Skip to content

Commit

Permalink
Merge pull request #5 from oppia/develop
Browse files Browse the repository at this point in the history
Update from oppia develop
  • Loading branch information
rohitkatlaa committed Aug 30, 2019
2 parents 42889aa + d56b219 commit 2fe9cfe
Show file tree
Hide file tree
Showing 826 changed files with 12,047 additions and 12,580 deletions.
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
core/templates/dev/head/expressions/ExpressionParserService.js
core/templates/dev/head/google-analytics.initializer.ts
backend_prod_files/*
core/tests/protractor.conf.js
extensions/interactions/LogicProof/static/js/generatedDefaultData.ts
Expand Down
1 change: 1 addition & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@
"no-multi-str": [
"error"
],
"no-prototype-builtins": "off",
"no-redeclare": [
"off"
],
Expand Down
14 changes: 7 additions & 7 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,6 @@
/core/templates/dev/head/domain/objects/ @kevinlee12
/core/templates/dev/head/expressions/ @seanlip
/core/templates/dev/head/services/CodeNormalizerService*.ts @kevinlee12
/extensions/dependencies/ @seanlip @vojtechjelinek
/extensions/domain*.py @seanlip @DubeySandeep
/extensions/interactions/ @kevinlee12 @vojtechjelinek
/extensions/objects/ @aks681
Expand Down Expand Up @@ -305,15 +304,18 @@

# Topic project.
# Instead of * we have used _* to avoid topics_and_skills_dashboard related files.
/core/controllers/classroom*.py @aks681
/core/controllers/topic_*.py @aks681
/core/domain/subtopic_page_domain*.py @aks681
/core/domain/subtopic_page_services*.py @aks681
/core/domain/topic*.py @aks681
/core/storage/topic/ @aks681
/core/templates/dev/head/components/entity-creation-services/topic-creation.service.ts.ts @aks681
/core/templates/dev/head/domain/classroom/ @aks681
/core/templates/dev/head/domain/subtopic_viewer/ @aks681
/core/templates/dev/head/domain/topic/ @aks681
/core/templates/dev/head/domain/topic_viewer @aks681
/core/templates/dev/head/pages/classroom-page/ @aks681
/core/templates/dev/head/pages/subtopic-viewer-page/ @aks681
/core/templates/dev/head/pages/topic-editor-page/ @aks681
/core/templates/dev/head/pages/topic-viewer-page/ @aks681
Expand All @@ -333,7 +335,7 @@
/main.py @nithusha21 @DubeySandeep
/feconf.py @seanlip @nithusha21
/constants*.py @seanlip @nithusha21
/assets/constants.js @seanlip @nithusha21
/assets/constants.ts @seanlip @nithusha21
/core/controllers/incoming_emails*.py @aks681
/core/controllers/tasks*.py @aks681
/core/domain/email*.py @aks681
Expand Down Expand Up @@ -384,7 +386,6 @@

# Rich text editor team.
/core/templates/dev/head/components/ck-editor-helpers/ck-editor-4-rte.directive.ts @aks681
/core/templates/dev/head/components/ck-editor-helpers/ck-editor-5-rte.directive.ts @aks681 @NishealJ
/core/templates/dev/head/directives/mathjax-bind.directive.ts @aks681
/core/templates/dev/head/mathjaxConfig.ts @aks681
/core/templates/dev/head/components/ck-editor-helpers/ck-editor-4-widgets.initializer.ts @aks681
Expand All @@ -393,7 +394,7 @@
/core/domain/rte_component_registry*.py @vojtechjelinek
/extensions/ckeditor_plugins/ @vojtechjelinek
/extensions/rich_text_components/ @vojtechjelinek
/assets/rich_text_components_definitions.js @vojtechjelinek
/assets/rich_text_components_definitions.ts @vojtechjelinek


# Suggestion and feedback team.
Expand Down Expand Up @@ -433,9 +434,9 @@

# Speed Improvement team.
/app_dev.yaml @vojtechjelinek
/core/templates/dev/head/google-analytics.initializer.ts @vojtechjelinek
/core/templates/dev/head/base_components/ @jamesjay4199 @vojtechjelinek
/core/templates/dev/head/pages/Base.ts @vojtechjelinek
/core/templates/dev/head/pages/base.html @vojtechjelinek
/core/templates/dev/head/pages/oppia_footer_directive.html @vojtechjelinek
/core/templates/dev/head/pages/OppiaFooterDirective.ts @vojtechjelinek
/core/templates/dev/head/pages/footer_js_libs.html @vojtechjelinek
Expand All @@ -444,7 +445,7 @@
/core/templates/dev/head/services/CsrfTokenService*.ts @jamesjay4199 @vojtechjelinek
/gulpfile.js @vojtechjelinek
/jinja_utils*.py @vojtechjelinek
/webpack.config.ts @vojtechjelinek
/webpack.common.config.ts @vojtechjelinek
/webpack.dev.config.ts @vojtechjelinek
/webpack.prod.config.ts @vojtechjelinek

Expand Down Expand Up @@ -478,7 +479,6 @@
# in scripts/pre_commit_linter.py in sync with the modifications.
/core/controllers/acl_decorators*.py @seanlip
/core/controllers/base*.py @seanlip
/core/domain/dependency_registry*.py @seanlip
/core/domain/html*.py @seanlip
/core/domain/rights_manager*.py @seanlip
/core/domain/role_services*.py @seanlip
Expand Down
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ gae_runtime/*
# ignore the files and dirs inside the .git dir.
.git/*
third_party/*
assets/hashes.js
assets/hashes.json
backend_prod_files/*
local_compiled_js/*
local_compiled_js_for_test/*
core/templates/prod/*
core/templates/dev/head/dist/*
webpack_bundles/*
core/tests/.browserstack.env
node_modules/*
.coverage*
Expand Down
5 changes: 4 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,11 @@ env:
- RUN_E2E_TESTS_ADDITIONAL_EDITOR_AND_PLAYER_FEATURES=true
- RUN_E2E_TESTS_COLLECTIONS=true
- RUN_E2E_TESTS_CORE_EDITOR_AND_PLAYER_FEATURES=true
- RUN_E2E_TESTS_CREATOR_DASHBOARD=true
- RUN_E2E_TESTS_EMBEDDING=true
- RUN_E2E_TESTS_EXPLORATION_FEEDBACK_TAB=true
- RUN_E2E_TESTS_EXPLORATION_HISTORY_TAB=true
- RUN_E2E_TESTS_EXPLORATION_IMPROVEMENTS_TAB=true
- RUN_E2E_TESTS_EXPLORATION_STATISTICS_TAB=true
- RUN_E2E_TESTS_EXPLORATION_TRANSLATION_TAB=true
- RUN_E2E_TESTS_EXTENSIONS=true
Expand Down Expand Up @@ -105,9 +107,11 @@ script:
- if [ "$RUN_E2E_TESTS_ADDITIONAL_EDITOR_AND_PLAYER_FEATURES" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="additionalEditorAndPlayerFeatures" --prod_env; fi
- if [ "$RUN_E2E_TESTS_COLLECTIONS" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="collections" --prod_env; fi
- if [ "$RUN_E2E_TESTS_CORE_EDITOR_AND_PLAYER_FEATURES" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="coreEditorAndPlayerFeatures" --prod_env; fi
- if [ "$RUN_E2E_TESTS_CREATOR_DASHBOARD" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="creatorDashboard" --prod_env; fi
- if [ "$RUN_E2E_TESTS_EMBEDDING" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="embedding" --prod_env; fi
- if [ "$RUN_E2E_TESTS_EXPLORATION_FEEDBACK_TAB" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="explorationFeedbackTab" --prod_env; fi
- if [ "$RUN_E2E_TESTS_EXPLORATION_HISTORY_TAB" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="explorationHistoryTab" --prod_env; fi
- if [ "$RUN_E2E_TESTS_EXPLORATION_IMPROVEMENTS_TAB" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="explorationImprovementsTab" --prod_env; fi
- if [ "$RUN_E2E_TESTS_EXPLORATION_STATISTICS_TAB" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="explorationStatisticsTab" --prod_env; fi
- if [ "$RUN_E2E_TESTS_EXPLORATION_TRANSLATION_TAB" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="explorationTranslationTab" --prod_env; fi
- if [ "$RUN_E2E_TESTS_EXTENSIONS" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="extensions" --prod_env; fi
Expand All @@ -123,7 +127,6 @@ script:
- if [ "$RUN_E2E_TESTS_TOPICS_AND_SKILLS_DASHBOARD" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="topicsAndSkillsDashboard" --prod_env; fi
- if [ "$RUN_E2E_TESTS_TOPIC_AND_STORY_EDITOR" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="topicAndStoryEditor" --prod_env; fi
- if [ "$RUN_E2E_TESTS_USERS" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="users" --prod_env; fi

# These lines are commented out because these checks are being run on CircleCI
# here: https://circleci.com/gh/oppia/oppia
# after_success:
Expand Down
42 changes: 21 additions & 21 deletions app_dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ handlers:
expiration: "90d"

# DEVELOPMENT STATIC
- url: /dist
static_dir: core/templates/dev/head/dist
- url: /webpack_bundles
static_dir: webpack_bundles
secure: always
application_readable: true
expiration: "0"
Expand Down Expand Up @@ -140,8 +140,8 @@ handlers:

# STATIC PAGES.
- url: /about
static_files: core/templates/dev/head/dist/about-page.mainpage.html
upload: core/templates/dev/head/dist/about-page.mainpage.html
static_files: webpack_bundles/about-page.mainpage.html
upload: webpack_bundles/about-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -151,8 +151,8 @@ handlers:
secure: always
expiration: "0"
- url: /contact
static_files: core/templates/dev/head/dist/contact-page.mainpage.html
upload: core/templates/dev/head/dist/contact-page.mainpage.html
static_files: webpack_bundles/contact-page.mainpage.html
upload: webpack_bundles/contact-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -162,8 +162,8 @@ handlers:
secure: always
expiration: "0"
- url: /donate
static_files: core/templates/dev/head/dist/donate-page.mainpage.html
upload: core/templates/dev/head/dist/donate-page.mainpage.html
static_files: webpack_bundles/donate-page.mainpage.html
upload: webpack_bundles/donate-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -173,8 +173,8 @@ handlers:
secure: always
expiration: "0"
- url: /get_started
static_files: core/templates/dev/head/dist/get-started-page.mainpage.html
upload: core/templates/dev/head/dist/get-started-page.mainpage.html
static_files: webpack_bundles/get-started-page.mainpage.html
upload: webpack_bundles/get-started-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -184,8 +184,8 @@ handlers:
secure: always
expiration: "0"
- url: /privacy
static_files: core/templates/dev/head/dist/privacy-page.mainpage.html
upload: core/templates/dev/head/dist/privacy-page.mainpage.html
static_files: webpack_bundles/privacy-page.mainpage.html
upload: webpack_bundles/privacy-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -195,8 +195,8 @@ handlers:
secure: always
expiration: "0"
- url: /splash
static_files: core/templates/dev/head/dist/splash-page.mainpage.html
upload: core/templates/dev/head/dist/splash-page.mainpage.html
static_files: webpack_bundles/splash-page.mainpage.html
upload: webpack_bundles/splash-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -206,8 +206,8 @@ handlers:
secure: always
expiration: "0"
- url: /teach
static_files: core/templates/dev/head/dist/teach-page.mainpage.html
upload: core/templates/dev/head/dist/teach-page.mainpage.html
static_files: webpack_bundles/teach-page.mainpage.html
upload: webpack_bundles/teach-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -217,8 +217,8 @@ handlers:
secure: always
expiration: "0"
- url: /terms
static_files: core/templates/dev/head/dist/terms-page.mainpage.html
upload: core/templates/dev/head/dist/terms-page.mainpage.html
static_files: webpack_bundles/terms-page.mainpage.html
upload: webpack_bundles/terms-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand All @@ -228,8 +228,8 @@ handlers:
secure: always
expiration: "0"
- url: /thanks
static_files: core/templates/dev/head/dist/thanks-page.mainpage.html
upload: core/templates/dev/head/dist/thanks-page.mainpage.html
static_files: webpack_bundles/thanks-page.mainpage.html
upload: webpack_bundles/thanks-page.mainpage.html
http_headers:
Pragma: no-cache
Strict-Transport-Security: "max-age=31536000; includeSubDomains"
Expand Down Expand Up @@ -264,7 +264,7 @@ skip_files:
# Karma test files
- ^(.*/)Spec.js$
# Typescript files
- ^(.*/)?.*\.ts$
- ^core/(.*/)?.*\.ts$
# Typescript output log file
- ^(.*/)tsc_output_log.txt$
# Other folders to ignore
Expand Down
8 changes: 2 additions & 6 deletions assets/constants.js → assets/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,10 @@
* @fileoverview Initializes constants for the Oppia codebase.
*/

var constants = {
export = {
// Whether to allow custom event reporting to Google Analytics.
"CAN_SEND_ANALYTICS_EVENTS": false,

// This specifies the current editor in use and used to switch
// between CK4 & CK5.
"CURRENT_RTE_IS_CKEDITOR_4": true,

"ALL_CATEGORIES": ["Algebra", "Algorithms", "Architecture", "Arithmetic",
"Art", "Astronomy", "Biology", "Business", "Calculus", "Chemistry",
"Combinatorics", "Computing", "Economics", "Education", "Engineering",
Expand Down Expand Up @@ -539,7 +535,7 @@ var constants = {

"ENABLE_NEW_STRUCTURE_PLAYERS": false,

"ENABLE_SOLICIT_ANSWER_DETAILS_FEATURE": false,
"ENABLE_SOLICIT_ANSWER_DETAILS_FEATURE": true,

"MAX_SKILLS_PER_QUESTION": 3,

Expand Down
12 changes: 12 additions & 0 deletions assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,16 @@
"I18N_PREFERENCES_USERNAME": "Username",
"I18N_PREFERENCES_USERNAME_NOT_SELECTED": "Not yet selected",
"I18N_PROFILE_NO_EXPLORATIONS": "This user hasn't created or edited any explorations yet.",
"I18N_QUESTION_PLAYER_BOOST_SCORE": "Boost Score",
"I18N_QUESTION_PLAYER_LEARN_MORE_ABOUT_SCORE": "Learn more about your score",
"I18N_QUESTION_PLAYER_MY_DASHBOARD": "My Dashboard",
"I18N_QUESTION_PLAYER_NEW_SESSION": "New Session",
"I18N_QUESTION_PLAYER_RETRY_TEST": "Retry Test",
"I18N_QUESTION_PLAYER_RETURN_TO_STORY": "Return To Story",
"I18N_QUESTION_PLAYER_SCORE": "Score",
"I18N_QUESTION_PLAYER_SKILL_DESCRIPTIONS": "Skill Descriptions",
"I18N_QUESTION_PLAYER_TEST_FAILED": "Test failed. Please review the skills and try again",
"I18N_QUESTION_PLAYER_TEST_PASSED": "Test complete. Well done!",
"I18N_REGISTRATION_SESSION_EXPIRED_HEADING": "Registration Session Expired",
"I18N_REGISTRATION_SESSION_EXPIRED_MESSAGE": "Sorry, your registration session has expired. Please click \"Continue Registration\" to restart the process.",
"I18N_SIDEBAR_ABOUT_LINK": "About",
Expand Down Expand Up @@ -474,6 +484,8 @@
"I18N_SIGNUP_USERNAME_EXPLANATION": "Your username will be shown next to your contributions.",
"I18N_SIGNUP_WAIVER_OBJECTIVE": "The waiver of the attribution (BY) requirement means that, if someone reuses this work, they are not required to attribute the authors. However, all of your individual contributions to explorations will be available on this site in the exploration change log, and people who reuse the exploration are encouraged (but not required) to include a link to this page.",
"I18N_SIGNUP_WHY_LICENSE": "Why CC-BY-SA?",
"I18N_SOLICIT_ANSWER_DETAILS_FEEDBACK": "Okay, now let's go back to your answer.",
"I18N_SOLICIT_ANSWER_DETAILS_QUESTION": "Could you explain why you picked this answer?",
"I18N_SPLASH_FIRST_EXPLORATION_DESCRIPTION": "Oppia's lessons, also known as explorations, provide more immersive experiences than static videos or text, helping users learn by doing.",
"I18N_SPLASH_JAVASCRIPT_ERROR_DESCRIPTION": "Oppia is a free, open-source learning platform full of interactive activities called 'explorations'. Sadly, Oppia requires JavaScript to be enabled in your web browser in order to function properly and your web browser has JavaScript disabled. If you need help enabling JavaScript, <a href=\"<[hrefUrl]>\">click here.</a>",
"I18N_SPLASH_JAVASCRIPT_ERROR_THANKS": "Thank you.",
Expand Down
12 changes: 12 additions & 0 deletions assets/i18n/qqq.json
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,16 @@
"I18N_PREFERENCES_USERNAME": "Text displayed in the preferences page. - Text shown at the left of the text entry where the user can change his username.\n{{Identical|Username}}",
"I18N_PREFERENCES_USERNAME_NOT_SELECTED": "Text displayed in the preferences page. - Text shown in the text entry for the username when there is no username assigned to the user.",
"I18N_PROFILE_NO_EXPLORATIONS": "Text displayed on the Profile page. - This message is shown on a user's profile when the user has zero created/edited explorations.",
"I18N_QUESTION_PLAYER_BOOST_SCORE": "Text displayed in Practice Session and Review Test pages. - Text of the button that opens up a modal showing a concept card of skills that the learner can improve upon.",
"I18N_QUESTION_PLAYER_LEARN_MORE_ABOUT_SCORE": "Text displayed in Practice Session and Review Test pages. - Text that is shown above the breakdown of the score that indicates users can learn more about their score below.",
"I18N_QUESTION_PLAYER_MY_DASHBOARD":"Text displayed in the Practice Session page. - Text of the button that go to the Topics Dashboard on click.",
"I18N_QUESTION_PLAYER_NEW_SESSION": "Text displayed in the Practice Session page. - Text of the button that starts a new practice session",
"I18N_QUESTION_PLAYER_RETRY_TEST": "Text displayed in Review Test page. - Text of the button that retries a review test.",
"I18N_QUESTION_PLAYER_RETURN_TO_STORY": "Text displayed in Review Test page. - Text of the button that redirects back to the Story page.",
"I18N_QUESTION_PLAYER_SCORE": "Text displayed in Practice Session and Review Test pages. - Text that is the heading of a column with scores.",
"I18N_QUESTION_PLAYER_SKILL_DESCRIPTIONS": "Text displayed in Practice Session and Review Test pages. - Text that is the heading of a column with skill descriptions.",
"I18N_QUESTION_PLAYER_TEST_FAILED": "Text displayed in Practice Session and Review Test pages. - Text that is shown above the score wheel when the user fails the test.",
"I18N_QUESTION_PLAYER_TEST_PASSED": "Text displayed in Practice Session and Review Test pages. - Text that is shown above the score wheel when the user passes the test.",
"I18N_REGISTRATION_SESSION_EXPIRED_HEADING": "Text which appears as the heading for registration session expired modal on Signup page.",
"I18N_REGISTRATION_SESSION_EXPIRED_MESSAGE": "Text which appears on registration session expired modal on Signup page - This message informs user that their registration session has expired and they need to click on Continue Registration to restart the registration.",
"I18N_SIDEBAR_ABOUT_LINK": "Text displayed in the side navigation bar. - When the user clicks the link, they are redirected to the about page.\n{{Identical|About}}",
Expand Down Expand Up @@ -474,6 +484,8 @@
"I18N_SIGNUP_USERNAME_EXPLANATION": "Text displayed next to an entry box in the signup page - Explains how the username selected in the box is going to be used inside the site.",
"I18N_SIGNUP_WAIVER_OBJECTIVE": "Text displayed inside a information dialog widget in the signup page. - It explains the waiver of attribution. See I18N_SIGNUP_WHY_LICENSE.",
"I18N_SIGNUP_WHY_LICENSE": "Text displayed inside a information dialog widget in the signup page. - It's the title of a dialog that contains additional information about why the creative commons licence was chosen for Oppia.",
"I18N_SOLICIT_ANSWER_DETAILS_FEEDBACK": "Text to introduce the regular feedback that Oppia shows after the student submits the answer details.",
"I18N_SOLICIT_ANSWER_DETAILS_QUESTION": "Text for the question which asks the students to explain why they entered a particular answer.",
"I18N_SPLASH_FIRST_EXPLORATION_DESCRIPTION": "Paragraph describing Oppia. - Shown in the splash page next to an image.",
"I18N_SPLASH_JAVASCRIPT_ERROR_DESCRIPTION": "Main content of an error page - The error is triggered when the user has disabled javascript in the browser. There is no space constraints for this paragraph and the priority is to clearly explain the user what caused the problem and how to solve it.",
"I18N_SPLASH_JAVASCRIPT_ERROR_THANKS": "Closing message of an error page - Thanks the user in a informal language.\n{{Identical|Thank you}}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
* @fileoverview Definitions for rich text components.
*/

var richTextComponents = {
export = {
"Collapsible": {
"backend_id": "Collapsible",
"category": "Basic Input",
Expand Down
2 changes: 1 addition & 1 deletion constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,5 @@ class Constants(dict):
__getattr__ = dict.__getitem__


with python_utils.open_file(os.path.join('assets', 'constants.js'), 'r') as f:
with python_utils.open_file(os.path.join('assets', 'constants.ts'), 'r') as f:
constants = Constants(parse_json_from_js(f))

0 comments on commit 2fe9cfe

Please sign in to comment.