From f9db4225c88453381f44126fc1de033a6aeedc75 Mon Sep 17 00:00:00 2001 From: Michael Sharman Date: Tue, 25 Jun 2024 19:15:09 +1000 Subject: [PATCH] Prod build and bumped version number --- dist/assessment/core.js | 185 +- dist/assessment/index.js | 809 +---- dist/assessment/index.js.LICENSE.txt | 43 + dist/authoring/core.js | 145 +- dist/authoring/index.js | 4318 +------------------------- dist/authoring/index.js.LICENSE.txt | 49 + dist/version.js | 2 +- package-lock.json | 4 +- package.json | 2 +- 9 files changed, 102 insertions(+), 5455 deletions(-) create mode 100644 dist/assessment/index.js.LICENSE.txt create mode 100644 dist/authoring/index.js.LICENSE.txt diff --git a/dist/assessment/core.js b/dist/assessment/core.js index af929dd..5debbc8 100644 --- a/dist/assessment/core.js +++ b/dist/assessment/core.js @@ -1,184 +1 @@ -/* - * ATTENTION: An "eval-source-map" devtool has been used. - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ var __webpack_modules__ = ({ - -/***/ "./dist/version.js": -/*!*************************!*\ - !*** ./dist/version.js ***! - \*************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* binding */ version)\n/* harmony export */ });\nconst version = '2.12.0';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9kaXN0L3ZlcnNpb24uanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL2Rpc3QvdmVyc2lvbi5qcz80OWMxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzIuMTIuMCc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./dist/version.js\n"); - -/***/ }), - -/***/ "./src/assessment/core.js": -/*!********************************!*\ - !*** ./src/assessment/core.js ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LT: () => (/* binding */ LT)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _core_diagnostics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./core/diagnostics */ \"./src/assessment/core/diagnostics.js\");\n/* harmony import */ var _core_items__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./core/items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _core_player__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./core/player */ \"./src/assessment/core/player.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./core/questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var _core_sections__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./core/sections */ \"./src/assessment/core/sections.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\n\n\n\n\n\n\n\n\nconst utils = {\n utils: {\n logger: _utils_logger__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n },\n};\n\nconst LT = { ..._core_app__WEBPACK_IMPORTED_MODULE_0__, ..._core_items__WEBPACK_IMPORTED_MODULE_3__, ..._core_activity__WEBPACK_IMPORTED_MODULE_1__, ..._core_player__WEBPACK_IMPORTED_MODULE_4__, ..._core_questions__WEBPACK_IMPORTED_MODULE_5__, ..._core_sections__WEBPACK_IMPORTED_MODULE_6__, ..._core_diagnostics__WEBPACK_IMPORTED_MODULE_2__, ...utils };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFrQztBQUNVO0FBQ007QUFDWjtBQUNFO0FBQ007QUFDRjtBQUNQOztBQUVyQztBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTDs7QUFFTyxhQUFhLEdBQUcsc0NBQUcsS0FBSyx3Q0FBSyxLQUFLLDJDQUFRLEtBQUsseUNBQU0sS0FBSyw0Q0FBUyxLQUFLLDJDQUFRLEtBQUssOENBQVciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvY29yZS5qcz84NGE3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuL2NvcmUvYXBwJztcbmltcG9ydCAqIGFzIGFjdGl2aXR5IGZyb20gJy4vY29yZS9hY3Rpdml0eSc7XG5pbXBvcnQgKiBhcyBkaWFnbm9zdGljcyBmcm9tICcuL2NvcmUvZGlhZ25vc3RpY3MnO1xuaW1wb3J0ICogYXMgaXRlbXMgZnJvbSAnLi9jb3JlL2l0ZW1zJztcbmltcG9ydCAqIGFzIHBsYXllciBmcm9tICcuL2NvcmUvcGxheWVyJztcbmltcG9ydCAqIGFzIHF1ZXN0aW9ucyBmcm9tICcuL2NvcmUvcXVlc3Rpb25zJztcbmltcG9ydCAqIGFzIHNlY3Rpb25zIGZyb20gJy4vY29yZS9zZWN0aW9ucyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5cbmNvbnN0IHV0aWxzID0ge1xuICAgIHV0aWxzOiB7XG4gICAgICAgIGxvZ2dlcixcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IExUID0geyAuLi5hcHAsIC4uLml0ZW1zLCAuLi5hY3Rpdml0eSwgLi4ucGxheWVyLCAuLi5xdWVzdGlvbnMsIC4uLnNlY3Rpb25zLCAuLi5kaWFnbm9zdGljcywgLi4udXRpbHMgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/core.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/activity.js": -/*!*****************************************!*\ - !*** ./src/assessment/core/activity.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ activity: () => (/* binding */ activity),\n/* harmony export */ activityId: () => (/* binding */ activityId),\n/* harmony export */ activitySubTitle: () => (/* binding */ activitySubTitle),\n/* harmony export */ activityTags: () => (/* binding */ activityTags),\n/* harmony export */ activityTemplateId: () => (/* binding */ activityTemplateId),\n/* harmony export */ activityTitle: () => (/* binding */ activityTitle),\n/* harmony export */ adaptiveType: () => (/* binding */ adaptiveType),\n/* harmony export */ annotationsConfig: () => (/* binding */ annotationsConfig),\n/* harmony export */ autoSaveConfig: () => (/* binding */ autoSaveConfig),\n/* harmony export */ elapsedTime: () => (/* binding */ elapsedTime),\n/* harmony export */ hasActivityTemplate: () => (/* binding */ hasActivityTemplate),\n/* harmony export */ hasAnnotations: () => (/* binding */ hasAnnotations),\n/* harmony export */ hasAutoSave: () => (/* binding */ hasAutoSave),\n/* harmony export */ hasEvents: () => (/* binding */ hasEvents),\n/* harmony export */ hasItemPool: () => (/* binding */ hasItemPool),\n/* harmony export */ hasResourceItems: () => (/* binding */ hasResourceItems),\n/* harmony export */ hasSections: () => (/* binding */ hasSections),\n/* harmony export */ hasShuffledItems: () => (/* binding */ hasShuffledItems),\n/* harmony export */ hasTryAgain: () => (/* binding */ hasTryAgain),\n/* harmony export */ isAdaptive: () => (/* binding */ isAdaptive),\n/* harmony export */ isResuming: () => (/* binding */ isResuming),\n/* harmony export */ itemBank: () => (/* binding */ itemBank),\n/* harmony export */ itemPool: () => (/* binding */ itemPool),\n/* harmony export */ maxTime: () => (/* binding */ maxTime),\n/* harmony export */ region: () => (/* binding */ region),\n/* harmony export */ resourceItems: () => (/* binding */ resourceItems),\n/* harmony export */ sessionId: () => (/* binding */ sessionId),\n/* harmony export */ state: () => (/* binding */ state),\n/* harmony export */ timeRemaining: () => (/* binding */ timeRemaining),\n/* harmony export */ totalItems: () => (/* binding */ totalItems),\n/* harmony export */ userId: () => (/* binding */ userId)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _sections__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sections */ \"./src/assessment/core/sections.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n\n\n\n\n/**\n * Everything relating to the activity currently\n * loaded by Items API.\n * @module Assessment/Activity\n */\n\n/**\n * The activity configuration object, including anything\n * overridden at runtime if using activity templates.\n * @since 0.1.0\n * @returns {object}\n */\nfunction activity() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getActivity();\n}\n\n/**\n * The activity id used for this activity instance\n * used to group related sessions.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activityId() {\n return activity().activity_id;\n}\n\n/**\n * The `activity_template_id` if templates are used.\n * Returns '' if templates aren't being used.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activityTemplateId() {\n return activity().activity_template_id;\n}\n\n/**\n * The visible title from the configuration object.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activityTitle() {\n return activity().config.title;\n}\n\n/**\n * The visible subtitle from the configuration object.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activitySubTitle() {\n return activity().config.subtitle;\n}\n\n/**\n * All tags that have been set against items in the activity.\n * Requires `retrieve_tags` to be set to `true` in the\n * Items API configuration.\n * @since 2.9.0\n * @returns {array}\n */\nfunction activityTags() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getTags();\n}\n\n/**\n * The adaptive type as defined in the configuration.\n * Returns '' if the activity isn't adaptive.\n * @since 0.1.0\n * @returns {string}\n */\nfunction adaptiveType() {\n if (isAdaptive() && activity().adaptive.hasOwnProperty('type')) {\n return activity().adaptive.type;\n } else {\n return '';\n }\n}\n\n/**\n * The annotations configuration object.\n * @since 0.1.0\n * @returns {object}\n */\nfunction annotationsConfig() {\n return hasAnnotations() && activity()?.config?.annotations_api_init_options ? activity().config.annotations_api_init_options : {};\n}\n\n/**\n * The auto-save configuration object. Returns `true` or an\n * object based on what was in the configuration.\n * @since 0.1.0\n * @returns {boolean | object}\n */\nfunction autoSaveConfig() {\n const a = activity();\n return a?.config?.navigation?.auto_save ? a.config.navigation.auto_save : {};\n}\n\n/**\n * The current elapsed time for the session. Returns whether\n * the timer is visible or not.\n * @since 2.6.0\n * @returns {number}\n */\nfunction elapsedTime() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getTime();\n}\n\n/**\n * Whether this activity was loaded from an activity template.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasActivityTemplate() {\n return activity().hasOwnProperty('activity_template_id');\n}\n\n/**\n * Whether annotations have been configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasAnnotations() {\n const a = activity();\n return Boolean(a?.config?.annotations === true || a?.config?.annotations_api_init_options);\n}\n\n/**\n * Whether auto-save is configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasAutoSave() {\n const a = activity();\n return (\n a.hasOwnProperty('config') &&\n a.config.hasOwnProperty('navigation') &&\n a.config.navigation.hasOwnProperty('auto_save') &&\n a.config.navigation.auto_save !== false\n );\n}\n\n/**\n * Whether items have been shuffled within this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasShuffledItems() {\n return Boolean(activity()?.config?.configuration?.shuffle_items);\n}\n\n/**\n * Whether events have been configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasEvents() {\n const a = activity();\n return a.hasOwnProperty('events') && a.events !== false;\n}\n\n/**\n * Whether an item pool has been configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasItemPool() {\n const a = activity();\n return a.hasOwnProperty('item_pool_id');\n}\n\n/**\n * Whether this activity contains resource item(s).\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasResourceItems() {\n return Boolean(activity()?.config?.navigation?.resource_items);\n}\n\n/**\n * Whether this activity contains sections.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasSections() {\n return activity().hasOwnProperty('sections');\n}\n\n/**\n * Whether the activity has try again enabled.\n * @since 1.4.0\n * @returns {boolean}\n */\nfunction hasTryAgain() {\n return activity()?.dynamic_items.hasOwnProperty('try_again');\n}\n\n/**\n * Whether this activity is adaptive.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isAdaptive() {\n return activity().hasOwnProperty('adaptive');\n}\n\n/**\n * Whether the user is resuming the session.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isResuming() {\n return activity().existing_session;\n}\n\n/**\n * The global `organisation_id` used for this activity instance.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemBank() {\n return activity()?.organisation_id;\n}\n\n/**\n * The `item_pool_id` used for this activity instance.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemPool() {\n return activity()?.item_pool_id;\n}\n\n/**\n * The maximum time allowed for this session. If `0`, it\n * means unlimited time.\n * @since 2.6.0\n * @returns {number}\n */\nfunction maxTime() {\n return activity()?.config?.time?.max_time ? activity().config.time.max_time : 0;\n}\n\n/**\n * Which UI region the session was set up with. Values include:\n * - `main`\n * - `horizontal`\n * - `horizontal-fixed`\n *\n * `undefined` will mean that no `regions` key was found in the\n * Items API configuration, meaning the player defaults to the\n * legacy UI region (not recommended).\n * @since 1.1.0\n * @returns {string}\n */\nfunction region() {\n return activity()?.config?.regions;\n}\n\n/**\n * The resource item references used for this activity instance.\n * @since 0.1.0\n * @returns {array}\n */\nfunction resourceItems() {\n return activity()?.config?.navigation?.resource_items;\n}\n\n/**\n * The `session_id` used for this activity instance.\n * @since 0.1.0\n * @returns {string}\n */\nfunction sessionId() {\n return activity()?.session_id;\n}\n\n/**\n * The current `state` of this activity instance. Possible\n * values:\n * - `initial`\n * - `resume`\n * - `review`\n * - `preview`\n * @since 0.1.0\n * @returns {string}\n */\nfunction state() {\n let s;\n switch (activity()?.state) {\n case undefined:\n s = 'initial';\n break;\n default:\n s = activity().state;\n break;\n }\n return s;\n}\n\n/**\n * The time remaining in the session. If `max_time` hasn't\n * been set, the session is unlimited, so this returns `null`.\n * @since 2.6.0\n * @returns {number|null}\n */\nfunction timeRemaining() {\n if (maxTime() === 0) return null;\n return maxTime() - elapsedTime();\n}\n\n/**\n * The total number of items in the activity, including\n * items within sections if relevant.\n * @since 0.1.0\n * @returns {number}\n */\nfunction totalItems() {\n if (hasSections()) {\n let numItems = 0;\n let allSections = _sections__WEBPACK_IMPORTED_MODULE_1__.sections();\n for (let i = 0; i < allSections.length; i++) {\n numItems += allSections[i].items.length;\n }\n return numItems;\n } else if (isAdaptive()) {\n if (activity().hasOwnProperty('items')) {\n return activity().items.length;\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info('This is an adaptive session, no items array found');\n return 0;\n }\n } else {\n return activity().items.length;\n }\n}\n\n/**\n * The `user_id` as defined in the configuration.\n * @since 0.1.0\n * @returns {string}\n */\nfunction userId() {\n return activity()?.user_id;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2FjdGl2aXR5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBNkI7QUFDVTtBQUNDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxXQUFXLDZDQUFlO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyw2Q0FBZTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLFdBQVcsNkNBQWU7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0EsMEJBQTBCLCtDQUFpQjtBQUMzQyx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsVUFBVTtBQUNWLFlBQVkscURBQU07QUFDbEI7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvYWN0aXZpdHkuanM/MzY3YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi9hcHAnO1xuaW1wb3J0ICogYXMgc2VjdGlvbnMgZnJvbSAnLi9zZWN0aW9ucyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5cbi8qKlxuICogRXZlcnl0aGluZyByZWxhdGluZyB0byB0aGUgYWN0aXZpdHkgY3VycmVudGx5XG4gKiBsb2FkZWQgYnkgSXRlbXMgQVBJLlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L0FjdGl2aXR5XG4gKi9cblxuLyoqXG4gKiBUaGUgYWN0aXZpdHkgY29uZmlndXJhdGlvbiBvYmplY3QsIGluY2x1ZGluZyBhbnl0aGluZ1xuICogb3ZlcnJpZGRlbiBhdCBydW50aW1lIGlmIHVzaW5nIGFjdGl2aXR5IHRlbXBsYXRlcy5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdGl2aXR5KCkge1xuICAgIHJldHVybiBhcHAuYXBwSW5zdGFuY2UoKS5nZXRBY3Rpdml0eSgpO1xufVxuXG4vKipcbiAqIFRoZSBhY3Rpdml0eSBpZCB1c2VkIGZvciB0aGlzIGFjdGl2aXR5IGluc3RhbmNlXG4gKiB1c2VkIHRvIGdyb3VwIHJlbGF0ZWQgc2Vzc2lvbnMuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3Rpdml0eUlkKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmFjdGl2aXR5X2lkO1xufVxuXG4vKipcbiAqIFRoZSBgYWN0aXZpdHlfdGVtcGxhdGVfaWRgIGlmIHRlbXBsYXRlcyBhcmUgdXNlZC5cbiAqIFJldHVybnMgJycgaWYgdGVtcGxhdGVzIGFyZW4ndCBiZWluZyB1c2VkLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZpdHlUZW1wbGF0ZUlkKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmFjdGl2aXR5X3RlbXBsYXRlX2lkO1xufVxuXG4vKipcbiAqIFRoZSB2aXNpYmxlIHRpdGxlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZpdHlUaXRsZSgpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKS5jb25maWcudGl0bGU7XG59XG5cbi8qKlxuICogVGhlIHZpc2libGUgc3VidGl0bGUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3Rpdml0eVN1YlRpdGxlKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmNvbmZpZy5zdWJ0aXRsZTtcbn1cblxuLyoqXG4gKiBBbGwgdGFncyB0aGF0IGhhdmUgYmVlbiBzZXQgYWdhaW5zdCBpdGVtcyBpbiB0aGUgYWN0aXZpdHkuXG4gKiBSZXF1aXJlcyBgcmV0cmlldmVfdGFnc2AgdG8gYmUgc2V0IHRvIGB0cnVlYCBpbiB0aGVcbiAqIEl0ZW1zIEFQSSBjb25maWd1cmF0aW9uLlxuICogQHNpbmNlIDIuOS4wXG4gKiBAcmV0dXJucyB7YXJyYXl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3Rpdml0eVRhZ3MoKSB7XG4gICAgcmV0dXJuIGFwcC5hcHBJbnN0YW5jZSgpLmdldFRhZ3MoKTtcbn1cblxuLyoqXG4gKiBUaGUgYWRhcHRpdmUgdHlwZSBhcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uLlxuICogUmV0dXJucyAnJyBpZiB0aGUgYWN0aXZpdHkgaXNuJ3QgYWRhcHRpdmUuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGFwdGl2ZVR5cGUoKSB7XG4gICAgaWYgKGlzQWRhcHRpdmUoKSAmJiBhY3Rpdml0eSgpLmFkYXB0aXZlLmhhc093blByb3BlcnR5KCd0eXBlJykpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2aXR5KCkuYWRhcHRpdmUudHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBhbm5vdGF0aW9ucyBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25zQ29uZmlnKCkge1xuICAgIHJldHVybiBoYXNBbm5vdGF0aW9ucygpICYmIGFjdGl2aXR5KCk/LmNvbmZpZz8uYW5ub3RhdGlvbnNfYXBpX2luaXRfb3B0aW9ucyA/IGFjdGl2aXR5KCkuY29uZmlnLmFubm90YXRpb25zX2FwaV9pbml0X29wdGlvbnMgOiB7fTtcbn1cblxuLyoqXG4gKiBUaGUgYXV0by1zYXZlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBSZXR1cm5zIGB0cnVlYCBvciBhblxuICogb2JqZWN0IGJhc2VkIG9uIHdoYXQgd2FzIGluIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG9iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9TYXZlQ29uZmlnKCkge1xuICAgIGNvbnN0IGEgPSBhY3Rpdml0eSgpO1xuICAgIHJldHVybiBhPy5jb25maWc/Lm5hdmlnYXRpb24/LmF1dG9fc2F2ZSA/IGEuY29uZmlnLm5hdmlnYXRpb24uYXV0b19zYXZlIDoge307XG59XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZWxhcHNlZCB0aW1lIGZvciB0aGUgc2Vzc2lvbi4gUmV0dXJucyB3aGV0aGVyXG4gKiB0aGUgdGltZXIgaXMgdmlzaWJsZSBvciBub3QuXG4gKiBAc2luY2UgMi42LjBcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGFwc2VkVGltZSgpIHtcbiAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0VGltZSgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyBhY3Rpdml0eSB3YXMgbG9hZGVkIGZyb20gYW4gYWN0aXZpdHkgdGVtcGxhdGUuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQWN0aXZpdHlUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKS5oYXNPd25Qcm9wZXJ0eSgnYWN0aXZpdHlfdGVtcGxhdGVfaWQnKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFubm90YXRpb25zIGhhdmUgYmVlbiBjb25maWd1cmVkIHdpdGggdGhpcyBhY3Rpdml0eS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNBbm5vdGF0aW9ucygpIHtcbiAgICBjb25zdCBhID0gYWN0aXZpdHkoKTtcbiAgICByZXR1cm4gQm9vbGVhbihhPy5jb25maWc/LmFubm90YXRpb25zID09PSB0cnVlIHx8IGE/LmNvbmZpZz8uYW5ub3RhdGlvbnNfYXBpX2luaXRfb3B0aW9ucyk7XG59XG5cbi8qKlxuICogV2hldGhlciBhdXRvLXNhdmUgaXMgY29uZmlndXJlZCB3aXRoIHRoaXMgYWN0aXZpdHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQXV0b1NhdmUoKSB7XG4gICAgY29uc3QgYSA9IGFjdGl2aXR5KCk7XG4gICAgcmV0dXJuIChcbiAgICAgICAgYS5oYXNPd25Qcm9wZXJ0eSgnY29uZmlnJykgJiZcbiAgICAgICAgYS5jb25maWcuaGFzT3duUHJvcGVydHkoJ25hdmlnYXRpb24nKSAmJlxuICAgICAgICBhLmNvbmZpZy5uYXZpZ2F0aW9uLmhhc093blByb3BlcnR5KCdhdXRvX3NhdmUnKSAmJlxuICAgICAgICBhLmNvbmZpZy5uYXZpZ2F0aW9uLmF1dG9fc2F2ZSAhPT0gZmFsc2VcbiAgICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgaXRlbXMgaGF2ZSBiZWVuIHNodWZmbGVkIHdpdGhpbiB0aGlzIGFjdGl2aXR5LlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1NodWZmbGVkSXRlbXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYWN0aXZpdHkoKT8uY29uZmlnPy5jb25maWd1cmF0aW9uPy5zaHVmZmxlX2l0ZW1zKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGV2ZW50cyBoYXZlIGJlZW4gY29uZmlndXJlZCB3aXRoIHRoaXMgYWN0aXZpdHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRXZlbnRzKCkge1xuICAgIGNvbnN0IGEgPSBhY3Rpdml0eSgpO1xuICAgIHJldHVybiBhLmhhc093blByb3BlcnR5KCdldmVudHMnKSAmJiBhLmV2ZW50cyAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBpdGVtIHBvb2wgaGFzIGJlZW4gY29uZmlndXJlZCB3aXRoIHRoaXMgYWN0aXZpdHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSXRlbVBvb2woKSB7XG4gICAgY29uc3QgYSA9IGFjdGl2aXR5KCk7XG4gICAgcmV0dXJuIGEuaGFzT3duUHJvcGVydHkoJ2l0ZW1fcG9vbF9pZCcpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyBhY3Rpdml0eSBjb250YWlucyByZXNvdXJjZSBpdGVtKHMpLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc291cmNlSXRlbXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYWN0aXZpdHkoKT8uY29uZmlnPy5uYXZpZ2F0aW9uPy5yZXNvdXJjZV9pdGVtcyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIGFjdGl2aXR5IGNvbnRhaW5zIHNlY3Rpb25zLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1NlY3Rpb25zKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmhhc093blByb3BlcnR5KCdzZWN0aW9ucycpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGFjdGl2aXR5IGhhcyB0cnkgYWdhaW4gZW5hYmxlZC5cbiAqIEBzaW5jZSAxLjQuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUcnlBZ2FpbigpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKT8uZHluYW1pY19pdGVtcy5oYXNPd25Qcm9wZXJ0eSgndHJ5X2FnYWluJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIGFjdGl2aXR5IGlzIGFkYXB0aXZlLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWRhcHRpdmUoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCkuaGFzT3duUHJvcGVydHkoJ2FkYXB0aXZlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgdXNlciBpcyByZXN1bWluZyB0aGUgc2Vzc2lvbi5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3VtaW5nKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmV4aXN0aW5nX3Nlc3Npb247XG59XG5cbi8qKlxuICogVGhlIGdsb2JhbCBgb3JnYW5pc2F0aW9uX2lkYCB1c2VkIGZvciB0aGlzIGFjdGl2aXR5IGluc3RhbmNlLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlbUJhbmsoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/Lm9yZ2FuaXNhdGlvbl9pZDtcbn1cblxuLyoqXG4gKiBUaGUgYGl0ZW1fcG9vbF9pZGAgdXNlZCBmb3IgdGhpcyBhY3Rpdml0eSBpbnN0YW5jZS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1Qb29sKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpPy5pdGVtX3Bvb2xfaWQ7XG59XG5cbi8qKlxuICogVGhlIG1heGltdW0gdGltZSBhbGxvd2VkIGZvciB0aGlzIHNlc3Npb24uIElmIGAwYCwgaXRcbiAqIG1lYW5zIHVubGltaXRlZCB0aW1lLlxuICogQHNpbmNlIDIuNi4wXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4VGltZSgpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKT8uY29uZmlnPy50aW1lPy5tYXhfdGltZSA/IGFjdGl2aXR5KCkuY29uZmlnLnRpbWUubWF4X3RpbWUgOiAwO1xufVxuXG4vKipcbiAqIFdoaWNoIFVJIHJlZ2lvbiB0aGUgc2Vzc2lvbiB3YXMgc2V0IHVwIHdpdGguIFZhbHVlcyBpbmNsdWRlOlxuICogLSBgbWFpbmBcbiAqIC0gYGhvcml6b250YWxgXG4gKiAtIGBob3Jpem9udGFsLWZpeGVkYFxuICpcbiAqIGB1bmRlZmluZWRgIHdpbGwgbWVhbiB0aGF0IG5vIGByZWdpb25zYCBrZXkgd2FzIGZvdW5kIGluIHRoZVxuICogSXRlbXMgQVBJIGNvbmZpZ3VyYXRpb24sIG1lYW5pbmcgdGhlIHBsYXllciBkZWZhdWx0cyB0byB0aGVcbiAqIGxlZ2FjeSBVSSByZWdpb24gKG5vdCByZWNvbW1lbmRlZCkuXG4gKiBAc2luY2UgMS4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb24oKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/LmNvbmZpZz8ucmVnaW9ucztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgaXRlbSByZWZlcmVuY2VzIHVzZWQgZm9yIHRoaXMgYWN0aXZpdHkgaW5zdGFuY2UuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHthcnJheX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc291cmNlSXRlbXMoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/LmNvbmZpZz8ubmF2aWdhdGlvbj8ucmVzb3VyY2VfaXRlbXM7XG59XG5cbi8qKlxuICogVGhlIGBzZXNzaW9uX2lkYCB1c2VkIGZvciB0aGlzIGFjdGl2aXR5IGluc3RhbmNlLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2Vzc2lvbklkKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpPy5zZXNzaW9uX2lkO1xufVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IGBzdGF0ZWAgb2YgdGhpcyBhY3Rpdml0eSBpbnN0YW5jZS4gUG9zc2libGVcbiAqIHZhbHVlczpcbiAqICAtIGBpbml0aWFsYFxuICogIC0gYHJlc3VtZWBcbiAqICAtIGByZXZpZXdgXG4gKiAgLSBgcHJldmlld2BcbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXRlKCkge1xuICAgIGxldCBzO1xuICAgIHN3aXRjaCAoYWN0aXZpdHkoKT8uc3RhdGUpIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICBzID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzID0gYWN0aXZpdHkoKS5zdGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBUaGUgdGltZSByZW1haW5pbmcgaW4gdGhlIHNlc3Npb24uIElmIGBtYXhfdGltZWAgaGFzbid0XG4gKiBiZWVuIHNldCwgdGhlIHNlc3Npb24gaXMgdW5saW1pdGVkLCBzbyB0aGlzIHJldHVybnMgYG51bGxgLlxuICogQHNpbmNlIDIuNi4wXG4gKiBAcmV0dXJucyB7bnVtYmVyfG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lUmVtYWluaW5nKCkge1xuICAgIGlmIChtYXhUaW1lKCkgPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBtYXhUaW1lKCkgLSBlbGFwc2VkVGltZSgpO1xufVxuXG4vKipcbiAqIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFjdGl2aXR5LCBpbmNsdWRpbmdcbiAqIGl0ZW1zIHdpdGhpbiBzZWN0aW9ucyBpZiByZWxldmFudC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdGFsSXRlbXMoKSB7XG4gICAgaWYgKGhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgbGV0IG51bUl0ZW1zID0gMDtcbiAgICAgICAgbGV0IGFsbFNlY3Rpb25zID0gc2VjdGlvbnMuc2VjdGlvbnMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbnVtSXRlbXMgKz0gYWxsU2VjdGlvbnNbaV0uaXRlbXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1JdGVtcztcbiAgICB9IGVsc2UgaWYgKGlzQWRhcHRpdmUoKSkge1xuICAgICAgICBpZiAoYWN0aXZpdHkoKS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5KCkuaXRlbXMubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1RoaXMgaXMgYW4gYWRhcHRpdmUgc2Vzc2lvbiwgbm8gaXRlbXMgYXJyYXkgZm91bmQnKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2aXR5KCkuaXRlbXMubGVuZ3RoO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgYHVzZXJfaWRgIGFzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VySWQoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/LnVzZXJfaWQ7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/core/activity.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/app.js": -/*!************************************!*\ - !*** ./src/assessment/core/app.js ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ annotationsApp: () => (/* binding */ annotationsApp),\n/* harmony export */ appInstance: () => (/* binding */ appInstance),\n/* harmony export */ assessApp: () => (/* binding */ assessApp),\n/* harmony export */ eventsApp: () => (/* binding */ eventsApp),\n/* harmony export */ init: () => (/* binding */ init),\n/* harmony export */ questionsApp: () => (/* binding */ questionsApp)\n/* harmony export */ });\n/* harmony import */ var _diagnostics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./diagnostics */ \"./src/assessment/core/diagnostics.js\");\n/* harmony import */ var _questions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questions */ \"./src/assessment/core/questions.js\");\n\n\n\n/**\n * Learnosity Toolkit constructor module.\n * @module Assessment/App\n */\n\nconst state = {};\n\n/**\n * Constructor method for Learnosity Toolkit.\n * @since 0.1.0\n * @param {object} app - Items API app instance\n * @example\n * // Declare and set your variable with the Items API LearnosityItems.init() method\n * const itemsApp = LearnosityItems.init(signedConfigObject);\n *\n * // Pass that app instance to the Toolkit constructor in the Items API readyListener()\n * import { LT } from '[path/to/tookit/index]';\n * LT.init(itemsApp);\n *\n * // Can be handy in the global scope for development\n * window.LT = LT;\n */\nfunction init(app) {\n state.app = app;\n setupListeners();\n}\n\n/**\n * Returns the Items API app instance that the host page declared.\n * @since 0.1.0\n * @returns {object}\n */\nfunction appInstance() {\n return state.app;\n}\n\n/**\n * The Annotations API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction annotationsApp() {\n return appInstance().annotationsApp() !== undefined ? appInstance().annotationsApp() : null;\n}\n\n/**\n * The Assess API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction assessApp() {\n return appInstance().assessApp();\n}\n\n/**\n * The Events API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction eventsApp() {\n return appInstance().eventsApp();\n}\n\n/**\n * The Questions API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction questionsApp() {\n return appInstance().questionsApp();\n}\n\n/**\n * Sets up item and question listeners to pass to the diagnostics module.\n * Should not be called externally.\n * @since 0.1.0\n * @ignore\n */\nfunction setupListeners() {\n // Sends all Items and Assess API events for handling.\n state.app.on('all', e => {\n (0,_diagnostics__WEBPACK_IMPORTED_MODULE_0__.handleEvent)(e);\n });\n\n // Sends Questions API `changed` event for handling.\n state.app.on('item:load', e => {\n let response_ids = (0,_questions__WEBPACK_IMPORTED_MODULE_1__.questionResponseIds)();\n response_ids.forEach(id => {\n state.app.question(id).on('changed', ev => {\n (0,_diagnostics__WEBPACK_IMPORTED_MODULE_0__.handleEvent)('changed');\n });\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2FwcC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUE0QztBQUNNOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHlEQUFXO0FBQ25CLEtBQUs7O0FBRUw7QUFDQTtBQUNBLDJCQUEyQiwrREFBbUI7QUFDOUM7QUFDQTtBQUNBLGdCQUFnQix5REFBVztBQUMzQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9jb3JlL2FwcC5qcz85MWRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhhbmRsZUV2ZW50IH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgeyBxdWVzdGlvblJlc3BvbnNlSWRzIH0gZnJvbSAnLi9xdWVzdGlvbnMnO1xuXG4vKipcbiAqIExlYXJub3NpdHkgVG9vbGtpdCBjb25zdHJ1Y3RvciBtb2R1bGUuXG4gKiBAbW9kdWxlIEFzc2Vzc21lbnQvQXBwXG4gKi9cblxuY29uc3Qgc3RhdGUgPSB7fTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBtZXRob2QgZm9yIExlYXJub3NpdHkgVG9vbGtpdC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtvYmplY3R9IGFwcCAtIEl0ZW1zIEFQSSBhcHAgaW5zdGFuY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWNsYXJlIGFuZCBzZXQgeW91ciB2YXJpYWJsZSB3aXRoIHRoZSBJdGVtcyBBUEkgTGVhcm5vc2l0eUl0ZW1zLmluaXQoKSBtZXRob2RcbiAqIGNvbnN0IGl0ZW1zQXBwID0gTGVhcm5vc2l0eUl0ZW1zLmluaXQoc2lnbmVkQ29uZmlnT2JqZWN0KTtcbiAqXG4gKiAvLyBQYXNzIHRoYXQgYXBwIGluc3RhbmNlIHRvIHRoZSBUb29sa2l0IGNvbnN0cnVjdG9yIGluIHRoZSBJdGVtcyBBUEkgcmVhZHlMaXN0ZW5lcigpXG4gKiBpbXBvcnQgeyBMVCB9IGZyb20gJ1twYXRoL3RvL3Rvb2tpdC9pbmRleF0nO1xuICogTFQuaW5pdChpdGVtc0FwcCk7XG4gKlxuICogLy8gQ2FuIGJlIGhhbmR5IGluIHRoZSBnbG9iYWwgc2NvcGUgZm9yIGRldmVsb3BtZW50XG4gKiB3aW5kb3cuTFQgPSBMVDtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQoYXBwKSB7XG4gICAgc3RhdGUuYXBwID0gYXBwO1xuICAgIHNldHVwTGlzdGVuZXJzKCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgSXRlbXMgQVBJIGFwcCBpbnN0YW5jZSB0aGF0IHRoZSBob3N0IHBhZ2UgZGVjbGFyZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gc3RhdGUuYXBwO1xufVxuXG4vKipcbiAqIFRoZSBBbm5vdGF0aW9ucyBBUEkgYXBwIGluc3RhbmNlLCBvciBgbnVsbGAgaWYgbm90IGxvYWRlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdCB8IG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uc0FwcCgpIHtcbiAgICByZXR1cm4gYXBwSW5zdGFuY2UoKS5hbm5vdGF0aW9uc0FwcCgpICE9PSB1bmRlZmluZWQgPyBhcHBJbnN0YW5jZSgpLmFubm90YXRpb25zQXBwKCkgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBBc3Nlc3MgQVBJIGFwcCBpbnN0YW5jZSwgb3IgYG51bGxgIGlmIG5vdCBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXNzQXBwKCkge1xuICAgIHJldHVybiBhcHBJbnN0YW5jZSgpLmFzc2Vzc0FwcCgpO1xufVxuXG4vKipcbiAqIFRoZSBFdmVudHMgQVBJIGFwcCBpbnN0YW5jZSwgb3IgYG51bGxgIGlmIG5vdCBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRzQXBwKCkge1xuICAgIHJldHVybiBhcHBJbnN0YW5jZSgpLmV2ZW50c0FwcCgpO1xufVxuXG4vKipcbiAqIFRoZSBRdWVzdGlvbnMgQVBJIGFwcCBpbnN0YW5jZSwgb3IgYG51bGxgIGlmIG5vdCBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb25zQXBwKCkge1xuICAgIHJldHVybiBhcHBJbnN0YW5jZSgpLnF1ZXN0aW9uc0FwcCgpO1xufVxuXG4vKipcbiAqIFNldHMgdXAgaXRlbSBhbmQgcXVlc3Rpb24gbGlzdGVuZXJzIHRvIHBhc3MgdG8gdGhlIGRpYWdub3N0aWNzIG1vZHVsZS5cbiAqIFNob3VsZCBub3QgYmUgY2FsbGVkIGV4dGVybmFsbHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0dXBMaXN0ZW5lcnMoKSB7XG4gICAgLy8gU2VuZHMgYWxsIEl0ZW1zIGFuZCBBc3Nlc3MgQVBJIGV2ZW50cyBmb3IgaGFuZGxpbmcuXG4gICAgc3RhdGUuYXBwLm9uKCdhbGwnLCBlID0+IHtcbiAgICAgICAgaGFuZGxlRXZlbnQoZSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZW5kcyBRdWVzdGlvbnMgQVBJIGBjaGFuZ2VkYCBldmVudCBmb3IgaGFuZGxpbmcuXG4gICAgc3RhdGUuYXBwLm9uKCdpdGVtOmxvYWQnLCBlID0+IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlX2lkcyA9IHF1ZXN0aW9uUmVzcG9uc2VJZHMoKTtcbiAgICAgICAgcmVzcG9uc2VfaWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgc3RhdGUuYXBwLnF1ZXN0aW9uKGlkKS5vbignY2hhbmdlZCcsIGV2ID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVFdmVudCgnY2hhbmdlZCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/app.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/diagnostics.js": -/*!********************************************!*\ - !*** ./src/assessment/core/diagnostics.js ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ diagnostics: () => (/* binding */ diagnostics),\n/* harmony export */ filterEvent: () => (/* binding */ filterEvent),\n/* harmony export */ handleEvent: () => (/* binding */ handleEvent),\n/* harmony export */ listen: () => (/* binding */ listen)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _dist_version_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../dist/version.js */ \"./dist/version.js\");\n\n\n\n\n\n/**\n * Diagnostic/metadata information for Items API.\n * @module Assessment/Diagnostics\n */\n\nconst state = {\n events: {\n broadcast: false,\n listenFor: 'item',\n },\n};\n\n/**\n * Returns an object of diagnostic information about\n * the current session.\n * @since 0.1.0\n * @returns {object}\n * @example\n * // Sample returned object\n * {\n * \"apps\": {\n * \"annotations\": {\n * \"app\": {},\n * \"config\": true,\n * \"enabled\": true\n * },\n * \"assess\": {\n * \"app\": {}\n * },\n * \"events\": {\n * \"app\": null,\n * \"enabled\": false\n * },\n * \"items\": {\n * \"app\": {},\n * \"metadata\": {\n * \"items_api_version\": \"v1.118.3\"\n * }\n * },\n * \"questions\": {\n * \"app\": {}\n * }\n * },\n * \"activity\": {\n * \"activity\": \"items-api-demo\",\n * \"autoSave\": {\n * \"config\": {\n * \"save_interval_duration\": 300\n * },\n * \"enabled\": true\n * },\n * \"itemBank\": 6,\n * \"session\": \"f85afe9c-342e-4363-8d70-ad3c665566c0\",\n * \"state\": \"initial\",\n * \"type\": \"submit_practice\",\n * \"user\": \"labs-site\"\n * },\n * \"versions\": {\n * \"requested\": \"v2023.2.LTS\",\n * \"mapped\": \"v2.197\",\n * \"concrete\": \"v2.197.5\",\n * \"server\": \"v2023.2.LTS\",\n * \"assets\": \"v2.197.5\"\n * }\n * }\n */\nfunction diagnostics() {\n let v = window.LearnosityApp ? LearnosityApp.versions : {};\n let d = {\n apps: {\n annotations: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.annotationsApp(),\n config: _activity__WEBPACK_IMPORTED_MODULE_1__.annotationsConfig(),\n enabled: _activity__WEBPACK_IMPORTED_MODULE_1__.hasAnnotations(),\n },\n assess: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.assessApp(),\n },\n events: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.eventsApp(),\n enabled: _activity__WEBPACK_IMPORTED_MODULE_1__.hasEvents(),\n },\n items: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.appInstance(),\n metadata: _activity__WEBPACK_IMPORTED_MODULE_1__.activity().config.metadata,\n },\n questions: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.questionsApp(),\n },\n },\n activity: {\n activity: _activity__WEBPACK_IMPORTED_MODULE_1__.activityId(),\n activityTemplate: _activity__WEBPACK_IMPORTED_MODULE_1__.activityTemplateId(),\n autoSave: {\n config: _activity__WEBPACK_IMPORTED_MODULE_1__.autoSaveConfig(),\n enabled: _activity__WEBPACK_IMPORTED_MODULE_1__.hasAutoSave(),\n },\n itemBank: _activity__WEBPACK_IMPORTED_MODULE_1__.itemBank(),\n itemPool: _activity__WEBPACK_IMPORTED_MODULE_1__.itemPool(),\n session: _activity__WEBPACK_IMPORTED_MODULE_1__.sessionId(),\n state: _activity__WEBPACK_IMPORTED_MODULE_1__.state(),\n type: _activity__WEBPACK_IMPORTED_MODULE_1__.activity().type,\n user: _activity__WEBPACK_IMPORTED_MODULE_1__.userId(),\n },\n LT: {\n version: _dist_version_js__WEBPACK_IMPORTED_MODULE_3__.version,\n },\n versions: v,\n };\n return d;\n}\n\n/**\n * Which event(s) you want to listen for on the console.\n * You must call `listen()` first to start broadcasting.\n *\n * Pass any of the following:\n * - exact event (https://reference.learnosity.com/items-api/events) or;\n * - `*` for all events or;\n * - left or right wildcards via `*`\n * @since 0.1.0\n * @param {string} event\n * @example\n * LT.listen();\n * LT.filterEvent('item*');\n */\nfunction filterEvent(event) {\n const regex = /^[a-zA-Z:*]*$/;\n if (regex.test(event)) {\n state.events.listenFor = event;\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].warn('Invalid event type');\n }\n}\n\n/**\n * Accepts an event when triggered, optionally write to the console.\n * This is triggered internally so should not be called directly.\n * @since 0.1.0\n * @param {string} event\n * @ignore\n */\nfunction handleEvent(event) {\n if (state.events.broadcast) {\n const eventPattern = state.events.listenFor;\n const eventListeningFor = eventPattern.replaceAll('*', '');\n if ((eventPattern.length === 1 && eventPattern === '*') || eventPattern === 'all') {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n } else if (eventPattern.startsWith('*') && !eventPattern.endsWith('*')) {\n if (event.endsWith(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n } else if (eventPattern.endsWith('*') && !eventPattern.startsWith('*')) {\n if (event.startsWith(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n } else if (eventPattern.startsWith('*') && eventPattern.endsWith('*')) {\n if (event.includes(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n } else {\n if (event.startsWith(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n }\n }\n}\n\n/**\n * Enables or disabled any console logging of events.\n * Defaults to `true`, turn off by passing a falsy.\n * @since 0.1.0\n * @param {boolean=} status\n */\nfunction listen(status = true) {\n state.events.broadcast = Boolean(status);\n if (Boolean(status)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(`👂 listening for '${state.events.listenFor}'`);\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info('🚫👂 not listening');\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2RpYWdub3N0aWNzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQTZCO0FBQ1U7QUFDQztBQUNXOztBQUVuRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixnREFBa0I7QUFDdkMsd0JBQXdCLHdEQUEwQjtBQUNsRCx5QkFBeUIscURBQXVCO0FBQ2hELGFBQWE7QUFDYjtBQUNBLHFCQUFxQiwyQ0FBYTtBQUNsQyxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsMkNBQWE7QUFDbEMseUJBQXlCLGdEQUFrQjtBQUMzQyxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsNkNBQWU7QUFDcEMsMEJBQTBCLCtDQUFpQjtBQUMzQyxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsOENBQWdCO0FBQ3JDLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxzQkFBc0IsaURBQW1CO0FBQ3pDLDhCQUE4Qix5REFBMkI7QUFDekQ7QUFDQSx3QkFBd0IscURBQXVCO0FBQy9DLHlCQUF5QixrREFBb0I7QUFDN0MsYUFBYTtBQUNiLHNCQUFzQiwrQ0FBaUI7QUFDdkMsc0JBQXNCLCtDQUFpQjtBQUN2QyxxQkFBcUIsZ0RBQWtCO0FBQ3ZDLG1CQUFtQiw0Q0FBYztBQUNqQyxrQkFBa0IsK0NBQWlCO0FBQ25DLGtCQUFrQiw2Q0FBZTtBQUNqQyxTQUFTO0FBQ1Q7QUFDQSxxQkFBcUIscURBQU87QUFDNUIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLFFBQVEscURBQU07QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxREFBTTtBQUNsQixVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDTztBQUNQO0FBQ0E7QUFDQSxRQUFRLHFEQUFNLDJCQUEyQix1QkFBdUI7QUFDaEUsTUFBTTtBQUNOLFFBQVEscURBQU07QUFDZDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvZGlhZ25vc3RpY3MuanM/YjZiZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi9hcHAnO1xuaW1wb3J0ICogYXMgYWN0aXZpdHkgZnJvbSAnLi9hY3Rpdml0eSc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vZGlzdC92ZXJzaW9uLmpzJztcblxuLyoqXG4gKiBEaWFnbm9zdGljL21ldGFkYXRhIGluZm9ybWF0aW9uIGZvciBJdGVtcyBBUEkuXG4gKiBAbW9kdWxlIEFzc2Vzc21lbnQvRGlhZ25vc3RpY3NcbiAqL1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICBldmVudHM6IHtcbiAgICAgICAgYnJvYWRjYXN0OiBmYWxzZSxcbiAgICAgICAgbGlzdGVuRm9yOiAnaXRlbScsXG4gICAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgb2YgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBhYm91dFxuICogdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gU2FtcGxlIHJldHVybmVkIG9iamVjdFxuICogIHtcbiAqICAgICAgXCJhcHBzXCI6IHtcbiAqICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge1xuICogICAgICAgICAgICAgIFwiYXBwXCI6IHt9LFxuICogICAgICAgICAgICAgIFwiY29uZmlnXCI6IHRydWUsXG4gKiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IHRydWVcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcImFzc2Vzc1wiOiB7XG4gKiAgICAgICAgICAgICAgXCJhcHBcIjoge31cbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcImV2ZW50c1wiOiB7XG4gKiAgICAgICAgICAgICAgXCJhcHBcIjogbnVsbCxcbiAqICAgICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2VcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcIml0ZW1zXCI6IHtcbiAqICAgICAgICAgICAgICBcImFwcFwiOiB7fSxcbiAqICAgICAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgXCJpdGVtc19hcGlfdmVyc2lvblwiOiBcInYxLjExOC4zXCJcbiAqICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICB9LFxuICogICAgICAgICAgXCJxdWVzdGlvbnNcIjoge1xuICogICAgICAgICAgICAgIFwiYXBwXCI6IHt9XG4gKiAgICAgICAgICB9XG4gKiAgICAgIH0sXG4gKiAgICAgIFwiYWN0aXZpdHlcIjoge1xuICogICAgICAgICAgXCJhY3Rpdml0eVwiOiBcIml0ZW1zLWFwaS1kZW1vXCIsXG4gKiAgICAgICAgICBcImF1dG9TYXZlXCI6IHtcbiAqICAgICAgICAgICAgICBcImNvbmZpZ1wiOiB7XG4gKiAgICAgICAgICAgICAgICAgIFwic2F2ZV9pbnRlcnZhbF9kdXJhdGlvblwiOiAzMDBcbiAqICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlXG4gKiAgICAgICAgICB9LFxuICogICAgICAgICAgXCJpdGVtQmFua1wiOiA2LFxuICogICAgICAgICAgXCJzZXNzaW9uXCI6IFwiZjg1YWZlOWMtMzQyZS00MzYzLThkNzAtYWQzYzY2NTU2NmMwXCIsXG4gKiAgICAgICAgICBcInN0YXRlXCI6IFwiaW5pdGlhbFwiLFxuICogICAgICAgICAgXCJ0eXBlXCI6IFwic3VibWl0X3ByYWN0aWNlXCIsXG4gKiAgICAgICAgICBcInVzZXJcIjogXCJsYWJzLXNpdGVcIlxuICogICAgICB9LFxuICogICAgICBcInZlcnNpb25zXCI6IHtcbiAqICAgICAgICAgIFwicmVxdWVzdGVkXCI6IFwidjIwMjMuMi5MVFNcIixcbiAqICAgICAgICAgIFwibWFwcGVkXCI6IFwidjIuMTk3XCIsXG4gKiAgICAgICAgICBcImNvbmNyZXRlXCI6IFwidjIuMTk3LjVcIixcbiAqICAgICAgICAgIFwic2VydmVyXCI6IFwidjIwMjMuMi5MVFNcIixcbiAqICAgICAgICAgIFwiYXNzZXRzXCI6IFwidjIuMTk3LjVcIlxuICogICAgICB9XG4gKiAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlhZ25vc3RpY3MoKSB7XG4gICAgbGV0IHYgPSB3aW5kb3cuTGVhcm5vc2l0eUFwcCA/IExlYXJub3NpdHlBcHAudmVyc2lvbnMgOiB7fTtcbiAgICBsZXQgZCA9IHtcbiAgICAgICAgYXBwczoge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBhcHA6IGFwcC5hbm5vdGF0aW9uc0FwcCgpLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogYWN0aXZpdHkuYW5ub3RhdGlvbnNDb25maWcoKSxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBhY3Rpdml0eS5oYXNBbm5vdGF0aW9ucygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzc2Vzczoge1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLmFzc2Vzc0FwcCgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLmV2ZW50c0FwcCgpLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGFjdGl2aXR5Lmhhc0V2ZW50cygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgYXBwOiBhcHAuYXBwSW5zdGFuY2UoKSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogYWN0aXZpdHkuYWN0aXZpdHkoKS5jb25maWcubWV0YWRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcXVlc3Rpb25zOiB7XG4gICAgICAgICAgICAgICAgYXBwOiBhcHAucXVlc3Rpb25zQXBwKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhY3Rpdml0eToge1xuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5LmFjdGl2aXR5SWQoKSxcbiAgICAgICAgICAgIGFjdGl2aXR5VGVtcGxhdGU6IGFjdGl2aXR5LmFjdGl2aXR5VGVtcGxhdGVJZCgpLFxuICAgICAgICAgICAgYXV0b1NhdmU6IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IGFjdGl2aXR5LmF1dG9TYXZlQ29uZmlnKCksXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogYWN0aXZpdHkuaGFzQXV0b1NhdmUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpdGVtQmFuazogYWN0aXZpdHkuaXRlbUJhbmsoKSxcbiAgICAgICAgICAgIGl0ZW1Qb29sOiBhY3Rpdml0eS5pdGVtUG9vbCgpLFxuICAgICAgICAgICAgc2Vzc2lvbjogYWN0aXZpdHkuc2Vzc2lvbklkKCksXG4gICAgICAgICAgICBzdGF0ZTogYWN0aXZpdHkuc3RhdGUoKSxcbiAgICAgICAgICAgIHR5cGU6IGFjdGl2aXR5LmFjdGl2aXR5KCkudHlwZSxcbiAgICAgICAgICAgIHVzZXI6IGFjdGl2aXR5LnVzZXJJZCgpLFxuICAgICAgICB9LFxuICAgICAgICBMVDoge1xuICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgdmVyc2lvbnM6IHYsXG4gICAgfTtcbiAgICByZXR1cm4gZDtcbn1cblxuLyoqXG4gKiBXaGljaCBldmVudChzKSB5b3Ugd2FudCB0byBsaXN0ZW4gZm9yIG9uIHRoZSBjb25zb2xlLlxuICogWW91IG11c3QgY2FsbCBgbGlzdGVuKClgIGZpcnN0IHRvIHN0YXJ0IGJyb2FkY2FzdGluZy5cbiAqXG4gKiBQYXNzIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICogLSBleGFjdCBldmVudCAoaHR0cHM6Ly9yZWZlcmVuY2UubGVhcm5vc2l0eS5jb20vaXRlbXMtYXBpL2V2ZW50cykgb3I7XG4gKiAtIGAqYCBmb3IgYWxsIGV2ZW50cyBvcjtcbiAqIC0gbGVmdCBvciByaWdodCB3aWxkY2FyZHMgdmlhIGAqYFxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAqIEBleGFtcGxlXG4gKiBMVC5saXN0ZW4oKTtcbiAqIExULmZpbHRlckV2ZW50KCdpdGVtKicpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCByZWdleCA9IC9eW2EtekEtWjoqXSokLztcbiAgICBpZiAocmVnZXgudGVzdChldmVudCkpIHtcbiAgICAgICAgc3RhdGUuZXZlbnRzLmxpc3RlbkZvciA9IGV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdJbnZhbGlkIGV2ZW50IHR5cGUnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyBhbiBldmVudCB3aGVuIHRyaWdnZXJlZCwgb3B0aW9uYWxseSB3cml0ZSB0byB0aGUgY29uc29sZS5cbiAqIFRoaXMgaXMgdHJpZ2dlcmVkIGludGVybmFsbHkgc28gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICBpZiAoc3RhdGUuZXZlbnRzLmJyb2FkY2FzdCkge1xuICAgICAgICBjb25zdCBldmVudFBhdHRlcm4gPSBzdGF0ZS5ldmVudHMubGlzdGVuRm9yO1xuICAgICAgICBjb25zdCBldmVudExpc3RlbmluZ0ZvciA9IGV2ZW50UGF0dGVybi5yZXBsYWNlQWxsKCcqJywgJycpO1xuICAgICAgICBpZiAoKGV2ZW50UGF0dGVybi5sZW5ndGggPT09IDEgJiYgZXZlbnRQYXR0ZXJuID09PSAnKicpIHx8IGV2ZW50UGF0dGVybiA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudFBhdHRlcm4uc3RhcnRzV2l0aCgnKicpICYmICFldmVudFBhdHRlcm4uZW5kc1dpdGgoJyonKSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmVuZHNXaXRoKGV2ZW50TGlzdGVuaW5nRm9yKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudFBhdHRlcm4uZW5kc1dpdGgoJyonKSAmJiAhZXZlbnRQYXR0ZXJuLnN0YXJ0c1dpdGgoJyonKSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnN0YXJ0c1dpdGgoZXZlbnRMaXN0ZW5pbmdGb3IpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50UGF0dGVybi5zdGFydHNXaXRoKCcqJykgJiYgZXZlbnRQYXR0ZXJuLmVuZHNXaXRoKCcqJykpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5pbmNsdWRlcyhldmVudExpc3RlbmluZ0ZvcikpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc3RhcnRzV2l0aChldmVudExpc3RlbmluZ0ZvcikpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlZCBhbnkgY29uc29sZSBsb2dnaW5nIG9mIGV2ZW50cy5cbiAqIERlZmF1bHRzIHRvIGB0cnVlYCwgdHVybiBvZmYgYnkgcGFzc2luZyBhIGZhbHN5LlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzdGF0dXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihzdGF0dXMgPSB0cnVlKSB7XG4gICAgc3RhdGUuZXZlbnRzLmJyb2FkY2FzdCA9IEJvb2xlYW4oc3RhdHVzKTtcbiAgICBpZiAoQm9vbGVhbihzdGF0dXMpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGDwn5GCIGxpc3RlbmluZyBmb3IgJyR7c3RhdGUuZXZlbnRzLmxpc3RlbkZvcn0nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ/Cfmqvwn5GCIG5vdCBsaXN0ZW5pbmcnKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/core/diagnostics.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/items.js": -/*!**************************************!*\ - !*** ./src/assessment/core/items.js ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ dynamic: () => (/* binding */ dynamic),\n/* harmony export */ flag: () => (/* binding */ flag),\n/* harmony export */ isDynamicItem: () => (/* binding */ isDynamicItem),\n/* harmony export */ isFirstItem: () => (/* binding */ isFirstItem),\n/* harmony export */ isFlagged: () => (/* binding */ isFlagged),\n/* harmony export */ isItemFullyAttempted: () => (/* binding */ isItemFullyAttempted),\n/* harmony export */ isLastItem: () => (/* binding */ isLastItem),\n/* harmony export */ isMaskingEnabled: () => (/* binding */ isMaskingEnabled),\n/* harmony export */ item: () => (/* binding */ item),\n/* harmony export */ itemAttemptStatus: () => (/* binding */ itemAttemptStatus),\n/* harmony export */ itemByResponseId: () => (/* binding */ itemByResponseId),\n/* harmony export */ itemElement: () => (/* binding */ itemElement),\n/* harmony export */ itemPosition: () => (/* binding */ itemPosition),\n/* harmony export */ itemReference: () => (/* binding */ itemReference),\n/* harmony export */ itemTags: () => (/* binding */ itemTags)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _questions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var _sections__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sections */ \"./src/assessment/core/sections.js\");\n\n\n\n\n\n/**\n * Everything relating to the items in the activity.\n * @module Assessment/Items\n */\n\n/**\n * The dynamic object for the current item. Useful when\n * using dynamic content with try again.\n * https://reference.learnosity.com/items-api/methods/item/dynamic\n * @since 1.4.0\n * @returns {object}\n */\nfunction dynamic() {\n const reference = itemReference();\n return _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().item(reference).dynamic || {};\n}\n\n/**\n * Toggles the `user_flagged` state on the current item.\n * @since 1.4.0\n */\nfunction flag() {\n const reference = itemReference();\n _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().item(reference).flag();\n}\n\n/**\n * Whether the current item has dynamic content.\n * @since 1.4.0\n * @returns {boolean}\n */\nfunction isDynamicItem() {\n return item()?.source.hasOwnProperty('data_table_seed');\n}\n\n/**\n * Whether the current item is the first item in the activity.\n * This ignores sections, so will be a global check.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isFirstItem() {\n let reference;\n\n if (_activity__WEBPACK_IMPORTED_MODULE_1__.hasSections()) {\n reference = typeof _sections__WEBPACK_IMPORTED_MODULE_3__.sections()[0].items[0] === 'object' ? _sections__WEBPACK_IMPORTED_MODULE_3__.sections()[0].items[0].reference : _sections__WEBPACK_IMPORTED_MODULE_3__.sections()[0].items[0];\n return reference === item().reference;\n } else {\n reference = typeof _activity__WEBPACK_IMPORTED_MODULE_1__.activity().items[0] === 'object' ? _activity__WEBPACK_IMPORTED_MODULE_1__.activity().items[0].reference : _activity__WEBPACK_IMPORTED_MODULE_1__.activity().items[0];\n return reference === item().reference;\n }\n}\n\n/**\n * Whether the current item is the last item in the activity.\n * This ignores sections, so will be a global check.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isLastItem() {\n return item().is_last_item;\n}\n\n/**\n * Whether the current item has been flagged by the user.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isFlagged() {\n return item().user_flagged;\n}\n\n/**\n * Checks whether the entire item has been fully attempted.\n * Returns `false` if _all_ possible responses haven't been\n * attempted (eg on cloze types). Handles multi-part items.\n * @since 0.1.0\n * @param {string} reference Optionally pass an exact item reference.\n * @returns {boolean}\n */\nfunction isItemFullyAttempted(reference) {\n let itemQuestions;\n let attempted;\n let r;\n\n if (reference) {\n itemQuestions = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getItems()[reference]['questions'];\n } else {\n itemQuestions = _questions__WEBPACK_IMPORTED_MODULE_2__.questions();\n }\n\n if (Array.isArray(itemQuestions) && itemQuestions.length) {\n for (let i = 0; i < itemQuestions.length; i++) {\n let q = itemQuestions[i];\n r = _questions__WEBPACK_IMPORTED_MODULE_2__.questionResponse(q.response_id);\n if (r) {\n if (q.hasOwnProperty('metadata') && q.metadata.hasOwnProperty('valid_response_count')) {\n if (Array.isArray(r.value)) {\n const undefinedValues = r.value.filter(v => v === undefined);\n if (undefinedValues.length) {\n // A single question wasn't fully attempted\n return false;\n }\n const nullValues = r.value.filter(v => v === null);\n if (nullValues.length) {\n // A single question wasn't fully attempted\n return false;\n }\n }\n }\n attempted = true;\n } else {\n // We found at least one question with no response object\n return false;\n }\n }\n } else {\n attempted = true; // Technically not correct, but avoids logic problems by the caller\n }\n\n return attempted;\n}\n\n/**\n * Whether the current item has answer masking enabled.\n * @since 0.4.0\n * @returns {boolean}\n */\nfunction isMaskingEnabled() {\n return Boolean(document.querySelector('.lrn-masking'));\n}\n\n/**\n * JSON object for the current item.\n * @since 0.1.0\n * @param {string} reference Optionally pass an exact item reference.\n * @returns {object} An item JSON object.\n */\nfunction item(reference) {\n if (reference) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getItems()[reference];\n }\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getCurrentItem();\n}\n\n/**\n * Whether the current item has been attempted. Return value can be:\n * - `not_attempted`\n * - `fully_attempted`\n * - `partially_attempted`\n *\n * Partially attempted items may be where there are 2+ questions\n * on the item and only 1 has been attempted.\n *\n * Note that if a question accepts multiple responses, eg multiple\n * dropdown elements, this method will return `fully_attempted` even\n * if not all responses have been attempted. If you want to check _all_\n * responses have been attempted use `isItemFullyAttempted()`.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemAttemptStatus() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getCurrentItem().attempt_status;\n}\n\n/**\n * Returns an item object by response id.\n * @since 1.1.0\n * @param {string} response_id\n * @returns {object} An item JSON object.\n */\nfunction itemByResponseId(response_id) {\n const items = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getItems();\n let item;\n\n for (const ref in items) {\n if (items[ref].response_ids.includes(response_id)) {\n item = items[ref];\n break;\n }\n }\n\n return item;\n}\n\n/**\n * The current item DOM element.\n * @since 0.4.0\n * @returns {object} HTML DOM element\n * ```\n *
\n * ...\n *
\n * ```\n */\nfunction itemElement() {\n return document.querySelector(`div[data-reference='${itemReference()}']`);\n}\n\n/**\n * The current item position, 1-based (not 0-based), in the activity.\n * This ignores sections, so returns the global item position.\n * @since 0.1.0\n * @returns {number}\n */\nfunction itemPosition() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().assessApp().getItemPosition(itemReference()) + 1;\n}\n\n/**\n * The reference of the current item.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemReference() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getCurrentItem().reference;\n}\n\n/**\n * All tags that have been set against the current item.\n * Requires `retrieve_tags` to be set to `true` in the\n * Items API configuration.\n * @since 2.9.0\n * @returns {array}\n */\nfunction itemTags(reference) {\n const tags = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getTags();\n const itemRef = reference || itemReference();\n\n return tags[itemRef] || [];\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2l0ZW1zLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBNkI7QUFDVTtBQUNFO0FBQ0Y7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0EsV0FBVywyQ0FBYTtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxJQUFJLDJDQUFhO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7O0FBRUEsUUFBUSxrREFBb0I7QUFDNUIsMkJBQTJCLCtDQUFpQiw4QkFBOEIsK0NBQWlCLDJCQUEyQiwrQ0FBaUI7QUFDdkk7QUFDQSxNQUFNO0FBQ04sMkJBQTJCLCtDQUFpQiwyQkFBMkIsK0NBQWlCLHdCQUF3QiwrQ0FBaUI7QUFDakk7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLDZDQUFlO0FBQ3ZDLE1BQU07QUFDTix3QkFBd0IsaURBQW1CO0FBQzNDOztBQUVBO0FBQ0Esd0JBQXdCLDBCQUEwQjtBQUNsRDtBQUNBLGdCQUFnQix3REFBMEI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQO0FBQ0EsZUFBZSw2Q0FBZTtBQUM5QjtBQUNBLFdBQVcsNkNBQWU7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyw2Q0FBZTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ087QUFDUCxrQkFBa0IsNkNBQWU7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AseURBQXlELGdCQUFnQjtBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyw2Q0FBZTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLFdBQVcsNkNBQWU7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsaUJBQWlCLDZDQUFlO0FBQ2hDOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvY29yZS9pdGVtcy5qcz9jNzk5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuL2FwcCc7XG5pbXBvcnQgKiBhcyBhY3Rpdml0eSBmcm9tICcuL2FjdGl2aXR5JztcbmltcG9ydCAqIGFzIHF1ZXN0aW9ucyBmcm9tICcuL3F1ZXN0aW9ucyc7XG5pbXBvcnQgKiBhcyBzZWN0aW9ucyBmcm9tICcuL3NlY3Rpb25zJztcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHJlbGF0aW5nIHRvIHRoZSBpdGVtcyBpbiB0aGUgYWN0aXZpdHkuXG4gKiBAbW9kdWxlIEFzc2Vzc21lbnQvSXRlbXNcbiAqL1xuXG4vKipcbiAqIFRoZSBkeW5hbWljIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgaXRlbS4gVXNlZnVsIHdoZW5cbiAqIHVzaW5nIGR5bmFtaWMgY29udGVudCB3aXRoIHRyeSBhZ2Fpbi5cbiAqIGh0dHBzOi8vcmVmZXJlbmNlLmxlYXJub3NpdHkuY29tL2l0ZW1zLWFwaS9tZXRob2RzL2l0ZW0vZHluYW1pY1xuICogQHNpbmNlIDEuNC4wXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pYygpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBpdGVtUmVmZXJlbmNlKCk7XG4gICAgcmV0dXJuIGFwcC5hc3Nlc3NBcHAoKS5pdGVtKHJlZmVyZW5jZSkuZHluYW1pYyB8fCB7fTtcbn1cblxuLyoqXG4gKiBUb2dnbGVzIHRoZSBgdXNlcl9mbGFnZ2VkYCBzdGF0ZSBvbiB0aGUgY3VycmVudCBpdGVtLlxuICogQHNpbmNlIDEuNC4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGFnKCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGl0ZW1SZWZlcmVuY2UoKTtcbiAgICBhcHAuYXNzZXNzQXBwKCkuaXRlbShyZWZlcmVuY2UpLmZsYWcoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaGFzIGR5bmFtaWMgY29udGVudC5cbiAqIEBzaW5jZSAxLjQuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWNJdGVtKCkge1xuICAgIHJldHVybiBpdGVtKCk/LnNvdXJjZS5oYXNPd25Qcm9wZXJ0eSgnZGF0YV90YWJsZV9zZWVkJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBpdGVtIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBhY3Rpdml0eS5cbiAqIFRoaXMgaWdub3JlcyBzZWN0aW9ucywgc28gd2lsbCBiZSBhIGdsb2JhbCBjaGVjay5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SXRlbSgpIHtcbiAgICBsZXQgcmVmZXJlbmNlO1xuXG4gICAgaWYgKGFjdGl2aXR5Lmhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgcmVmZXJlbmNlID0gdHlwZW9mIHNlY3Rpb25zLnNlY3Rpb25zKClbMF0uaXRlbXNbMF0gPT09ICdvYmplY3QnID8gc2VjdGlvbnMuc2VjdGlvbnMoKVswXS5pdGVtc1swXS5yZWZlcmVuY2UgOiBzZWN0aW9ucy5zZWN0aW9ucygpWzBdLml0ZW1zWzBdO1xuICAgICAgICByZXR1cm4gcmVmZXJlbmNlID09PSBpdGVtKCkucmVmZXJlbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZmVyZW5jZSA9IHR5cGVvZiBhY3Rpdml0eS5hY3Rpdml0eSgpLml0ZW1zWzBdID09PSAnb2JqZWN0JyA/IGFjdGl2aXR5LmFjdGl2aXR5KCkuaXRlbXNbMF0ucmVmZXJlbmNlIDogYWN0aXZpdHkuYWN0aXZpdHkoKS5pdGVtc1swXTtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZSA9PT0gaXRlbSgpLnJlZmVyZW5jZTtcbiAgICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBpdGVtIGlzIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFjdGl2aXR5LlxuICogVGhpcyBpZ25vcmVzIHNlY3Rpb25zLCBzbyB3aWxsIGJlIGEgZ2xvYmFsIGNoZWNrLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGFzdEl0ZW0oKSB7XG4gICAgcmV0dXJuIGl0ZW0oKS5pc19sYXN0X2l0ZW07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBpdGVtIGhhcyBiZWVuIGZsYWdnZWQgYnkgdGhlIHVzZXIuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGbGFnZ2VkKCkge1xuICAgIHJldHVybiBpdGVtKCkudXNlcl9mbGFnZ2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbnRpcmUgaXRlbSBoYXMgYmVlbiBmdWxseSBhdHRlbXB0ZWQuXG4gKiBSZXR1cm5zIGBmYWxzZWAgaWYgX2FsbF8gcG9zc2libGUgcmVzcG9uc2VzIGhhdmVuJ3QgYmVlblxuICogYXR0ZW1wdGVkIChlZyBvbiBjbG96ZSB0eXBlcykuIEhhbmRsZXMgbXVsdGktcGFydCBpdGVtcy5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZSBPcHRpb25hbGx5IHBhc3MgYW4gZXhhY3QgaXRlbSByZWZlcmVuY2UuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSXRlbUZ1bGx5QXR0ZW1wdGVkKHJlZmVyZW5jZSkge1xuICAgIGxldCBpdGVtUXVlc3Rpb25zO1xuICAgIGxldCBhdHRlbXB0ZWQ7XG4gICAgbGV0IHI7XG5cbiAgICBpZiAocmVmZXJlbmNlKSB7XG4gICAgICAgIGl0ZW1RdWVzdGlvbnMgPSBhcHAuYXBwSW5zdGFuY2UoKS5nZXRJdGVtcygpW3JlZmVyZW5jZV1bJ3F1ZXN0aW9ucyddO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1RdWVzdGlvbnMgPSBxdWVzdGlvbnMucXVlc3Rpb25zKCk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbVF1ZXN0aW9ucykgJiYgaXRlbVF1ZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcSA9IGl0ZW1RdWVzdGlvbnNbaV07XG4gICAgICAgICAgICByID0gcXVlc3Rpb25zLnF1ZXN0aW9uUmVzcG9uc2UocS5yZXNwb25zZV9pZCk7XG4gICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgIGlmIChxLmhhc093blByb3BlcnR5KCdtZXRhZGF0YScpICYmIHEubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ3ZhbGlkX3Jlc3BvbnNlX2NvdW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuZGVmaW5lZFZhbHVlcyA9IHIudmFsdWUuZmlsdGVyKHYgPT4gdiA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmRlZmluZWRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaW5nbGUgcXVlc3Rpb24gd2Fzbid0IGZ1bGx5IGF0dGVtcHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bGxWYWx1ZXMgPSByLnZhbHVlLmZpbHRlcih2ID0+IHYgPT09IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaW5nbGUgcXVlc3Rpb24gd2Fzbid0IGZ1bGx5IGF0dGVtcHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhdCBsZWFzdCBvbmUgcXVlc3Rpb24gd2l0aCBubyByZXNwb25zZSBvYmplY3RcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlOyAvLyBUZWNobmljYWxseSBub3QgY29ycmVjdCwgYnV0IGF2b2lkcyBsb2dpYyBwcm9ibGVtcyBieSB0aGUgY2FsbGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dGVtcHRlZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaGFzIGFuc3dlciBtYXNraW5nIGVuYWJsZWQuXG4gKiBAc2luY2UgMC40LjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXNraW5nRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubHJuLW1hc2tpbmcnKSk7XG59XG5cbi8qKlxuICogSlNPTiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGl0ZW0uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2UgT3B0aW9uYWxseSBwYXNzIGFuIGV4YWN0IGl0ZW0gcmVmZXJlbmNlLlxuICogQHJldHVybnMge29iamVjdH0gQW4gaXRlbSBKU09OIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZW0ocmVmZXJlbmNlKSB7XG4gICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0SXRlbXMoKVtyZWZlcmVuY2VdO1xuICAgIH1cbiAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0Q3VycmVudEl0ZW0oKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaGFzIGJlZW4gYXR0ZW1wdGVkLiBSZXR1cm4gdmFsdWUgY2FuIGJlOlxuICogIC0gYG5vdF9hdHRlbXB0ZWRgXG4gKiAgLSBgZnVsbHlfYXR0ZW1wdGVkYFxuICogIC0gYHBhcnRpYWxseV9hdHRlbXB0ZWRgXG4gKlxuICogUGFydGlhbGx5IGF0dGVtcHRlZCBpdGVtcyBtYXkgYmUgd2hlcmUgdGhlcmUgYXJlIDIrIHF1ZXN0aW9uc1xuICogb24gdGhlIGl0ZW0gYW5kIG9ubHkgMSBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gKlxuICogTm90ZSB0aGF0IGlmIGEgcXVlc3Rpb24gYWNjZXB0cyBtdWx0aXBsZSByZXNwb25zZXMsIGVnIG11bHRpcGxlXG4gKiBkcm9wZG93biBlbGVtZW50cywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYGZ1bGx5X2F0dGVtcHRlZGAgZXZlblxuICogaWYgbm90IGFsbCByZXNwb25zZXMgaGF2ZSBiZWVuIGF0dGVtcHRlZC4gSWYgeW91IHdhbnQgdG8gY2hlY2sgX2FsbF9cbiAqIHJlc3BvbnNlcyBoYXZlIGJlZW4gYXR0ZW1wdGVkIHVzZSBgaXNJdGVtRnVsbHlBdHRlbXB0ZWQoKWAuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtQXR0ZW1wdFN0YXR1cygpIHtcbiAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0Q3VycmVudEl0ZW0oKS5hdHRlbXB0X3N0YXR1cztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZW0gb2JqZWN0IGJ5IHJlc3BvbnNlIGlkLlxuICogQHNpbmNlIDEuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2VfaWRcbiAqIEByZXR1cm5zIHtvYmplY3R9IEFuIGl0ZW0gSlNPTiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtQnlSZXNwb25zZUlkKHJlc3BvbnNlX2lkKSB7XG4gICAgY29uc3QgaXRlbXMgPSBhcHAuYXBwSW5zdGFuY2UoKS5nZXRJdGVtcygpO1xuICAgIGxldCBpdGVtO1xuXG4gICAgZm9yIChjb25zdCByZWYgaW4gaXRlbXMpIHtcbiAgICAgICAgaWYgKGl0ZW1zW3JlZl0ucmVzcG9uc2VfaWRzLmluY2x1ZGVzKHJlc3BvbnNlX2lkKSkge1xuICAgICAgICAgICAgaXRlbSA9IGl0ZW1zW3JlZl07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtO1xufVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IGl0ZW0gRE9NIGVsZW1lbnQuXG4gKiBAc2luY2UgMC40LjBcbiAqIEByZXR1cm5zIHtvYmplY3R9IEhUTUwgRE9NIGVsZW1lbnRcbiAqIGBgYFxuICogPGRpdiBkYXRhLXJlZmVyZW5jZT1cIltpdGVtLXJlZmVyZW5jZV1cIiBjbGFzcz1cImxlYXJub3NpdHktaXRlbSBscm4tc2Nyb2xsYWJsZS1jb250YWluZXIgaXRlbSBscm4tYXNzZXNzLWl0ZW1cIj5cbiAqICAgLi4uXG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlbUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGRpdltkYXRhLXJlZmVyZW5jZT0nJHtpdGVtUmVmZXJlbmNlKCl9J11gKTtcbn1cblxuLyoqXG4gKiBUaGUgY3VycmVudCBpdGVtIHBvc2l0aW9uLCAxLWJhc2VkIChub3QgMC1iYXNlZCksIGluIHRoZSBhY3Rpdml0eS5cbiAqIFRoaXMgaWdub3JlcyBzZWN0aW9ucywgc28gcmV0dXJucyB0aGUgZ2xvYmFsIGl0ZW0gcG9zaXRpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIGFwcC5hcHBJbnN0YW5jZSgpLmFzc2Vzc0FwcCgpLmdldEl0ZW1Qb3NpdGlvbihpdGVtUmVmZXJlbmNlKCkpICsgMTtcbn1cblxuLyoqXG4gKiBUaGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGl0ZW0uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtUmVmZXJlbmNlKCkge1xuICAgIHJldHVybiBhcHAuYXBwSW5zdGFuY2UoKS5nZXRDdXJyZW50SXRlbSgpLnJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBBbGwgdGFncyB0aGF0IGhhdmUgYmVlbiBzZXQgYWdhaW5zdCB0aGUgY3VycmVudCBpdGVtLlxuICogUmVxdWlyZXMgYHJldHJpZXZlX3RhZ3NgIHRvIGJlIHNldCB0byBgdHJ1ZWAgaW4gdGhlXG4gKiBJdGVtcyBBUEkgY29uZmlndXJhdGlvbi5cbiAqIEBzaW5jZSAyLjkuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlbVRhZ3MocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgdGFncyA9IGFwcC5hcHBJbnN0YW5jZSgpLmdldFRhZ3MoKTtcbiAgICBjb25zdCBpdGVtUmVmID0gcmVmZXJlbmNlIHx8IGl0ZW1SZWZlcmVuY2UoKTtcblxuICAgIHJldHVybiB0YWdzW2l0ZW1SZWZdIHx8IFtdO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/items.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/player.js": -/*!***************************************!*\ - !*** ./src/assessment/core/player.js ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ dialog: () => (/* binding */ dialog),\n/* harmony export */ hideDialog: () => (/* binding */ hideDialog),\n/* harmony export */ isResponsiveMode: () => (/* binding */ isResponsiveMode),\n/* harmony export */ isReviewScreen: () => (/* binding */ isReviewScreen),\n/* harmony export */ navigate: () => (/* binding */ navigate),\n/* harmony export */ next: () => (/* binding */ next),\n/* harmony export */ previous: () => (/* binding */ previous),\n/* harmony export */ review: () => (/* binding */ review),\n/* harmony export */ submit: () => (/* binding */ submit)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n\n\n\n\n/**\n * Everything relating to the assessment player.\n * @module Assessment/Player\n */\n\n/**\n * Renders an Items API custom dialog.\n * @since 0.1.0\n * @param {object} config - Dialog configuration\n * @see https://help.learnosity.com/hc/en-us/articles/360000755558-Using-Custom-Dialogs-During-Assessments\n * @example\n * LT.dialog({\n * \"header\": \"My heading\",\n * \"body\": \"Custom body with html support\",\n * \"buttons\": [\n * {\n * \"button_id\": \"my_primary_button\",\n * \"label\": \"My Primary Button\",\n * \"is_primary\": true\n * },\n * {\n * \"button_id\": \"my_standard_button\",\n * \"label\": \"My Standard Button\",\n * \"is_primary\": false\n * }\n * ]\n * });\n */\nfunction dialog(config) {\n _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().dialogs().custom.show(config);\n}\n\n/**\n * Hides a custom dialog.\n * @since 1.1.0\n */\nfunction hideDialog() {\n _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().dialogs().custom.hide();\n}\n\n/**\n * Checks whether the player is in responsive mode. This will be either the\n * small or medium breakpoints. See more https://help.learnosity.com/hc/en-us/articles/360000758337-Customizing-the-Assessment-Player-experience-with-User-Interface-Regions#responsive-behavior\n * @since 1.2.0\n * @returns {boolean}\n */\nfunction isResponsiveMode() {\n return Boolean(document.querySelector('.has-menu-region'));\n}\n\n/**\n * Check that the review screen has been loaded.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isReviewScreen() {\n let loaded = false;\n // The API event fires when loading the panel. We need a delay to\n // detect that this particular panel has loaded.\n setTimeout(() => {\n if (document.getElementsByClassName('review-screen')[0].getAttribute('aria-hidden') === null) {\n loaded = true;\n }\n return loaded;\n }, 500);\n}\n\n/**\n * Generic function to call API navigation methods. Supports:\n * - `previous`\n * - `next`\n * - `review`\n * - `submit`\n * - Number (0-based) representing the item index\n *\n * Internally this calls `next()`, `previous()`, `review()`, or `goto()`\n * and `submit()`.\n * @since 0.1.0\n * @param {string} target\n */\nfunction navigate(target) {\n switch (target) {\n case 'previous':\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().items().previous();\n break;\n case 'next':\n if (!_items__WEBPACK_IMPORTED_MODULE_1__.isLastItem()) {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().items().next();\n }\n break;\n case 'review':\n // Allow opening and closing the `Review progress` modal.\n if (document.getElementsByClassName('review-screen')[0].getAttribute('aria-hidden') === null) {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().dialogs().reviewScreen.hide();\n } else {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().dialogs().reviewScreen.show();\n }\n break;\n case 'submit':\n let submitSettings = {\n show_submit_confirmation: true,\n show_submit_ui: true,\n success: function (response_ids) {\n alert('Test saved!');\n },\n error: function (event) {\n alert('Test submit failed...check browser log');\n console.log('Submission failed: ', event);\n },\n };\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().submit(submitSettings);\n break;\n default:\n if (typeof Number(target) === 'number' && Number(target) >= 0) {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().items().goto(Number(target));\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].warn(`Invalid target (${target})`);\n }\n }\n}\n\n/**\n * Navigates to the next item. No-op if on\n * the last item.\n * @since 0.1.0\n */\nfunction next() {\n navigate('next');\n}\n\n/**\n * Navigates to the previous item. No-op if on\n * item #1.\n * @since 0.1.0\n */\nfunction previous() {\n navigate('previous');\n}\n\n/**\n * Toggles the review screen.\n * @since 0.1.0\n */\nfunction review() {\n navigate('review');\n}\n\n/**\n * Submits the session.\n * @since 0.1.0\n */\nfunction submit() {\n navigate('submit');\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL3BsYXllci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBNkI7QUFDSTtBQUNPOztBQUV4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ087QUFDUCxJQUFJLDJDQUFhO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxJQUFJLDJDQUFhO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ087QUFDUDtBQUNBO0FBQ0EsWUFBWSw2Q0FBZTtBQUMzQjtBQUNBO0FBQ0EsaUJBQWlCLDhDQUFnQjtBQUNqQyxnQkFBZ0IsNkNBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw2Q0FBZTtBQUMvQixjQUFjO0FBQ2QsZ0JBQWdCLDZDQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsWUFBWSw2Q0FBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNkNBQWU7QUFDL0IsY0FBYztBQUNkLGdCQUFnQixxREFBTSx5QkFBeUIsT0FBTztBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvcGxheWVyLmpzPzJkYWMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXBwIGZyb20gJy4vYXBwJztcbmltcG9ydCAqIGFzIGl0ZW1zIGZyb20gJy4vaXRlbXMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgcmVsYXRpbmcgdG8gdGhlIGFzc2Vzc21lbnQgcGxheWVyLlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L1BsYXllclxuICovXG5cbi8qKlxuICogUmVuZGVycyBhbiBJdGVtcyBBUEkgY3VzdG9tIGRpYWxvZy5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIERpYWxvZyBjb25maWd1cmF0aW9uXG4gKiBAc2VlIGh0dHBzOi8vaGVscC5sZWFybm9zaXR5LmNvbS9oYy9lbi11cy9hcnRpY2xlcy8zNjAwMDA3NTU1NTgtVXNpbmctQ3VzdG9tLURpYWxvZ3MtRHVyaW5nLUFzc2Vzc21lbnRzXG4gKiBAZXhhbXBsZVxuICogTFQuZGlhbG9nKHtcbiAqICAgICBcImhlYWRlclwiOiBcIk15IGhlYWRpbmdcIixcbiAqICAgICBcImJvZHlcIjogIFwiQ3VzdG9tIGJvZHkgd2l0aCA8c3Ryb25nPmh0bWw8L3N0cm9uZz4gc3VwcG9ydFwiLFxuICogICAgIFwiYnV0dG9uc1wiOiBbXG4gKiAgICAgICAgIHtcbiAqICAgICAgICAgICAgIFwiYnV0dG9uX2lkXCI6IFwibXlfcHJpbWFyeV9idXR0b25cIixcbiAqICAgICAgICAgICAgIFwibGFiZWxcIjogXCJNeSBQcmltYXJ5IEJ1dHRvblwiLFxuICogICAgICAgICAgICAgXCJpc19wcmltYXJ5XCI6IHRydWVcbiAqICAgICAgICAgfSxcbiAqICAgICAgICAge1xuICogICAgICAgICAgICAgXCJidXR0b25faWRcIjogXCJteV9zdGFuZGFyZF9idXR0b25cIixcbiAqICAgICAgICAgICAgIFwibGFiZWxcIjogXCJNeSBTdGFuZGFyZCBCdXR0b25cIixcbiAqICAgICAgICAgICAgIFwiaXNfcHJpbWFyeVwiOiBmYWxzZVxuICogICAgICAgICB9XG4gKiAgICAgXVxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWFsb2coY29uZmlnKSB7XG4gICAgYXBwLmFzc2Vzc0FwcCgpLmRpYWxvZ3MoKS5jdXN0b20uc2hvdyhjb25maWcpO1xufVxuXG4vKipcbiAqIEhpZGVzIGEgY3VzdG9tIGRpYWxvZy5cbiAqIEBzaW5jZSAxLjEuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZURpYWxvZygpIHtcbiAgICBhcHAuYXNzZXNzQXBwKCkuZGlhbG9ncygpLmN1c3RvbS5oaWRlKCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiByZXNwb25zaXZlIG1vZGUuIFRoaXMgd2lsbCBiZSBlaXRoZXIgdGhlXG4gKiBzbWFsbCBvciBtZWRpdW0gYnJlYWtwb2ludHMuIFNlZSBtb3JlIGh0dHBzOi8vaGVscC5sZWFybm9zaXR5LmNvbS9oYy9lbi11cy9hcnRpY2xlcy8zNjAwMDA3NTgzMzctQ3VzdG9taXppbmctdGhlLUFzc2Vzc21lbnQtUGxheWVyLWV4cGVyaWVuY2Utd2l0aC1Vc2VyLUludGVyZmFjZS1SZWdpb25zI3Jlc3BvbnNpdmUtYmVoYXZpb3JcbiAqIEBzaW5jZSAxLjIuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3BvbnNpdmVNb2RlKCkge1xuICAgIHJldHVybiBCb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oYXMtbWVudS1yZWdpb24nKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgcmV2aWV3IHNjcmVlbiBoYXMgYmVlbiBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXZpZXdTY3JlZW4oKSB7XG4gICAgbGV0IGxvYWRlZCA9IGZhbHNlO1xuICAgIC8vIFRoZSBBUEkgZXZlbnQgZmlyZXMgd2hlbiBsb2FkaW5nIHRoZSBwYW5lbC4gV2UgbmVlZCBhIGRlbGF5IHRvXG4gICAgLy8gZGV0ZWN0IHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHBhbmVsIGhhcyBsb2FkZWQuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyZXZpZXctc2NyZWVuJylbMF0uZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpID09PSBudWxsKSB7XG4gICAgICAgICAgICBsb2FkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2FkZWQ7XG4gICAgfSwgNTAwKTtcbn1cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGNhbGwgQVBJIG5hdmlnYXRpb24gbWV0aG9kcy4gU3VwcG9ydHM6XG4gKiAgLSBgcHJldmlvdXNgXG4gKiAgLSBgbmV4dGBcbiAqICAtIGByZXZpZXdgXG4gKiAgLSBgc3VibWl0YFxuICogIC0gTnVtYmVyICgwLWJhc2VkKSByZXByZXNlbnRpbmcgdGhlIGl0ZW0gaW5kZXhcbiAqXG4gKiBJbnRlcm5hbGx5IHRoaXMgY2FsbHMgYG5leHQoKWAsIGBwcmV2aW91cygpYCwgYHJldmlldygpYCwgb3IgYGdvdG8oKWBcbiAqIGFuZCBgc3VibWl0KClgLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXZpZ2F0ZSh0YXJnZXQpIHtcbiAgICBzd2l0Y2ggKHRhcmdldCkge1xuICAgICAgICBjYXNlICdwcmV2aW91cyc6XG4gICAgICAgICAgICBhcHAuYXBwSW5zdGFuY2UoKS5pdGVtcygpLnByZXZpb3VzKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgICBpZiAoIWl0ZW1zLmlzTGFzdEl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLml0ZW1zKCkubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Jldmlldyc6XG4gICAgICAgICAgICAvLyBBbGxvdyBvcGVuaW5nIGFuZCBjbG9zaW5nIHRoZSBgUmV2aWV3IHByb2dyZXNzYCBtb2RhbC5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyZXZpZXctc2NyZWVuJylbMF0uZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXBwLmFwcEluc3RhbmNlKCkuZGlhbG9ncygpLnJldmlld1NjcmVlbi5oaWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLmRpYWxvZ3MoKS5yZXZpZXdTY3JlZW4uc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgICAgICBsZXQgc3VibWl0U2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgc2hvd19zdWJtaXRfY29uZmlybWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dfc3VibWl0X3VpOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZV9pZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1Rlc3Qgc2F2ZWQhJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KCdUZXN0IHN1Ym1pdCBmYWlsZWQuLi5jaGVjayBicm93c2VyIGxvZycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VibWlzc2lvbiBmYWlsZWQ6ICcsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLnN1Ym1pdChzdWJtaXRTZXR0aW5ncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTnVtYmVyKHRhcmdldCkgPT09ICdudW1iZXInICYmIE51bWJlcih0YXJnZXQpID49IDApIHtcbiAgICAgICAgICAgICAgICBhcHAuYXBwSW5zdGFuY2UoKS5pdGVtcygpLmdvdG8oTnVtYmVyKHRhcmdldCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgSW52YWxpZCB0YXJnZXQgKCR7dGFyZ2V0fSlgKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogTmF2aWdhdGVzIHRvIHRoZSBuZXh0IGl0ZW0uIE5vLW9wIGlmIG9uXG4gKiB0aGUgbGFzdCBpdGVtLlxuICogQHNpbmNlIDAuMS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0KCkge1xuICAgIG5hdmlnYXRlKCduZXh0Jyk7XG59XG5cbi8qKlxuICogTmF2aWdhdGVzIHRvIHRoZSBwcmV2aW91cyBpdGVtLiBOby1vcCBpZiBvblxuICogaXRlbSAjMS5cbiAqIEBzaW5jZSAwLjEuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJldmlvdXMoKSB7XG4gICAgbmF2aWdhdGUoJ3ByZXZpb3VzJyk7XG59XG5cbi8qKlxuICogVG9nZ2xlcyB0aGUgcmV2aWV3IHNjcmVlbi5cbiAqIEBzaW5jZSAwLjEuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2aWV3KCkge1xuICAgIG5hdmlnYXRlKCdyZXZpZXcnKTtcbn1cblxuLyoqXG4gKiBTdWJtaXRzIHRoZSBzZXNzaW9uLlxuICogQHNpbmNlIDAuMS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJtaXQoKSB7XG4gICAgbmF2aWdhdGUoJ3N1Ym1pdCcpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/player.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/questions.js": -/*!******************************************!*\ - !*** ./src/assessment/core/questions.js ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasCheckAnswer: () => (/* binding */ hasCheckAnswer),\n/* harmony export */ isAutoScorable: () => (/* binding */ isAutoScorable),\n/* harmony export */ question: () => (/* binding */ question),\n/* harmony export */ questionInstance: () => (/* binding */ questionInstance),\n/* harmony export */ questionResponse: () => (/* binding */ questionResponse),\n/* harmony export */ questionResponseIds: () => (/* binding */ questionResponseIds),\n/* harmony export */ questionScore: () => (/* binding */ questionScore),\n/* harmony export */ questions: () => (/* binding */ questions)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _utils_validation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/validation */ \"./src/utils/validation.js\");\n\n\n\n\n\n\n/**\n * Everything relating to questions currently\n * loaded by Items API.\n * @module Assessment/Questions\n */\n\n/**\n * Checks whether the \"Check Answer\" button is enabled for the\n * current question, including if enabled via activity override.\n * @since 2.11.0\n * @param {string=} response_id\n * @returns {boolean}\n */\nfunction hasCheckAnswer(response_id) {\n if (!isAutoScorable(response_id)) return false;\n\n const hasActivityOverride =\n (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)()?.config?.questions_api_init_options?.attribute_overrides &&\n (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)().config.questions_api_init_options.attribute_overrides.hasOwnProperty('instant_feedback') &&\n typeof (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback === 'boolean';\n const q = question(response_id);\n\n if (hasActivityOverride) return (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback;\n\n return q.hasOwnProperty('instant_feedback') && typeof q.instant_feedback === 'boolean' ? q.instant_feedback : false;\n}\n\n/**\n * Checks whether the question is auto-scorable. This includes\n * questions that are technically auto-scorable but don't have\n * a validation object set (including when the validation is\n * ignored in Items API configuration).\n * @since 2.11.0\n * @param {string=} response_id\n * @returns {boolean}\n */\nfunction isAutoScorable(response_id) {\n const q = question(response_id);\n const check = questionInstance(response_id).checkValidation();\n return check.has_validation;\n}\n\n/**\n * Returns the question JSON on the current item.\n *\n * If the item is multi-part, pass `response_id` to return\n * the desired question. This argument will also look across\n * all items for the requested `response_id`.\n *\n * Returns {} if no question was found on the current item.\n * @since 0.1.0\n * @param {string=} response_id\n * @returns {object} A question JSON object.\n */\nfunction question(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(id).getQuestion();\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_3__[\"default\"].error(`Question not found (index ${id})`);\n return {};\n }\n}\n\n/**\n * Returns the question app instance on the current item.\n *\n * If the item is multi-part, pass `response_id` to return the\n * desired question.\n * @since 0.4.0\n * @param {string=} response_id\n * @returns {object} A question app instance.\n */\nfunction questionInstance(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(id);\n } else {\n return {};\n }\n}\n\n/**\n * Returns all question JSON on the current item.\n *\n * Returns [] if no questions were found.\n * @since 0.1.0\n * @returns {array}\n */\nfunction questions() {\n return _items__WEBPACK_IMPORTED_MODULE_1__.item().questions;\n}\n\n/**\n * A response object for a question on the\n * current item. Defaults to the first question.\n *\n * Pass `response_id` if you want a different question\n * response returned in the case of a multi-part item.\n *\n * Returns {} if no questions found on the item.\n * @since 0.1.0\n * @param {string=} response_id\n * @returns {object} The response object for the question, null if no attempts yet.\n */\nfunction questionResponse(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return response(id);\n } else {\n return {};\n }\n}\n\n/**\n * Array of `response_id` string values for all questions on the current item.\n * @since 0.1.0\n * @returns {array}\n */\nfunction questionResponseIds() {\n return questions().map(r => r.response_id);\n}\n\n/**\n * The score object for a question on the current item.\n * Defaults to the first question.\n *\n * Pass `response_id` if you want a different question\n * response returned in the case of a multi-part item.\n *\n * Returns {} if no questions found on the item, or a\n * non-autoscoreable question.\n * @since 0.1.0\n * @param {string=} response_id\n * @returns {object} The score object for the question.\n */\nfunction questionScore(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getScores()[id] || {};\n } else {\n return {};\n }\n}\n\n/**\n * A response object for a single question on the current item.\n *\n * Returns {} if a response isn't found.\n * @since 0.1.0\n * @param {string} response_id\n * @returns {object | null} The response object for the question\n * @ignore\n */\nfunction response(response_id) {\n const r = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(response_id);\n\n if (r) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(response_id).getResponse();\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_3__[\"default\"].error(`Response not found ${response_id}`);\n return undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL3F1ZXN0aW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQTZCO0FBQ0k7QUFDSztBQUNFO0FBQ1U7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYTtBQUNiO0FBQ087QUFDUDs7QUFFQTtBQUNBLFFBQVEsbURBQVE7QUFDaEIsUUFBUSxtREFBUTtBQUNoQixlQUFlLG1EQUFRO0FBQ3ZCOztBQUVBLG9DQUFvQyxtREFBUTs7QUFFNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQOztBQUVBO0FBQ0EsZUFBZSw2Q0FBZTtBQUM5QixNQUFNO0FBQ04sUUFBUSxxREFBTSxvQ0FBb0MsR0FBRztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7O0FBRUE7QUFDQSxlQUFlLDZDQUFlO0FBQzlCLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyx3Q0FBVTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7O0FBRUE7QUFDQSxlQUFlLDZDQUFlO0FBQzlCLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsZUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxjQUFjLDZDQUFlOztBQUU3QjtBQUNBLGVBQWUsNkNBQWU7QUFDOUIsTUFBTTtBQUNOLFFBQVEscURBQU0sNkJBQTZCLFlBQVk7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvcXVlc3Rpb25zLmpzPzY0NjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXBwIGZyb20gJy4vYXBwJztcbmltcG9ydCAqIGFzIGl0ZW1zIGZyb20gJy4vaXRlbXMnO1xuaW1wb3J0IHsgYWN0aXZpdHkgfSBmcm9tICcuL2FjdGl2aXR5JztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGhhc1ZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdGlvbic7XG5cbi8qKlxuICogRXZlcnl0aGluZyByZWxhdGluZyB0byBxdWVzdGlvbnMgY3VycmVudGx5XG4gKiBsb2FkZWQgYnkgSXRlbXMgQVBJLlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L1F1ZXN0aW9uc1xuICovXG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIFwiQ2hlY2sgQW5zd2VyXCIgYnV0dG9uIGlzIGVuYWJsZWQgZm9yIHRoZVxuICogY3VycmVudCBxdWVzdGlvbiwgaW5jbHVkaW5nIGlmIGVuYWJsZWQgdmlhIGFjdGl2aXR5IG92ZXJyaWRlLlxuICogQHNpbmNlIDIuMTEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDaGVja0Fuc3dlcihyZXNwb25zZV9pZCkge1xuICAgIGlmICghaXNBdXRvU2NvcmFibGUocmVzcG9uc2VfaWQpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBoYXNBY3Rpdml0eU92ZXJyaWRlID1cbiAgICAgICAgYWN0aXZpdHkoKT8uY29uZmlnPy5xdWVzdGlvbnNfYXBpX2luaXRfb3B0aW9ucz8uYXR0cmlidXRlX292ZXJyaWRlcyAmJlxuICAgICAgICBhY3Rpdml0eSgpLmNvbmZpZy5xdWVzdGlvbnNfYXBpX2luaXRfb3B0aW9ucy5hdHRyaWJ1dGVfb3ZlcnJpZGVzLmhhc093blByb3BlcnR5KCdpbnN0YW50X2ZlZWRiYWNrJykgJiZcbiAgICAgICAgdHlwZW9mIGFjdGl2aXR5KCkuY29uZmlnLnF1ZXN0aW9uc19hcGlfaW5pdF9vcHRpb25zLmF0dHJpYnV0ZV9vdmVycmlkZXMuaW5zdGFudF9mZWVkYmFjayA9PT0gJ2Jvb2xlYW4nO1xuICAgIGNvbnN0IHEgPSBxdWVzdGlvbihyZXNwb25zZV9pZCk7XG5cbiAgICBpZiAoaGFzQWN0aXZpdHlPdmVycmlkZSkgcmV0dXJuIGFjdGl2aXR5KCkuY29uZmlnLnF1ZXN0aW9uc19hcGlfaW5pdF9vcHRpb25zLmF0dHJpYnV0ZV9vdmVycmlkZXMuaW5zdGFudF9mZWVkYmFjaztcblxuICAgIHJldHVybiBxLmhhc093blByb3BlcnR5KCdpbnN0YW50X2ZlZWRiYWNrJykgJiYgdHlwZW9mIHEuaW5zdGFudF9mZWVkYmFjayA9PT0gJ2Jvb2xlYW4nID8gcS5pbnN0YW50X2ZlZWRiYWNrIDogZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHF1ZXN0aW9uIGlzIGF1dG8tc2NvcmFibGUuIFRoaXMgaW5jbHVkZXNcbiAqIHF1ZXN0aW9ucyB0aGF0IGFyZSB0ZWNobmljYWxseSBhdXRvLXNjb3JhYmxlIGJ1dCBkb24ndCBoYXZlXG4gKiBhIHZhbGlkYXRpb24gb2JqZWN0IHNldCAoaW5jbHVkaW5nIHdoZW4gdGhlIHZhbGlkYXRpb24gaXNcbiAqIGlnbm9yZWQgaW4gSXRlbXMgQVBJIGNvbmZpZ3VyYXRpb24pLlxuICogQHNpbmNlIDIuMTEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dG9TY29yYWJsZShyZXNwb25zZV9pZCkge1xuICAgIGNvbnN0IHEgPSBxdWVzdGlvbihyZXNwb25zZV9pZCk7XG4gICAgY29uc3QgY2hlY2sgPSBxdWVzdGlvbkluc3RhbmNlKHJlc3BvbnNlX2lkKS5jaGVja1ZhbGlkYXRpb24oKTtcbiAgICByZXR1cm4gY2hlY2suaGFzX3ZhbGlkYXRpb247XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcXVlc3Rpb24gSlNPTiBvbiB0aGUgY3VycmVudCBpdGVtLlxuICpcbiAqIElmIHRoZSBpdGVtIGlzIG11bHRpLXBhcnQsIHBhc3MgYHJlc3BvbnNlX2lkYCB0byByZXR1cm5cbiAqIHRoZSBkZXNpcmVkIHF1ZXN0aW9uLiBUaGlzIGFyZ3VtZW50IHdpbGwgYWxzbyBsb29rIGFjcm9zc1xuICogYWxsIGl0ZW1zIGZvciB0aGUgcmVxdWVzdGVkIGByZXNwb25zZV9pZGAuXG4gKlxuICogUmV0dXJucyB7fSBpZiBubyBxdWVzdGlvbiB3YXMgZm91bmQgb24gdGhlIGN1cnJlbnQgaXRlbS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge29iamVjdH0gQSBxdWVzdGlvbiBKU09OIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uKHJlc3BvbnNlX2lkKSB7XG4gICAgbGV0IGlkID0gcmVzcG9uc2VfaWQgPyByZXNwb25zZV9pZCA6IHF1ZXN0aW9uUmVzcG9uc2VJZHMoKVswXTtcblxuICAgIGlmIChpZCkge1xuICAgICAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkucXVlc3Rpb24oaWQpLmdldFF1ZXN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBRdWVzdGlvbiBub3QgZm91bmQgKGluZGV4ICR7aWR9KWApO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHF1ZXN0aW9uIGFwcCBpbnN0YW5jZSBvbiB0aGUgY3VycmVudCBpdGVtLlxuICpcbiAqIElmIHRoZSBpdGVtIGlzIG11bHRpLXBhcnQsIHBhc3MgYHJlc3BvbnNlX2lkYCB0byByZXR1cm4gdGhlXG4gKiBkZXNpcmVkIHF1ZXN0aW9uLlxuICogQHNpbmNlIDAuNC4wXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlc3BvbnNlX2lkXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBBIHF1ZXN0aW9uIGFwcCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uSW5zdGFuY2UocmVzcG9uc2VfaWQpIHtcbiAgICBsZXQgaWQgPSByZXNwb25zZV9pZCA/IHJlc3BvbnNlX2lkIDogcXVlc3Rpb25SZXNwb25zZUlkcygpWzBdO1xuXG4gICAgaWYgKGlkKSB7XG4gICAgICAgIHJldHVybiBhcHAuYXBwSW5zdGFuY2UoKS5xdWVzdGlvbihpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBxdWVzdGlvbiBKU09OIG9uIHRoZSBjdXJyZW50IGl0ZW0uXG4gKlxuICogUmV0dXJucyBbXSBpZiBubyBxdWVzdGlvbnMgd2VyZSBmb3VuZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb25zKCkge1xuICAgIHJldHVybiBpdGVtcy5pdGVtKCkucXVlc3Rpb25zO1xufVxuXG4vKipcbiAqIEEgcmVzcG9uc2Ugb2JqZWN0IGZvciBhIHF1ZXN0aW9uIG9uIHRoZVxuICogY3VycmVudCBpdGVtLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcXVlc3Rpb24uXG4gKlxuICogUGFzcyBgcmVzcG9uc2VfaWRgIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IHF1ZXN0aW9uXG4gKiByZXNwb25zZSByZXR1cm5lZCBpbiB0aGUgY2FzZSBvZiBhIG11bHRpLXBhcnQgaXRlbS5cbiAqXG4gKiBSZXR1cm5zIHt9IGlmIG5vIHF1ZXN0aW9ucyBmb3VuZCBvbiB0aGUgaXRlbS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlIG9iamVjdCBmb3IgdGhlIHF1ZXN0aW9uLCBudWxsIGlmIG5vIGF0dGVtcHRzIHlldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uUmVzcG9uc2UocmVzcG9uc2VfaWQpIHtcbiAgICBsZXQgaWQgPSByZXNwb25zZV9pZCA/IHJlc3BvbnNlX2lkIDogcXVlc3Rpb25SZXNwb25zZUlkcygpWzBdO1xuXG4gICAgaWYgKGlkKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuLyoqXG4gKiBBcnJheSBvZiBgcmVzcG9uc2VfaWRgIHN0cmluZyB2YWx1ZXMgZm9yIGFsbCBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgaXRlbS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb25SZXNwb25zZUlkcygpIHtcbiAgICByZXR1cm4gcXVlc3Rpb25zKCkubWFwKHIgPT4gci5yZXNwb25zZV9pZCk7XG59XG5cbi8qKlxuICogVGhlIHNjb3JlIG9iamVjdCBmb3IgYSBxdWVzdGlvbiBvbiB0aGUgY3VycmVudCBpdGVtLlxuICogRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uLlxuICpcbiAqIFBhc3MgYHJlc3BvbnNlX2lkYCBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBxdWVzdGlvblxuICogcmVzcG9uc2UgcmV0dXJuZWQgaW4gdGhlIGNhc2Ugb2YgYSBtdWx0aS1wYXJ0IGl0ZW0uXG4gKlxuICogUmV0dXJucyB7fSBpZiBubyBxdWVzdGlvbnMgZm91bmQgb24gdGhlIGl0ZW0sIG9yIGFcbiAqIG5vbi1hdXRvc2NvcmVhYmxlIHF1ZXN0aW9uLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlc3BvbnNlX2lkXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgc2NvcmUgb2JqZWN0IGZvciB0aGUgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWVzdGlvblNjb3JlKHJlc3BvbnNlX2lkKSB7XG4gICAgbGV0IGlkID0gcmVzcG9uc2VfaWQgPyByZXNwb25zZV9pZCA6IHF1ZXN0aW9uUmVzcG9uc2VJZHMoKVswXTtcblxuICAgIGlmIChpZCkge1xuICAgICAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0U2NvcmVzKClbaWRdIHx8IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cbi8qKlxuICogQSByZXNwb25zZSBvYmplY3QgZm9yIGEgc2luZ2xlIHF1ZXN0aW9uIG9uIHRoZSBjdXJyZW50IGl0ZW0uXG4gKlxuICogUmV0dXJucyB7fSBpZiBhIHJlc3BvbnNlIGlzbid0IGZvdW5kLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2VfaWRcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfSBUaGUgcmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgcXVlc3Rpb25cbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gcmVzcG9uc2UocmVzcG9uc2VfaWQpIHtcbiAgICBjb25zdCByID0gYXBwLmFwcEluc3RhbmNlKCkucXVlc3Rpb24ocmVzcG9uc2VfaWQpO1xuXG4gICAgaWYgKHIpIHtcbiAgICAgICAgcmV0dXJuIGFwcC5hcHBJbnN0YW5jZSgpLnF1ZXN0aW9uKHJlc3BvbnNlX2lkKS5nZXRSZXNwb25zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgUmVzcG9uc2Ugbm90IGZvdW5kICR7cmVzcG9uc2VfaWR9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/questions.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/sections.js": -/*!*****************************************!*\ - !*** ./src/assessment/core/sections.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isFirstItemInSection: () => (/* binding */ isFirstItemInSection),\n/* harmony export */ isLastItemInSection: () => (/* binding */ isLastItemInSection),\n/* harmony export */ section: () => (/* binding */ section),\n/* harmony export */ sectionHasShuffledItems: () => (/* binding */ sectionHasShuffledItems),\n/* harmony export */ sectionIndex: () => (/* binding */ sectionIndex),\n/* harmony export */ sectionItemPosition: () => (/* binding */ sectionItemPosition),\n/* harmony export */ sections: () => (/* binding */ sections),\n/* harmony export */ totalItemsInSection: () => (/* binding */ totalItemsInSection)\n/* harmony export */ });\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./items */ \"./src/assessment/core/items.js\");\n\n\n\n/**\n * Everything relating to any sections defined\n * in the activity.\n * @module Assessment/Sections\n */\n\n/**\n * Whether the current item is the first in this section.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isFirstItemInSection() {\n return sectionItemPosition() === 1;\n}\n\n/**\n * Whether the current item is the last in this section.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isLastItemInSection() {\n return sectionItemPosition() === totalItemsInSection();\n}\n\n/**\n * The current section of the activity.\n *\n * Returns {} if sections aren't being used.\n * @since 0.1.0\n * @returns {object}\n */\nfunction section() {\n if (_activity__WEBPACK_IMPORTED_MODULE_0__.hasSections()) {\n const currentRef = _items__WEBPACK_IMPORTED_MODULE_1__.itemReference();\n const allSections = sections();\n let section = -1;\n let found = false;\n for (let s = 0; s < allSections.length; s++) {\n if (found) {\n break;\n }\n ++section;\n for (let i = 0; i < allSections[s].items.length; i++) {\n if (currentRef === allSections[s].items[i].reference) {\n found = true;\n break;\n }\n }\n }\n return sections()[section];\n } else {\n return {};\n }\n}\n\n/**\n * Whether items have been shuffled within this section.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction sectionHasShuffledItems() {\n return Boolean(section()?.config?.configuration?.shuffle_items);\n}\n\n/**\n * The index of the current section, 1-based.\n *\n * Returns 0 if sections aren't being used.\n * @since 0.1.0\n * @returns {number}\n */\nfunction sectionIndex() {\n if (_activity__WEBPACK_IMPORTED_MODULE_0__.hasSections()) {\n const currentRef = _items__WEBPACK_IMPORTED_MODULE_1__.itemReference();\n const sections = sections();\n let section = 0;\n let found = false;\n for (let s = 0; s < sections.length; s++) {\n if (found) {\n break;\n }\n ++section;\n for (let i = 0; i < sections[s].items.length; i++) {\n if (currentRef === sections[s].items[i].reference) {\n found = true;\n break;\n }\n }\n }\n return section;\n } else {\n return 0;\n }\n}\n\n/**\n * The item position in the current section.\n *\n * Returns `null` if the activity isn't using sections.\n * @since 0.1.0\n * @returns {number|null}\n */\nfunction sectionItemPosition() {\n const currentRef = _items__WEBPACK_IMPORTED_MODULE_1__.itemReference();\n const currentSection = section();\n let itemPos = 0;\n\n if (!Object.keys(currentSection).length) {\n return null;\n }\n\n for (let i = 0; i < currentSection.items.length; i++) {\n ++itemPos;\n if (currentRef === currentSection.items[i].reference) {\n break;\n }\n }\n return itemPos;\n}\n\n/**\n * An array of section objects.\n *\n * Returns [] if sections aren't being used.\n * @since 0.1.0\n * @returns {array}\n */\nfunction sections() {\n if (_activity__WEBPACK_IMPORTED_MODULE_0__.hasSections()) {\n return _activity__WEBPACK_IMPORTED_MODULE_0__.activity().sections;\n } else {\n return [];\n }\n}\n\n/**\n * The total number of items in the current section.\n *\n * Returns `null` if sections aren't being used.\n * @since 0.1.0\n * @returns {number|null}\n */\nfunction totalItemsInSection() {\n return section()?.items?.length || null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL3NlY3Rpb25zLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBdUM7QUFDTjs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsUUFBUSxrREFBb0I7QUFDNUIsMkJBQTJCLGlEQUFtQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGlDQUFpQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLFFBQVEsa0RBQW9CO0FBQzVCLDJCQUEyQixpREFBbUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw4QkFBOEI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLHVCQUF1QixpREFBbUI7QUFDMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGlDQUFpQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxRQUFRLGtEQUFvQjtBQUM1QixlQUFlLCtDQUFpQjtBQUNoQyxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvY29yZS9zZWN0aW9ucy5qcz84NDMyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFjdGl2aXR5IGZyb20gJy4vYWN0aXZpdHknO1xuaW1wb3J0ICogYXMgaXRlbXMgZnJvbSAnLi9pdGVtcyc7XG5cbi8qKlxuICogRXZlcnl0aGluZyByZWxhdGluZyB0byBhbnkgc2VjdGlvbnMgZGVmaW5lZFxuICogaW4gdGhlIGFjdGl2aXR5LlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L1NlY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaXMgdGhlIGZpcnN0IGluIHRoaXMgc2VjdGlvbi5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SXRlbUluU2VjdGlvbigpIHtcbiAgICByZXR1cm4gc2VjdGlvbkl0ZW1Qb3NpdGlvbigpID09PSAxO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgaXRlbSBpcyB0aGUgbGFzdCBpbiB0aGlzIHNlY3Rpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYXN0SXRlbUluU2VjdGlvbigpIHtcbiAgICByZXR1cm4gc2VjdGlvbkl0ZW1Qb3NpdGlvbigpID09PSB0b3RhbEl0ZW1zSW5TZWN0aW9uKCk7XG59XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgc2VjdGlvbiBvZiB0aGUgYWN0aXZpdHkuXG4gKlxuICogUmV0dXJucyB7fSBpZiBzZWN0aW9ucyBhcmVuJ3QgYmVpbmcgdXNlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlY3Rpb24oKSB7XG4gICAgaWYgKGFjdGl2aXR5Lmhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFJlZiA9IGl0ZW1zLml0ZW1SZWZlcmVuY2UoKTtcbiAgICAgICAgY29uc3QgYWxsU2VjdGlvbnMgPSBzZWN0aW9ucygpO1xuICAgICAgICBsZXQgc2VjdGlvbiA9IC0xO1xuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBhbGxTZWN0aW9ucy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICArK3NlY3Rpb247XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFNlY3Rpb25zW3NdLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSZWYgPT09IGFsbFNlY3Rpb25zW3NdLml0ZW1zW2ldLnJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VjdGlvbnMoKVtzZWN0aW9uXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgaXRlbXMgaGF2ZSBiZWVuIHNodWZmbGVkIHdpdGhpbiB0aGlzIHNlY3Rpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbkhhc1NodWZmbGVkSXRlbXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oc2VjdGlvbigpPy5jb25maWc/LmNvbmZpZ3VyYXRpb24/LnNodWZmbGVfaXRlbXMpO1xufVxuXG4vKipcbiAqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLCAxLWJhc2VkLlxuICpcbiAqIFJldHVybnMgMCBpZiBzZWN0aW9ucyBhcmVuJ3QgYmVpbmcgdXNlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlY3Rpb25JbmRleCgpIHtcbiAgICBpZiAoYWN0aXZpdHkuaGFzU2VjdGlvbnMoKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UmVmID0gaXRlbXMuaXRlbVJlZmVyZW5jZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zKCk7XG4gICAgICAgIGxldCBzZWN0aW9uID0gMDtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc2VjdGlvbnMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytzZWN0aW9uO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWN0aW9uc1tzXS5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UmVmID09PSBzZWN0aW9uc1tzXS5pdGVtc1tpXS5yZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBpdGVtIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IHNlY3Rpb24uXG4gKlxuICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIGFjdGl2aXR5IGlzbid0IHVzaW5nIHNlY3Rpb25zLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7bnVtYmVyfG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWN0aW9uSXRlbVBvc2l0aW9uKCkge1xuICAgIGNvbnN0IGN1cnJlbnRSZWYgPSBpdGVtcy5pdGVtUmVmZXJlbmNlKCk7XG4gICAgY29uc3QgY3VycmVudFNlY3Rpb24gPSBzZWN0aW9uKCk7XG4gICAgbGV0IGl0ZW1Qb3MgPSAwO1xuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhjdXJyZW50U2VjdGlvbikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudFNlY3Rpb24uaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgKytpdGVtUG9zO1xuICAgICAgICBpZiAoY3VycmVudFJlZiA9PT0gY3VycmVudFNlY3Rpb24uaXRlbXNbaV0ucmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXRlbVBvcztcbn1cblxuLyoqXG4gKiBBbiBhcnJheSBvZiBzZWN0aW9uIG9iamVjdHMuXG4gKlxuICogUmV0dXJucyBbXSBpZiBzZWN0aW9ucyBhcmVuJ3QgYmVpbmcgdXNlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbnMoKSB7XG4gICAgaWYgKGFjdGl2aXR5Lmhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2aXR5LmFjdGl2aXR5KCkuc2VjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjdXJyZW50IHNlY3Rpb24uXG4gKlxuICogUmV0dXJucyBgbnVsbGAgaWYgc2VjdGlvbnMgYXJlbid0IGJlaW5nIHVzZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdGFsSXRlbXNJblNlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNlY3Rpb24oKT8uaXRlbXM/Lmxlbmd0aCB8fCBudWxsO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/sections.js\n"); - -/***/ }), - -/***/ "./src/utils/logger.js": -/*!*****************************!*\ - !*** ./src/utils/logger.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * A utility logger that generates styled log outputs.\n * @module Utils/Logger\n */\n\n/**\n * Debug only logs to the console\n * @static\n * @since 2.10.0\n * @param {*} msg\n */\nfunction debug(msg, mode) {\n if (mode === 'DEBUG') console.log(msg);\n}\n\n/**\n * Formatted error logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction error(msg) {\n let style = 'display:inline-block;background-color:#e0005a;color:#fff;font-weight:bold;padding:3px 7px;border-radius:3px';\n console.error('%cError:%c ' + msg, style, '');\n}\n\n/**\n * Formatted info logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction info(msg) {\n let style = 'display:inline-block;background-color:#46C0FF;color:#000;font-weight:bold;padding:3px 7px;border-radius:3px';\n console.info('%cInfo:%c ' + msg, style, '');\n}\n\n/**\n * Generic logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction log(msg) {\n console.log(msg);\n}\n\n/**\n * Formatted warning logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction warn(msg, type = 'log') {\n let style = 'display:inline-block;background-color:gold;color:#000;font-weight:bold;padding:3px 7px;border-radius:3px';\n console.warn('%cWarning:%c ' + msg, style, '');\n}\n\nconst logger = {\n debug,\n error,\n info,\n log,\n warn,\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (logger);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvbG9nZ2VyLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBLHNDQUFzQyx5QkFBeUIsV0FBVyxpQkFBaUIsZ0JBQWdCO0FBQzNHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0Esc0NBQXNDLHlCQUF5QixXQUFXLGlCQUFpQixnQkFBZ0I7QUFDM0c7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBLHNDQUFzQyxzQkFBc0IsV0FBVyxpQkFBaUIsZ0JBQWdCO0FBQ3hHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsTUFBTSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy91dGlscy9sb2dnZXIuanM/ODIzYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgdXRpbGl0eSBsb2dnZXIgdGhhdCBnZW5lcmF0ZXMgc3R5bGVkIGxvZyBvdXRwdXRzLlxuICogQG1vZHVsZSBVdGlscy9Mb2dnZXJcbiAqL1xuXG4vKipcbiAqIERlYnVnIG9ubHkgbG9ncyB0byB0aGUgY29uc29sZVxuICogQHN0YXRpY1xuICogQHNpbmNlIDIuMTAuMFxuICogQHBhcmFtIHsqfSBtc2dcbiAqL1xuZnVuY3Rpb24gZGVidWcobXNnLCBtb2RlKSB7XG4gICAgaWYgKG1vZGUgPT09ICdERUJVRycpIGNvbnNvbGUubG9nKG1zZyk7XG59XG5cbi8qKlxuICogRm9ybWF0dGVkIGVycm9yIGxvZ2dlciB0byB0aGUgY29uc29sZVxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0geyp9IG1zZ1xuICovXG5mdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgICBsZXQgc3R5bGUgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjojZTAwMDVhO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZDtwYWRkaW5nOjNweCA3cHg7Ym9yZGVyLXJhZGl1czozcHgnO1xuICAgIGNvbnNvbGUuZXJyb3IoJyVjRXJyb3I6JWMgJyArIG1zZywgc3R5bGUsICcnKTtcbn1cblxuLyoqXG4gKiBGb3JtYXR0ZWQgaW5mbyBsb2dnZXIgdG8gdGhlIGNvbnNvbGVcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHsqfSBtc2dcbiAqL1xuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgICBsZXQgc3R5bGUgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjojNDZDMEZGO2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6Ym9sZDtwYWRkaW5nOjNweCA3cHg7Ym9yZGVyLXJhZGl1czozcHgnO1xuICAgIGNvbnNvbGUuaW5mbygnJWNJbmZvOiVjICcgKyBtc2csIHN0eWxlLCAnJyk7XG59XG5cbi8qKlxuICogR2VuZXJpYyBsb2dnZXIgdG8gdGhlIGNvbnNvbGVcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHsqfSBtc2dcbiAqL1xuZnVuY3Rpb24gbG9nKG1zZykge1xuICAgIGNvbnNvbGUubG9nKG1zZyk7XG59XG5cbi8qKlxuICogRm9ybWF0dGVkIHdhcm5pbmcgbG9nZ2VyIHRvIHRoZSBjb25zb2xlXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBwYXJhbSB7Kn0gbXNnXG4gKi9cbmZ1bmN0aW9uIHdhcm4obXNnLCB0eXBlID0gJ2xvZycpIHtcbiAgICBsZXQgc3R5bGUgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjpnb2xkO2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6Ym9sZDtwYWRkaW5nOjNweCA3cHg7Ym9yZGVyLXJhZGl1czozcHgnO1xuICAgIGNvbnNvbGUud2FybignJWNXYXJuaW5nOiVjICcgKyBtc2csIHN0eWxlLCAnJyk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IHtcbiAgICBkZWJ1ZyxcbiAgICBlcnJvcixcbiAgICBpbmZvLFxuICAgIGxvZyxcbiAgICB3YXJuLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/utils/logger.js\n"); - -/***/ }), - -/***/ "./src/utils/validation.js": -/*!*********************************!*\ - !*** ./src/utils/validation.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasValue: () => (/* binding */ hasValue)\n/* harmony export */ });\n/**\n * A utility validation object.\n * @module Utils/Validation\n */\n\n/**\n * Checks value for existence. The following are\n * falsy:\n * - null\n * - undefined\n * - ''\n * - []\n * - {}\n * @since 2.11.0\n * @param {any} value\n * @returns {boolean}\n */\nfunction hasValue(value) {\n if (value === null || value === undefined) {\n return false;\n }\n\n const type = typeof value;\n switch (type) {\n case 'string':\n return value.trim() !== '';\n case 'object':\n if (Array.isArray(value)) {\n return value.length > 0;\n } else {\n return Object.keys(value).length > 0;\n }\n default:\n return true;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvdmFsaWRhdGlvbi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvdXRpbHMvdmFsaWRhdGlvbi5qcz81NDY0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB1dGlsaXR5IHZhbGlkYXRpb24gb2JqZWN0LlxuICogQG1vZHVsZSBVdGlscy9WYWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBDaGVja3MgdmFsdWUgZm9yIGV4aXN0ZW5jZS4gVGhlIGZvbGxvd2luZyBhcmVcbiAqIGZhbHN5OlxuICogLSBudWxsXG4gKiAtIHVuZGVmaW5lZFxuICogLSAnJ1xuICogLSBbXVxuICogLSB7fVxuICogQHNpbmNlIDIuMTEuMFxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSAnJztcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/utils/validation.js\n"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval-source-map devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./src/assessment/core.js"); -/******/ var __webpack_exports__LT = __webpack_exports__.LT; -/******/ export { __webpack_exports__LT as LT }; -/******/ +var t={7738:(t,e,n)=>{n.r(e),n.d(e,{activity:()=>r,activityId:()=>a,activitySubTitle:()=>f,activityTags:()=>p,activityTemplateId:()=>c,activityTitle:()=>u,adaptiveType:()=>l,annotationsConfig:()=>d,autoSaveConfig:()=>m,elapsedTime:()=>g,hasActivityTemplate:()=>v,hasAnnotations:()=>h,hasAutoSave:()=>y,hasEvents:()=>b,hasItemPool:()=>I,hasResourceItems:()=>A,hasSections:()=>w,hasShuffledItems:()=>_,hasTryAgain:()=>S,isAdaptive:()=>k,isResuming:()=>q,itemBank:()=>P,itemPool:()=>T,maxTime:()=>x,region:()=>O,resourceItems:()=>R,sessionId:()=>B,state:()=>E,timeRemaining:()=>C,totalItems:()=>F,userId:()=>W});var i=n(2844),o=n(8511),s=n(7484);function r(){return i.appInstance().getActivity()}function a(){return r().activity_id}function c(){return r().activity_template_id}function u(){return r().config.title}function f(){return r().config.subtitle}function p(){return i.appInstance().getTags()}function l(){return k()&&r().adaptive.hasOwnProperty("type")?r().adaptive.type:""}function d(){return h()&&r()?.config?.annotations_api_init_options?r().config.annotations_api_init_options:{}}function m(){const t=r();return t?.config?.navigation?.auto_save?t.config.navigation.auto_save:{}}function g(){return i.appInstance().getTime()}function v(){return r().hasOwnProperty("activity_template_id")}function h(){const t=r();return Boolean(!0===t?.config?.annotations||t?.config?.annotations_api_init_options)}function y(){const t=r();return t.hasOwnProperty("config")&&t.config.hasOwnProperty("navigation")&&t.config.navigation.hasOwnProperty("auto_save")&&!1!==t.config.navigation.auto_save}function _(){return Boolean(r()?.config?.configuration?.shuffle_items)}function b(){const t=r();return t.hasOwnProperty("events")&&!1!==t.events}function I(){return r().hasOwnProperty("item_pool_id")}function A(){return Boolean(r()?.config?.navigation?.resource_items)}function w(){return r().hasOwnProperty("sections")}function S(){return r()?.dynamic_items.hasOwnProperty("try_again")}function k(){return r().hasOwnProperty("adaptive")}function q(){return r().existing_session}function P(){return r()?.organisation_id}function T(){return r()?.item_pool_id}function x(){return r()?.config?.time?.max_time?r().config.time.max_time:0}function O(){return r()?.config?.regions}function R(){return r()?.config?.navigation?.resource_items}function B(){return r()?.session_id}function E(){let t;return t=void 0===r()?.state?"initial":r().state,t}function C(){return 0===x()?null:x()-g()}function F(){if(w()){let t=0,e=o.sections();for(let n=0;n{n.r(e),n.d(e,{annotationsApp:()=>c,appInstance:()=>a,assessApp:()=>u,eventsApp:()=>f,init:()=>r,questionsApp:()=>p});var i=n(1634),o=n(7066);const s={};function r(t){s.app=t,s.app.on("all",(t=>{(0,i.handleEvent)(t)})),s.app.on("item:load",(t=>{(0,o.questionResponseIds)().forEach((t=>{s.app.question(t).on("changed",(t=>{(0,i.handleEvent)("changed")}))}))}))}function a(){return s.app}function c(){return void 0!==a().annotationsApp()?a().annotationsApp():null}function u(){return a().assessApp()}function f(){return a().eventsApp()}function p(){return a().questionsApp()}},1634:(t,e,n)=>{n.r(e),n.d(e,{diagnostics:()=>c,filterEvent:()=>u,handleEvent:()=>f,listen:()=>p});var i=n(2844),o=n(7738),s=n(7484);const r="2.13.0",a={events:{broadcast:!1,listenFor:"item"}};function c(){let t=window.LearnosityApp?LearnosityApp.versions:{};return{apps:{annotations:{app:i.annotationsApp(),config:o.annotationsConfig(),enabled:o.hasAnnotations()},assess:{app:i.assessApp()},events:{app:i.eventsApp(),enabled:o.hasEvents()},items:{app:i.appInstance(),metadata:o.activity().config.metadata},questions:{app:i.questionsApp()}},activity:{activity:o.activityId(),activityTemplate:o.activityTemplateId(),autoSave:{config:o.autoSaveConfig(),enabled:o.hasAutoSave()},itemBank:o.itemBank(),itemPool:o.itemPool(),session:o.sessionId(),state:o.state(),type:o.activity().type,user:o.userId()},LT:{version:r},versions:t}}function u(t){/^[a-zA-Z:*]*$/.test(t)?a.events.listenFor=t:s.A.warn("Invalid event type")}function f(t){if(a.events.broadcast){const e=a.events.listenFor,n=e.replaceAll("*","");1===e.length&&"*"===e||"all"===e?s.A.info(t):e.startsWith("*")&&!e.endsWith("*")?t.endsWith(n)&&s.A.info(t):e.endsWith("*")&&!e.startsWith("*")?t.startsWith(n)&&s.A.info(t):e.startsWith("*")&&e.endsWith("*")?t.includes(n)&&s.A.info(t):t.startsWith(n)&&s.A.info(t)}}function p(t=!0){a.events.broadcast=Boolean(t),Boolean(t)?s.A.info(`👂 listening for '${a.events.listenFor}'`):s.A.info("🚫👂 not listening")}},3191:(t,e,n)=>{n.r(e),n.d(e,{dynamic:()=>a,flag:()=>c,isDynamicItem:()=>u,isFirstItem:()=>f,isFlagged:()=>l,isItemFullyAttempted:()=>d,isLastItem:()=>p,isMaskingEnabled:()=>m,item:()=>g,itemAttemptStatus:()=>v,itemByResponseId:()=>h,itemElement:()=>y,itemPosition:()=>_,itemReference:()=>b,itemTags:()=>I});var i=n(2844),o=n(7738),s=n(7066),r=n(8511);function a(){const t=b();return i.assessApp().item(t).dynamic||{}}function c(){const t=b();i.assessApp().item(t).flag()}function u(){return g()?.source.hasOwnProperty("data_table_seed")}function f(){let t;return o.hasSections()?(t="object"==typeof r.sections()[0].items[0]?r.sections()[0].items[0].reference:r.sections()[0].items[0],t===g().reference):(t="object"==typeof o.activity().items[0]?o.activity().items[0].reference:o.activity().items[0],t===g().reference)}function p(){return g().is_last_item}function l(){return g().user_flagged}function d(t){let e,n,o;if(e=t?i.appInstance().getItems()[t].questions:s.questions(),Array.isArray(e)&&e.length)for(let t=0;tvoid 0===t)).length)return!1;if(o.value.filter((t=>null===t)).length)return!1}n=!0}else n=!0;return n}function m(){return Boolean(document.querySelector(".lrn-masking"))}function g(t){return t?i.appInstance().getItems()[t]:i.appInstance().getCurrentItem()}function v(){return i.appInstance().getCurrentItem().attempt_status}function h(t){const e=i.appInstance().getItems();let n;for(const i in e)if(e[i].response_ids.includes(t)){n=e[i];break}return n}function y(){return document.querySelector(`div[data-reference='${b()}']`)}function _(){return i.appInstance().assessApp().getItemPosition(b())+1}function b(){return i.appInstance().getCurrentItem().reference}function I(t){return i.appInstance().getTags()[t||b()]||[]}},1570:(t,e,n)=>{n.r(e),n.d(e,{dialog:()=>r,hideDialog:()=>a,isResponsiveMode:()=>c,isReviewScreen:()=>u,navigate:()=>f,next:()=>p,previous:()=>l,review:()=>d,submit:()=>m});var i=n(2844),o=n(3191),s=n(7484);function r(t){i.assessApp().dialogs().custom.show(t)}function a(){i.assessApp().dialogs().custom.hide()}function c(){return Boolean(document.querySelector(".has-menu-region"))}function u(){let t=!1;setTimeout((()=>(null===document.getElementsByClassName("review-screen")[0].getAttribute("aria-hidden")&&(t=!0),t)),500)}function f(t){switch(t){case"previous":i.appInstance().items().previous();break;case"next":o.isLastItem()||i.appInstance().items().next();break;case"review":null===document.getElementsByClassName("review-screen")[0].getAttribute("aria-hidden")?i.appInstance().dialogs().reviewScreen.hide():i.appInstance().dialogs().reviewScreen.show();break;case"submit":let e={show_submit_confirmation:!0,show_submit_ui:!0,success:function(t){alert("Test saved!")},error:function(t){alert("Test submit failed...check browser log"),console.log("Submission failed: ",t)}};i.appInstance().submit(e);break;default:"number"==typeof Number(t)&&Number(t)>=0?i.appInstance().items().goto(Number(t)):s.A.warn(`Invalid target (${t})`)}}function p(){f("next")}function l(){f("previous")}function d(){f("review")}function m(){f("submit")}},7066:(t,e,n)=>{n.r(e),n.d(e,{hasCheckAnswer:()=>a,isAutoScorable:()=>c,question:()=>u,questionInstance:()=>f,questionResponse:()=>l,questionResponseIds:()=>d,questionScore:()=>m,questions:()=>p});var i=n(2844),o=n(3191),s=n(7738),r=n(7484);function a(t){if(!c(t))return!1;const e=(0,s.activity)()?.config?.questions_api_init_options?.attribute_overrides&&(0,s.activity)().config.questions_api_init_options.attribute_overrides.hasOwnProperty("instant_feedback")&&"boolean"==typeof(0,s.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback,n=u(t);return e?(0,s.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback:!(!n.hasOwnProperty("instant_feedback")||"boolean"!=typeof n.instant_feedback)&&n.instant_feedback}function c(t){return u(t),f(t).checkValidation().has_validation}function u(t){let e=t||d()[0];return e?i.appInstance().question(e).getQuestion():(r.A.error(`Question not found (index ${e})`),{})}function f(t){let e=t||d()[0];return e?i.appInstance().question(e):{}}function p(){return o.item().questions}function l(t){let e=t||d()[0];return e?function(t){return i.appInstance().question(t)?i.appInstance().question(t).getResponse():void r.A.error(`Response not found ${t}`)}(e):{}}function d(){return p().map((t=>t.response_id))}function m(t){let e=t||d()[0];return e&&i.appInstance().getScores()[e]||{}}},8511:(t,e,n)=>{n.r(e),n.d(e,{isFirstItemInSection:()=>s,isLastItemInSection:()=>r,section:()=>a,sectionHasShuffledItems:()=>c,sectionIndex:()=>u,sectionItemPosition:()=>f,sections:()=>p,totalItemsInSection:()=>l});var i=n(7738),o=n(3191);function s(){return 1===f()}function r(){return f()===l()}function a(){if(i.hasSections()){const t=o.itemReference(),e=p();let n=-1,i=!1;for(let o=0;o{n.d(e,{A:()=>i});const i={debug:function(t,e){"DEBUG"===e&&console.log(t)},error:function(t){console.error("%cError:%c "+t,"display:inline-block;background-color:#e0005a;color:#fff;font-weight:bold;padding:3px 7px;border-radius:3px","")},info:function(t){console.info("%cInfo:%c "+t,"display:inline-block;background-color:#46C0FF;color:#000;font-weight:bold;padding:3px 7px;border-radius:3px","")},log:function(t){console.log(t)},warn:function(t,e="log"){console.warn("%cWarning:%c "+t,"display:inline-block;background-color:gold;color:#000;font-weight:bold;padding:3px 7px;border-radius:3px","")}}}},e={};function n(i){var o=e[i];if(void 0!==o)return o.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,n),s.exports}n.d=(t,e)=>{for(var i in e)n.o(e,i)&&!n.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};n.d(i,{LT:()=>a});var o=n(2844),s=n(7738),r=n(1634);const a={...o,...n(3191),...s,...n(1570),...n(7066),...n(8511),...r,utils:{logger:n(7484).A}};var c=i.LT;export{c as LT}; \ No newline at end of file diff --git a/dist/assessment/index.js b/dist/assessment/index.js index 0f1dbd4..851d7f1 100644 --- a/dist/assessment/index.js +++ b/dist/assessment/index.js @@ -1,807 +1,2 @@ -/* - * ATTENTION: An "eval-source-map" devtool has been used. - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ var __webpack_modules__ = ({ - -/***/ "./dist/version.js": -/*!*************************!*\ - !*** ./dist/version.js ***! - \*************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* binding */ version)\n/* harmony export */ });\nconst version = '2.12.0';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9kaXN0L3ZlcnNpb24uanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL2Rpc3QvdmVyc2lvbi5qcz80OWMxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzIuMTIuMCc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./dist/version.js\n"); - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/assessment/extensions/ui/themes/juniorQuest/sass/index.scss": -/*!******************************************************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/assessment/extensions/ui/themes/juniorQuest/sass/index.scss ***! - \******************************************************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n___CSS_LOADER_EXPORT___.push([module.id, \"@import url(https://fonts.googleapis.com/css2?family=Comic+Neue:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap);\"]);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.lrn:not(.lrn_absolute_keyboard_parent),\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest,\n.lrn.lrn-assess.lt__theme-juniorQuest {\n font-family: \"LearnosityMath\", \"Comic Neue\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: 400;\n font-style: normal;\n font-size: 30px;\n color: #333;\n background-color: #e6f2ff;\n padding: 1em;\n /* Title and subtitle elements */\n /* Progress bar (if used) */\n /* Container queries to narrow and center items */\n /* Button elements */\n /* Table of contents */\n /* MCQ */\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region .top-right-wrapper,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region .top-right-wrapper,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region .top-right-wrapper {\n font-size: 0.8em;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region .top-right-wrapper .lrn_btn,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region .top-right-wrapper .lrn_btn,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region .top-right-wrapper .lrn_btn {\n vertical-align: bottom;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .test-title-text,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .test-title-text,\n.lrn.lrn-assess.lt__theme-juniorQuest .test-title-text {\n font-size: 1.8em;\n font-weight: bold;\n color: #2b63c7;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .subtitle,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .subtitle,\n.lrn.lrn-assess.lt__theme-juniorQuest .subtitle {\n font-size: 1.4em;\n color: #2b63c7;\n font-weight: bold;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .items .progress span,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .items .progress span,\n.lrn.lrn-assess.lt__theme-juniorQuest .items .progress span {\n background: #2b63c7;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .learnosity-item,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .learnosity-item,\n.lrn.lrn-assess.lt__theme-juniorQuest .learnosity-item {\n container-name: learnosity-item;\n container-type: inline-size;\n}\n@container learnosity-item (width < 800px) {\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\n width: 100%;\n }\n}\n@container learnosity-item (width > 800px) {\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\n width: 80%;\n margin: 0 auto;\n }\n}\n@container learnosity-item (width > 1000px) {\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\n width: 60%;\n }\n}\n@container learnosity-item (width > 1200px) {\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\n width: 50%;\n }\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn_blue,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue {\n background-color: #2b63c7;\n color: #fff;\n font-size: 0.8em;\n font-weight: bold;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled {\n background-color: #5384da;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn {\n font-size: 0.8em;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn.item-prev,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn.item-prev,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn.item-prev {\n background-color: #2b63c7;\n color: #fff;\n font-size: 0.8em;\n border: 1px solid #d9d9d9;\n font-weight: bold;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .toc,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .toc,\n.lrn.lrn-assess.lt__theme-juniorQuest .toc {\n font-size: 0.8em;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination li,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li {\n margin: 7px 0;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .toc .lrn-pager li.pagination-active a,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .toc .lrn-pager li.pagination-active a,\n.lrn.lrn-assess.lt__theme-juniorQuest .toc .lrn-pager li.pagination-active a {\n background: #f6c70a;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active:before,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active a:before,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:before,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:before,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:before,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:before {\n background-color: #f6c70a;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active:after,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active a:after,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:after,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:after,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:after,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:after {\n border-color: transparent transparent transparent #f6c70a;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item a:focus,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item a:focus,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item a:focus {\n -webkit-box-shadow: inset 0 0 0 2px #f6c70a;\n box-shadow: inset 0 0 0 2px #f6c70a;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination li:first-child,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li:first-child,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li:first-child {\n margin: 0;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .has-vertical-toc-region .lrn-right-region,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .has-vertical-toc-region .lrn-right-region,\n.lrn.lrn-assess.lt__theme-juniorQuest .has-vertical-toc-region .lrn-right-region {\n width: 150px;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a {\n background-color: #f7f7f7;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before {\n height: 47px;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-bottom-right-region.lrn-align-top,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-bottom-right-region.lrn-align-top,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-bottom-right-region.lrn-align-top {\n margin-top: 0px;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-right-region .right-wrapper:not(.menu-with-scroll),\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-right-region .right-wrapper:not(.menu-with-scroll),\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-right-region .right-wrapper:not(.menu-with-scroll) {\n height: auto;\n background-color: #eaeaea;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .lrn-pager .slides-vertical-pagination,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .lrn-pager .slides-vertical-pagination,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .lrn-pager .slides-vertical-pagination {\n padding-bottom: 1px;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination {\n height: auto;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn {\n font-size: 0.55em;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-horizontal-toc .pagination,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-horizontal-toc .pagination,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-horizontal-toc .pagination,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination {\n font-size: 1.03em;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_widget.lrn_mcq .lrn_mcqgroup,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_widget.lrn_mcq .lrn_mcqgroup,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_widget.lrn_mcq .lrn_mcqgroup {\n overflow-x: visible;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) input[type=radio],\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest input[type=radio],\n.lrn.lrn-assess.lt__theme-juniorQuest input[type=radio] {\n transform: scale(1.5);\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_response_wrapper,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_texteditor,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_toolbar,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-toolbar,\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-toolbar-footer,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_response_wrapper,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_texteditor,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_toolbar,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-toolbar,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-toolbar-footer,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_response_wrapper,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_texteditor,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_toolbar,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-toolbar,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-toolbar-footer {\n font-size: 0.8em;\n}\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_widget .lrn_texteditor_editable,\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_widget .lrn_texteditor_editable,\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_widget .lrn_texteditor_editable {\n padding: 0.5em;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/assessment/extensions/ui/themes/juniorQuest/sass/components/_player.scss\",\"webpack://./src/assessment/extensions/ui/themes/juniorQuest/sass/_variables.scss\",\"webpack://./src/assessment/extensions/ui/themes/juniorQuest/sass/index.scss\"],\"names\":[],\"mappings\":\"AAAA;;;EAGI,2FCIoB;EDHpB,gBAAA;EACA,kBAAA;EACA,eCJqB;EDKrB,WCFsB;EDGtB,yBCRmB;EDSnB,YAAA;EAUA,gCAAA;EAaA,2BAAA;EAKA,iDAAA;EA+BA,oBAAA;EA6BA,sBAAA;EA2DA,QAAA;AE3IJ;AFNI;;;EACI,gBCFkB;ACY1B;AFRQ;;;EACI,sBAAA;AEYZ;AFPI;;;EACI,gBCboB;EDcpB,iBAAA;EACA,cCjBiB;AC4BzB;AFRI;;;EACI,gBClBuB;EDmBvB,cCtBiB;EDuBjB,iBAAA;AEYR;AFRI;;;EACI,mBC5BiB;ACwCzB;AFRI;;;EACI,+BAAA;EACA,2BAAA;AEYR;AFTI;EACI;;;IACI,WAAA;EEaV;AACF;AFVI;EACI;;;IACI,UAAA;IACA,cAAA;EEcV;AACF;AFXI;EACI;;;IACI,UAAA;EEeV;AACF;AFZI;EACI;;;IACI,UAAA;EEgBV;AACF;AFZI;;;;;;EAEI,yBCpE2B;EDqE3B,WAAA;EACA,gBC/DkB;EDgElB,iBAAA;AEkBR;AFhBI;;;;;;;;;;;;;;;EAKI,yBAAA;AE4BR;AFzBI;;;EACI,gBC3EkB;ACwG1B;AF1BI;;;;;;EAEI,yBCvF2B;EDwF3B,WAAA;EACA,gBClFkB;EDmFlB,yBAAA;EACA,iBAAA;AEgCR;AF5BI;;;EACI,gBCzFkB;ACyH1B;AF9BI;;;EACI,aAAA;AEkCR;AFhCI;;;EACI,mBCxGmB;AC4I3B;AFlCI;;;;;;EAEI,yBC5GmB;ACoJ3B;AFtCI;;;;;;EAEI,yDAAA;AE4CR;AF1CI;;;EACI,2CAAA;EACA,mCAAA;AE8CR;AF5CI;;;EACI,SAAA;AEgDR;AF9CI;;;EACI,YAAA;AEkDR;AFhDI;;;;;;EAEI,yBAAA;AEsDR;AFpDI;;;;;;EAEI,YAAA;AE0DR;AFxDI;;;EACI,eAAA;AE4DR;AF1DI;;;EACI,YAAA;EACA,yBAAA;AE8DR;AF5DI;;;EACI,mBAAA;AEgER;AF9DI;;;EACI,YAAA;AEkER;AF/DI;;;EACI,iBAAA;AEmER;AFhEI;;;;;;EAEI,iBAAA;AEsER;AFlEI;;;EACI,mBAAA;AEsER;AFpEI;;;EACI,qBAAA;AEwER;AFrEI;;;;;;;;;;;;;;;EAKI,gBC/JkB;ACgP1B;AF9EI;;;EACI,cAAA;AEkFR\",\"sourcesContent\":[\".lrn:not(.lrn_absolute_keyboard_parent),\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest,\\n.lrn.lrn-assess.lt__theme-juniorQuest {\\n font-family: $lt__theme-font-family;\\n font-weight: 400;\\n font-style: normal;\\n font-size: $lt__theme-baseFontSize;\\n color: $lt__theme-color-primary;\\n background-color: $lt__theme-background;\\n padding: 1em;\\n\\n .lrn-region .top-right-wrapper {\\n font-size: $lt__theme-smallFontSize;\\n\\n .lrn_btn {\\n vertical-align: bottom;\\n }\\n }\\n\\n /* Title and subtitle elements */\\n .test-title-text {\\n font-size: $lt__theme-headingFontSize;\\n font-weight: bold;\\n color: $lt__theme-color-titles;\\n }\\n\\n .subtitle {\\n font-size: $lt__theme-subheadingFontSize;\\n color: $lt__theme-color-titles;\\n font-weight: bold;\\n }\\n\\n /* Progress bar (if used) */\\n .items .progress span {\\n background: $lt__theme-color-titles;\\n }\\n\\n /* Container queries to narrow and center items */\\n .learnosity-item {\\n container-name: learnosity-item;\\n container-type: inline-size;\\n }\\n\\n @container learnosity-item (width < 800px) {\\n .lrn .col-xs-12 {\\n width: 100%;\\n }\\n }\\n\\n @container learnosity-item (width > 800px) {\\n .lrn .col-xs-12 {\\n width: 80%;\\n margin: 0 auto;\\n }\\n }\\n\\n @container learnosity-item (width > 1000px) {\\n .lrn .col-xs-12 {\\n width: 60%;\\n }\\n }\\n\\n @container learnosity-item (width > 1200px) {\\n .lrn .col-xs-12 {\\n width: 50%;\\n }\\n }\\n\\n /* Button elements */\\n .lrn-region:not(.lrn-items-region) .lrn_btn_blue,\\n .lrn.lrn-assess .dialogs .lrn_btn_blue {\\n background-color: $lt__theme-btn-primary-background;\\n color: #fff;\\n font-size: $lt__theme-smallFontSize;\\n font-weight: bold;\\n }\\n .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),\\n .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),\\n .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,\\n .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,\\n .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled {\\n background-color: #5384da;\\n }\\n\\n .lrn-region:not(.lrn-items-region) .lrn_btn {\\n font-size: $lt__theme-smallFontSize;\\n }\\n\\n .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,\\n .lrn.lrn-assess .dialogs .lrn_btn.item-prev {\\n background-color: $lt__theme-btn-primary-background;\\n color: #fff;\\n font-size: $lt__theme-smallFontSize;\\n border: 1px solid #d9d9d9;\\n font-weight: bold;\\n }\\n\\n /* Table of contents */\\n .toc {\\n font-size: $lt__theme-smallFontSize;\\n }\\n .lrn-vertical-toc .slides-vertical-pagination li {\\n margin: 7px 0;\\n }\\n .toc .lrn-pager li.pagination-active a {\\n background: $lt__theme-background-toc;\\n }\\n .lrn-vertical-toc .pagination-active:before,\\n .lrn-vertical-toc .pagination-active a:before {\\n background-color: $lt__theme-background-toc;\\n }\\n .lrn-vertical-toc .pagination-active:after,\\n .lrn-vertical-toc .pagination-active a:after {\\n border-color: transparent transparent transparent $lt__theme-background-toc;\\n }\\n .lrn-vertical-toc .pagination-item a:focus {\\n -webkit-box-shadow: inset 0 0 0 2px $lt__theme-background-toc;\\n box-shadow: inset 0 0 0 2px $lt__theme-background-toc;\\n }\\n .lrn-vertical-toc .slides-vertical-pagination li:first-child {\\n margin: 0;\\n }\\n .has-vertical-toc-region .lrn-right-region {\\n width: 150px;\\n }\\n .lrn-vertical-toc .pagination-item.pagination-item[data-attempted='partially_attempted']:not(.pagination-active) a,\\n .lrn-vertical-toc .pagination-item.pagination-item[data-attempted='fully_attempted']:not(.pagination-active) a {\\n background-color: #f7f7f7;\\n }\\n .lrn-vertical-toc .pagination-item.pagination-item[data-attempted='partially_attempted']:not(.pagination-active):before,\\n .lrn-vertical-toc .pagination-item.pagination-item[data-attempted='fully_attempted']:not(.pagination-active):before {\\n height: 47px;\\n }\\n .lrn-bottom-right-region.lrn-align-top {\\n margin-top: 0px;\\n }\\n .lrn-right-region .right-wrapper:not(.menu-with-scroll) {\\n height: auto;\\n background-color: #eaeaea;\\n }\\n .lrn-vertical-toc .lrn-pager .slides-vertical-pagination {\\n padding-bottom: 1px;\\n }\\n .lrn-vertical-toc .slides-vertical-pagination {\\n height: auto;\\n }\\n\\n .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn {\\n font-size: 0.55em;\\n }\\n\\n .lrn-horizontal-toc .pagination,\\n .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination {\\n font-size: 1.03em;\\n }\\n\\n /* MCQ */\\n .lrn_widget.lrn_mcq .lrn_mcqgroup {\\n overflow-x: visible;\\n }\\n input[type='radio'] {\\n transform: scale(1.5);\\n }\\n\\n .lrn_response_wrapper,\\n .lrn_texteditor,\\n .lrn_toolbar,\\n .lrn-toolbar,\\n .lrn-toolbar-footer {\\n font-size: $lt__theme-smallFontSize;\\n }\\n\\n .lrn_widget .lrn_texteditor_editable {\\n padding: 0.5em;\\n }\\n}\\n\",\"$lt__theme-background: #e6f2ff;\\n$lt__theme-background-toc: #f6c70a;\\n$lt__theme-baseFontSize: 30px;\\n$lt__theme-btn-primary-background: #2b63c7;\\n$lt__theme-btn-primary-color: #ffffff;\\n$lt__theme-color-primary: #333;\\n$lt__theme-color-titles: #2b63c7;\\n$lt__theme-font-family: 'LearnosityMath', 'Comic Neue', 'Helvetica Neue', Helvetica, Arial, sans-serif;\\n$lt__theme-headingFontSize: 1.8em;\\n$lt__theme-subheadingFontSize: 1.4em;\\n$lt__theme-smallFontSize: 0.8em;\\n\",\"@import url(\\\"https://fonts.googleapis.com/css2?family=Comic+Neue:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap\\\");\\n.lrn:not(.lrn_absolute_keyboard_parent),\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest,\\n.lrn.lrn-assess.lt__theme-juniorQuest {\\n font-family: \\\"LearnosityMath\\\", \\\"Comic Neue\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n font-weight: 400;\\n font-style: normal;\\n font-size: 30px;\\n color: #333;\\n background-color: #e6f2ff;\\n padding: 1em;\\n /* Title and subtitle elements */\\n /* Progress bar (if used) */\\n /* Container queries to narrow and center items */\\n /* Button elements */\\n /* Table of contents */\\n /* MCQ */\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region .top-right-wrapper,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region .top-right-wrapper,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region .top-right-wrapper {\\n font-size: 0.8em;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region .top-right-wrapper .lrn_btn,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region .top-right-wrapper .lrn_btn,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region .top-right-wrapper .lrn_btn {\\n vertical-align: bottom;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .test-title-text,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .test-title-text,\\n.lrn.lrn-assess.lt__theme-juniorQuest .test-title-text {\\n font-size: 1.8em;\\n font-weight: bold;\\n color: #2b63c7;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .subtitle,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .subtitle,\\n.lrn.lrn-assess.lt__theme-juniorQuest .subtitle {\\n font-size: 1.4em;\\n color: #2b63c7;\\n font-weight: bold;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .items .progress span,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .items .progress span,\\n.lrn.lrn-assess.lt__theme-juniorQuest .items .progress span {\\n background: #2b63c7;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .learnosity-item,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .learnosity-item,\\n.lrn.lrn-assess.lt__theme-juniorQuest .learnosity-item {\\n container-name: learnosity-item;\\n container-type: inline-size;\\n}\\n@container learnosity-item (width < 800px) {\\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\\n width: 100%;\\n }\\n}\\n@container learnosity-item (width > 800px) {\\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\\n width: 80%;\\n margin: 0 auto;\\n }\\n}\\n@container learnosity-item (width > 1000px) {\\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\\n width: 60%;\\n }\\n}\\n@container learnosity-item (width > 1200px) {\\n .lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,\\n .lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,\\n .lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12 {\\n width: 50%;\\n }\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn_blue,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue {\\n background-color: #2b63c7;\\n color: #fff;\\n font-size: 0.8em;\\n font-weight: bold;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled {\\n background-color: #5384da;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn {\\n font-size: 0.8em;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn.item-prev,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn.item-prev,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn.item-prev {\\n background-color: #2b63c7;\\n color: #fff;\\n font-size: 0.8em;\\n border: 1px solid #d9d9d9;\\n font-weight: bold;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .toc,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .toc,\\n.lrn.lrn-assess.lt__theme-juniorQuest .toc {\\n font-size: 0.8em;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination li,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li {\\n margin: 7px 0;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .toc .lrn-pager li.pagination-active a,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .toc .lrn-pager li.pagination-active a,\\n.lrn.lrn-assess.lt__theme-juniorQuest .toc .lrn-pager li.pagination-active a {\\n background: #f6c70a;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active:before,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active a:before,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:before,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:before,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:before,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:before {\\n background-color: #f6c70a;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active:after,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active a:after,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:after,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:after,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:after,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:after {\\n border-color: transparent transparent transparent #f6c70a;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item a:focus,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item a:focus,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item a:focus {\\n -webkit-box-shadow: inset 0 0 0 2px #f6c70a;\\n box-shadow: inset 0 0 0 2px #f6c70a;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination li:first-child,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li:first-child,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li:first-child {\\n margin: 0;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .has-vertical-toc-region .lrn-right-region,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .has-vertical-toc-region .lrn-right-region,\\n.lrn.lrn-assess.lt__theme-juniorQuest .has-vertical-toc-region .lrn-right-region {\\n width: 150px;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a {\\n background-color: #f7f7f7;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before {\\n height: 47px;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-bottom-right-region.lrn-align-top,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-bottom-right-region.lrn-align-top,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-bottom-right-region.lrn-align-top {\\n margin-top: 0px;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-right-region .right-wrapper:not(.menu-with-scroll),\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-right-region .right-wrapper:not(.menu-with-scroll),\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-right-region .right-wrapper:not(.menu-with-scroll) {\\n height: auto;\\n background-color: #eaeaea;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .lrn-pager .slides-vertical-pagination,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .lrn-pager .slides-vertical-pagination,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .lrn-pager .slides-vertical-pagination {\\n padding-bottom: 1px;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination {\\n height: auto;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn {\\n font-size: 0.55em;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-horizontal-toc .pagination,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-horizontal-toc .pagination,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-horizontal-toc .pagination,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination {\\n font-size: 1.03em;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_widget.lrn_mcq .lrn_mcqgroup,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_widget.lrn_mcq .lrn_mcqgroup,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_widget.lrn_mcq .lrn_mcqgroup {\\n overflow-x: visible;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) input[type=radio],\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest input[type=radio],\\n.lrn.lrn-assess.lt__theme-juniorQuest input[type=radio] {\\n transform: scale(1.5);\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_response_wrapper,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_texteditor,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_toolbar,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-toolbar,\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn-toolbar-footer,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_response_wrapper,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_texteditor,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_toolbar,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-toolbar,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-toolbar-footer,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_response_wrapper,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_texteditor,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_toolbar,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-toolbar,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn-toolbar-footer {\\n font-size: 0.8em;\\n}\\n.lrn:not(.lrn_absolute_keyboard_parent) .lrn_widget .lrn_texteditor_editable,\\n.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_widget .lrn_texteditor_editable,\\n.lrn.lrn-assess.lt__theme-juniorQuest .lrn_widget .lrn_texteditor_editable {\\n padding: 0.5em;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvdWkvdGhlbWVzL2p1bmlvclF1ZXN0L3Nhc3MvaW5kZXguc2NzcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQzRIO0FBQ2pCO0FBQzNHLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0YsMEhBQTBILE1BQU0sTUFBTSxNQUFNLE1BQU0sb0JBQW9CO0FBQ3RLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsT0FBTyxrVEFBa1QsWUFBWSxZQUFZLFdBQVcsV0FBVyxZQUFZLGFBQWEsV0FBVyxXQUFXLFdBQVcsV0FBVyxZQUFZLFlBQVksV0FBVyxNQUFNLE9BQU8sWUFBWSxNQUFNLE9BQU8sV0FBVyxLQUFLLE9BQU8sWUFBWSxZQUFZLFlBQVksT0FBTyxPQUFPLGFBQWEsY0FBYyxhQUFhLEtBQUssT0FBTyxhQUFhLE9BQU8sT0FBTyxXQUFXLFdBQVcsS0FBSyxLQUFLLE9BQU8sVUFBVSxLQUFLLEtBQUssS0FBSyxPQUFPLFVBQVUsVUFBVSxLQUFLLEtBQUssS0FBSyxPQUFPLFVBQVUsS0FBSyxLQUFLLEtBQUssT0FBTyxVQUFVLE1BQU0sS0FBSyxVQUFVLGFBQWEsWUFBWSxhQUFhLGFBQWEsTUFBTSxvQkFBb0IsV0FBVyxNQUFNLFFBQVEsYUFBYSxPQUFPLFdBQVcsYUFBYSxZQUFZLGFBQWEsYUFBYSxXQUFXLE1BQU0sUUFBUSxhQUFhLE9BQU8sUUFBUSxVQUFVLE1BQU0sUUFBUSxhQUFhLE9BQU8sV0FBVyxhQUFhLE9BQU8sV0FBVyxXQUFXLE1BQU0sUUFBUSxXQUFXLFdBQVcsTUFBTSxRQUFRLFVBQVUsTUFBTSxRQUFRLFVBQVUsTUFBTSxXQUFXLFdBQVcsTUFBTSxXQUFXLFVBQVUsTUFBTSxRQUFRLFVBQVUsTUFBTSxRQUFRLFVBQVUsV0FBVyxNQUFNLFFBQVEsV0FBVyxNQUFNLFFBQVEsVUFBVSxNQUFNLFFBQVEsV0FBVyxNQUFNLFdBQVcsV0FBVyxNQUFNLFFBQVEsV0FBVyxNQUFNLFFBQVEsV0FBVyxNQUFNLG9CQUFvQixhQUFhLE9BQU8sUUFBUSxVQUFVLDBKQUEwSiwwQ0FBMEMsdUJBQXVCLHlCQUF5Qix5Q0FBeUMsc0NBQXNDLDhDQUE4QyxtQkFBbUIsd0NBQXdDLDhDQUE4QyxzQkFBc0IscUNBQXFDLFdBQVcsT0FBTyxpRUFBaUUsZ0RBQWdELDRCQUE0Qix5Q0FBeUMsT0FBTyxtQkFBbUIsbURBQW1ELHlDQUF5Qyw0QkFBNEIsT0FBTyxpRUFBaUUsOENBQThDLE9BQU8sa0ZBQWtGLDBDQUEwQyxzQ0FBc0MsT0FBTyxvREFBb0QsMkJBQTJCLDBCQUEwQixXQUFXLE9BQU8sb0RBQW9ELDJCQUEyQix5QkFBeUIsNkJBQTZCLFdBQVcsT0FBTyxxREFBcUQsMkJBQTJCLHlCQUF5QixXQUFXLE9BQU8scURBQXFELDJCQUEyQix5QkFBeUIsV0FBVyxPQUFPLGtJQUFrSSw4REFBOEQsc0JBQXNCLDhDQUE4Qyw0QkFBNEIsT0FBTywwVUFBMFUsb0NBQW9DLE9BQU8scURBQXFELDhDQUE4QyxPQUFPLGlIQUFpSCw4REFBOEQsc0JBQXNCLDhDQUE4QyxvQ0FBb0MsNEJBQTRCLE9BQU8sMkNBQTJDLDhDQUE4QyxPQUFPLHdEQUF3RCx3QkFBd0IsT0FBTyw4Q0FBOEMsZ0RBQWdELE9BQU8sdUdBQXVHLHNEQUFzRCxPQUFPLHFHQUFxRyxzRkFBc0YsT0FBTyxrREFBa0Qsd0VBQXdFLGdFQUFnRSxPQUFPLG9FQUFvRSxvQkFBb0IsT0FBTyxrREFBa0QsdUJBQXVCLE9BQU8sK09BQStPLG9DQUFvQyxPQUFPLHlQQUF5UCx1QkFBdUIsT0FBTyw4Q0FBOEMsMEJBQTBCLE9BQU8sK0RBQStELHVCQUF1QixvQ0FBb0MsT0FBTyxnRUFBZ0UsOEJBQThCLE9BQU8scURBQXFELHVCQUF1QixPQUFPLG1FQUFtRSw0QkFBNEIsT0FBTywwR0FBMEcsNEJBQTRCLE9BQU8sMERBQTBELDhCQUE4QixPQUFPLDJCQUEyQixnQ0FBZ0MsT0FBTyxxSEFBcUgsOENBQThDLE9BQU8sOENBQThDLHlCQUF5QixPQUFPLEdBQUcsb0NBQW9DLHFDQUFxQyxnQ0FBZ0MsNkNBQTZDLHdDQUF3QyxpQ0FBaUMsbUNBQW1DLHlHQUF5RyxvQ0FBb0MsdUNBQXVDLGtDQUFrQyx1RkFBdUYsTUFBTSxNQUFNLE1BQU0sTUFBTSxzQkFBc0Isa0lBQWtJLHNHQUFzRyxxQkFBcUIsdUJBQXVCLG9CQUFvQixnQkFBZ0IsOEJBQThCLGlCQUFpQiwrTEFBK0wsK05BQStOLHFCQUFxQixHQUFHLDBQQUEwUCwyQkFBMkIsR0FBRyxxTEFBcUwscUJBQXFCLHNCQUFzQixtQkFBbUIsR0FBRyxnS0FBZ0sscUJBQXFCLG1CQUFtQixzQkFBc0IsR0FBRyxvTUFBb00sd0JBQXdCLEdBQUcscUxBQXFMLG9DQUFvQyxnQ0FBZ0MsR0FBRyw4Q0FBOEMsd0xBQXdMLGtCQUFrQixLQUFLLEdBQUcsOENBQThDLHdMQUF3TCxpQkFBaUIscUJBQXFCLEtBQUssR0FBRywrQ0FBK0Msd0xBQXdMLGlCQUFpQixLQUFLLEdBQUcsK0NBQStDLHdMQUF3TCxpQkFBaUIsS0FBSyxHQUFHLDJnQkFBMmdCLDhCQUE4QixnQkFBZ0IscUJBQXFCLHNCQUFzQixHQUFHLHVnREFBdWdELDhCQUE4QixHQUFHLHNRQUFzUSxxQkFBcUIsR0FBRyx5aUJBQXlpQiw4QkFBOEIsZ0JBQWdCLHFCQUFxQiw4QkFBOEIsc0JBQXNCLEdBQUcsaUpBQWlKLHFCQUFxQixHQUFHLHFSQUFxUixrQkFBa0IsR0FBRyx1UEFBdVAsd0JBQXdCLEdBQUcsaWhCQUFpaEIsOEJBQThCLEdBQUcsMmdCQUEyZ0IsOERBQThELEdBQUcsbVFBQW1RLGdEQUFnRCx3Q0FBd0MsR0FBRyx5VEFBeVQsY0FBYyxHQUFHLG1RQUFtUSxpQkFBaUIsR0FBRyw2NUJBQTY1Qiw4QkFBOEIsR0FBRywyN0JBQTI3QixpQkFBaUIsR0FBRyx1UEFBdVAsb0JBQW9CLEdBQUcsMFNBQTBTLGlCQUFpQiw4QkFBOEIsR0FBRyw2U0FBNlMsd0JBQXdCLEdBQUcsNFFBQTRRLGlCQUFpQixHQUFHLGdUQUFnVCxzQkFBc0IsR0FBRyxvaEJBQW9oQixzQkFBc0IsR0FBRyx3T0FBd08sd0JBQXdCLEdBQUcsd0xBQXdMLDBCQUEwQixHQUFHLGs0QkFBazRCLHFCQUFxQixHQUFHLGlQQUFpUCxtQkFBbUIsR0FBRyxtQkFBbUI7QUFDNTJyQjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvdWkvdGhlbWVzL2p1bmlvclF1ZXN0L3Nhc3MvaW5kZXguc2Nzcz9lOWQxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Q29taWMrTmV1ZTppdGFsLHdnaHRAMCwzMDA7MCw0MDA7MCw3MDA7MSwzMDA7MSw0MDA7MSw3MDAmZGlzcGxheT1zd2FwKTtcIl0pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCksXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3Qge1xuICBmb250LWZhbWlseTogXCJMZWFybm9zaXR5TWF0aFwiLCBcIkNvbWljIE5ldWVcIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMzBweDtcbiAgY29sb3I6ICMzMzM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNmYyZmY7XG4gIHBhZGRpbmc6IDFlbTtcbiAgLyogVGl0bGUgYW5kIHN1YnRpdGxlIGVsZW1lbnRzICovXG4gIC8qIFByb2dyZXNzIGJhciAoaWYgdXNlZCkgKi9cbiAgLyogQ29udGFpbmVyIHF1ZXJpZXMgdG8gbmFycm93IGFuZCBjZW50ZXIgaXRlbXMgKi9cbiAgLyogQnV0dG9uIGVsZW1lbnRzICovXG4gIC8qIFRhYmxlIG9mIGNvbnRlbnRzICovXG4gIC8qIE1DUSAqL1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tcmVnaW9uIC50b3AtcmlnaHQtd3JhcHBlcixcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uIC50b3AtcmlnaHQtd3JhcHBlcixcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb24gLnRvcC1yaWdodC13cmFwcGVyIHtcbiAgZm9udC1zaXplOiAwLjhlbTtcbn1cbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbiAudG9wLXJpZ2h0LXdyYXBwZXIgLmxybl9idG4sXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbiAudG9wLXJpZ2h0LXdyYXBwZXIgLmxybl9idG4sXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uIC50b3AtcmlnaHQtd3JhcHBlciAubHJuX2J0biB7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLnRlc3QtdGl0bGUtdGV4dCxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50ZXN0LXRpdGxlLXRleHQsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50ZXN0LXRpdGxlLXRleHQge1xuICBmb250LXNpemU6IDEuOGVtO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICMyYjYzYzc7XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLnN1YnRpdGxlLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLnN1YnRpdGxlLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAuc3VidGl0bGUge1xuICBmb250LXNpemU6IDEuNGVtO1xuICBjb2xvcjogIzJiNjNjNztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLml0ZW1zIC5wcm9ncmVzcyBzcGFuLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLml0ZW1zIC5wcm9ncmVzcyBzcGFuLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAuaXRlbXMgLnByb2dyZXNzIHNwYW4ge1xuICBiYWNrZ3JvdW5kOiAjMmI2M2M3O1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5sZWFybm9zaXR5LWl0ZW0sXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubGVhcm5vc2l0eS1pdGVtLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubGVhcm5vc2l0eS1pdGVtIHtcbiAgY29udGFpbmVyLW5hbWU6IGxlYXJub3NpdHktaXRlbTtcbiAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplO1xufVxuQGNvbnRhaW5lciBsZWFybm9zaXR5LWl0ZW0gKHdpZHRoIDwgODAwcHgpIHtcbiAgLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4gLmNvbC14cy0xMixcbiAgLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybiAuY29sLXhzLTEyLFxuICAubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4gLmNvbC14cy0xMiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cbkBjb250YWluZXIgbGVhcm5vc2l0eS1pdGVtICh3aWR0aCA+IDgwMHB4KSB7XG4gIC5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuIC5jb2wteHMtMTIsXG4gIC5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4gLmNvbC14cy0xMixcbiAgLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuIC5jb2wteHMtMTIge1xuICAgIHdpZHRoOiA4MCU7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gIH1cbn1cbkBjb250YWluZXIgbGVhcm5vc2l0eS1pdGVtICh3aWR0aCA+IDEwMDBweCkge1xuICAubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybiAuY29sLXhzLTEyLFxuICAubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuIC5jb2wteHMtMTIsXG4gIC5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybiAuY29sLXhzLTEyIHtcbiAgICB3aWR0aDogNjAlO1xuICB9XG59XG5AY29udGFpbmVyIGxlYXJub3NpdHktaXRlbSAod2lkdGggPiAxMjAwcHgpIHtcbiAgLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4gLmNvbC14cy0xMixcbiAgLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybiAuY29sLXhzLTEyLFxuICAubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4gLmNvbC14cy0xMiB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZSxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG5fYmx1ZSxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZSxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4ubHJuLWFzc2VzcyAuZGlhbG9ncyAubHJuX2J0bl9ibHVlLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWUsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4ubHJuLWFzc2VzcyAuZGlhbG9ncyAubHJuX2J0bl9ibHVlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJiNjNjNztcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtc2l6ZTogMC44ZW07XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZTpob3Zlcjpub3QoOmRpc2FibGVkKSxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG5fYmx1ZTpob3Zlcjpub3QoOmRpc2FibGVkKSxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6YWN0aXZlLFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZTpmb2N1cyxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6ZGlzYWJsZWQsXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6aG92ZXI6bm90KDpkaXNhYmxlZCksXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG5fYmx1ZTpob3Zlcjpub3QoOmRpc2FibGVkKSxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZTphY3RpdmUsXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6Zm9jdXMsXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6ZGlzYWJsZWQsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZTpob3Zlcjpub3QoOmRpc2FibGVkKSxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi5scm4tYXNzZXNzIC5kaWFsb2dzIC5scm5fYnRuX2JsdWU6aG92ZXI6bm90KDpkaXNhYmxlZCksXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZTphY3RpdmUsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZTpmb2N1cyxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmRpc2FibGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUzODRkYTtcbn1cbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bixcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0biB7XG4gIGZvbnQtc2l6ZTogMC44ZW07XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bi5pdGVtLXByZXYsXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi5scm4tYXNzZXNzIC5kaWFsb2dzIC5scm5fYnRuLml0ZW0tcHJldixcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG4uaXRlbS1wcmV2LFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi5scm4tYXNzZXNzIC5kaWFsb2dzIC5scm5fYnRuLml0ZW0tcHJldixcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bi5pdGVtLXByZXYsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4ubHJuLWFzc2VzcyAuZGlhbG9ncyAubHJuX2J0bi5pdGVtLXByZXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmI2M2M3O1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLnRvYyxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50b2MsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50b2Mge1xuICBmb250LXNpemU6IDAuOGVtO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbiBsaSxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbiBsaSxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIGxpIHtcbiAgbWFyZ2luOiA3cHggMDtcbn1cbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAudG9jIC5scm4tcGFnZXIgbGkucGFnaW5hdGlvbi1hY3RpdmUgYSxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50b2MgLmxybi1wYWdlciBsaS5wYWdpbmF0aW9uLWFjdGl2ZSBhLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAudG9jIC5scm4tcGFnZXIgbGkucGFnaW5hdGlvbi1hY3RpdmUgYSB7XG4gIGJhY2tncm91bmQ6ICNmNmM3MGE7XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24tYWN0aXZlOmJlZm9yZSxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmUgYTpiZWZvcmUsXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmU6YmVmb3JlLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24tYWN0aXZlIGE6YmVmb3JlLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmU6YmVmb3JlLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmUgYTpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjZjNzBhO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZTphZnRlcixcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmUgYTphZnRlcixcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZTphZnRlcixcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZSBhOmFmdGVyLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmU6YWZ0ZXIsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZSBhOmFmdGVyIHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjZjZjNzBhO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0gYTpmb2N1cyxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0gYTpmb2N1cyxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbSBhOmZvY3VzIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2Y2YzcwYTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4ICNmNmM3MGE7XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIGxpOmZpcnN0LWNoaWxkLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIGxpOmZpcnN0LWNoaWxkLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAuc2xpZGVzLXZlcnRpY2FsLXBhZ2luYXRpb24gbGk6Zmlyc3QtY2hpbGQge1xuICBtYXJnaW46IDA7XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmhhcy12ZXJ0aWNhbC10b2MtcmVnaW9uIC5scm4tcmlnaHQtcmVnaW9uLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmhhcy12ZXJ0aWNhbC10b2MtcmVnaW9uIC5scm4tcmlnaHQtcmVnaW9uLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAuaGFzLXZlcnRpY2FsLXRvYy1yZWdpb24gLmxybi1yaWdodC1yZWdpb24ge1xuICB3aWR0aDogMTUwcHg7XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9cGFydGlhbGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSkgYSxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1mdWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpIGEsXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1wYXJ0aWFsbHlfYXR0ZW1wdGVkXTpub3QoLnBhZ2luYXRpb24tYWN0aXZlKSBhLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9ZnVsbHlfYXR0ZW1wdGVkXTpub3QoLnBhZ2luYXRpb24tYWN0aXZlKSBhLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1wYXJ0aWFsbHlfYXR0ZW1wdGVkXTpub3QoLnBhZ2luYXRpb24tYWN0aXZlKSBhLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1mdWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpIGEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3O1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPXBhcnRpYWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpOmJlZm9yZSxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1mdWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpOmJlZm9yZSxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPXBhcnRpYWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpOmJlZm9yZSxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPWZ1bGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSk6YmVmb3JlLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1wYXJ0aWFsbHlfYXR0ZW1wdGVkXTpub3QoLnBhZ2luYXRpb24tYWN0aXZlKTpiZWZvcmUsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPWZ1bGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSk6YmVmb3JlIHtcbiAgaGVpZ2h0OiA0N3B4O1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tYm90dG9tLXJpZ2h0LXJlZ2lvbi5scm4tYWxpZ24tdG9wLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1ib3R0b20tcmlnaHQtcmVnaW9uLmxybi1hbGlnbi10b3AsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tYm90dG9tLXJpZ2h0LXJlZ2lvbi5scm4tYWxpZ24tdG9wIHtcbiAgbWFyZ2luLXRvcDogMHB4O1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tcmlnaHQtcmVnaW9uIC5yaWdodC13cmFwcGVyOm5vdCgubWVudS13aXRoLXNjcm9sbCksXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJpZ2h0LXJlZ2lvbiAucmlnaHQtd3JhcHBlcjpub3QoLm1lbnUtd2l0aC1zY3JvbGwpLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJpZ2h0LXJlZ2lvbiAucmlnaHQtd3JhcHBlcjpub3QoLm1lbnUtd2l0aC1zY3JvbGwpIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWFlYWVhO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5scm4tcGFnZXIgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLmxybi1wYWdlciAuc2xpZGVzLXZlcnRpY2FsLXBhZ2luYXRpb24sXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5scm4tcGFnZXIgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIHtcbiAgcGFkZGluZy1ib3R0b206IDFweDtcbn1cbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAuc2xpZGVzLXZlcnRpY2FsLXBhZ2luYXRpb24sXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAuc2xpZGVzLXZlcnRpY2FsLXBhZ2luYXRpb24sXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbiB7XG4gIGhlaWdodDogYXV0bztcbn1cbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5tZW51LWJ1dHRvbnMgLmxybl9idG4sXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5tZW51LWJ1dHRvbnMgLmxybl9idG4sXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLm1lbnUtYnV0dG9ucyAubHJuX2J0biB7XG4gIGZvbnQtc2l6ZTogMC41NWVtO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4taG9yaXpvbnRhbC10b2MgLnBhZ2luYXRpb24sXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi5scm4tYXNzZXNzIC5scm4taG9yaXpvbnRhbC10b2MgLmxybi1hc3Nlc3MtcGFnaW5hdGlvbixcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4taG9yaXpvbnRhbC10b2MgLnBhZ2luYXRpb24sXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLmxybi1hc3Nlc3MgLmxybi1ob3Jpem9udGFsLXRvYyAubHJuLWFzc2Vzcy1wYWdpbmF0aW9uLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLWhvcml6b250YWwtdG9jIC5wYWdpbmF0aW9uLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLmxybi1hc3Nlc3MgLmxybi1ob3Jpem9udGFsLXRvYyAubHJuLWFzc2Vzcy1wYWdpbmF0aW9uIHtcbiAgZm9udC1zaXplOiAxLjAzZW07XG59XG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybl93aWRnZXQubHJuX21jcSAubHJuX21jcWdyb3VwLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl93aWRnZXQubHJuX21jcSAubHJuX21jcWdyb3VwLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuX3dpZGdldC5scm5fbWNxIC5scm5fbWNxZ3JvdXAge1xuICBvdmVyZmxvdy14OiB2aXNpYmxlO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIGlucHV0W3R5cGU9cmFkaW9dLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgaW5wdXRbdHlwZT1yYWRpb10sXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IGlucHV0W3R5cGU9cmFkaW9dIHtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpO1xufVxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm5fcmVzcG9uc2Vfd3JhcHBlcixcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuX3RleHRlZGl0b3IsXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybl90b29sYmFyLFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdG9vbGJhcixcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXRvb2xiYXItZm9vdGVyLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl9yZXNwb25zZV93cmFwcGVyLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl90ZXh0ZWRpdG9yLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl90b29sYmFyLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi10b29sYmFyLFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi10b29sYmFyLWZvb3Rlcixcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl9yZXNwb25zZV93cmFwcGVyLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuX3RleHRlZGl0b3IsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm5fdG9vbGJhcixcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi10b29sYmFyLFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXRvb2xiYXItZm9vdGVyIHtcbiAgZm9udC1zaXplOiAwLjhlbTtcbn1cbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuX3dpZGdldCAubHJuX3RleHRlZGl0b3JfZWRpdGFibGUsXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuX3dpZGdldCAubHJuX3RleHRlZGl0b3JfZWRpdGFibGUsXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm5fd2lkZ2V0IC5scm5fdGV4dGVkaXRvcl9lZGl0YWJsZSB7XG4gIHBhZGRpbmc6IDAuNWVtO1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2Fzc2Vzc21lbnQvZXh0ZW5zaW9ucy91aS90aGVtZXMvanVuaW9yUXVlc3Qvc2Fzcy9jb21wb25lbnRzL19wbGF5ZXIuc2Nzc1wiLFwid2VicGFjazovLy4vc3JjL2Fzc2Vzc21lbnQvZXh0ZW5zaW9ucy91aS90aGVtZXMvanVuaW9yUXVlc3Qvc2Fzcy9fdmFyaWFibGVzLnNjc3NcIixcIndlYnBhY2s6Ly8uL3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvdWkvdGhlbWVzL2p1bmlvclF1ZXN0L3Nhc3MvaW5kZXguc2Nzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTs7O0VBR0ksMkZDSW9CO0VESHBCLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxlQ0pxQjtFREtyQixXQ0ZzQjtFREd0Qix5QkNSbUI7RURTbkIsWUFBQTtFQVVBLGdDQUFBO0VBYUEsMkJBQUE7RUFLQSxpREFBQTtFQStCQSxvQkFBQTtFQTZCQSxzQkFBQTtFQTJEQSxRQUFBO0FFM0lKO0FGTkk7OztFQUNJLGdCQ0ZrQjtBQ1kxQjtBRlJROzs7RUFDSSxzQkFBQTtBRVlaO0FGUEk7OztFQUNJLGdCQ2JvQjtFRGNwQixpQkFBQTtFQUNBLGNDakJpQjtBQzRCekI7QUZSSTs7O0VBQ0ksZ0JDbEJ1QjtFRG1CdkIsY0N0QmlCO0VEdUJqQixpQkFBQTtBRVlSO0FGUkk7OztFQUNJLG1CQzVCaUI7QUN3Q3pCO0FGUkk7OztFQUNJLCtCQUFBO0VBQ0EsMkJBQUE7QUVZUjtBRlRJO0VBQ0k7OztJQUNJLFdBQUE7RUVhVjtBQUNGO0FGVkk7RUFDSTs7O0lBQ0ksVUFBQTtJQUNBLGNBQUE7RUVjVjtBQUNGO0FGWEk7RUFDSTs7O0lBQ0ksVUFBQTtFRWVWO0FBQ0Y7QUZaSTtFQUNJOzs7SUFDSSxVQUFBO0VFZ0JWO0FBQ0Y7QUZaSTs7Ozs7O0VBRUkseUJDcEUyQjtFRHFFM0IsV0FBQTtFQUNBLGdCQy9Ea0I7RURnRWxCLGlCQUFBO0FFa0JSO0FGaEJJOzs7Ozs7Ozs7Ozs7Ozs7RUFLSSx5QkFBQTtBRTRCUjtBRnpCSTs7O0VBQ0ksZ0JDM0VrQjtBQ3dHMUI7QUYxQkk7Ozs7OztFQUVJLHlCQ3ZGMkI7RUR3RjNCLFdBQUE7RUFDQSxnQkNsRmtCO0VEbUZsQix5QkFBQTtFQUNBLGlCQUFBO0FFZ0NSO0FGNUJJOzs7RUFDSSxnQkN6RmtCO0FDeUgxQjtBRjlCSTs7O0VBQ0ksYUFBQTtBRWtDUjtBRmhDSTs7O0VBQ0ksbUJDeEdtQjtBQzRJM0I7QUZsQ0k7Ozs7OztFQUVJLHlCQzVHbUI7QUNvSjNCO0FGdENJOzs7Ozs7RUFFSSx5REFBQTtBRTRDUjtBRjFDSTs7O0VBQ0ksMkNBQUE7RUFDQSxtQ0FBQTtBRThDUjtBRjVDSTs7O0VBQ0ksU0FBQTtBRWdEUjtBRjlDSTs7O0VBQ0ksWUFBQTtBRWtEUjtBRmhESTs7Ozs7O0VBRUkseUJBQUE7QUVzRFI7QUZwREk7Ozs7OztFQUVJLFlBQUE7QUUwRFI7QUZ4REk7OztFQUNJLGVBQUE7QUU0RFI7QUYxREk7OztFQUNJLFlBQUE7RUFDQSx5QkFBQTtBRThEUjtBRjVESTs7O0VBQ0ksbUJBQUE7QUVnRVI7QUY5REk7OztFQUNJLFlBQUE7QUVrRVI7QUYvREk7OztFQUNJLGlCQUFBO0FFbUVSO0FGaEVJOzs7Ozs7RUFFSSxpQkFBQTtBRXNFUjtBRmxFSTs7O0VBQ0ksbUJBQUE7QUVzRVI7QUZwRUk7OztFQUNJLHFCQUFBO0FFd0VSO0FGckVJOzs7Ozs7Ozs7Ozs7Ozs7RUFLSSxnQkMvSmtCO0FDZ1AxQjtBRjlFSTs7O0VBQ0ksY0FBQTtBRWtGUlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCksXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCB7XFxuICAgIGZvbnQtZmFtaWx5OiAkbHRfX3RoZW1lLWZvbnQtZmFtaWx5O1xcbiAgICBmb250LXdlaWdodDogNDAwO1xcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XFxuICAgIGZvbnQtc2l6ZTogJGx0X190aGVtZS1iYXNlRm9udFNpemU7XFxuICAgIGNvbG9yOiAkbHRfX3RoZW1lLWNvbG9yLXByaW1hcnk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICRsdF9fdGhlbWUtYmFja2dyb3VuZDtcXG4gICAgcGFkZGluZzogMWVtO1xcblxcbiAgICAubHJuLXJlZ2lvbiAudG9wLXJpZ2h0LXdyYXBwZXIge1xcbiAgICAgICAgZm9udC1zaXplOiAkbHRfX3RoZW1lLXNtYWxsRm9udFNpemU7XFxuXFxuICAgICAgICAubHJuX2J0biB7XFxuICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICAvKiBUaXRsZSBhbmQgc3VidGl0bGUgZWxlbWVudHMgKi9cXG4gICAgLnRlc3QtdGl0bGUtdGV4dCB7XFxuICAgICAgICBmb250LXNpemU6ICRsdF9fdGhlbWUtaGVhZGluZ0ZvbnRTaXplO1xcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgICAgICBjb2xvcjogJGx0X190aGVtZS1jb2xvci10aXRsZXM7XFxuICAgIH1cXG5cXG4gICAgLnN1YnRpdGxlIHtcXG4gICAgICAgIGZvbnQtc2l6ZTogJGx0X190aGVtZS1zdWJoZWFkaW5nRm9udFNpemU7XFxuICAgICAgICBjb2xvcjogJGx0X190aGVtZS1jb2xvci10aXRsZXM7XFxuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgfVxcblxcbiAgICAvKiBQcm9ncmVzcyBiYXIgKGlmIHVzZWQpICovXFxuICAgIC5pdGVtcyAucHJvZ3Jlc3Mgc3BhbiB7XFxuICAgICAgICBiYWNrZ3JvdW5kOiAkbHRfX3RoZW1lLWNvbG9yLXRpdGxlcztcXG4gICAgfVxcblxcbiAgICAvKiBDb250YWluZXIgcXVlcmllcyB0byBuYXJyb3cgYW5kIGNlbnRlciBpdGVtcyAqL1xcbiAgICAubGVhcm5vc2l0eS1pdGVtIHtcXG4gICAgICAgIGNvbnRhaW5lci1uYW1lOiBsZWFybm9zaXR5LWl0ZW07XFxuICAgICAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7XFxuICAgIH1cXG5cXG4gICAgQGNvbnRhaW5lciBsZWFybm9zaXR5LWl0ZW0gKHdpZHRoIDwgODAwcHgpIHtcXG4gICAgICAgIC5scm4gLmNvbC14cy0xMiB7XFxuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgQGNvbnRhaW5lciBsZWFybm9zaXR5LWl0ZW0gKHdpZHRoID4gODAwcHgpIHtcXG4gICAgICAgIC5scm4gLmNvbC14cy0xMiB7XFxuICAgICAgICAgICAgd2lkdGg6IDgwJTtcXG4gICAgICAgICAgICBtYXJnaW46IDAgYXV0bztcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBAY29udGFpbmVyIGxlYXJub3NpdHktaXRlbSAod2lkdGggPiAxMDAwcHgpIHtcXG4gICAgICAgIC5scm4gLmNvbC14cy0xMiB7XFxuICAgICAgICAgICAgd2lkdGg6IDYwJTtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBAY29udGFpbmVyIGxlYXJub3NpdHktaXRlbSAod2lkdGggPiAxMjAwcHgpIHtcXG4gICAgICAgIC5scm4gLmNvbC14cy0xMiB7XFxuICAgICAgICAgICAgd2lkdGg6IDUwJTtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICAvKiBCdXR0b24gZWxlbWVudHMgKi9cXG4gICAgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlLFxcbiAgICAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG5fYmx1ZSB7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbHRfX3RoZW1lLWJ0bi1wcmltYXJ5LWJhY2tncm91bmQ7XFxuICAgICAgICBjb2xvcjogI2ZmZjtcXG4gICAgICAgIGZvbnQtc2l6ZTogJGx0X190aGVtZS1zbWFsbEZvbnRTaXplO1xcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgIH1cXG4gICAgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmhvdmVyOm5vdCg6ZGlzYWJsZWQpLFxcbiAgICAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG5fYmx1ZTpob3Zlcjpub3QoOmRpc2FibGVkKSxcXG4gICAgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmFjdGl2ZSxcXG4gICAgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmZvY3VzLFxcbiAgICAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6ZGlzYWJsZWQge1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzUzODRkYTtcXG4gICAgfVxcblxcbiAgICAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuIHtcXG4gICAgICAgIGZvbnQtc2l6ZTogJGx0X190aGVtZS1zbWFsbEZvbnRTaXplO1xcbiAgICB9XFxuXFxuICAgIC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG4uaXRlbS1wcmV2LFxcbiAgICAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG4uaXRlbS1wcmV2IHtcXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRsdF9fdGhlbWUtYnRuLXByaW1hcnktYmFja2dyb3VuZDtcXG4gICAgICAgIGNvbG9yOiAjZmZmO1xcbiAgICAgICAgZm9udC1zaXplOiAkbHRfX3RoZW1lLXNtYWxsRm9udFNpemU7XFxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDlkOWQ5O1xcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgIH1cXG5cXG4gICAgLyogVGFibGUgb2YgY29udGVudHMgKi9cXG4gICAgLnRvYyB7XFxuICAgICAgICBmb250LXNpemU6ICRsdF9fdGhlbWUtc21hbGxGb250U2l6ZTtcXG4gICAgfVxcbiAgICAubHJuLXZlcnRpY2FsLXRvYyAuc2xpZGVzLXZlcnRpY2FsLXBhZ2luYXRpb24gbGkge1xcbiAgICAgICAgbWFyZ2luOiA3cHggMDtcXG4gICAgfVxcbiAgICAudG9jIC5scm4tcGFnZXIgbGkucGFnaW5hdGlvbi1hY3RpdmUgYSB7XFxuICAgICAgICBiYWNrZ3JvdW5kOiAkbHRfX3RoZW1lLWJhY2tncm91bmQtdG9jO1xcbiAgICB9XFxuICAgIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZTpiZWZvcmUsXFxuICAgIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZSBhOmJlZm9yZSB7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbHRfX3RoZW1lLWJhY2tncm91bmQtdG9jO1xcbiAgICB9XFxuICAgIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZTphZnRlcixcXG4gICAgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24tYWN0aXZlIGE6YWZ0ZXIge1xcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAkbHRfX3RoZW1lLWJhY2tncm91bmQtdG9jO1xcbiAgICB9XFxuICAgIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0gYTpmb2N1cyB7XFxuICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCAkbHRfX3RoZW1lLWJhY2tncm91bmQtdG9jO1xcbiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4ICRsdF9fdGhlbWUtYmFja2dyb3VuZC10b2M7XFxuICAgIH1cXG4gICAgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIGxpOmZpcnN0LWNoaWxkIHtcXG4gICAgICAgIG1hcmdpbjogMDtcXG4gICAgfVxcbiAgICAuaGFzLXZlcnRpY2FsLXRvYy1yZWdpb24gLmxybi1yaWdodC1yZWdpb24ge1xcbiAgICAgICAgd2lkdGg6IDE1MHB4O1xcbiAgICB9XFxuICAgIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPSdwYXJ0aWFsbHlfYXR0ZW1wdGVkJ106bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSkgYSxcXG4gICAgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9J2Z1bGx5X2F0dGVtcHRlZCddOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpIGEge1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNztcXG4gICAgfVxcbiAgICAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD0ncGFydGlhbGx5X2F0dGVtcHRlZCddOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpOmJlZm9yZSxcXG4gICAgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9J2Z1bGx5X2F0dGVtcHRlZCddOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpOmJlZm9yZSB7XFxuICAgICAgICBoZWlnaHQ6IDQ3cHg7XFxuICAgIH1cXG4gICAgLmxybi1ib3R0b20tcmlnaHQtcmVnaW9uLmxybi1hbGlnbi10b3Age1xcbiAgICAgICAgbWFyZ2luLXRvcDogMHB4O1xcbiAgICB9XFxuICAgIC5scm4tcmlnaHQtcmVnaW9uIC5yaWdodC13cmFwcGVyOm5vdCgubWVudS13aXRoLXNjcm9sbCkge1xcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VhZWFlYTtcXG4gICAgfVxcbiAgICAubHJuLXZlcnRpY2FsLXRvYyAubHJuLXBhZ2VyIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbiB7XFxuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMXB4O1xcbiAgICB9XFxuICAgIC5scm4tdmVydGljYWwtdG9jIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbiB7XFxuICAgICAgICBoZWlnaHQ6IGF1dG87XFxuICAgIH1cXG5cXG4gICAgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubWVudS1idXR0b25zIC5scm5fYnRuIHtcXG4gICAgICAgIGZvbnQtc2l6ZTogMC41NWVtO1xcbiAgICB9XFxuXFxuICAgIC5scm4taG9yaXpvbnRhbC10b2MgLnBhZ2luYXRpb24sXFxuICAgIC5scm4ubHJuLWFzc2VzcyAubHJuLWhvcml6b250YWwtdG9jIC5scm4tYXNzZXNzLXBhZ2luYXRpb24ge1xcbiAgICAgICAgZm9udC1zaXplOiAxLjAzZW07XFxuICAgIH1cXG5cXG4gICAgLyogTUNRICovXFxuICAgIC5scm5fd2lkZ2V0Lmxybl9tY3EgLmxybl9tY3Fncm91cCB7XFxuICAgICAgICBvdmVyZmxvdy14OiB2aXNpYmxlO1xcbiAgICB9XFxuICAgIGlucHV0W3R5cGU9J3JhZGlvJ10ge1xcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpO1xcbiAgICB9XFxuXFxuICAgIC5scm5fcmVzcG9uc2Vfd3JhcHBlcixcXG4gICAgLmxybl90ZXh0ZWRpdG9yLFxcbiAgICAubHJuX3Rvb2xiYXIsXFxuICAgIC5scm4tdG9vbGJhcixcXG4gICAgLmxybi10b29sYmFyLWZvb3RlciB7XFxuICAgICAgICBmb250LXNpemU6ICRsdF9fdGhlbWUtc21hbGxGb250U2l6ZTtcXG4gICAgfVxcblxcbiAgICAubHJuX3dpZGdldCAubHJuX3RleHRlZGl0b3JfZWRpdGFibGUge1xcbiAgICAgICAgcGFkZGluZzogMC41ZW07XFxuICAgIH1cXG59XFxuXCIsXCIkbHRfX3RoZW1lLWJhY2tncm91bmQ6ICNlNmYyZmY7XFxuJGx0X190aGVtZS1iYWNrZ3JvdW5kLXRvYzogI2Y2YzcwYTtcXG4kbHRfX3RoZW1lLWJhc2VGb250U2l6ZTogMzBweDtcXG4kbHRfX3RoZW1lLWJ0bi1wcmltYXJ5LWJhY2tncm91bmQ6ICMyYjYzYzc7XFxuJGx0X190aGVtZS1idG4tcHJpbWFyeS1jb2xvcjogI2ZmZmZmZjtcXG4kbHRfX3RoZW1lLWNvbG9yLXByaW1hcnk6ICMzMzM7XFxuJGx0X190aGVtZS1jb2xvci10aXRsZXM6ICMyYjYzYzc7XFxuJGx0X190aGVtZS1mb250LWZhbWlseTogJ0xlYXJub3NpdHlNYXRoJywgJ0NvbWljIE5ldWUnLCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xcbiRsdF9fdGhlbWUtaGVhZGluZ0ZvbnRTaXplOiAxLjhlbTtcXG4kbHRfX3RoZW1lLXN1YmhlYWRpbmdGb250U2l6ZTogMS40ZW07XFxuJGx0X190aGVtZS1zbWFsbEZvbnRTaXplOiAwLjhlbTtcXG5cIixcIkBpbXBvcnQgdXJsKFxcXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUNvbWljK05ldWU6aXRhbCx3Z2h0QDAsMzAwOzAsNDAwOzAsNzAwOzEsMzAwOzEsNDAwOzEsNzAwJmRpc3BsYXk9c3dhcFxcXCIpO1xcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCxcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IHtcXG4gIGZvbnQtZmFtaWx5OiBcXFwiTGVhcm5vc2l0eU1hdGhcXFwiLCBcXFwiQ29taWMgTmV1ZVxcXCIsIFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgZm9udC1zaXplOiAzMHB4O1xcbiAgY29sb3I6ICMzMzM7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZmMmZmO1xcbiAgcGFkZGluZzogMWVtO1xcbiAgLyogVGl0bGUgYW5kIHN1YnRpdGxlIGVsZW1lbnRzICovXFxuICAvKiBQcm9ncmVzcyBiYXIgKGlmIHVzZWQpICovXFxuICAvKiBDb250YWluZXIgcXVlcmllcyB0byBuYXJyb3cgYW5kIGNlbnRlciBpdGVtcyAqL1xcbiAgLyogQnV0dG9uIGVsZW1lbnRzICovXFxuICAvKiBUYWJsZSBvZiBjb250ZW50cyAqL1xcbiAgLyogTUNRICovXFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbiAudG9wLXJpZ2h0LXdyYXBwZXIsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb24gLnRvcC1yaWdodC13cmFwcGVyLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb24gLnRvcC1yaWdodC13cmFwcGVyIHtcXG4gIGZvbnQtc2l6ZTogMC44ZW07XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbiAudG9wLXJpZ2h0LXdyYXBwZXIgLmxybl9idG4sXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb24gLnRvcC1yaWdodC13cmFwcGVyIC5scm5fYnRuLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb24gLnRvcC1yaWdodC13cmFwcGVyIC5scm5fYnRuIHtcXG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAudGVzdC10aXRsZS10ZXh0LFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50ZXN0LXRpdGxlLXRleHQsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAudGVzdC10aXRsZS10ZXh0IHtcXG4gIGZvbnQtc2l6ZTogMS44ZW07XFxuICBmb250LXdlaWdodDogYm9sZDtcXG4gIGNvbG9yOiAjMmI2M2M3O1xcbn1cXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLnN1YnRpdGxlLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5zdWJ0aXRsZSxcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5zdWJ0aXRsZSB7XFxuICBmb250LXNpemU6IDEuNGVtO1xcbiAgY29sb3I6ICMyYjYzYzc7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5pdGVtcyAucHJvZ3Jlc3Mgc3BhbixcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAuaXRlbXMgLnByb2dyZXNzIHNwYW4sXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAuaXRlbXMgLnByb2dyZXNzIHNwYW4ge1xcbiAgYmFja2dyb3VuZDogIzJiNjNjNztcXG59XFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5sZWFybm9zaXR5LWl0ZW0sXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxlYXJub3NpdHktaXRlbSxcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5sZWFybm9zaXR5LWl0ZW0ge1xcbiAgY29udGFpbmVyLW5hbWU6IGxlYXJub3NpdHktaXRlbTtcXG4gIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTtcXG59XFxuQGNvbnRhaW5lciBsZWFybm9zaXR5LWl0ZW0gKHdpZHRoIDwgODAwcHgpIHtcXG4gIC5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuIC5jb2wteHMtMTIsXFxuICAubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuIC5jb2wteHMtMTIsXFxuICAubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4gLmNvbC14cy0xMiB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgfVxcbn1cXG5AY29udGFpbmVyIGxlYXJub3NpdHktaXRlbSAod2lkdGggPiA4MDBweCkge1xcbiAgLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4gLmNvbC14cy0xMixcXG4gIC5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4gLmNvbC14cy0xMixcXG4gIC5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybiAuY29sLXhzLTEyIHtcXG4gICAgd2lkdGg6IDgwJTtcXG4gICAgbWFyZ2luOiAwIGF1dG87XFxuICB9XFxufVxcbkBjb250YWluZXIgbGVhcm5vc2l0eS1pdGVtICh3aWR0aCA+IDEwMDBweCkge1xcbiAgLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4gLmNvbC14cy0xMixcXG4gIC5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4gLmNvbC14cy0xMixcXG4gIC5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybiAuY29sLXhzLTEyIHtcXG4gICAgd2lkdGg6IDYwJTtcXG4gIH1cXG59XFxuQGNvbnRhaW5lciBsZWFybm9zaXR5LWl0ZW0gKHdpZHRoID4gMTIwMHB4KSB7XFxuICAubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybiAuY29sLXhzLTEyLFxcbiAgLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybiAuY29sLXhzLTEyLFxcbiAgLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuIC5jb2wteHMtMTIge1xcbiAgICB3aWR0aDogNTAlO1xcbiAgfVxcbn1cXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlLFxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG5fYmx1ZSxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWUsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi5scm4tYXNzZXNzIC5kaWFsb2dzIC5scm5fYnRuX2JsdWUsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWUsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG5fYmx1ZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmI2M2M3O1xcbiAgY29sb3I6ICNmZmY7XFxuICBmb250LXNpemU6IDAuOGVtO1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6aG92ZXI6bm90KDpkaXNhYmxlZCksXFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4ubHJuLWFzc2VzcyAuZGlhbG9ncyAubHJuX2J0bl9ibHVlOmhvdmVyOm5vdCg6ZGlzYWJsZWQpLFxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6YWN0aXZlLFxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6Zm9jdXMsXFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG5fYmx1ZTpkaXNhYmxlZCxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6aG92ZXI6bm90KDpkaXNhYmxlZCksXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi5scm4tYXNzZXNzIC5kaWFsb2dzIC5scm5fYnRuX2JsdWU6aG92ZXI6bm90KDpkaXNhYmxlZCksXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmFjdGl2ZSxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6Zm9jdXMsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmRpc2FibGVkLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmhvdmVyOm5vdCg6ZGlzYWJsZWQpLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi5scm4tYXNzZXNzIC5kaWFsb2dzIC5scm5fYnRuX2JsdWU6aG92ZXI6bm90KDpkaXNhYmxlZCksXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuX2JsdWU6YWN0aXZlLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmZvY3VzLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bl9ibHVlOmRpc2FibGVkIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM1Mzg0ZGE7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLmxybl9idG4sXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuIHtcXG4gIGZvbnQtc2l6ZTogMC44ZW07XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuLml0ZW0tcHJldixcXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi5scm4tYXNzZXNzIC5kaWFsb2dzIC5scm5fYnRuLml0ZW0tcHJldixcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuLml0ZW0tcHJldixcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG4uaXRlbS1wcmV2LFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1yZWdpb246bm90KC5scm4taXRlbXMtcmVnaW9uKSAubHJuX2J0bi5pdGVtLXByZXYsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLmxybi1hc3Nlc3MgLmRpYWxvZ3MgLmxybl9idG4uaXRlbS1wcmV2IHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyYjYzYzc7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGZvbnQtc2l6ZTogMC44ZW07XFxuICBib3JkZXI6IDFweCBzb2xpZCAjZDlkOWQ5O1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAudG9jLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50b2MsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAudG9jIHtcXG4gIGZvbnQtc2l6ZTogMC44ZW07XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAuc2xpZGVzLXZlcnRpY2FsLXBhZ2luYXRpb24gbGksXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIGxpLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIGxpIHtcXG4gIG1hcmdpbjogN3B4IDA7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAudG9jIC5scm4tcGFnZXIgbGkucGFnaW5hdGlvbi1hY3RpdmUgYSxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAudG9jIC5scm4tcGFnZXIgbGkucGFnaW5hdGlvbi1hY3RpdmUgYSxcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC50b2MgLmxybi1wYWdlciBsaS5wYWdpbmF0aW9uLWFjdGl2ZSBhIHtcXG4gIGJhY2tncm91bmQ6ICNmNmM3MGE7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmU6YmVmb3JlLFxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmUgYTpiZWZvcmUsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24tYWN0aXZlOmJlZm9yZSxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmUgYTpiZWZvcmUsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmU6YmVmb3JlLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24tYWN0aXZlIGE6YmVmb3JlIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmNmM3MGE7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmU6YWZ0ZXIsXFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZSBhOmFmdGVyLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZTphZnRlcixcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1hY3RpdmUgYTphZnRlcixcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZTphZnRlcixcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWFjdGl2ZSBhOmFmdGVyIHtcXG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgI2Y2YzcwYTtcXG59XFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0gYTpmb2N1cyxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtIGE6Zm9jdXMsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtIGE6Zm9jdXMge1xcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2Y2YzcwYTtcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCAjZjZjNzBhO1xcbn1cXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIGxpOmZpcnN0LWNoaWxkLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbiBsaTpmaXJzdC1jaGlsZCxcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbiBsaTpmaXJzdC1jaGlsZCB7XFxuICBtYXJnaW46IDA7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAuaGFzLXZlcnRpY2FsLXRvYy1yZWdpb24gLmxybi1yaWdodC1yZWdpb24sXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmhhcy12ZXJ0aWNhbC10b2MtcmVnaW9uIC5scm4tcmlnaHQtcmVnaW9uLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmhhcy12ZXJ0aWNhbC10b2MtcmVnaW9uIC5scm4tcmlnaHQtcmVnaW9uIHtcXG4gIHdpZHRoOiAxNTBweDtcXG59XFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPXBhcnRpYWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpIGEsXFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPWZ1bGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSkgYSxcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1wYXJ0aWFsbHlfYXR0ZW1wdGVkXTpub3QoLnBhZ2luYXRpb24tYWN0aXZlKSBhLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPWZ1bGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSkgYSxcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPXBhcnRpYWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpIGEsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAucGFnaW5hdGlvbi1pdGVtLnBhZ2luYXRpb24taXRlbVtkYXRhLWF0dGVtcHRlZD1mdWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpIGEge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNztcXG59XFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPXBhcnRpYWxseV9hdHRlbXB0ZWRdOm5vdCgucGFnaW5hdGlvbi1hY3RpdmUpOmJlZm9yZSxcXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9ZnVsbHlfYXR0ZW1wdGVkXTpub3QoLnBhZ2luYXRpb24tYWN0aXZlKTpiZWZvcmUsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9cGFydGlhbGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSk6YmVmb3JlLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5wYWdpbmF0aW9uLWl0ZW0ucGFnaW5hdGlvbi1pdGVtW2RhdGEtYXR0ZW1wdGVkPWZ1bGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSk6YmVmb3JlLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9cGFydGlhbGx5X2F0dGVtcHRlZF06bm90KC5wYWdpbmF0aW9uLWFjdGl2ZSk6YmVmb3JlLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnBhZ2luYXRpb24taXRlbS5wYWdpbmF0aW9uLWl0ZW1bZGF0YS1hdHRlbXB0ZWQ9ZnVsbHlfYXR0ZW1wdGVkXTpub3QoLnBhZ2luYXRpb24tYWN0aXZlKTpiZWZvcmUge1xcbiAgaGVpZ2h0OiA0N3B4O1xcbn1cXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybi1ib3R0b20tcmlnaHQtcmVnaW9uLmxybi1hbGlnbi10b3AsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi1ib3R0b20tcmlnaHQtcmVnaW9uLmxybi1hbGlnbi10b3AsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLWJvdHRvbS1yaWdodC1yZWdpb24ubHJuLWFsaWduLXRvcCB7XFxuICBtYXJnaW4tdG9wOiAwcHg7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXJpZ2h0LXJlZ2lvbiAucmlnaHQtd3JhcHBlcjpub3QoLm1lbnUtd2l0aC1zY3JvbGwpLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tcmlnaHQtcmVnaW9uIC5yaWdodC13cmFwcGVyOm5vdCgubWVudS13aXRoLXNjcm9sbCksXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJpZ2h0LXJlZ2lvbiAucmlnaHQtd3JhcHBlcjpub3QoLm1lbnUtd2l0aC1zY3JvbGwpIHtcXG4gIGhlaWdodDogYXV0bztcXG4gIGJhY2tncm91bmQtY29sb3I6ICNlYWVhZWE7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAubHJuLXBhZ2VyIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbixcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXZlcnRpY2FsLXRvYyAubHJuLXBhZ2VyIC5zbGlkZXMtdmVydGljYWwtcGFnaW5hdGlvbixcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdmVydGljYWwtdG9jIC5scm4tcGFnZXIgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIHtcXG4gIHBhZGRpbmctYm90dG9tOiAxcHg7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXZlcnRpY2FsLXRvYyAuc2xpZGVzLXZlcnRpY2FsLXBhZ2luYXRpb24sXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi12ZXJ0aWNhbC10b2MgLnNsaWRlcy12ZXJ0aWNhbC1wYWdpbmF0aW9uIHtcXG4gIGhlaWdodDogYXV0bztcXG59XFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tcmVnaW9uOm5vdCgubHJuLWl0ZW1zLXJlZ2lvbikgLm1lbnUtYnV0dG9ucyAubHJuX2J0bixcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5tZW51LWJ1dHRvbnMgLmxybl9idG4sXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5tZW51LWJ1dHRvbnMgLmxybl9idG4ge1xcbiAgZm9udC1zaXplOiAwLjU1ZW07XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLWhvcml6b250YWwtdG9jIC5wYWdpbmF0aW9uLFxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLmxybi1hc3Nlc3MgLmxybi1ob3Jpem9udGFsLXRvYyAubHJuLWFzc2Vzcy1wYWdpbmF0aW9uLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4taG9yaXpvbnRhbC10b2MgLnBhZ2luYXRpb24sXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi5scm4tYXNzZXNzIC5scm4taG9yaXpvbnRhbC10b2MgLmxybi1hc3Nlc3MtcGFnaW5hdGlvbixcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4taG9yaXpvbnRhbC10b2MgLnBhZ2luYXRpb24sXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLmxybi1hc3Nlc3MgLmxybi1ob3Jpem9udGFsLXRvYyAubHJuLWFzc2Vzcy1wYWdpbmF0aW9uIHtcXG4gIGZvbnQtc2l6ZTogMS4wM2VtO1xcbn1cXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybl93aWRnZXQubHJuX21jcSAubHJuX21jcWdyb3VwLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm5fd2lkZ2V0Lmxybl9tY3EgLmxybl9tY3Fncm91cCxcXG4ubHJuLmxybi1hc3Nlc3MubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm5fd2lkZ2V0Lmxybl9tY3EgLmxybl9tY3Fncm91cCB7XFxuICBvdmVyZmxvdy14OiB2aXNpYmxlO1xcbn1cXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgaW5wdXRbdHlwZT1yYWRpb10sXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgaW5wdXRbdHlwZT1yYWRpb10sXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCBpbnB1dFt0eXBlPXJhZGlvXSB7XFxuICB0cmFuc2Zvcm06IHNjYWxlKDEuNSk7XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuX3Jlc3BvbnNlX3dyYXBwZXIsXFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm5fdGV4dGVkaXRvcixcXG4ubHJuOm5vdCgubHJuX2Fic29sdXRlX2tleWJvYXJkX3BhcmVudCkgLmxybl90b29sYmFyLFxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuLXRvb2xiYXIsXFxuLmxybjpub3QoLmxybl9hYnNvbHV0ZV9rZXlib2FyZF9wYXJlbnQpIC5scm4tdG9vbGJhci1mb290ZXIsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl9yZXNwb25zZV93cmFwcGVyLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm5fdGV4dGVkaXRvcixcXG4ubHJuLmxybi1hc3Nlc3MubHJuLW1kLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuX3Rvb2xiYXIsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybi10b29sYmFyLFxcbi5scm4ubHJuLWFzc2Vzcy5scm4tbWQubHRfX3RoZW1lLWp1bmlvclF1ZXN0IC5scm4tdG9vbGJhci1mb290ZXIsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuX3Jlc3BvbnNlX3dyYXBwZXIsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuX3RleHRlZGl0b3IsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuX3Rvb2xiYXIsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXRvb2xiYXIsXFxuLmxybi5scm4tYXNzZXNzLmx0X190aGVtZS1qdW5pb3JRdWVzdCAubHJuLXRvb2xiYXItZm9vdGVyIHtcXG4gIGZvbnQtc2l6ZTogMC44ZW07XFxufVxcbi5scm46bm90KC5scm5fYWJzb2x1dGVfa2V5Ym9hcmRfcGFyZW50KSAubHJuX3dpZGdldCAubHJuX3RleHRlZGl0b3JfZWRpdGFibGUsXFxuLmxybi5scm4tYXNzZXNzLmxybi1tZC5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl93aWRnZXQgLmxybl90ZXh0ZWRpdG9yX2VkaXRhYmxlLFxcbi5scm4ubHJuLWFzc2Vzcy5sdF9fdGhlbWUtanVuaW9yUXVlc3QgLmxybl93aWRnZXQgLmxybl90ZXh0ZWRpdG9yX2VkaXRhYmxlIHtcXG4gIHBhZGRpbmc6IDAuNWVtO1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/assessment/extensions/ui/themes/juniorQuest/sass/index.scss\n"); - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/api.js": -/*!*****************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/api.js ***! - \*****************************************************/ -/***/ ((module) => { - -eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFCQUFxQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzRkFBc0YscUJBQXFCO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixpREFBaUQscUJBQXFCO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzREFBc0QscUJBQXFCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcz8yNGZiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/api.js\n"); - -/***/ }), - -/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": -/*!************************************************************!*\ - !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! - \************************************************************/ -/***/ ((module) => { - -eval("\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcz9hZjEyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/sourceMaps.js\n"); - -/***/ }), - -/***/ "./node_modules/howler/dist/howler.js": -/*!********************************************!*\ - !*** ./node_modules/howler/dist/howler.js ***! - \********************************************/ -/***/ ((module, exports, __webpack_require__) => { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * howler.js v2.2.4\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Create the global controller. All contained methods and properties apply\n * to all sounds that are currently playing or will be in the future.\n */\n var HowlerGlobal = function() {\n this.init();\n };\n HowlerGlobal.prototype = {\n /**\n * Initialize the global Howler object.\n * @return {Howler}\n */\n init: function() {\n var self = this || Howler;\n\n // Create a global ID counter.\n self._counter = 1000;\n\n // Pool of unlocked HTML5 Audio objects.\n self._html5AudioPool = [];\n self.html5PoolSize = 10;\n\n // Internal properties.\n self._codecs = {};\n self._howls = [];\n self._muted = false;\n self._volume = 1;\n self._canPlayEvent = 'canplaythrough';\n self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n // Public properties.\n self.masterGain = null;\n self.noAudio = false;\n self.usingWebAudio = true;\n self.autoSuspend = true;\n self.ctx = null;\n\n // Set to false to disable the auto audio unlocker.\n self.autoUnlock = true;\n\n // Setup the various state values for global tracking.\n self._setup();\n\n return self;\n },\n\n /**\n * Get/set the global volume for all sounds.\n * @param {Float} vol Volume from 0.0 to 1.0.\n * @return {Howler/Float} Returns self or current volume.\n */\n volume: function(vol) {\n var self = this || Howler;\n vol = parseFloat(vol);\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!self.ctx) {\n setupAudioContext();\n }\n\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n self._volume = vol;\n\n // Don't update any of the nodes if we are muted.\n if (self._muted) {\n return self;\n }\n\n // When using Web Audio, we just need to adjust the master gain.\n if (self.usingWebAudio) {\n self.masterGain.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n }\n\n // Loop through and change volume for all HTML5 audio nodes.\n for (var i=0; i=0; i--) {\n self._howls[i].unload();\n }\n\n // Create a new AudioContext to make sure it is fully reset.\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n self.ctx.close();\n self.ctx = null;\n setupAudioContext();\n }\n\n return self;\n },\n\n /**\n * Check for codec support of specific extension.\n * @param {String} ext Audio file extention.\n * @return {Boolean}\n */\n codecs: function(ext) {\n return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n },\n\n /**\n * Setup various state values for global tracking.\n * @return {Howler}\n */\n _setup: function() {\n var self = this || Howler;\n\n // Keeps track of the suspend/resume state of the AudioContext.\n self.state = self.ctx ? self.ctx.state || 'suspended' : 'suspended';\n\n // Automatically begin the 30-second suspend process\n self._autoSuspend();\n\n // Check if audio is available.\n if (!self.usingWebAudio) {\n // No audio is available on this system if noAudio is set to true.\n if (typeof Audio !== 'undefined') {\n try {\n var test = new Audio();\n\n // Check if the canplaythrough event is available.\n if (typeof test.oncanplaythrough === 'undefined') {\n self._canPlayEvent = 'canplay';\n }\n } catch(e) {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n // Test to make sure audio isn't disabled in Internet Explorer.\n try {\n var test = new Audio();\n if (test.muted) {\n self.noAudio = true;\n }\n } catch (e) {}\n\n // Check for supported codecs.\n if (!self.noAudio) {\n self._setupCodecs();\n }\n\n return self;\n },\n\n /**\n * Check for browser support for various codecs and cache the results.\n * @return {Howler}\n */\n _setupCodecs: function() {\n var self = this || Howler;\n var audioTest = null;\n\n // Must wrap in a try/catch because IE11 in server mode throws an error.\n try {\n audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n } catch (err) {\n return self;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n return self;\n }\n\n var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n var ua = self._navigator ? self._navigator.userAgent : '';\n var checkOpera = ua.match(/OPR\\/(\\d+)/g);\n var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n var checkSafari = ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1;\n var safariVersion = ua.match(/Version\\/(.*?) /);\n var isOldSafari = (checkSafari && safariVersion && parseInt(safariVersion[1], 10) < 15);\n\n self._codecs = {\n mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n mpeg: !!mpegTest,\n opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n wav: !!(audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType('audio/wav')).replace(/^no$/, ''),\n aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n m4b: !!(audioTest.canPlayType('audio/x-m4b;') || audioTest.canPlayType('audio/m4b;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n weba: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n webm: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n };\n\n return self;\n },\n\n /**\n * Some browsers/devices will only allow audio to be played after a user interaction.\n * Attempt to automatically unlock audio on the first user interaction.\n * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n * @return {Howler}\n */\n _unlockAudio: function() {\n var self = this || Howler;\n\n // Only run this if Web Audio is supported and it hasn't already been unlocked.\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n // http://stackoverflow.com/questions/24119684\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n // Call this method on touch start to create and play a buffer,\n // then check if the audio actually played to determine if\n // audio has now been unlocked on iOS, Android, etc.\n var unlock = function(e) {\n // Create a pool of unlocked HTML5 Audio objects that can\n // be used for playing sounds without user interaction. HTML5\n // Audio objects must be individually unlocked, as opposed\n // to the WebAudio API which only needs a single activation.\n // This must occur before WebAudio setup or the source.onended\n // event will not fire.\n while (self._html5AudioPool.length < self.html5PoolSize) {\n try {\n var audioNode = new Audio();\n\n // Mark this Audio object as unlocked to ensure it can get returned\n // to the unlocked pool when released.\n audioNode._unlocked = true;\n\n // Add the audio node to the pool.\n self._releaseHtml5Audio(audioNode);\n } catch (e) {\n self.noAudio = true;\n break;\n }\n }\n\n // Loop through any assigned audio nodes and unlock them.\n for (var i=0; i= 55.\n if (typeof self.ctx.resume === 'function') {\n self.ctx.resume();\n }\n\n // Setup a timeout to check that we are unlocked on the next event loop.\n source.onended = function() {\n source.disconnect(0);\n\n // Update the unlocked state and prevent this check from happening again.\n self._audioUnlocked = true;\n\n // Remove the touch start listener.\n document.removeEventListener('touchstart', unlock, true);\n document.removeEventListener('touchend', unlock, true);\n document.removeEventListener('click', unlock, true);\n document.removeEventListener('keydown', unlock, true);\n\n // Let all sounds know that audio has been unlocked.\n for (var i=0; i 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n var timeout = (duration * 1000) / Math.abs(sound._rate);\n var start = self._sprite[sprite][0] / 1000;\n var stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n sound._sprite = sprite;\n\n // Mark the sound as ended instantly so that this async playback\n // doesn't get grabbed by another call to play while this one waits to start.\n sound._ended = false;\n\n // Update the parameters of the sound.\n var setParams = function() {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = !!(sound._loop || self._sprite[sprite][2]);\n };\n\n // End the sound instantly if seek is at the end.\n if (seek >= stop) {\n self._ended(sound);\n return;\n }\n\n // Begin the actual playback.\n var node = sound._node;\n if (self._webAudio) {\n // Fire this when the sound is ready to play to begin Web Audio playback.\n var playWebAudio = function() {\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n // Setup the playback params.\n var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n sound._playStart = Howler.ctx.currentTime;\n\n // Play the sound using the supported method.\n if (typeof node.bufferSource.start === 'undefined') {\n sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n }\n\n // Start a new timer if none is present.\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n if (!internal) {\n setTimeout(function() {\n self._emit('play', sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (Howler.state === 'running' && Howler.ctx.state !== 'interrupted') {\n playWebAudio();\n } else {\n self._playLock = true;\n\n // Wait for the audio context to resume before playing.\n self.once('resume', playWebAudio);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n } else {\n // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n var playHtml5 = function() {\n node.currentTime = seek;\n node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n node.volume = sound._volume * Howler.volume();\n node.playbackRate = sound._rate;\n\n // Some browsers will throw an error if this is called without user interaction.\n try {\n var play = node.play();\n\n // Support older browsers that don't support promises, and thus don't have this issue.\n if (play && typeof Promise !== 'undefined' && (play instanceof Promise || typeof play.then === 'function')) {\n // Implements a lock to prevent DOMException: The play() request was interrupted by a call to pause().\n self._playLock = true;\n\n // Set param values immediately.\n setParams();\n\n // Releases the lock and executes queued actions.\n play\n .then(function() {\n self._playLock = false;\n node._unlocked = true;\n if (!internal) {\n self._emit('play', sound._id);\n } else {\n self._loadQueue();\n }\n })\n .catch(function() {\n self._playLock = false;\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n\n // Reset the ended and paused values.\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit('play', sound._id);\n }\n\n // Setting rate before playing won't work in IE, so we set it again here.\n node.playbackRate = sound._rate;\n\n // If the node is still paused, then we can assume there was a playback issue.\n if (node.paused) {\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n return;\n }\n\n // Setup the end timer on sprites or listen for the ended event.\n if (sprite !== '__default' || sound._loop) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n } else {\n self._endTimers[sound._id] = function() {\n // Fire ended on this audio node.\n self._ended(sound);\n\n // Clear this listener.\n node.removeEventListener('ended', self._endTimers[sound._id], false);\n };\n node.addEventListener('ended', self._endTimers[sound._id], false);\n }\n } catch (err) {\n self._emit('playerror', sound._id, err);\n }\n };\n\n // If this is streaming audio, make sure the src is set and load again.\n if (node.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') {\n node.src = self._src;\n node.load();\n }\n\n // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n var loadedNoReadyState = (window && window.ejecta) || (!node.readyState && Howler._navigator.isCocoonJS);\n if (node.readyState >= 3 || loadedNoReadyState) {\n playHtml5();\n } else {\n self._playLock = true;\n self._state = 'loading';\n\n var listener = function() {\n self._state = 'loaded';\n \n // Begin playback.\n playHtml5();\n\n // Clear this listener.\n node.removeEventListener(Howler._canPlayEvent, listener, false);\n };\n node.addEventListener(Howler._canPlayEvent, listener, false);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n },\n\n /**\n * Pause playback and save current position.\n * @param {Number} id The sound ID (empty to pause all in group).\n * @return {Howl}\n */\n pause: function(id) {\n var self = this;\n\n // If the sound hasn't loaded or a play() promise is pending, add it to the load queue to pause when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'pause',\n action: function() {\n self.pause(id);\n }\n });\n\n return self;\n }\n\n // If no id is passed, get all ID's to be paused.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i Returns the group's volume value.\n * volume(id) -> Returns the sound id's current volume.\n * volume(vol) -> Sets the volume of all sounds in this Howl group.\n * volume(vol, id) -> Sets the volume of passed sound id.\n * @return {Howl/Number} Returns self or current volume.\n */\n volume: function() {\n var self = this;\n var args = arguments;\n var vol, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the value of the groups' volume.\n return self._volume;\n } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n // First check if this is an ID, and if not, assume it is a new volume.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n vol = parseFloat(args[0]);\n }\n } else if (args.length >= 2) {\n vol = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the volume or return the current volume.\n var sound;\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n if (self._state !== 'loaded'|| self._playLock) {\n self._queue.push({\n event: 'volume',\n action: function() {\n self.volume.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group volume.\n if (typeof id === 'undefined') {\n self._volume = vol;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i 0) ? len / steps : len);\n var lastTick = Date.now();\n\n // Store the value being faded to.\n sound._fadeTo = to;\n\n // Update the volume value on each interval tick.\n sound._interval = setInterval(function() {\n // Update the volume based on the time since the last tick.\n var tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n // Round to within 2 decimal points.\n vol = Math.round(vol * 100) / 100;\n\n // Make sure the volume is in the right bounds.\n if (diff < 0) {\n vol = Math.max(to, vol);\n } else {\n vol = Math.min(to, vol);\n }\n\n // Change the volume.\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n // Set the group's volume.\n if (isGroup) {\n self._volume = vol;\n }\n\n // When the fade is complete, stop it and fire event.\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = null;\n sound._fadeTo = null;\n self.volume(to, sound._id);\n self._emit('fade', sound._id);\n }\n }, stepLen);\n },\n\n /**\n * Internal method that stops the currently playing fade when\n * a new fade starts, volume is changed or the sound is stopped.\n * @param {Number} id The sound id.\n * @return {Howl}\n */\n _stopFade: function(id) {\n var self = this;\n var sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio) {\n sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n }\n\n clearInterval(sound._interval);\n sound._interval = null;\n self.volume(sound._fadeTo, id);\n sound._fadeTo = null;\n self._emit('fade', id);\n }\n\n return self;\n },\n\n /**\n * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n * loop() -> Returns the group's loop value.\n * loop(id) -> Returns the sound id's loop value.\n * loop(loop) -> Sets the loop value for all sounds in this Howl group.\n * loop(loop, id) -> Sets the loop value of passed sound id.\n * @return {Howl/Boolean} Returns self or current loop value.\n */\n loop: function() {\n var self = this;\n var args = arguments;\n var loop, id, sound;\n\n // Determine the values for loop and id.\n if (args.length === 0) {\n // Return the grou's loop value.\n return self._loop;\n } else if (args.length === 1) {\n if (typeof args[0] === 'boolean') {\n loop = args[0];\n self._loop = loop;\n } else {\n // Return this sound's loop value.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._loop : false;\n }\n } else if (args.length === 2) {\n loop = args[0];\n id = parseInt(args[1], 10);\n }\n\n // If no id is passed, get all ID's to be looped.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current playback rate.\n * rate(id) -> Returns the sound id's current playback rate.\n * rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n * rate(rate, id) -> Sets the playback rate of passed sound id.\n * @return {Howl/Number} Returns self or the current playback rate.\n */\n rate: function() {\n var self = this;\n var args = arguments;\n var rate, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current rate of the first node.\n id = self._sounds[0]._id;\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new rate value.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n rate = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n rate = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the playback rate or return the current value.\n var sound;\n if (typeof rate === 'number') {\n // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'rate',\n action: function() {\n self.rate.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group rate.\n if (typeof id === 'undefined') {\n self._rate = rate;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current seek position.\n * seek(id) -> Returns the sound id's current seek position.\n * seek(seek) -> Sets the seek position of the first sound node.\n * seek(seek, id) -> Sets the seek position of passed sound id.\n * @return {Howl/Number} Returns self or the current seek position.\n */\n seek: function() {\n var self = this;\n var args = arguments;\n var seek, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current position of the first node.\n if (self._sounds.length) {\n id = self._sounds[0]._id;\n }\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new seek position.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]._id;\n seek = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n seek = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // If there is no ID, bail out.\n if (typeof id === 'undefined') {\n return 0;\n }\n\n // If the sound hasn't loaded, add it to the load queue to seek when capable.\n if (typeof seek === 'number' && (self._state !== 'loaded' || self._playLock)) {\n self._queue.push({\n event: 'seek',\n action: function() {\n self.seek.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Get the sound.\n var sound = self._soundById(id);\n\n if (sound) {\n if (typeof seek === 'number' && seek >= 0) {\n // Pause the sound and update position for restarting playback.\n var playing = self.playing(id);\n if (playing) {\n self.pause(id, true);\n }\n\n // Move the position of the track and cancel timer.\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n // Update the seek position for HTML5 Audio.\n if (!self._webAudio && sound._node && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n // Seek and emit when ready.\n var seekAndEmit = function() {\n // Restart the playback if the sound was playing.\n if (playing) {\n self.play(id, true);\n }\n\n self._emit('seek', id);\n };\n\n // Wait for the play lock to be unset before emitting (HTML5 Audio).\n if (playing && !self._webAudio) {\n var emitSeek = function() {\n if (!self._playLock) {\n seekAndEmit();\n } else {\n setTimeout(emitSeek, 0);\n }\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n } else {\n if (self._webAudio) {\n var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n } else {\n return sound._node.currentTime;\n }\n }\n }\n\n return self;\n },\n\n /**\n * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n * @param {Number} id The sound id to check. If none is passed, the whole sound group is checked.\n * @return {Boolean} True if playing and false if not.\n */\n playing: function(id) {\n var self = this;\n\n // Check the passed sound ID (if any).\n if (typeof id === 'number') {\n var sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n // Otherwise, loop through all sounds and check if any are playing.\n for (var i=0; i= 0) {\n Howler._howls.splice(index, 1);\n }\n\n // Delete this sound from the cache (if no other Howl is using it).\n var remCache = true;\n for (i=0; i= 0) {\n remCache = false;\n break;\n }\n }\n\n if (cache && remCache) {\n delete cache[self._src];\n }\n\n // Clear global errors.\n Howler.noAudio = false;\n\n // Clear out `self`.\n self._state = 'unloaded';\n self._sounds = [];\n self = null;\n\n return null;\n },\n\n /**\n * Listen to a custom event.\n * @param {String} event Event name.\n * @param {Function} fn Listener to call.\n * @param {Number} id (optional) Only listen to events for this sound.\n * @param {Number} once (INTERNAL) Marks event to fire only once.\n * @return {Howl}\n */\n on: function(event, fn, id, once) {\n var self = this;\n var events = self['_on' + event];\n\n if (typeof fn === 'function') {\n events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n }\n\n return self;\n },\n\n /**\n * Remove a custom event. Call without parameters to remove all events.\n * @param {String} event Event name.\n * @param {Function} fn Listener to remove. Leave empty to remove all.\n * @param {Number} id (optional) Only remove events for this sound.\n * @return {Howl}\n */\n off: function(event, fn, id) {\n var self = this;\n var events = self['_on' + event];\n var i = 0;\n\n // Allow passing just an event and ID.\n if (typeof fn === 'number') {\n id = fn;\n fn = null;\n }\n\n if (fn || id) {\n // Loop through event store and remove the passed function.\n for (i=0; i=0; i--) {\n // Only fire the listener if the correct ID is used.\n if (!events[i].id || events[i].id === id || event === 'load') {\n setTimeout(function(fn) {\n fn.call(this, id, msg);\n }.bind(self, events[i].fn), 0);\n\n // If this event was setup with `once`, remove it.\n if (events[i].once) {\n self.off(event, events[i].fn, events[i].id);\n }\n }\n }\n\n // Pass the event type into load queue so that it can continue stepping.\n self._loadQueue(event);\n\n return self;\n },\n\n /**\n * Queue of actions initiated before the sound has loaded.\n * These will be called in sequence, with the next only firing\n * after the previous has finished executing (even if async like play).\n * @return {Howl}\n */\n _loadQueue: function(event) {\n var self = this;\n\n if (self._queue.length > 0) {\n var task = self._queue[0];\n\n // Remove this task if a matching event was passed.\n if (task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n\n // Run the task if no event type is passed.\n if (!event) {\n task.action();\n }\n }\n\n return self;\n },\n\n /**\n * Fired when playback ends at the end of the duration.\n * @param {Sound} sound The sound object to work with.\n * @return {Howl}\n */\n _ended: function(sound) {\n var self = this;\n var sprite = sound._sprite;\n\n // If we are using IE and there was network latency we may be clipping\n // audio before it completes playing. Lets check the node to make sure it\n // believes it has completed, before ending the playback.\n if (!self._webAudio && sound._node && !sound._node.paused && !sound._node.ended && sound._node.currentTime < sound._stop) {\n setTimeout(self._ended.bind(self, sound), 100);\n return self;\n }\n\n // Should this sound loop?\n var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n // Fire the ended event.\n self._emit('end', sound._id);\n\n // Restart the playback for HTML5 Audio loop.\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n // Restart this timer if on a Web Audio loop.\n if (self._webAudio && loop) {\n self._emit('play', sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = Howler.ctx.currentTime;\n\n var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n // Mark the node as paused.\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n\n // Attempt to auto-suspend AudioContext if no sounds are still playing.\n Howler._autoSuspend();\n }\n\n // When using a sprite, end the track.\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n },\n\n /**\n * Clear the end timer for a sound playback.\n * @param {Number} id The sound ID.\n * @return {Howl}\n */\n _clearTimer: function(id) {\n var self = this;\n\n if (self._endTimers[id]) {\n // Clear the timeout or remove the ended listener.\n if (typeof self._endTimers[id] !== 'function') {\n clearTimeout(self._endTimers[id]);\n } else {\n var sound = self._soundById(id);\n if (sound && sound._node) {\n sound._node.removeEventListener('ended', self._endTimers[id], false);\n }\n }\n\n delete self._endTimers[id];\n }\n\n return self;\n },\n\n /**\n * Return the sound identified by this ID, or return null.\n * @param {Number} id Sound ID\n * @return {Object} Sound object or null.\n */\n _soundById: function(id) {\n var self = this;\n\n // Loop through all sounds and find the one with this ID.\n for (var i=0; i=0; i--) {\n if (cnt <= limit) {\n return;\n }\n\n if (self._sounds[i]._ended) {\n // Disconnect the audio source when using Web Audio.\n if (self._webAudio && self._sounds[i]._node) {\n self._sounds[i]._node.disconnect(0);\n }\n\n // Remove sounds until we have the pool size.\n self._sounds.splice(i, 1);\n cnt--;\n }\n }\n },\n\n /**\n * Get all ID's from the sounds pool.\n * @param {Number} id Only return one ID if one is passed.\n * @return {Array} Array of IDs.\n */\n _getSoundIds: function(id) {\n var self = this;\n\n if (typeof id === 'undefined') {\n var ids = [];\n for (var i=0; i= 0;\n\n if (!node.bufferSource) {\n return self;\n }\n\n if (Howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try { node.bufferSource.buffer = Howler._scratchBuffer; } catch(e) {}\n }\n }\n node.bufferSource = null;\n\n return self;\n },\n\n /**\n * Set the source to a 0-second silence to stop any downloading (except in IE).\n * @param {Object} node Audio node to clear.\n */\n _clearSound: function(node) {\n var checkIE = /MSIE |Trident\\//.test(Howler._navigator && Howler._navigator.userAgent);\n if (!checkIE) {\n node.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';\n }\n }\n };\n\n /** Single Sound Methods **/\n /***************************************************************************/\n\n /**\n * Setup the sound object, which each node attached to a Howl group is contained in.\n * @param {Object} howl The Howl parent group.\n */\n var Sound = function(howl) {\n this._parent = howl;\n this.init();\n };\n Sound.prototype = {\n /**\n * Initialize a new Sound object.\n * @return {Sound}\n */\n init: function() {\n var self = this;\n var parent = self._parent;\n\n // Setup the default parameters.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a unique ID for this sound.\n self._id = ++Howler._counter;\n\n // Add itself to the parent's pool.\n parent._sounds.push(self);\n\n // Create the new node.\n self.create();\n\n return self;\n },\n\n /**\n * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n * @return {Sound}\n */\n create: function() {\n var self = this;\n var parent = self._parent;\n var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n if (parent._webAudio) {\n // Create the gain node for controlling volume (the source will connect to this).\n self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n self._node.paused = true;\n self._node.connect(Howler.masterGain);\n } else if (!Howler.noAudio) {\n // Get an unlocked Audio object from the pool.\n self._node = Howler._obtainHtml5Audio();\n\n // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n self._errorFn = self._errorListener.bind(self);\n self._node.addEventListener('error', self._errorFn, false);\n\n // Listen for 'canplaythrough' event to let us know the sound is ready.\n self._loadFn = self._loadListener.bind(self);\n self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n // Listen for the 'ended' event on the sound to account for edge-case where\n // a finite sound has a duration of Infinity.\n self._endFn = self._endListener.bind(self);\n self._node.addEventListener('ended', self._endFn, false);\n\n // Setup the new audio node.\n self._node.src = parent._src;\n self._node.preload = parent._preload === true ? 'auto' : parent._preload;\n self._node.volume = volume * Howler.volume();\n\n // Begin loading the source.\n self._node.load();\n }\n\n return self;\n },\n\n /**\n * Reset the parameters of this sound to the original state (for recycle).\n * @return {Sound}\n */\n reset: function() {\n var self = this;\n var parent = self._parent;\n\n // Reset all of the parameters of this sound.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a new ID so that it isn't confused with the previous sound.\n self._id = ++Howler._counter;\n\n return self;\n },\n\n /**\n * HTML5 Audio error listener callback.\n */\n _errorListener: function() {\n var self = this;\n\n // Fire an error event and pass back the code.\n self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n // Clear the event listener.\n self._node.removeEventListener('error', self._errorFn, false);\n },\n\n /**\n * HTML5 Audio canplaythrough listener callback.\n */\n _loadListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Setup a sprite if none is defined.\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = {__default: [0, parent._duration * 1000]};\n }\n\n if (parent._state !== 'loaded') {\n parent._state = 'loaded';\n parent._emit('load');\n parent._loadQueue();\n }\n\n // Clear the event listener.\n self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n },\n\n /**\n * HTML5 Audio ended listener callback.\n */\n _endListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Only handle the `ended`` event if the duration is Infinity.\n if (parent._duration === Infinity) {\n // Update the parent duration to match the real audio duration.\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Update the sprite that corresponds to the real duration.\n if (parent._sprite.__default[1] === Infinity) {\n parent._sprite.__default[1] = parent._duration * 1000;\n }\n\n // Run the regular ended method.\n parent._ended(self);\n }\n\n // Clear the event listener since the duration is now correct.\n self._node.removeEventListener('ended', self._endFn, false);\n }\n };\n\n /** Helper Methods **/\n /***************************************************************************/\n\n var cache = {};\n\n /**\n * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n * @param {Howl} self\n */\n var loadBuffer = function(self) {\n var url = self._src;\n\n // Check if the buffer has already been cached and use it instead.\n if (cache[url]) {\n // Set the duration from the cache.\n self._duration = cache[url].duration;\n\n // Load the sound into this Howl.\n loadSound(self);\n\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n // Decode the base64 data URI without XHR, since some browsers don't support it.\n var data = atob(url.split(',')[1]);\n var dataView = new Uint8Array(data.length);\n for (var i=0; i 0) {\n cache[self._src] = buffer;\n loadSound(self, buffer);\n } else {\n error();\n }\n };\n\n // Decode the buffer into an audio source.\n if (typeof Promise !== 'undefined' && Howler.ctx.decodeAudioData.length === 1) {\n Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);\n } else {\n Howler.ctx.decodeAudioData(arraybuffer, success, error);\n }\n }\n\n /**\n * Sound is now loaded, so finish setting everything up and fire the loaded event.\n * @param {Howl} self\n * @param {Object} buffer The decoded buffer sound source.\n */\n var loadSound = function(self, buffer) {\n // Set the duration.\n if (buffer && !self._duration) {\n self._duration = buffer.duration;\n }\n\n // Setup a sprite if none is defined.\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = {__default: [0, self._duration * 1000]};\n }\n\n // Fire the loaded event.\n if (self._state !== 'loaded') {\n self._state = 'loaded';\n self._emit('load');\n self._loadQueue();\n }\n };\n\n /**\n * Setup the audio context when available, or switch to HTML5 Audio mode.\n */\n var setupAudioContext = function() {\n // If we have already detected that Web Audio isn't supported, don't run this step again.\n if (!Howler.usingWebAudio) {\n return;\n }\n\n // Check if we are using Web Audio and setup the AudioContext if we are.\n try {\n if (typeof AudioContext !== 'undefined') {\n Howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== 'undefined') {\n Howler.ctx = new webkitAudioContext();\n } else {\n Howler.usingWebAudio = false;\n }\n } catch(e) {\n Howler.usingWebAudio = false;\n }\n\n // If the audio context creation still failed, set using web audio to false.\n if (!Howler.ctx) {\n Howler.usingWebAudio = false;\n }\n\n // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n // If it is, disable Web Audio as it causes crashing.\n var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n var version = appVersion ? parseInt(appVersion[1], 10) : null;\n if (iOS && version && version < 9) {\n var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n if (Howler._navigator && !safari) {\n Howler.usingWebAudio = false;\n }\n }\n\n // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n if (Howler.usingWebAudio) {\n Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n Howler.masterGain.gain.setValueAtTime(Howler._muted ? 0 : Howler._volume, Howler.ctx.currentTime);\n Howler.masterGain.connect(Howler.ctx.destination);\n }\n\n // Re-run the setup on Howler.\n Howler._setup();\n };\n\n // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n return {\n Howler: Howler,\n Howl: Howl\n };\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n\n // Add support for CommonJS libraries such as browserify.\n if (true) {\n exports.Howler = Howler;\n exports.Howl = Howl;\n }\n\n // Add to global in Node.js (for testing, etc).\n if (typeof __webpack_require__.g !== 'undefined') {\n __webpack_require__.g.HowlerGlobal = HowlerGlobal;\n __webpack_require__.g.Howler = Howler;\n __webpack_require__.g.Howl = Howl;\n __webpack_require__.g.Sound = Sound;\n } else if (typeof window !== 'undefined') { // Define globally in case AMD is not available or unused.\n window.HowlerGlobal = HowlerGlobal;\n window.Howler = Howler;\n window.Howl = Howl;\n window.Sound = Sound;\n }\n})();\n\n\n/*!\n * Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n * \n * howler.js v2.2.4\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n // Setup default properties.\n HowlerGlobal.prototype._pos = [0, 0, 0];\n HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Helper method to update the stereo panning position of all current Howls.\n * Future Howls will not use this value unless explicitly set.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @return {Howler/Number} Self or current stereo panning value.\n */\n HowlerGlobal.prototype.stereo = function(pan) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Loop through all Howls and update their stereo panning.\n for (var i=self._howls.length-1; i>=0; i--) {\n self._howls[i].stereo(pan);\n }\n\n return self;\n };\n\n /**\n * Get/set the position of the listener in 3D cartesian space. Sounds using\n * 3D position will be relative to the listener's position.\n * @param {Number} x The x-position of the listener.\n * @param {Number} y The y-position of the listener.\n * @param {Number} z The z-position of the listener.\n * @return {Howler/Array} Self or current listener position.\n */\n HowlerGlobal.prototype.pos = function(x, y, z) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? self._pos[1] : y;\n z = (typeof z !== 'number') ? self._pos[2] : z;\n\n if (typeof x === 'number') {\n self._pos = [x, y, z];\n\n if (typeof self.ctx.listener.positionX !== 'undefined') {\n self.ctx.listener.positionX.setTargetAtTime(self._pos[0], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionY.setTargetAtTime(self._pos[1], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionZ.setTargetAtTime(self._pos[2], Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n }\n } else {\n return self._pos;\n }\n\n return self;\n };\n\n /**\n * Get/set the direction the listener is pointing in the 3D cartesian space.\n * A front and up vector must be provided. The front is the direction the\n * face of the listener is pointing, and up is the direction the top of the\n * listener is pointing. Thus, these values are expected to be at right angles\n * from each other.\n * @param {Number} x The x-orientation of the listener.\n * @param {Number} y The y-orientation of the listener.\n * @param {Number} z The z-orientation of the listener.\n * @param {Number} xUp The x-orientation of the top of the listener.\n * @param {Number} yUp The y-orientation of the top of the listener.\n * @param {Number} zUp The z-orientation of the top of the listener.\n * @return {Howler/Array} Returns self or the current orientation vectors.\n */\n HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n var or = self._orientation;\n y = (typeof y !== 'number') ? or[1] : y;\n z = (typeof z !== 'number') ? or[2] : z;\n xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n if (typeof x === 'number') {\n self._orientation = [x, y, z, xUp, yUp, zUp];\n\n if (typeof self.ctx.listener.forwardX !== 'undefined') {\n self.ctx.listener.forwardX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upX.setTargetAtTime(xUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upY.setTargetAtTime(yUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upZ.setTargetAtTime(zUp, Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n }\n } else {\n return or;\n }\n\n return self;\n };\n\n /** Group Methods **/\n /***************************************************************************/\n\n /**\n * Add new properties to the core init.\n * @param {Function} _super Core init method.\n * @return {Howl}\n */\n Howl.prototype.init = (function(_super) {\n return function(o) {\n var self = this;\n\n // Setup user-defined default properties.\n self._orientation = o.orientation || [1, 0, 0];\n self._stereo = o.stereo || null;\n self._pos = o.pos || null;\n self._pannerAttr = {\n coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n };\n\n // Setup event listeners.\n self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n // Complete initilization with howler.js core's init function.\n return _super.call(this, o);\n };\n })(Howl.prototype.init);\n\n /**\n * Get/set the stereo panning of the audio source for this sound or all in the group.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Number} Returns self or the current stereo panning value.\n */\n Howl.prototype.stereo = function(pan, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'stereo',\n action: function() {\n self.stereo(pan, id);\n }\n });\n\n return self;\n }\n\n // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n // Setup the group's stereo panning if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's stereo panning if no parameters are passed.\n if (typeof pan === 'number') {\n self._stereo = pan;\n self._pos = [pan, 0, 0];\n } else {\n return self._stereo;\n }\n }\n\n // Change the streo panning of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the group's values.\n * pannerAttr(id) -> Returns the sound id's values.\n * pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n * pannerAttr(o, id) -> Set's the values of passed sound id.\n *\n * Attributes:\n * coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * inside of which there will be no volume reduction.\n * coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n * coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n * `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n * distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n * listener. Can be `linear`, `inverse` or `exponential.\n * maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n * will not be reduced any further.\n * refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n * This is simply a variable of the distance model and has a different effect depending on which model\n * is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n * rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n * variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, ∞]`\n * with `inverse` and `exponential`.\n * panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n * Can be `HRTF` or `equalpower`.\n *\n * @return {Howl/Object} Returns self or current panner attributes.\n */\n Howl.prototype.pannerAttr = function() {\n var self = this;\n var args = arguments;\n var o, id, sound;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the group's panner attribute values.\n return self._pannerAttr;\n } else if (args.length === 1) {\n if (typeof args[0] === 'object') {\n o = args[0];\n\n // Set the grou's panner attribute values.\n if (typeof id === 'undefined') {\n if (!o.pannerAttr) {\n o.pannerAttr = {\n coneInnerAngle: o.coneInnerAngle,\n coneOuterAngle: o.coneOuterAngle,\n coneOuterGain: o.coneOuterGain,\n distanceModel: o.distanceModel,\n maxDistance: o.maxDistance,\n refDistance: o.refDistance,\n rolloffFactor: o.rolloffFactor,\n panningModel: o.panningModel\n };\n }\n\n self._pannerAttr = {\n coneInnerAngle: typeof o.pannerAttr.coneInnerAngle !== 'undefined' ? o.pannerAttr.coneInnerAngle : self._coneInnerAngle,\n coneOuterAngle: typeof o.pannerAttr.coneOuterAngle !== 'undefined' ? o.pannerAttr.coneOuterAngle : self._coneOuterAngle,\n coneOuterGain: typeof o.pannerAttr.coneOuterGain !== 'undefined' ? o.pannerAttr.coneOuterGain : self._coneOuterGain,\n distanceModel: typeof o.pannerAttr.distanceModel !== 'undefined' ? o.pannerAttr.distanceModel : self._distanceModel,\n maxDistance: typeof o.pannerAttr.maxDistance !== 'undefined' ? o.pannerAttr.maxDistance : self._maxDistance,\n refDistance: typeof o.pannerAttr.refDistance !== 'undefined' ? o.pannerAttr.refDistance : self._refDistance,\n rolloffFactor: typeof o.pannerAttr.rolloffFactor !== 'undefined' ? o.pannerAttr.rolloffFactor : self._rolloffFactor,\n panningModel: typeof o.pannerAttr.panningModel !== 'undefined' ? o.pannerAttr.panningModel : self._panningModel\n };\n }\n } else {\n // Return this sound's panner attribute values.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._pannerAttr : self._pannerAttr;\n }\n } else if (args.length === 2) {\n o = args[0];\n id = parseInt(args[1], 10);\n }\n\n // Update the values of the specified sounds.\n var ids = self._getSoundIds(id);\n for (var i=0; i { - -eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*global define:false */\n/**\n * Copyright 2012-2017 Craig Campbell\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Mousetrap is a simple keyboard shortcut library for Javascript with\n * no external dependencies\n *\n * @version 1.6.5\n * @url craig.is/killing/mice\n */\n(function(window, document, undefined) {\n\n // Check if mousetrap is used inside browser, if not, return\n if (!window) {\n return;\n }\n\n /**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\n var _MAP = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'ins',\n 46: 'del',\n 91: 'meta',\n 93: 'meta',\n 224: 'meta'\n };\n\n /**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\n var _KEYCODE_MAP = {\n 106: '*',\n 107: '+',\n 109: '-',\n 110: '.',\n 111 : '/',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: '\\''\n };\n\n /**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\n var _SHIFT_MAP = {\n '~': '`',\n '!': '1',\n '@': '2',\n '#': '3',\n '$': '4',\n '%': '5',\n '^': '6',\n '&': '7',\n '*': '8',\n '(': '9',\n ')': '0',\n '_': '-',\n '+': '=',\n ':': ';',\n '\\\"': '\\'',\n '<': ',',\n '>': '.',\n '?': '/',\n '|': '\\\\'\n };\n\n /**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\n var _SPECIAL_ALIASES = {\n 'option': 'alt',\n 'command': 'meta',\n 'return': 'enter',\n 'escape': 'esc',\n 'plus': '+',\n 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n };\n\n /**\n * variable to store the flipped version of _MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\n var _REVERSE_MAP;\n\n /**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\n for (var i = 1; i < 20; ++i) {\n _MAP[111 + i] = 'f' + i;\n }\n\n /**\n * loop through to map numbers on the numeric keypad\n */\n for (i = 0; i <= 9; ++i) {\n\n // This needs to use a string cause otherwise since 0 is falsey\n // mousetrap will never fire for numpad 0 pressed as part of a keydown\n // event.\n //\n // @see https://github.com/ccampbell/mousetrap/pull/258\n _MAP[i + 96] = i.toString();\n }\n\n /**\n * cross browser add event method\n *\n * @param {Element|HTMLDocument} object\n * @param {string} type\n * @param {Function} callback\n * @returns void\n */\n function _addEvent(object, type, callback) {\n if (object.addEventListener) {\n object.addEventListener(type, callback, false);\n return;\n }\n\n object.attachEvent('on' + type, callback);\n }\n\n /**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\n function _characterFromEvent(e) {\n\n // for keypress events we should return the character as is\n if (e.type == 'keypress') {\n var character = String.fromCharCode(e.which);\n\n // if the shift key is not pressed then it is safe to assume\n // that we want the character to be lowercase. this means if\n // you accidentally have caps lock on then your key bindings\n // will continue to work\n //\n // the only side effect that might not be desired is if you\n // bind something like 'A' cause you want to trigger an\n // event when capital A is pressed caps lock will no longer\n // trigger the event. shift+a will though.\n if (!e.shiftKey) {\n character = character.toLowerCase();\n }\n\n return character;\n }\n\n // for non keypress events the special maps are needed\n if (_MAP[e.which]) {\n return _MAP[e.which];\n }\n\n if (_KEYCODE_MAP[e.which]) {\n return _KEYCODE_MAP[e.which];\n }\n\n // if it is not in the special map\n\n // with keydown and keyup events the character seems to always\n // come in as an uppercase character whether you are pressing shift\n // or not. we should make sure it is always lowercase for comparisons\n return String.fromCharCode(e.which).toLowerCase();\n }\n\n /**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\n function _modifiersMatch(modifiers1, modifiers2) {\n return modifiers1.sort().join(',') === modifiers2.sort().join(',');\n }\n\n /**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\n function _eventModifiers(e) {\n var modifiers = [];\n\n if (e.shiftKey) {\n modifiers.push('shift');\n }\n\n if (e.altKey) {\n modifiers.push('alt');\n }\n\n if (e.ctrlKey) {\n modifiers.push('ctrl');\n }\n\n if (e.metaKey) {\n modifiers.push('meta');\n }\n\n return modifiers;\n }\n\n /**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _preventDefault(e) {\n if (e.preventDefault) {\n e.preventDefault();\n return;\n }\n\n e.returnValue = false;\n }\n\n /**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\n function _stopPropagation(e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n return;\n }\n\n e.cancelBubble = true;\n }\n\n /**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\n function _isModifier(key) {\n return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta';\n }\n\n /**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\n function _getReverseMap() {\n if (!_REVERSE_MAP) {\n _REVERSE_MAP = {};\n for (var key in _MAP) {\n\n // pull out the numeric keypad from here cause keypress should\n // be able to detect the keys from the character\n if (key > 95 && key < 112) {\n continue;\n }\n\n if (_MAP.hasOwnProperty(key)) {\n _REVERSE_MAP[_MAP[key]] = key;\n }\n }\n }\n return _REVERSE_MAP;\n }\n\n /**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\n function _pickBestAction(key, modifiers, action) {\n\n // if no action was picked in we should try to pick the one\n // that we think would work best for this key\n if (!action) {\n action = _getReverseMap()[key] ? 'keydown' : 'keypress';\n }\n\n // modifier keys don't work as expected with keypress,\n // switch to keydown\n if (action == 'keypress' && modifiers.length) {\n action = 'keydown';\n }\n\n return action;\n }\n\n /**\n * Converts from a string key combination to an array\n *\n * @param {string} combination like \"command+shift+l\"\n * @return {Array}\n */\n function _keysFromString(combination) {\n if (combination === '+') {\n return ['+'];\n }\n\n combination = combination.replace(/\\+{2}/g, '+plus');\n return combination.split('+');\n }\n\n /**\n * Gets info for a specific key combination\n *\n * @param {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param {string=} action\n * @returns {Object}\n */\n function _getKeyInfo(combination, action) {\n var keys;\n var key;\n var i;\n var modifiers = [];\n\n // take the keys from this pattern and figure out what the actual\n // pattern is all about\n keys = _keysFromString(combination);\n\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n\n // normalize key names\n if (_SPECIAL_ALIASES[key]) {\n key = _SPECIAL_ALIASES[key];\n }\n\n // if this is not a keypress event then we should\n // be smart about using shift keys\n // this will only work for US keyboards however\n if (action && action != 'keypress' && _SHIFT_MAP[key]) {\n key = _SHIFT_MAP[key];\n modifiers.push('shift');\n }\n\n // if this key is a modifier then add it to the list of modifiers\n if (_isModifier(key)) {\n modifiers.push(key);\n }\n }\n\n // depending on what the key combination is\n // we will try to pick the best event for it\n action = _pickBestAction(key, modifiers, action);\n\n return {\n key: key,\n modifiers: modifiers,\n action: action\n };\n }\n\n function _belongsTo(element, ancestor) {\n if (element === null || element === document) {\n return false;\n }\n\n if (element === ancestor) {\n return true;\n }\n\n return _belongsTo(element.parentNode, ancestor);\n }\n\n function Mousetrap(targetElement) {\n var self = this;\n\n targetElement = targetElement || document;\n\n if (!(self instanceof Mousetrap)) {\n return new Mousetrap(targetElement);\n }\n\n /**\n * element to attach key events to\n *\n * @type {Element}\n */\n self.target = targetElement;\n\n /**\n * a list of all the callbacks setup via Mousetrap.bind()\n *\n * @type {Object}\n */\n self._callbacks = {};\n\n /**\n * direct map of string combinations to callbacks used for trigger()\n *\n * @type {Object}\n */\n self._directMap = {};\n\n /**\n * keeps track of what level each sequence is at since multiple\n * sequences can start out with the same sequence\n *\n * @type {Object}\n */\n var _sequenceLevels = {};\n\n /**\n * variable to store the setTimeout call\n *\n * @type {null|number}\n */\n var _resetTimer;\n\n /**\n * temporary state where we will ignore the next keyup\n *\n * @type {boolean|string}\n */\n var _ignoreNextKeyup = false;\n\n /**\n * temporary state where we will ignore the next keypress\n *\n * @type {boolean}\n */\n var _ignoreNextKeypress = false;\n\n /**\n * are we currently inside of a sequence?\n * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n *\n * @type {boolean|string}\n */\n var _nextExpectedAction = false;\n\n /**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\n function _resetSequences(doNotReset) {\n doNotReset = doNotReset || {};\n\n var activeSequences = false,\n key;\n\n for (key in _sequenceLevels) {\n if (doNotReset[key]) {\n activeSequences = true;\n continue;\n }\n _sequenceLevels[key] = 0;\n }\n\n if (!activeSequences) {\n _nextExpectedAction = false;\n }\n }\n\n /**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\n function _getMatches(character, modifiers, e, sequenceName, combination, level) {\n var i;\n var callback;\n var matches = [];\n var action = e.type;\n\n // if there are no events related to this keycode\n if (!self._callbacks[character]) {\n return [];\n }\n\n // if a modifier key is coming up on its own we should allow it\n if (action == 'keyup' && _isModifier(character)) {\n modifiers = [character];\n }\n\n // loop through all callbacks for the key that was pressed\n // and see if any of them match\n for (i = 0; i < self._callbacks[character].length; ++i) {\n callback = self._callbacks[character][i];\n\n // if a sequence name is not specified, but this is a sequence at\n // the wrong level then move onto the next match\n if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {\n continue;\n }\n\n // if the action we are looking for doesn't match the action we got\n // then we should keep going\n if (action != callback.action) {\n continue;\n }\n\n // if this is a keypress event and the meta key and control key\n // are not pressed that means that we need to only look at the\n // character, otherwise check the modifiers as well\n //\n // chrome will not fire a keypress if meta or control is down\n // safari will fire a keypress if meta or meta+shift is down\n // firefox will fire a keypress if meta or control is down\n if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {\n\n // when you bind a combination or sequence a second time it\n // should overwrite the first one. if a sequenceName or\n // combination is specified in this call it does just that\n //\n // @todo make deleting its own method?\n var deleteCombo = !sequenceName && callback.combo == combination;\n var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;\n if (deleteCombo || deleteSequence) {\n self._callbacks[character].splice(i, 1);\n }\n\n matches.push(callback);\n }\n }\n\n return matches;\n }\n\n /**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\n function _fireCallback(callback, e, combo, sequence) {\n\n // if this event should not happen stop here\n if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n return;\n }\n\n if (callback(e, combo) === false) {\n _preventDefault(e);\n _stopPropagation(e);\n }\n }\n\n /**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\n self._handleKey = function(character, modifiers, e) {\n var callbacks = _getMatches(character, modifiers, e);\n var i;\n var doNotReset = {};\n var maxLevel = 0;\n var processedSequenceCallback = false;\n\n // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n for (i = 0; i < callbacks.length; ++i) {\n if (callbacks[i].seq) {\n maxLevel = Math.max(maxLevel, callbacks[i].level);\n }\n }\n\n // loop through matching callbacks for this key event\n for (i = 0; i < callbacks.length; ++i) {\n\n // fire for all sequence callbacks\n // this is because if for example you have multiple sequences\n // bound such as \"g i\" and \"g t\" they both need to fire the\n // callback for matching g cause otherwise you can only ever\n // match the first one\n if (callbacks[i].seq) {\n\n // only fire callbacks for the maxLevel to prevent\n // subsequences from also firing\n //\n // for example 'a option b' should not cause 'option b' to fire\n // even though 'option b' is part of the other sequence\n //\n // any sequences that do not match here will be discarded\n // below by the _resetSequences call\n if (callbacks[i].level != maxLevel) {\n continue;\n }\n\n processedSequenceCallback = true;\n\n // keep a list of which sequences were matches for later\n doNotReset[callbacks[i].seq] = 1;\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq);\n continue;\n }\n\n // if there were no sequence matches but we are still here\n // that means this is a regular match so we should fire that\n if (!processedSequenceCallback) {\n _fireCallback(callbacks[i].callback, e, callbacks[i].combo);\n }\n }\n\n // if the key you pressed matches the type of sequence without\n // being a modifier (ie \"keyup\" or \"keypress\") then we should\n // reset all sequences that were not matched by this event\n //\n // this is so, for example, if you have the sequence \"h a t\" and you\n // type \"h e a r t\" it does not match. in this case the \"e\" will\n // cause the sequence to reset\n //\n // modifier keys are ignored because you can have a sequence\n // that contains modifiers such as \"enter ctrl+space\" and in most\n // cases the modifier key will be pressed before the next key\n //\n // also if you have a sequence such as \"ctrl+b a\" then pressing the\n // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n //\n // the \"keydown\" is expected when there is a modifier, but the\n // \"keypress\" ends up matching the _nextExpectedAction since it occurs\n // after and that causes the sequence to reset\n //\n // we ignore keypresses in a sequence that directly follow a keydown\n // for the same character\n var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress;\n if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) {\n _resetSequences(doNotReset);\n }\n\n _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown';\n };\n\n /**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\n function _handleKeyEvent(e) {\n\n // normalize e.which for key events\n // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n if (typeof e.which !== 'number') {\n e.which = e.keyCode;\n }\n\n var character = _characterFromEvent(e);\n\n // no character found then stop\n if (!character) {\n return;\n }\n\n // need to use === for the character check because the character can be 0\n if (e.type == 'keyup' && _ignoreNextKeyup === character) {\n _ignoreNextKeyup = false;\n return;\n }\n\n self.handleKey(character, _eventModifiers(e), e);\n }\n\n /**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\n function _resetSequenceTimer() {\n clearTimeout(_resetTimer);\n _resetTimer = setTimeout(_resetSequences, 1000);\n }\n\n /**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\n function _bindSequence(combo, keys, callback, action) {\n\n // start off by adding a sequence level record for this combination\n // and setting the level to 0\n _sequenceLevels[combo] = 0;\n\n /**\n * callback to increase the sequence level for this sequence and reset\n * all other sequences that were active\n *\n * @param {string} nextAction\n * @returns {Function}\n */\n function _increaseSequence(nextAction) {\n return function() {\n _nextExpectedAction = nextAction;\n ++_sequenceLevels[combo];\n _resetSequenceTimer();\n };\n }\n\n /**\n * wraps the specified callback inside of another function in order\n * to reset all sequence counters as soon as this sequence is done\n *\n * @param {Event} e\n * @returns void\n */\n function _callbackAndReset(e) {\n _fireCallback(callback, e, combo);\n\n // we should ignore the next key up if the action is key down\n // or keypress. this is so if you finish a sequence and\n // release the key the final key will not trigger a keyup\n if (action !== 'keyup') {\n _ignoreNextKeyup = _characterFromEvent(e);\n }\n\n // weird race condition if a sequence ends with the key\n // another sequence begins with\n setTimeout(_resetSequences, 10);\n }\n\n // loop through keys one at a time and bind the appropriate callback\n // function. for any key leading up to the final one it should\n // increase the sequence. after the final, it should reset all sequences\n //\n // if an action is specified in the original bind call then that will\n // be used throughout. otherwise we will pass the action that the\n // next key in the sequence should match. this allows a sequence\n // to mix and match keypress and keydown events depending on which\n // ones are better suited to the key provided\n for (var i = 0; i < keys.length; ++i) {\n var isFinal = i + 1 === keys.length;\n var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);\n _bindSingle(keys[i], wrappedCallback, action, combo, i);\n }\n }\n\n /**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\n function _bindSingle(combination, callback, action, sequenceName, level) {\n\n // store a direct mapped reference for use with Mousetrap.trigger\n self._directMap[combination + ':' + action] = callback;\n\n // make sure multiple spaces in a row become a single space\n combination = combination.replace(/\\s+/g, ' ');\n\n var sequence = combination.split(' ');\n var info;\n\n // if this pattern is a sequence of keys then run through this method\n // to reprocess each pattern one key at a time\n if (sequence.length > 1) {\n _bindSequence(combination, sequence, callback, action);\n return;\n }\n\n info = _getKeyInfo(combination, action);\n\n // make sure to initialize array if this is the first time\n // a callback is added for this key\n self._callbacks[info.key] = self._callbacks[info.key] || [];\n\n // remove an existing match if there is one\n _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);\n\n // add this call back to the array\n // if it is a sequence put it at the beginning\n // if not put it at the end\n //\n // this is important because the way these are processed expects\n // the sequence ones to come first\n self._callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n callback: callback,\n modifiers: info.modifiers,\n action: info.action,\n seq: sequenceName,\n level: level,\n combo: combination\n });\n }\n\n /**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\n self._bindMultiple = function(combinations, callback, action) {\n for (var i = 0; i < combinations.length; ++i) {\n _bindSingle(combinations[i], callback, action);\n }\n };\n\n // start!\n _addEvent(targetElement, 'keypress', _handleKeyEvent);\n _addEvent(targetElement, 'keydown', _handleKeyEvent);\n _addEvent(targetElement, 'keyup', _handleKeyEvent);\n }\n\n /**\n * binds an event to mousetrap\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - 'keypress', 'keydown', or 'keyup'\n * @returns void\n */\n Mousetrap.prototype.bind = function(keys, callback, action) {\n var self = this;\n keys = keys instanceof Array ? keys : [keys];\n self._bindMultiple.call(self, keys, callback, action);\n return self;\n };\n\n /**\n * unbinds an event to mousetrap\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * _directMap dict.\n *\n * TODO: actually remove this from the _callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\n Mousetrap.prototype.unbind = function(keys, action) {\n var self = this;\n return self.bind.call(self, keys, function() {}, action);\n };\n\n /**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\n Mousetrap.prototype.trigger = function(keys, action) {\n var self = this;\n if (self._directMap[keys + ':' + action]) {\n self._directMap[keys + ':' + action]({}, keys);\n }\n return self;\n };\n\n /**\n * resets the library back to its initial state. this is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\n Mousetrap.prototype.reset = function() {\n var self = this;\n self._callbacks = {};\n self._directMap = {};\n return self;\n };\n\n /**\n * should we stop this event before firing off callbacks\n *\n * @param {Event} e\n * @param {Element} element\n * @return {boolean}\n */\n Mousetrap.prototype.stopCallback = function(e, element) {\n var self = this;\n\n // if the element has the class \"mousetrap\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n return false;\n }\n\n if (_belongsTo(element, self.target)) {\n return false;\n }\n\n // Events originating from a shadow DOM are re-targetted and `e.target` is the shadow host,\n // not the initial event target in the shadow tree. Note that not all events cross the\n // shadow boundary.\n // For shadow trees with `mode: 'open'`, the initial event target is the first element in\n // the event’s composed path. For shadow trees with `mode: 'closed'`, the initial event\n // target cannot be obtained.\n if ('composedPath' in e && typeof e.composedPath === 'function') {\n // For open shadow trees, update `element` so that the following check works.\n var initialEventTarget = e.composedPath()[0];\n if (initialEventTarget !== e.target) {\n element = initialEventTarget;\n }\n }\n\n // stop for input, select, and textarea\n return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable;\n };\n\n /**\n * exposes _handleKey publicly so it can be overwritten by extensions\n */\n Mousetrap.prototype.handleKey = function() {\n var self = this;\n return self._handleKey.apply(self, arguments);\n };\n\n /**\n * allow custom key mappings\n */\n Mousetrap.addKeycodes = function(object) {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n _MAP[key] = object[key];\n }\n }\n _REVERSE_MAP = null;\n };\n\n /**\n * Init the global mousetrap functions\n *\n * This method is needed to allow the global mousetrap functions to work\n * now that mousetrap is a constructor function.\n */\n Mousetrap.init = function() {\n var documentMousetrap = Mousetrap(document);\n for (var method in documentMousetrap) {\n if (method.charAt(0) !== '_') {\n Mousetrap[method] = (function(method) {\n return function() {\n return documentMousetrap[method].apply(documentMousetrap, arguments);\n };\n } (method));\n }\n }\n };\n\n Mousetrap.init();\n\n // expose mousetrap to the global object\n window.Mousetrap = Mousetrap;\n\n // expose as a common js module\n if ( true && module.exports) {\n module.exports = Mousetrap;\n }\n\n // expose mousetrap as an AMD module\n if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n return Mousetrap;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n}) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbW91c2V0cmFwL21vdXNldHJhcC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckMsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsT0FBTztBQUN0QixlQUFlLFNBQVM7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEMsRUFBRTtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCLGdCQUFnQixTQUFTO0FBQ3pCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpQkFBaUI7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0IsbUJBQW1CLE9BQU87QUFDMUIsbUJBQW1CLGNBQWM7QUFDakMsbUJBQW1CLFNBQVM7QUFDNUIsbUJBQW1CLFNBQVM7QUFDNUIsbUJBQW1CLFNBQVM7QUFDNUIscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLHVDQUF1QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsVUFBVTtBQUM3QixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQixtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixzQkFBc0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE9BQU87QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQixtQkFBbUIsT0FBTztBQUMxQixtQkFBbUIsVUFBVTtBQUM3QixtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0IseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGlCQUFpQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCLG1CQUFtQixVQUFVO0FBQzdCLG1CQUFtQixTQUFTO0FBQzVCLG1CQUFtQixTQUFTO0FBQzVCLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1ELGtCQUFrQjs7QUFFckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE9BQU87QUFDMUIsbUJBQW1CLFVBQVU7QUFDN0IsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQSw0QkFBNEIseUJBQXlCO0FBQ3JEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QixlQUFlLFVBQVU7QUFDekIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsU0FBUztBQUN4QixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxLQUE2QjtBQUNyQztBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUEwQztBQUNsRCxRQUFRLG1DQUFPO0FBQ2Y7QUFDQSxTQUFTO0FBQUEsa0dBQUM7QUFDVjtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL21vdXNldHJhcC9tb3VzZXRyYXAuanM/OGE2MCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKmdsb2JhbCBkZWZpbmU6ZmFsc2UgKi9cbi8qKlxuICogQ29weXJpZ2h0IDIwMTItMjAxNyBDcmFpZyBDYW1wYmVsbFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIE1vdXNldHJhcCBpcyBhIHNpbXBsZSBrZXlib2FyZCBzaG9ydGN1dCBsaWJyYXJ5IGZvciBKYXZhc2NyaXB0IHdpdGhcbiAqIG5vIGV4dGVybmFsIGRlcGVuZGVuY2llc1xuICpcbiAqIEB2ZXJzaW9uIDEuNi41XG4gKiBAdXJsIGNyYWlnLmlzL2tpbGxpbmcvbWljZVxuICovXG4oZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cbiAgICAvLyBDaGVjayBpZiBtb3VzZXRyYXAgaXMgdXNlZCBpbnNpZGUgYnJvd3NlciwgaWYgbm90LCByZXR1cm5cbiAgICBpZiAoIXdpbmRvdykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWFwcGluZyBvZiBzcGVjaWFsIGtleWNvZGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcga2V5c1xuICAgICAqXG4gICAgICogZXZlcnl0aGluZyBpbiB0aGlzIGRpY3Rpb25hcnkgY2Fubm90IHVzZSBrZXlwcmVzcyBldmVudHNcbiAgICAgKiBzbyBpdCBoYXMgdG8gYmUgaGVyZSB0byBtYXAgdG8gdGhlIGNvcnJlY3Qga2V5Y29kZXMgZm9yXG4gICAgICoga2V5dXAva2V5ZG93biBldmVudHNcbiAgICAgKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFyIF9NQVAgPSB7XG4gICAgICAgIDg6ICdiYWNrc3BhY2UnLFxuICAgICAgICA5OiAndGFiJyxcbiAgICAgICAgMTM6ICdlbnRlcicsXG4gICAgICAgIDE2OiAnc2hpZnQnLFxuICAgICAgICAxNzogJ2N0cmwnLFxuICAgICAgICAxODogJ2FsdCcsXG4gICAgICAgIDIwOiAnY2Fwc2xvY2snLFxuICAgICAgICAyNzogJ2VzYycsXG4gICAgICAgIDMyOiAnc3BhY2UnLFxuICAgICAgICAzMzogJ3BhZ2V1cCcsXG4gICAgICAgIDM0OiAncGFnZWRvd24nLFxuICAgICAgICAzNTogJ2VuZCcsXG4gICAgICAgIDM2OiAnaG9tZScsXG4gICAgICAgIDM3OiAnbGVmdCcsXG4gICAgICAgIDM4OiAndXAnLFxuICAgICAgICAzOTogJ3JpZ2h0JyxcbiAgICAgICAgNDA6ICdkb3duJyxcbiAgICAgICAgNDU6ICdpbnMnLFxuICAgICAgICA0NjogJ2RlbCcsXG4gICAgICAgIDkxOiAnbWV0YScsXG4gICAgICAgIDkzOiAnbWV0YScsXG4gICAgICAgIDIyNDogJ21ldGEnXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIG1hcHBpbmcgZm9yIHNwZWNpYWwgY2hhcmFjdGVycyBzbyB0aGV5IGNhbiBzdXBwb3J0XG4gICAgICpcbiAgICAgKiB0aGlzIGRpY3Rpb25hcnkgaXMgb25seSB1c2VkIGluY2FzZSB5b3Ugd2FudCB0byBiaW5kIGFcbiAgICAgKiBrZXl1cCBvciBrZXlkb3duIGV2ZW50IHRvIG9uZSBvZiB0aGVzZSBrZXlzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhciBfS0VZQ09ERV9NQVAgPSB7XG4gICAgICAgIDEwNjogJyonLFxuICAgICAgICAxMDc6ICcrJyxcbiAgICAgICAgMTA5OiAnLScsXG4gICAgICAgIDExMDogJy4nLFxuICAgICAgICAxMTEgOiAnLycsXG4gICAgICAgIDE4NjogJzsnLFxuICAgICAgICAxODc6ICc9JyxcbiAgICAgICAgMTg4OiAnLCcsXG4gICAgICAgIDE4OTogJy0nLFxuICAgICAgICAxOTA6ICcuJyxcbiAgICAgICAgMTkxOiAnLycsXG4gICAgICAgIDE5MjogJ2AnLFxuICAgICAgICAyMTk6ICdbJyxcbiAgICAgICAgMjIwOiAnXFxcXCcsXG4gICAgICAgIDIyMTogJ10nLFxuICAgICAgICAyMjI6ICdcXCcnXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgaXMgYSBtYXBwaW5nIG9mIGtleXMgdGhhdCByZXF1aXJlIHNoaWZ0IG9uIGEgVVMga2V5cGFkXG4gICAgICogYmFjayB0byB0aGUgbm9uIHNoaWZ0IGVxdWl2ZWxlbnRzXG4gICAgICpcbiAgICAgKiB0aGlzIGlzIHNvIHlvdSBjYW4gdXNlIGtleXVwIGV2ZW50cyB3aXRoIHRoZXNlIGtleXNcbiAgICAgKlxuICAgICAqIG5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSB3b3JrIHJlbGlhYmx5IG9uIFVTIGtleWJvYXJkc1xuICAgICAqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB2YXIgX1NISUZUX01BUCA9IHtcbiAgICAgICAgJ34nOiAnYCcsXG4gICAgICAgICchJzogJzEnLFxuICAgICAgICAnQCc6ICcyJyxcbiAgICAgICAgJyMnOiAnMycsXG4gICAgICAgICckJzogJzQnLFxuICAgICAgICAnJSc6ICc1JyxcbiAgICAgICAgJ14nOiAnNicsXG4gICAgICAgICcmJzogJzcnLFxuICAgICAgICAnKic6ICc4JyxcbiAgICAgICAgJygnOiAnOScsXG4gICAgICAgICcpJzogJzAnLFxuICAgICAgICAnXyc6ICctJyxcbiAgICAgICAgJysnOiAnPScsXG4gICAgICAgICc6JzogJzsnLFxuICAgICAgICAnXFxcIic6ICdcXCcnLFxuICAgICAgICAnPCc6ICcsJyxcbiAgICAgICAgJz4nOiAnLicsXG4gICAgICAgICc/JzogJy8nLFxuICAgICAgICAnfCc6ICdcXFxcJ1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGlzIGEgbGlzdCBvZiBzcGVjaWFsIHN0cmluZ3MgeW91IGNhbiB1c2UgdG8gbWFwXG4gICAgICogdG8gbW9kaWZpZXIga2V5cyB3aGVuIHlvdSBzcGVjaWZ5IHlvdXIga2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhciBfU1BFQ0lBTF9BTElBU0VTID0ge1xuICAgICAgICAnb3B0aW9uJzogJ2FsdCcsXG4gICAgICAgICdjb21tYW5kJzogJ21ldGEnLFxuICAgICAgICAncmV0dXJuJzogJ2VudGVyJyxcbiAgICAgICAgJ2VzY2FwZSc6ICdlc2MnLFxuICAgICAgICAncGx1cyc6ICcrJyxcbiAgICAgICAgJ21vZCc6IC9NYWN8aVBvZHxpUGhvbmV8aVBhZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pID8gJ21ldGEnIDogJ2N0cmwnXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBmbGlwcGVkIHZlcnNpb24gb2YgX01BUCBmcm9tIGFib3ZlXG4gICAgICogbmVlZGVkIHRvIGNoZWNrIGlmIHdlIHNob3VsZCB1c2Uga2V5cHJlc3Mgb3Igbm90IHdoZW4gbm8gYWN0aW9uXG4gICAgICogaXMgc3BlY2lmaWVkXG4gICAgICpcbiAgICAgKiBAdHlwZSB7T2JqZWN0fHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICB2YXIgX1JFVkVSU0VfTUFQO1xuXG4gICAgLyoqXG4gICAgICogbG9vcCB0aHJvdWdoIHRoZSBmIGtleXMsIGYxIHRvIGYxOSBhbmQgYWRkIHRoZW0gdG8gdGhlIG1hcFxuICAgICAqIHByb2dyYW1hdGljYWxseVxuICAgICAqL1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgMjA7ICsraSkge1xuICAgICAgICBfTUFQWzExMSArIGldID0gJ2YnICsgaTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBsb29wIHRocm91Z2ggdG8gbWFwIG51bWJlcnMgb24gdGhlIG51bWVyaWMga2V5cGFkXG4gICAgICovXG4gICAgZm9yIChpID0gMDsgaSA8PSA5OyArK2kpIHtcblxuICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIHVzZSBhIHN0cmluZyBjYXVzZSBvdGhlcndpc2Ugc2luY2UgMCBpcyBmYWxzZXlcbiAgICAgICAgLy8gbW91c2V0cmFwIHdpbGwgbmV2ZXIgZmlyZSBmb3IgbnVtcGFkIDAgcHJlc3NlZCBhcyBwYXJ0IG9mIGEga2V5ZG93blxuICAgICAgICAvLyBldmVudC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2NhbXBiZWxsL21vdXNldHJhcC9wdWxsLzI1OFxuICAgICAgICBfTUFQW2kgKyA5Nl0gPSBpLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3Jvc3MgYnJvd3NlciBhZGQgZXZlbnQgbWV0aG9kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTERvY3VtZW50fSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHJldHVybnMgdm9pZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9hZGRFdmVudChvYmplY3QsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgb2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iamVjdC5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRha2VzIHRoZSBldmVudCBhbmQgcmV0dXJucyB0aGUga2V5IGNoYXJhY3RlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfY2hhcmFjdGVyRnJvbUV2ZW50KGUpIHtcblxuICAgICAgICAvLyBmb3Iga2V5cHJlc3MgZXZlbnRzIHdlIHNob3VsZCByZXR1cm4gdGhlIGNoYXJhY3RlciBhcyBpc1xuICAgICAgICBpZiAoZS50eXBlID09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICAgIHZhciBjaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGUud2hpY2gpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGUgc2hpZnQga2V5IGlzIG5vdCBwcmVzc2VkIHRoZW4gaXQgaXMgc2FmZSB0byBhc3N1bWVcbiAgICAgICAgICAgIC8vIHRoYXQgd2Ugd2FudCB0aGUgY2hhcmFjdGVyIHRvIGJlIGxvd2VyY2FzZS4gIHRoaXMgbWVhbnMgaWZcbiAgICAgICAgICAgIC8vIHlvdSBhY2NpZGVudGFsbHkgaGF2ZSBjYXBzIGxvY2sgb24gdGhlbiB5b3VyIGtleSBiaW5kaW5nc1xuICAgICAgICAgICAgLy8gd2lsbCBjb250aW51ZSB0byB3b3JrXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gdGhlIG9ubHkgc2lkZSBlZmZlY3QgdGhhdCBtaWdodCBub3QgYmUgZGVzaXJlZCBpcyBpZiB5b3VcbiAgICAgICAgICAgIC8vIGJpbmQgc29tZXRoaW5nIGxpa2UgJ0EnIGNhdXNlIHlvdSB3YW50IHRvIHRyaWdnZXIgYW5cbiAgICAgICAgICAgIC8vIGV2ZW50IHdoZW4gY2FwaXRhbCBBIGlzIHByZXNzZWQgY2FwcyBsb2NrIHdpbGwgbm8gbG9uZ2VyXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIHRoZSBldmVudC4gIHNoaWZ0K2Egd2lsbCB0aG91Z2guXG4gICAgICAgICAgICBpZiAoIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBjaGFyYWN0ZXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNoYXJhY3RlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZvciBub24ga2V5cHJlc3MgZXZlbnRzIHRoZSBzcGVjaWFsIG1hcHMgYXJlIG5lZWRlZFxuICAgICAgICBpZiAoX01BUFtlLndoaWNoXSkge1xuICAgICAgICAgICAgcmV0dXJuIF9NQVBbZS53aGljaF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX0tFWUNPREVfTUFQW2Uud2hpY2hdKSB7XG4gICAgICAgICAgICByZXR1cm4gX0tFWUNPREVfTUFQW2Uud2hpY2hdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgaXQgaXMgbm90IGluIHRoZSBzcGVjaWFsIG1hcFxuXG4gICAgICAgIC8vIHdpdGgga2V5ZG93biBhbmQga2V5dXAgZXZlbnRzIHRoZSBjaGFyYWN0ZXIgc2VlbXMgdG8gYWx3YXlzXG4gICAgICAgIC8vIGNvbWUgaW4gYXMgYW4gdXBwZXJjYXNlIGNoYXJhY3RlciB3aGV0aGVyIHlvdSBhcmUgcHJlc3Npbmcgc2hpZnRcbiAgICAgICAgLy8gb3Igbm90LiAgd2Ugc2hvdWxkIG1ha2Ugc3VyZSBpdCBpcyBhbHdheXMgbG93ZXJjYXNlIGZvciBjb21wYXJpc29uc1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlLndoaWNoKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzMVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVyczJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfbW9kaWZpZXJzTWF0Y2gobW9kaWZpZXJzMSwgbW9kaWZpZXJzMikge1xuICAgICAgICByZXR1cm4gbW9kaWZpZXJzMS5zb3J0KCkuam9pbignLCcpID09PSBtb2RpZmllcnMyLnNvcnQoKS5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGFrZXMgYSBrZXkgZXZlbnQgYW5kIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIG1vZGlmaWVycyBhcmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGVcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZnVuY3Rpb24gX2V2ZW50TW9kaWZpZXJzKGUpIHtcbiAgICAgICAgdmFyIG1vZGlmaWVycyA9IFtdO1xuXG4gICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBtb2RpZmllcnMucHVzaCgnc2hpZnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlLmFsdEtleSkge1xuICAgICAgICAgICAgbW9kaWZpZXJzLnB1c2goJ2FsdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUuY3RybEtleSkge1xuICAgICAgICAgICAgbW9kaWZpZXJzLnB1c2goJ2N0cmwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlLm1ldGFLZXkpIHtcbiAgICAgICAgICAgIG1vZGlmaWVycy5wdXNoKCdtZXRhJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9kaWZpZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHByZXZlbnRzIGRlZmF1bHQgZm9yIHRoaXMgZXZlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGVcbiAgICAgKiBAcmV0dXJucyB2b2lkXG4gICAgICovXG4gICAgZnVuY3Rpb24gX3ByZXZlbnREZWZhdWx0KGUpIHtcbiAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzdG9wcyBwcm9wb2dhdGlvbiBmb3IgdGhpcyBldmVudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfc3RvcFByb3BhZ2F0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRldGVybWluZXMgaWYgdGhlIGtleWNvZGUgc3BlY2lmaWVkIGlzIGEgbW9kaWZpZXIga2V5IG9yIG5vdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9pc01vZGlmaWVyKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID09ICdzaGlmdCcgfHwga2V5ID09ICdjdHJsJyB8fCBrZXkgPT0gJ2FsdCcgfHwga2V5ID09ICdtZXRhJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXZlcnNlcyB0aGUgbWFwIGxvb2t1cCBzbyB0aGF0IHdlIGNhbiBsb29rIGZvciBzcGVjaWZpYyBrZXlzXG4gICAgICogdG8gc2VlIHdoYXQgY2FuIGFuZCBjYW4ndCB1c2Uga2V5cHJlc3NcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfZ2V0UmV2ZXJzZU1hcCgpIHtcbiAgICAgICAgaWYgKCFfUkVWRVJTRV9NQVApIHtcbiAgICAgICAgICAgIF9SRVZFUlNFX01BUCA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIF9NQVApIHtcblxuICAgICAgICAgICAgICAgIC8vIHB1bGwgb3V0IHRoZSBudW1lcmljIGtleXBhZCBmcm9tIGhlcmUgY2F1c2Uga2V5cHJlc3Mgc2hvdWxkXG4gICAgICAgICAgICAgICAgLy8gYmUgYWJsZSB0byBkZXRlY3QgdGhlIGtleXMgZnJvbSB0aGUgY2hhcmFjdGVyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA+IDk1ICYmIGtleSA8IDExMikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoX01BUC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9SRVZFUlNFX01BUFtfTUFQW2tleV1dID0ga2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX1JFVkVSU0VfTUFQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHBpY2tzIHRoZSBiZXN0IGFjdGlvbiBiYXNlZCBvbiB0aGUga2V5IGNvbWJpbmF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gY2hhcmFjdGVyIGZvciBrZXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBtb2RpZmllcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IGFjdGlvbiBwYXNzZWQgaW5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfcGlja0Jlc3RBY3Rpb24oa2V5LCBtb2RpZmllcnMsIGFjdGlvbikge1xuXG4gICAgICAgIC8vIGlmIG5vIGFjdGlvbiB3YXMgcGlja2VkIGluIHdlIHNob3VsZCB0cnkgdG8gcGljayB0aGUgb25lXG4gICAgICAgIC8vIHRoYXQgd2UgdGhpbmsgd291bGQgd29yayBiZXN0IGZvciB0aGlzIGtleVxuICAgICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICAgICAgYWN0aW9uID0gX2dldFJldmVyc2VNYXAoKVtrZXldID8gJ2tleWRvd24nIDogJ2tleXByZXNzJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1vZGlmaWVyIGtleXMgZG9uJ3Qgd29yayBhcyBleHBlY3RlZCB3aXRoIGtleXByZXNzLFxuICAgICAgICAvLyBzd2l0Y2ggdG8ga2V5ZG93blxuICAgICAgICBpZiAoYWN0aW9uID09ICdrZXlwcmVzcycgJiYgbW9kaWZpZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0aW9uID0gJ2tleWRvd24nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBmcm9tIGEgc3RyaW5nIGtleSBjb21iaW5hdGlvbiB0byBhbiBhcnJheVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBjb21iaW5hdGlvbiBsaWtlIFwiY29tbWFuZCtzaGlmdCtsXCJcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfa2V5c0Zyb21TdHJpbmcoY29tYmluYXRpb24pIHtcbiAgICAgICAgaWYgKGNvbWJpbmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICAgIHJldHVybiBbJysnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbWJpbmF0aW9uID0gY29tYmluYXRpb24ucmVwbGFjZSgvXFwrezJ9L2csICcrcGx1cycpO1xuICAgICAgICByZXR1cm4gY29tYmluYXRpb24uc3BsaXQoJysnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGluZm8gZm9yIGEgc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvbWJpbmF0aW9uIGtleSBjb21iaW5hdGlvbiAoXCJjb21tYW5kK3NcIiBvciBcImFcIiBvciBcIipcIilcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmc9fSBhY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9nZXRLZXlJbmZvKGNvbWJpbmF0aW9uLCBhY3Rpb24pIHtcbiAgICAgICAgdmFyIGtleXM7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgbW9kaWZpZXJzID0gW107XG5cbiAgICAgICAgLy8gdGFrZSB0aGUga2V5cyBmcm9tIHRoaXMgcGF0dGVybiBhbmQgZmlndXJlIG91dCB3aGF0IHRoZSBhY3R1YWxcbiAgICAgICAgLy8gcGF0dGVybiBpcyBhbGwgYWJvdXRcbiAgICAgICAga2V5cyA9IF9rZXlzRnJvbVN0cmluZyhjb21iaW5hdGlvbik7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGtleSA9IGtleXNbaV07XG5cbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBrZXkgbmFtZXNcbiAgICAgICAgICAgIGlmIChfU1BFQ0lBTF9BTElBU0VTW2tleV0pIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBfU1BFQ0lBTF9BTElBU0VTW2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgbm90IGEga2V5cHJlc3MgZXZlbnQgdGhlbiB3ZSBzaG91bGRcbiAgICAgICAgICAgIC8vIGJlIHNtYXJ0IGFib3V0IHVzaW5nIHNoaWZ0IGtleXNcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBvbmx5IHdvcmsgZm9yIFVTIGtleWJvYXJkcyBob3dldmVyXG4gICAgICAgICAgICBpZiAoYWN0aW9uICYmIGFjdGlvbiAhPSAna2V5cHJlc3MnICYmIF9TSElGVF9NQVBba2V5XSkge1xuICAgICAgICAgICAgICAgIGtleSA9IF9TSElGVF9NQVBba2V5XTtcbiAgICAgICAgICAgICAgICBtb2RpZmllcnMucHVzaCgnc2hpZnQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBrZXkgaXMgYSBtb2RpZmllciB0aGVuIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBtb2RpZmllcnNcbiAgICAgICAgICAgIGlmIChfaXNNb2RpZmllcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRlcGVuZGluZyBvbiB3aGF0IHRoZSBrZXkgY29tYmluYXRpb24gaXNcbiAgICAgICAgLy8gd2Ugd2lsbCB0cnkgdG8gcGljayB0aGUgYmVzdCBldmVudCBmb3IgaXRcbiAgICAgICAgYWN0aW9uID0gX3BpY2tCZXN0QWN0aW9uKGtleSwgbW9kaWZpZXJzLCBhY3Rpb24pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogbW9kaWZpZXJzLFxuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfYmVsb25nc1RvKGVsZW1lbnQsIGFuY2VzdG9yKSB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxlbWVudCA9PT0gYW5jZXN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9iZWxvbmdzVG8oZWxlbWVudC5wYXJlbnROb2RlLCBhbmNlc3Rvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTW91c2V0cmFwKHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRhcmdldEVsZW1lbnQgPSB0YXJnZXRFbGVtZW50IHx8IGRvY3VtZW50O1xuXG4gICAgICAgIGlmICghKHNlbGYgaW5zdGFuY2VvZiBNb3VzZXRyYXApKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vdXNldHJhcCh0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbGVtZW50IHRvIGF0dGFjaCBrZXkgZXZlbnRzIHRvXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtFbGVtZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgc2VsZi50YXJnZXQgPSB0YXJnZXRFbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIGxpc3Qgb2YgYWxsIHRoZSBjYWxsYmFja3Mgc2V0dXAgdmlhIE1vdXNldHJhcC5iaW5kKClcbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHNlbGYuX2NhbGxiYWNrcyA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBkaXJlY3QgbWFwIG9mIHN0cmluZyBjb21iaW5hdGlvbnMgdG8gY2FsbGJhY2tzIHVzZWQgZm9yIHRyaWdnZXIoKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgc2VsZi5fZGlyZWN0TWFwID0ge307XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGtlZXBzIHRyYWNrIG9mIHdoYXQgbGV2ZWwgZWFjaCBzZXF1ZW5jZSBpcyBhdCBzaW5jZSBtdWx0aXBsZVxuICAgICAgICAgKiBzZXF1ZW5jZXMgY2FuIHN0YXJ0IG91dCB3aXRoIHRoZSBzYW1lIHNlcXVlbmNlXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICB2YXIgX3NlcXVlbmNlTGV2ZWxzID0ge307XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBzZXRUaW1lb3V0IGNhbGxcbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge251bGx8bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIF9yZXNldFRpbWVyO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZW1wb3Jhcnkgc3RhdGUgd2hlcmUgd2Ugd2lsbCBpZ25vcmUgdGhlIG5leHQga2V5dXBcbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW58c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIF9pZ25vcmVOZXh0S2V5dXAgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGVtcG9yYXJ5IHN0YXRlIHdoZXJlIHdlIHdpbGwgaWdub3JlIHRoZSBuZXh0IGtleXByZXNzXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIF9pZ25vcmVOZXh0S2V5cHJlc3MgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogYXJlIHdlIGN1cnJlbnRseSBpbnNpZGUgb2YgYSBzZXF1ZW5jZT9cbiAgICAgICAgICogdHlwZSBvZiBhY3Rpb24gKFwia2V5dXBcIiBvciBcImtleWRvd25cIiBvciBcImtleXByZXNzXCIpIG9yIGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufHN0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHZhciBfbmV4dEV4cGVjdGVkQWN0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJlc2V0cyBhbGwgc2VxdWVuY2UgY291bnRlcnMgZXhjZXB0IGZvciB0aGUgb25lcyBwYXNzZWQgaW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRvTm90UmVzZXRcbiAgICAgICAgICogQHJldHVybnMgdm9pZFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX3Jlc2V0U2VxdWVuY2VzKGRvTm90UmVzZXQpIHtcbiAgICAgICAgICAgIGRvTm90UmVzZXQgPSBkb05vdFJlc2V0IHx8IHt9O1xuXG4gICAgICAgICAgICB2YXIgYWN0aXZlU2VxdWVuY2VzID0gZmFsc2UsXG4gICAgICAgICAgICAgICAga2V5O1xuXG4gICAgICAgICAgICBmb3IgKGtleSBpbiBfc2VxdWVuY2VMZXZlbHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZG9Ob3RSZXNldFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNlcXVlbmNlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfc2VxdWVuY2VMZXZlbHNba2V5XSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghYWN0aXZlU2VxdWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgX25leHRFeHBlY3RlZEFjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGZpbmRzIGFsbCBjYWxsYmFja3MgdGhhdCBtYXRjaCBiYXNlZCBvbiB0aGUga2V5Y29kZSwgbW9kaWZpZXJzLFxuICAgICAgICAgKiBhbmQgYWN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXJcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbW9kaWZpZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RXZlbnR8T2JqZWN0fSBlXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VxdWVuY2VOYW1lIC0gbmFtZSBvZiB0aGUgc2VxdWVuY2Ugd2UgYXJlIGxvb2tpbmcgZm9yXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gY29tYmluYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBsZXZlbFxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZ2V0TWF0Y2hlcyhjaGFyYWN0ZXIsIG1vZGlmaWVycywgZSwgc2VxdWVuY2VOYW1lLCBjb21iaW5hdGlvbiwgbGV2ZWwpIHtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrO1xuICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBhY3Rpb24gPSBlLnR5cGU7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBldmVudHMgcmVsYXRlZCB0byB0aGlzIGtleWNvZGVcbiAgICAgICAgICAgIGlmICghc2VsZi5fY2FsbGJhY2tzW2NoYXJhY3Rlcl0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIGEgbW9kaWZpZXIga2V5IGlzIGNvbWluZyB1cCBvbiBpdHMgb3duIHdlIHNob3VsZCBhbGxvdyBpdFxuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAna2V5dXAnICYmIF9pc01vZGlmaWVyKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBbY2hhcmFjdGVyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFsbCBjYWxsYmFja3MgZm9yIHRoZSBrZXkgdGhhdCB3YXMgcHJlc3NlZFxuICAgICAgICAgICAgLy8gYW5kIHNlZSBpZiBhbnkgb2YgdGhlbSBtYXRjaFxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYuX2NhbGxiYWNrc1tjaGFyYWN0ZXJdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9jYWxsYmFja3NbY2hhcmFjdGVyXVtpXTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGEgc2VxdWVuY2UgbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCBidXQgdGhpcyBpcyBhIHNlcXVlbmNlIGF0XG4gICAgICAgICAgICAgICAgLy8gdGhlIHdyb25nIGxldmVsIHRoZW4gbW92ZSBvbnRvIHRoZSBuZXh0IG1hdGNoXG4gICAgICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZU5hbWUgJiYgY2FsbGJhY2suc2VxICYmIF9zZXF1ZW5jZUxldmVsc1tjYWxsYmFjay5zZXFdICE9IGNhbGxiYWNrLmxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhY3Rpb24gd2UgYXJlIGxvb2tpbmcgZm9yIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjdGlvbiB3ZSBnb3RcbiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHNob3VsZCBrZWVwIGdvaW5nXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBjYWxsYmFjay5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGtleXByZXNzIGV2ZW50IGFuZCB0aGUgbWV0YSBrZXkgYW5kIGNvbnRyb2wga2V5XG4gICAgICAgICAgICAgICAgLy8gYXJlIG5vdCBwcmVzc2VkIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIG9ubHkgbG9vayBhdCB0aGVcbiAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIsIG90aGVyd2lzZSBjaGVjayB0aGUgbW9kaWZpZXJzIGFzIHdlbGxcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGNocm9tZSB3aWxsIG5vdCBmaXJlIGEga2V5cHJlc3MgaWYgbWV0YSBvciBjb250cm9sIGlzIGRvd25cbiAgICAgICAgICAgICAgICAvLyBzYWZhcmkgd2lsbCBmaXJlIGEga2V5cHJlc3MgaWYgbWV0YSBvciBtZXRhK3NoaWZ0IGlzIGRvd25cbiAgICAgICAgICAgICAgICAvLyBmaXJlZm94IHdpbGwgZmlyZSBhIGtleXByZXNzIGlmIG1ldGEgb3IgY29udHJvbCBpcyBkb3duXG4gICAgICAgICAgICAgICAgaWYgKChhY3Rpb24gPT0gJ2tleXByZXNzJyAmJiAhZS5tZXRhS2V5ICYmICFlLmN0cmxLZXkpIHx8IF9tb2RpZmllcnNNYXRjaChtb2RpZmllcnMsIGNhbGxiYWNrLm1vZGlmaWVycykpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHlvdSBiaW5kIGEgY29tYmluYXRpb24gb3Igc2VxdWVuY2UgYSBzZWNvbmQgdGltZSBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgb3ZlcndyaXRlIHRoZSBmaXJzdCBvbmUuICBpZiBhIHNlcXVlbmNlTmFtZSBvclxuICAgICAgICAgICAgICAgICAgICAvLyBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhpcyBjYWxsIGl0IGRvZXMganVzdCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0b2RvIG1ha2UgZGVsZXRpbmcgaXRzIG93biBtZXRob2Q/XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVDb21ibyA9ICFzZXF1ZW5jZU5hbWUgJiYgY2FsbGJhY2suY29tYm8gPT0gY29tYmluYXRpb247XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVTZXF1ZW5jZSA9IHNlcXVlbmNlTmFtZSAmJiBjYWxsYmFjay5zZXEgPT0gc2VxdWVuY2VOYW1lICYmIGNhbGxiYWNrLmxldmVsID09IGxldmVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlQ29tYm8gfHwgZGVsZXRlU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrc1tjaGFyYWN0ZXJdLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhY3R1YWxseSBjYWxscyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICpcbiAgICAgICAgICogaWYgeW91ciBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHRoaXMgd2lsbCB1c2UgdGhlIGpxdWVyeVxuICAgICAgICAgKiBjb252ZW50aW9uIC0gcHJldmVudCBkZWZhdWx0IGFuZCBzdG9wIHByb3BvZ2F0aW9uIG9uIHRoZSBldmVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9maXJlQ2FsbGJhY2soY2FsbGJhY2ssIGUsIGNvbWJvLCBzZXF1ZW5jZSkge1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGV2ZW50IHNob3VsZCBub3QgaGFwcGVuIHN0b3AgaGVyZVxuICAgICAgICAgICAgaWYgKHNlbGYuc3RvcENhbGxiYWNrKGUsIGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudCwgY29tYm8sIHNlcXVlbmNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGUsIGNvbWJvKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBfcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgICAgICAgICAgX3N0b3BQcm9wYWdhdGlvbihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBoYW5kbGVzIGEgY2hhcmFjdGVyIGtleSBldmVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1vZGlmaWVyc1xuICAgICAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgICAgICovXG4gICAgICAgIHNlbGYuX2hhbmRsZUtleSA9IGZ1bmN0aW9uKGNoYXJhY3RlciwgbW9kaWZpZXJzLCBlKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2tzID0gX2dldE1hdGNoZXMoY2hhcmFjdGVyLCBtb2RpZmllcnMsIGUpO1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICB2YXIgZG9Ob3RSZXNldCA9IHt9O1xuICAgICAgICAgICAgdmFyIG1heExldmVsID0gMDtcbiAgICAgICAgICAgIHZhciBwcm9jZXNzZWRTZXF1ZW5jZUNhbGxiYWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4TGV2ZWwgZm9yIHNlcXVlbmNlcyBzbyB3ZSBjYW4gb25seSBleGVjdXRlIHRoZSBsb25nZXN0IGNhbGxiYWNrIHNlcXVlbmNlXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXS5zZXEpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBNYXRoLm1heChtYXhMZXZlbCwgY2FsbGJhY2tzW2ldLmxldmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBtYXRjaGluZyBjYWxsYmFja3MgZm9yIHRoaXMga2V5IGV2ZW50XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBmaXJlIGZvciBhbGwgc2VxdWVuY2UgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlIGlmIGZvciBleGFtcGxlIHlvdSBoYXZlIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgICAgICAgICAgIC8vIGJvdW5kIHN1Y2ggYXMgXCJnIGlcIiBhbmQgXCJnIHRcIiB0aGV5IGJvdGggbmVlZCB0byBmaXJlIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGZvciBtYXRjaGluZyBnIGNhdXNlIG90aGVyd2lzZSB5b3UgY2FuIG9ubHkgZXZlclxuICAgICAgICAgICAgICAgIC8vIG1hdGNoIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzW2ldLnNlcSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZmlyZSBjYWxsYmFja3MgZm9yIHRoZSBtYXhMZXZlbCB0byBwcmV2ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbmNlcyBmcm9tIGFsc28gZmlyaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlICdhIG9wdGlvbiBiJyBzaG91bGQgbm90IGNhdXNlICdvcHRpb24gYicgdG8gZmlyZVxuICAgICAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCAnb3B0aW9uIGInIGlzIHBhcnQgb2YgdGhlIG90aGVyIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIGFueSBzZXF1ZW5jZXMgdGhhdCBkbyBub3QgbWF0Y2ggaGVyZSB3aWxsIGJlIGRpc2NhcmRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyBieSB0aGUgX3Jlc2V0U2VxdWVuY2VzIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXS5sZXZlbCAhPSBtYXhMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRTZXF1ZW5jZUNhbGxiYWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGEgbGlzdCBvZiB3aGljaCBzZXF1ZW5jZXMgd2VyZSBtYXRjaGVzIGZvciBsYXRlclxuICAgICAgICAgICAgICAgICAgICBkb05vdFJlc2V0W2NhbGxiYWNrc1tpXS5zZXFdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgX2ZpcmVDYWxsYmFjayhjYWxsYmFja3NbaV0uY2FsbGJhY2ssIGUsIGNhbGxiYWNrc1tpXS5jb21ibywgY2FsbGJhY2tzW2ldLnNlcSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdlcmUgbm8gc2VxdWVuY2UgbWF0Y2hlcyBidXQgd2UgYXJlIHN0aWxsIGhlcmVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IG1lYW5zIHRoaXMgaXMgYSByZWd1bGFyIG1hdGNoIHNvIHdlIHNob3VsZCBmaXJlIHRoYXRcbiAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NlZFNlcXVlbmNlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgX2ZpcmVDYWxsYmFjayhjYWxsYmFja3NbaV0uY2FsbGJhY2ssIGUsIGNhbGxiYWNrc1tpXS5jb21ibyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGUga2V5IHlvdSBwcmVzc2VkIG1hdGNoZXMgdGhlIHR5cGUgb2Ygc2VxdWVuY2Ugd2l0aG91dFxuICAgICAgICAgICAgLy8gYmVpbmcgYSBtb2RpZmllciAoaWUgXCJrZXl1cFwiIG9yIFwia2V5cHJlc3NcIikgdGhlbiB3ZSBzaG91bGRcbiAgICAgICAgICAgIC8vIHJlc2V0IGFsbCBzZXF1ZW5jZXMgdGhhdCB3ZXJlIG5vdCBtYXRjaGVkIGJ5IHRoaXMgZXZlbnRcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyB0aGlzIGlzIHNvLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIHNlcXVlbmNlIFwiaCBhIHRcIiBhbmQgeW91XG4gICAgICAgICAgICAvLyB0eXBlIFwiaCBlIGEgciB0XCIgaXQgZG9lcyBub3QgbWF0Y2guICBpbiB0aGlzIGNhc2UgdGhlIFwiZVwiIHdpbGxcbiAgICAgICAgICAgIC8vIGNhdXNlIHRoZSBzZXF1ZW5jZSB0byByZXNldFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIG1vZGlmaWVyIGtleXMgYXJlIGlnbm9yZWQgYmVjYXVzZSB5b3UgY2FuIGhhdmUgYSBzZXF1ZW5jZVxuICAgICAgICAgICAgLy8gdGhhdCBjb250YWlucyBtb2RpZmllcnMgc3VjaCBhcyBcImVudGVyIGN0cmwrc3BhY2VcIiBhbmQgaW4gbW9zdFxuICAgICAgICAgICAgLy8gY2FzZXMgdGhlIG1vZGlmaWVyIGtleSB3aWxsIGJlIHByZXNzZWQgYmVmb3JlIHRoZSBuZXh0IGtleVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGFsc28gaWYgeW91IGhhdmUgYSBzZXF1ZW5jZSBzdWNoIGFzIFwiY3RybCtiIGFcIiB0aGVuIHByZXNzaW5nIHRoZVxuICAgICAgICAgICAgLy8gXCJiXCIga2V5IHdpbGwgdHJpZ2dlciBhIFwia2V5cHJlc3NcIiBhbmQgYSBcImtleWRvd25cIlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHRoZSBcImtleWRvd25cIiBpcyBleHBlY3RlZCB3aGVuIHRoZXJlIGlzIGEgbW9kaWZpZXIsIGJ1dCB0aGVcbiAgICAgICAgICAgIC8vIFwia2V5cHJlc3NcIiBlbmRzIHVwIG1hdGNoaW5nIHRoZSBfbmV4dEV4cGVjdGVkQWN0aW9uIHNpbmNlIGl0IG9jY3Vyc1xuICAgICAgICAgICAgLy8gYWZ0ZXIgYW5kIHRoYXQgY2F1c2VzIHRoZSBzZXF1ZW5jZSB0byByZXNldFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHdlIGlnbm9yZSBrZXlwcmVzc2VzIGluIGEgc2VxdWVuY2UgdGhhdCBkaXJlY3RseSBmb2xsb3cgYSBrZXlkb3duXG4gICAgICAgICAgICAvLyBmb3IgdGhlIHNhbWUgY2hhcmFjdGVyXG4gICAgICAgICAgICB2YXIgaWdub3JlVGhpc0tleXByZXNzID0gZS50eXBlID09ICdrZXlwcmVzcycgJiYgX2lnbm9yZU5leHRLZXlwcmVzcztcbiAgICAgICAgICAgIGlmIChlLnR5cGUgPT0gX25leHRFeHBlY3RlZEFjdGlvbiAmJiAhX2lzTW9kaWZpZXIoY2hhcmFjdGVyKSAmJiAhaWdub3JlVGhpc0tleXByZXNzKSB7XG4gICAgICAgICAgICAgICAgX3Jlc2V0U2VxdWVuY2VzKGRvTm90UmVzZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfaWdub3JlTmV4dEtleXByZXNzID0gcHJvY2Vzc2VkU2VxdWVuY2VDYWxsYmFjayAmJiBlLnR5cGUgPT0gJ2tleWRvd24nO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBoYW5kbGVzIGEga2V5ZG93biBldmVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9oYW5kbGVLZXlFdmVudChlKSB7XG5cbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBlLndoaWNoIGZvciBrZXkgZXZlbnRzXG4gICAgICAgICAgICAvLyBAc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDI4NTYyNy9qYXZhc2NyaXB0LWtleWNvZGUtdnMtY2hhcmNvZGUtdXR0ZXItY29uZnVzaW9uXG4gICAgICAgICAgICBpZiAodHlwZW9mIGUud2hpY2ggIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgZS53aGljaCA9IGUua2V5Q29kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNoYXJhY3RlciA9IF9jaGFyYWN0ZXJGcm9tRXZlbnQoZSk7XG5cbiAgICAgICAgICAgIC8vIG5vIGNoYXJhY3RlciBmb3VuZCB0aGVuIHN0b3BcbiAgICAgICAgICAgIGlmICghY2hhcmFjdGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBuZWVkIHRvIHVzZSA9PT0gZm9yIHRoZSBjaGFyYWN0ZXIgY2hlY2sgYmVjYXVzZSB0aGUgY2hhcmFjdGVyIGNhbiBiZSAwXG4gICAgICAgICAgICBpZiAoZS50eXBlID09ICdrZXl1cCcgJiYgX2lnbm9yZU5leHRLZXl1cCA9PT0gY2hhcmFjdGVyKSB7XG4gICAgICAgICAgICAgICAgX2lnbm9yZU5leHRLZXl1cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5oYW5kbGVLZXkoY2hhcmFjdGVyLCBfZXZlbnRNb2RpZmllcnMoZSksIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB0byBzZXQgYSAxIHNlY29uZCB0aW1lb3V0IG9uIHRoZSBzcGVjaWZpZWQgc2VxdWVuY2VcbiAgICAgICAgICpcbiAgICAgICAgICogdGhpcyBpcyBzbyBhZnRlciBlYWNoIGtleSBwcmVzcyBpbiB0aGUgc2VxdWVuY2UgeW91IGhhdmUgMSBzZWNvbmRcbiAgICAgICAgICogdG8gcHJlc3MgdGhlIG5leHQga2V5IGJlZm9yZSB5b3UgaGF2ZSB0byBzdGFydCBvdmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9yZXNldFNlcXVlbmNlVGltZXIoKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoX3Jlc2V0VGltZXIpO1xuICAgICAgICAgICAgX3Jlc2V0VGltZXIgPSBzZXRUaW1lb3V0KF9yZXNldFNlcXVlbmNlcywgMTAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogYmluZHMgYSBrZXkgc2VxdWVuY2UgdG8gYW4gZXZlbnRcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbWJvIC0gY29tYm8gc3BlY2lmaWVkIGluIGJpbmQgY2FsbFxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBrZXlzXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYWN0aW9uXG4gICAgICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9iaW5kU2VxdWVuY2UoY29tYm8sIGtleXMsIGNhbGxiYWNrLCBhY3Rpb24pIHtcblxuICAgICAgICAgICAgLy8gc3RhcnQgb2ZmIGJ5IGFkZGluZyBhIHNlcXVlbmNlIGxldmVsIHJlY29yZCBmb3IgdGhpcyBjb21iaW5hdGlvblxuICAgICAgICAgICAgLy8gYW5kIHNldHRpbmcgdGhlIGxldmVsIHRvIDBcbiAgICAgICAgICAgIF9zZXF1ZW5jZUxldmVsc1tjb21ib10gPSAwO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGNhbGxiYWNrIHRvIGluY3JlYXNlIHRoZSBzZXF1ZW5jZSBsZXZlbCBmb3IgdGhpcyBzZXF1ZW5jZSBhbmQgcmVzZXRcbiAgICAgICAgICAgICAqIGFsbCBvdGhlciBzZXF1ZW5jZXMgdGhhdCB3ZXJlIGFjdGl2ZVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0QWN0aW9uXG4gICAgICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uIF9pbmNyZWFzZVNlcXVlbmNlKG5leHRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIF9uZXh0RXhwZWN0ZWRBY3Rpb24gPSBuZXh0QWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICArK19zZXF1ZW5jZUxldmVsc1tjb21ib107XG4gICAgICAgICAgICAgICAgICAgIF9yZXNldFNlcXVlbmNlVGltZXIoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHdyYXBzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24gaW4gb3JkZXJcbiAgICAgICAgICAgICAqIHRvIHJlc2V0IGFsbCBzZXF1ZW5jZSBjb3VudGVycyBhcyBzb29uIGFzIHRoaXMgc2VxdWVuY2UgaXMgZG9uZVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGVcbiAgICAgICAgICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZnVuY3Rpb24gX2NhbGxiYWNrQW5kUmVzZXQoZSkge1xuICAgICAgICAgICAgICAgIF9maXJlQ2FsbGJhY2soY2FsbGJhY2ssIGUsIGNvbWJvKTtcblxuICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBpZ25vcmUgdGhlIG5leHQga2V5IHVwIGlmIHRoZSBhY3Rpb24gaXMga2V5IGRvd25cbiAgICAgICAgICAgICAgICAvLyBvciBrZXlwcmVzcy4gIHRoaXMgaXMgc28gaWYgeW91IGZpbmlzaCBhIHNlcXVlbmNlIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UgdGhlIGtleSB0aGUgZmluYWwga2V5IHdpbGwgbm90IHRyaWdnZXIgYSBrZXl1cFxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gIT09ICdrZXl1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgX2lnbm9yZU5leHRLZXl1cCA9IF9jaGFyYWN0ZXJGcm9tRXZlbnQoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gd2VpcmQgcmFjZSBjb25kaXRpb24gaWYgYSBzZXF1ZW5jZSBlbmRzIHdpdGggdGhlIGtleVxuICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgc2VxdWVuY2UgYmVnaW5zIHdpdGhcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KF9yZXNldFNlcXVlbmNlcywgMTApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2gga2V5cyBvbmUgYXQgYSB0aW1lIGFuZCBiaW5kIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja1xuICAgICAgICAgICAgLy8gZnVuY3Rpb24uICBmb3IgYW55IGtleSBsZWFkaW5nIHVwIHRvIHRoZSBmaW5hbCBvbmUgaXQgc2hvdWxkXG4gICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgc2VxdWVuY2UuIGFmdGVyIHRoZSBmaW5hbCwgaXQgc2hvdWxkIHJlc2V0IGFsbCBzZXF1ZW5jZXNcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBpZiBhbiBhY3Rpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBiaW5kIGNhbGwgdGhlbiB0aGF0IHdpbGxcbiAgICAgICAgICAgIC8vIGJlIHVzZWQgdGhyb3VnaG91dC4gIG90aGVyd2lzZSB3ZSB3aWxsIHBhc3MgdGhlIGFjdGlvbiB0aGF0IHRoZVxuICAgICAgICAgICAgLy8gbmV4dCBrZXkgaW4gdGhlIHNlcXVlbmNlIHNob3VsZCBtYXRjaC4gIHRoaXMgYWxsb3dzIGEgc2VxdWVuY2VcbiAgICAgICAgICAgIC8vIHRvIG1peCBhbmQgbWF0Y2gga2V5cHJlc3MgYW5kIGtleWRvd24gZXZlbnRzIGRlcGVuZGluZyBvbiB3aGljaFxuICAgICAgICAgICAgLy8gb25lcyBhcmUgYmV0dGVyIHN1aXRlZCB0byB0aGUga2V5IHByb3ZpZGVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNGaW5hbCA9IGkgKyAxID09PSBrZXlzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlZENhbGxiYWNrID0gaXNGaW5hbCA/IF9jYWxsYmFja0FuZFJlc2V0IDogX2luY3JlYXNlU2VxdWVuY2UoYWN0aW9uIHx8IF9nZXRLZXlJbmZvKGtleXNbaSArIDFdKS5hY3Rpb24pO1xuICAgICAgICAgICAgICAgIF9iaW5kU2luZ2xlKGtleXNbaV0sIHdyYXBwZWRDYWxsYmFjaywgYWN0aW9uLCBjb21ibywgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogYmluZHMgYSBzaW5nbGUga2V5Ym9hcmQgY29tYmluYXRpb25cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbWJpbmF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VxdWVuY2VOYW1lIC0gbmFtZSBvZiBzZXF1ZW5jZSBpZiBwYXJ0IG9mIHNlcXVlbmNlXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gbGV2ZWwgLSB3aGF0IHBhcnQgb2YgdGhlIHNlcXVlbmNlIHRoZSBjb21tYW5kIGlzXG4gICAgICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9iaW5kU2luZ2xlKGNvbWJpbmF0aW9uLCBjYWxsYmFjaywgYWN0aW9uLCBzZXF1ZW5jZU5hbWUsIGxldmVsKSB7XG5cbiAgICAgICAgICAgIC8vIHN0b3JlIGEgZGlyZWN0IG1hcHBlZCByZWZlcmVuY2UgZm9yIHVzZSB3aXRoIE1vdXNldHJhcC50cmlnZ2VyXG4gICAgICAgICAgICBzZWxmLl9kaXJlY3RNYXBbY29tYmluYXRpb24gKyAnOicgKyBhY3Rpb25dID0gY2FsbGJhY2s7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBtdWx0aXBsZSBzcGFjZXMgaW4gYSByb3cgYmVjb21lIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgICAgICBjb21iaW5hdGlvbiA9IGNvbWJpbmF0aW9uLnJlcGxhY2UoL1xccysvZywgJyAnKTtcblxuICAgICAgICAgICAgdmFyIHNlcXVlbmNlID0gY29tYmluYXRpb24uc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIHZhciBpbmZvO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIHBhdHRlcm4gaXMgYSBzZXF1ZW5jZSBvZiBrZXlzIHRoZW4gcnVuIHRocm91Z2ggdGhpcyBtZXRob2RcbiAgICAgICAgICAgIC8vIHRvIHJlcHJvY2VzcyBlYWNoIHBhdHRlcm4gb25lIGtleSBhdCBhIHRpbWVcbiAgICAgICAgICAgIGlmIChzZXF1ZW5jZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgX2JpbmRTZXF1ZW5jZShjb21iaW5hdGlvbiwgc2VxdWVuY2UsIGNhbGxiYWNrLCBhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5mbyA9IF9nZXRLZXlJbmZvKGNvbWJpbmF0aW9uLCBhY3Rpb24pO1xuXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gaW5pdGlhbGl6ZSBhcnJheSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lXG4gICAgICAgICAgICAvLyBhIGNhbGxiYWNrIGlzIGFkZGVkIGZvciB0aGlzIGtleVxuICAgICAgICAgICAgc2VsZi5fY2FsbGJhY2tzW2luZm8ua2V5XSA9IHNlbGYuX2NhbGxiYWNrc1tpbmZvLmtleV0gfHwgW107XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBhbiBleGlzdGluZyBtYXRjaCBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgICAgIF9nZXRNYXRjaGVzKGluZm8ua2V5LCBpbmZvLm1vZGlmaWVycywge3R5cGU6IGluZm8uYWN0aW9ufSwgc2VxdWVuY2VOYW1lLCBjb21iaW5hdGlvbiwgbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBhZGQgdGhpcyBjYWxsIGJhY2sgdG8gdGhlIGFycmF5XG4gICAgICAgICAgICAvLyBpZiBpdCBpcyBhIHNlcXVlbmNlIHB1dCBpdCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgICAvLyBpZiBub3QgcHV0IGl0IGF0IHRoZSBlbmRcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSB3YXkgdGhlc2UgYXJlIHByb2Nlc3NlZCBleHBlY3RzXG4gICAgICAgICAgICAvLyB0aGUgc2VxdWVuY2Ugb25lcyB0byBjb21lIGZpcnN0XG4gICAgICAgICAgICBzZWxmLl9jYWxsYmFja3NbaW5mby5rZXldW3NlcXVlbmNlTmFtZSA/ICd1bnNoaWZ0JyA6ICdwdXNoJ10oe1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IGluZm8ubW9kaWZpZXJzLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogaW5mby5hY3Rpb24sXG4gICAgICAgICAgICAgICAgc2VxOiBzZXF1ZW5jZU5hbWUsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICAgICAgICAgIGNvbWJvOiBjb21iaW5hdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogYmluZHMgbXVsdGlwbGUgY29tYmluYXRpb25zIHRvIHRoZSBzYW1lIGNhbGxiYWNrXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGNvbWJpbmF0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGFjdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB2b2lkXG4gICAgICAgICAqL1xuICAgICAgICBzZWxmLl9iaW5kTXVsdGlwbGUgPSBmdW5jdGlvbihjb21iaW5hdGlvbnMsIGNhbGxiYWNrLCBhY3Rpb24pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tYmluYXRpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgX2JpbmRTaW5nbGUoY29tYmluYXRpb25zW2ldLCBjYWxsYmFjaywgYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBzdGFydCFcbiAgICAgICAgX2FkZEV2ZW50KHRhcmdldEVsZW1lbnQsICdrZXlwcmVzcycsIF9oYW5kbGVLZXlFdmVudCk7XG4gICAgICAgIF9hZGRFdmVudCh0YXJnZXRFbGVtZW50LCAna2V5ZG93bicsIF9oYW5kbGVLZXlFdmVudCk7XG4gICAgICAgIF9hZGRFdmVudCh0YXJnZXRFbGVtZW50LCAna2V5dXAnLCBfaGFuZGxlS2V5RXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGJpbmRzIGFuIGV2ZW50IHRvIG1vdXNldHJhcFxuICAgICAqXG4gICAgICogY2FuIGJlIGEgc2luZ2xlIGtleSwgYSBjb21iaW5hdGlvbiBvZiBrZXlzIHNlcGFyYXRlZCB3aXRoICssXG4gICAgICogYW4gYXJyYXkgb2Yga2V5cywgb3IgYSBzZXF1ZW5jZSBvZiBrZXlzIHNlcGFyYXRlZCBieSBzcGFjZXNcbiAgICAgKlxuICAgICAqIGJlIHN1cmUgdG8gbGlzdCB0aGUgbW9kaWZpZXIga2V5cyBmaXJzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGVcbiAgICAgKiBjb3JyZWN0IGtleSBlbmRzIHVwIGdldHRpbmcgYm91bmQgKHRoZSBsYXN0IGtleSBpbiB0aGUgcGF0dGVybilcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSBrZXlzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IGFjdGlvbiAtICdrZXlwcmVzcycsICdrZXlkb3duJywgb3IgJ2tleXVwJ1xuICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgKi9cbiAgICBNb3VzZXRyYXAucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbihrZXlzLCBjYWxsYmFjaywgYWN0aW9uKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAga2V5cyA9IGtleXMgaW5zdGFuY2VvZiBBcnJheSA/IGtleXMgOiBba2V5c107XG4gICAgICAgIHNlbGYuX2JpbmRNdWx0aXBsZS5jYWxsKHNlbGYsIGtleXMsIGNhbGxiYWNrLCBhY3Rpb24pO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdW5iaW5kcyBhbiBldmVudCB0byBtb3VzZXRyYXBcbiAgICAgKlxuICAgICAqIHRoZSB1bmJpbmRpbmcgc2V0cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhlIHNwZWNpZmllZCBrZXkgY29tYm9cbiAgICAgKiB0byBhbiBlbXB0eSBmdW5jdGlvbiBhbmQgZGVsZXRlcyB0aGUgY29ycmVzcG9uZGluZyBrZXkgaW4gdGhlXG4gICAgICogX2RpcmVjdE1hcCBkaWN0LlxuICAgICAqXG4gICAgICogVE9ETzogYWN0dWFsbHkgcmVtb3ZlIHRoaXMgZnJvbSB0aGUgX2NhbGxiYWNrcyBkaWN0aW9uYXJ5IGluc3RlYWRcbiAgICAgKiBvZiBiaW5kaW5nIGFuIGVtcHR5IGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiB0aGUga2V5Y29tYm8rYWN0aW9uIGhhcyB0byBiZSBleGFjdGx5IHRoZSBzYW1lIGFzXG4gICAgICogaXQgd2FzIGRlZmluZWQgaW4gdGhlIGJpbmQgbWV0aG9kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0ga2V5c1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25cbiAgICAgKiBAcmV0dXJucyB2b2lkXG4gICAgICovXG4gICAgTW91c2V0cmFwLnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbihrZXlzLCBhY3Rpb24pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gc2VsZi5iaW5kLmNhbGwoc2VsZiwga2V5cywgZnVuY3Rpb24oKSB7fSwgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogdHJpZ2dlcnMgYW4gZXZlbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGJvdW5kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5c1xuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYWN0aW9uXG4gICAgICogQHJldHVybnMgdm9pZFxuICAgICAqL1xuICAgIE1vdXNldHJhcC5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uKGtleXMsIGFjdGlvbikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzZWxmLl9kaXJlY3RNYXBba2V5cyArICc6JyArIGFjdGlvbl0pIHtcbiAgICAgICAgICAgIHNlbGYuX2RpcmVjdE1hcFtrZXlzICsgJzonICsgYWN0aW9uXSh7fSwga2V5cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHJlc2V0cyB0aGUgbGlicmFyeSBiYWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLiAgdGhpcyBpcyB1c2VmdWxcbiAgICAgKiBpZiB5b3Ugd2FudCB0byBjbGVhciBvdXQgdGhlIGN1cnJlbnQga2V5Ym9hcmQgc2hvcnRjdXRzIGFuZCBiaW5kXG4gICAgICogbmV3IG9uZXMgLSBmb3IgZXhhbXBsZSBpZiB5b3Ugc3dpdGNoIHRvIGFub3RoZXIgcGFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgdm9pZFxuICAgICAqL1xuICAgIE1vdXNldHJhcC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBzZWxmLl9jYWxsYmFja3MgPSB7fTtcbiAgICAgICAgc2VsZi5fZGlyZWN0TWFwID0ge307XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBzaG91bGQgd2Ugc3RvcCB0aGlzIGV2ZW50IGJlZm9yZSBmaXJpbmcgb2ZmIGNhbGxiYWNrc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgTW91c2V0cmFwLnByb3RvdHlwZS5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbihlLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGNsYXNzIFwibW91c2V0cmFwXCIgdGhlbiBubyBuZWVkIHRvIHN0b3BcbiAgICAgICAgaWYgKCgnICcgKyBlbGVtZW50LmNsYXNzTmFtZSArICcgJykuaW5kZXhPZignIG1vdXNldHJhcCAnKSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2JlbG9uZ3NUbyhlbGVtZW50LCBzZWxmLnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV2ZW50cyBvcmlnaW5hdGluZyBmcm9tIGEgc2hhZG93IERPTSBhcmUgcmUtdGFyZ2V0dGVkIGFuZCBgZS50YXJnZXRgIGlzIHRoZSBzaGFkb3cgaG9zdCxcbiAgICAgICAgLy8gbm90IHRoZSBpbml0aWFsIGV2ZW50IHRhcmdldCBpbiB0aGUgc2hhZG93IHRyZWUuIE5vdGUgdGhhdCBub3QgYWxsIGV2ZW50cyBjcm9zcyB0aGVcbiAgICAgICAgLy8gc2hhZG93IGJvdW5kYXJ5LlxuICAgICAgICAvLyBGb3Igc2hhZG93IHRyZWVzIHdpdGggYG1vZGU6ICdvcGVuJ2AsIHRoZSBpbml0aWFsIGV2ZW50IHRhcmdldCBpcyB0aGUgZmlyc3QgZWxlbWVudCBpblxuICAgICAgICAvLyB0aGUgZXZlbnTigJlzIGNvbXBvc2VkIHBhdGguIEZvciBzaGFkb3cgdHJlZXMgd2l0aCBgbW9kZTogJ2Nsb3NlZCdgLCB0aGUgaW5pdGlhbCBldmVudFxuICAgICAgICAvLyB0YXJnZXQgY2Fubm90IGJlIG9idGFpbmVkLlxuICAgICAgICBpZiAoJ2NvbXBvc2VkUGF0aCcgaW4gZSAmJiB0eXBlb2YgZS5jb21wb3NlZFBhdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEZvciBvcGVuIHNoYWRvdyB0cmVlcywgdXBkYXRlIGBlbGVtZW50YCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgY2hlY2sgd29ya3MuXG4gICAgICAgICAgICB2YXIgaW5pdGlhbEV2ZW50VGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsRXZlbnRUYXJnZXQgIT09IGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGluaXRpYWxFdmVudFRhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0b3AgZm9yIGlucHV0LCBzZWxlY3QsIGFuZCB0ZXh0YXJlYVxuICAgICAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lID09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09ICdTRUxFQ1QnIHx8IGVsZW1lbnQudGFnTmFtZSA9PSAnVEVYVEFSRUEnIHx8IGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGV4cG9zZXMgX2hhbmRsZUtleSBwdWJsaWNseSBzbyBpdCBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgZXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIE1vdXNldHJhcC5wcm90b3R5cGUuaGFuZGxlS2V5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhbmRsZUtleS5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBhbGxvdyBjdXN0b20ga2V5IG1hcHBpbmdzXG4gICAgICovXG4gICAgTW91c2V0cmFwLmFkZEtleWNvZGVzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIF9NQVBba2V5XSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9SRVZFUlNFX01BUCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEluaXQgdGhlIGdsb2JhbCBtb3VzZXRyYXAgZnVuY3Rpb25zXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgdG8gYWxsb3cgdGhlIGdsb2JhbCBtb3VzZXRyYXAgZnVuY3Rpb25zIHRvIHdvcmtcbiAgICAgKiBub3cgdGhhdCBtb3VzZXRyYXAgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBNb3VzZXRyYXAuaW5pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZG9jdW1lbnRNb3VzZXRyYXAgPSBNb3VzZXRyYXAoZG9jdW1lbnQpO1xuICAgICAgICBmb3IgKHZhciBtZXRob2QgaW4gZG9jdW1lbnRNb3VzZXRyYXApIHtcbiAgICAgICAgICAgIGlmIChtZXRob2QuY2hhckF0KDApICE9PSAnXycpIHtcbiAgICAgICAgICAgICAgICBNb3VzZXRyYXBbbWV0aG9kXSA9IChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50TW91c2V0cmFwW21ldGhvZF0uYXBwbHkoZG9jdW1lbnRNb3VzZXRyYXAsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSAobWV0aG9kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgTW91c2V0cmFwLmluaXQoKTtcblxuICAgIC8vIGV4cG9zZSBtb3VzZXRyYXAgdG8gdGhlIGdsb2JhbCBvYmplY3RcbiAgICB3aW5kb3cuTW91c2V0cmFwID0gTW91c2V0cmFwO1xuXG4gICAgLy8gZXhwb3NlIGFzIGEgY29tbW9uIGpzIG1vZHVsZVxuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IE1vdXNldHJhcDtcbiAgICB9XG5cbiAgICAvLyBleHBvc2UgbW91c2V0cmFwIGFzIGFuIEFNRCBtb2R1bGVcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBNb3VzZXRyYXA7XG4gICAgICAgIH0pO1xuICAgIH1cbn0pICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IG51bGwsIHR5cGVvZiAgd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogbnVsbCk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/mousetrap/mousetrap.js\n"); - -/***/ }), - -/***/ "./node_modules/platform-detect/index.js": -/*!***********************************************!*\ - !*** ./node_modules/platform-detect/index.js ***! - \***********************************************/ -/***/ (function(module) { - -eval("!function(e,o){ true?module.exports=o():0}(this,function(){\"use strict\";function e(e,o){var n=window.matchMedia(e);o(n.matches);var i=function(){return o(n.matches)};return n.addListener(i),function(){return n.removeListener(i)}}function o(e,o){return t[e]!==o&&(t[e]=o,s(e,o),!0)}var n=\"undefined\"!=typeof navigator&&\"undefined\"!=typeof window;if(n&&\"undefined\"!=typeof nw)try{nw.Window.get()}catch(e){n=!1}var i=!n,r=n?navigator.userAgent:void 0,t={gui:n,terminal:i,registerQuery:e};t.node=\"undefined\"!=typeof process&&!!process.versions&&!!process.versions.node,t.pwa=t.gui&&window.matchMedia(\"(display-mode: standalone)\").matches&&null!==document.head.querySelector('[rel=\"manifest\"]'),t.uwp=\"undefined\"!=typeof Windows&&\"undefined\"!=typeof MSApp,t.nwjs=!(!t.node||!process.versions.nw),t.electron=!(!t.node||!process.versions.electron),t.cordova=!(!t.gui||!window.cordova),t.packaged=t.uwp||t.nwjs||t.electron||t.cordova,t.web=!t.node&&!t.packaged,t.browser=t.web,t.website=t.web&&!t.pwa,t.worker=!t.gui&&\"undefined\"!=typeof self&&void 0!==self.importScripts,t.serviceWorker=t.worker&&!!navigator.serviceWorker.controller||!1,t.android=!!t.gui&&r.includes(\"Android\"),t.chromeos=!!t.gui&&r.includes(\"CrOS\"),t.tizen=!!t.gui&&r.includes(\"Tizen\"),t.ios=t.gui&&/iPad|iPhone|iPod/.test(r)&&!window.MSStream||!1,t.linuxBased=t.android||t.tizen,t.windows=t.node?\"win32\"===process.platform:r.includes(\"Windows\"),t.macos=t.node?\"darwin\"===process.platform:r.includes(\"Macintosh\"),t.linux=t.node?\"linux\"===process.platform:r.includes(\"Linux\")&&!t.linuxBased&&!t.macos,t.edgeHtml=t.gui&&r.includes(\"Edge/\"),t.edgeChromium=t.gui&&r.includes(\"Edg/\"),t.edgeAndroid=t.gui&&r.includes(\"EdgA/\"),t.edgeIos=t.gui&&r.includes(\"EdgiOS/\"),t.chromeIos=t.gui&&r.includes(\"CriOS/\"),t.firefoxIos=t.gui&&r.includes(\"FxiOS/\"),t.edge=t.edgeHtml||t.edgeChromium||t.edgeAndroid||t.edgeIos,t.samsungBrowser=t.gui&&r.includes(\"SamsungBrowser/\"),t.opera=t.gui&&(r.includes(\"Opera\")||r.includes(\"OPR/\")),t.firefox=t.gui&&(r.includes(\"Firefox\")||t.firefoxIos),t.chrome=t.gui&&(r.includes(\"Chrome\")||t.chromeIos)&&!t.edge&&!t.opera&&!t.samsungBrowser,t.safari=t.gui&&r.includes(\"Safari\")&&!t.chrome&&!t.edge&&!t.firefox&&!t.opera&&!t.samsungBrowser||t.edgeIos||t.chromeIos||t.firefoxIos,t.ie=t.trident=t.gui&&r.includes(\"Trident\"),t.blink=t.chrome&&!t.chromeIos||t.edgeChromium||t.edgeAndroid||t.samsungBrowser,t.webkit=t.blink||t.safari,t.gecko=t.firefox&&!t.firefoxIos&&!t.webkit&&!t.safari;var d={};t.on=function(e,o){d[e]=d[e]||new Set,d[e].add(o)},t.off=t.removeListener=function(e,o){d[e]&&d[e].delete(o)};var s=t.emit=function(e,o){d[e]&&d[e].forEach(function(e){return e(o)})};if(t.gui){t.pixelRatio=parseFloat(window.devicePixelRatio.toFixed(2)),t.gameconsole=r.includes(\"Xbox\")||r.includes(\"PlayStation\");var a=0;if(window.addEventListener(\"gamepadconnected\",function(e){return a++}),window.addEventListener(\"gamepaddisconnected\",function(e){return a--}),t.gameconsole)t.gamepad=!0,t.mouse=!0,t.touch=!1,t.tv=!0,t.battery=!1,t.phone=t.tablet=t.hybrid=t.laptop=t.desktop=!1,t.formfactor=\"gameconsole\";else{var c=function(){o(\"tv\",\"tv\"===t.formfactor),o(\"phone\",\"phone\"===t.formfactor),o(\"tablet\",\"tablet\"===t.formfactor),o(\"hybrid\",\"hybrid\"===t.formfactor),o(\"laptop\",\"laptop\"===t.formfactor),o(\"desktop\",\"desktop\"===t.formfactor)},u=function(){var e=Math.min(window.screen.width,window.screen.height);return t.tv?\"tv\":t.touch&&e<600?\"phone\":t.touch&&!t.mouse?\"tablet\":t.touch&&t.mouse?\"hybrid\":t.battery?\"laptop\":\"desktop\"};t.touch=navigator.maxTouchPoints>0,t.tv=r.includes(\"TV\"),a=navigator.getGamepads?Array.from(navigator.getGamepads()).filter(function(e){return null!==e&&void 0!==e}).length:0,t.gamepad=a>0,e(\"(orientation: portrait)\",function(e){t.portrait=e,t.landscape=!e,t.orientation=e?\"portrait\":\"landscape\",s(\"portrait\",t.portrait),s(\"landscape\",t.landscape),s(\"orientation\",t.orientation)}),e(\"(any-pointer: coarse)\",function(e){o(\"touch\",e),o(\"formfactor\",u())&&c()}),e(\"(hover: hover)\",function(e){o(\"mouse\",e),o(\"input\",e?\"mouse\":\"touch\"),o(\"formfactor\",u())&&c()})}}return t.csp=t.uwp||!1,t.nwjs?t.dev=\"sdk\"===process.versions[\"nw-flavor\"]:t.electron?t.dev=process.execPath.replace(/\\\\/g,\"/\").includes(\"node_modules/electron/\"):t.uwp?t.dev=Windows.ApplicationModel.Package.current.isDevelopmentMode:t.node?t.dev=\"production\"!==\"development\":t.dev=void 0,t});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcGxhdGZvcm0tZGV0ZWN0L2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFBLGVBQWUsS0FBb0Qsb0JBQW9CLENBQXNHLENBQUMsaUJBQWlCLGFBQWEsZ0JBQWdCLDJCQUEyQixhQUFhLGlCQUFpQixxQkFBcUIsbUNBQW1DLDRCQUE0QixnQkFBZ0Isb0NBQW9DLGdFQUFnRSxpQ0FBaUMsZ0JBQWdCLFNBQVMsS0FBSywyQ0FBMkMsa0NBQWtDLHU3REFBdTdELFNBQVMsbUJBQW1CLCtCQUErQixzQ0FBc0Msc0JBQXNCLDJCQUEyQiwrQkFBK0IsWUFBWSxHQUFHLFVBQVUsd0hBQXdILFFBQVEsMERBQTBELFdBQVcsNERBQTRELFdBQVcsbUpBQW1KLEtBQUssaUJBQWlCLGdOQUFnTixjQUFjLHlEQUF5RCwySEFBMkgsd0lBQXdJLDRCQUE0QixpRUFBaUUsc0pBQXNKLHdDQUF3QyxzQ0FBc0MsaUNBQWlDLG1FQUFtRSxHQUFHLHFRQUFxUSxhQUFvQixnQkFBZ0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL3BsYXRmb3JtLWRldGVjdC9pbmRleC5qcz9mNDU5Il0sInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbihlLG8pe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPW8oKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFwicGxhdGZvcm0tZGV0ZWN0XCIsbyk6KGU9ZXx8c2VsZixlW1wicGxhdGZvcm0tZGV0ZWN0XCJdPW8oKSl9KHRoaXMsZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBlKGUsbyl7dmFyIG49d2luZG93Lm1hdGNoTWVkaWEoZSk7byhuLm1hdGNoZXMpO3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIG8obi5tYXRjaGVzKX07cmV0dXJuIG4uYWRkTGlzdGVuZXIoaSksZnVuY3Rpb24oKXtyZXR1cm4gbi5yZW1vdmVMaXN0ZW5lcihpKX19ZnVuY3Rpb24gbyhlLG8pe3JldHVybiB0W2VdIT09byYmKHRbZV09byxzKGUsbyksITApfXZhciBuPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c7aWYobiYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG53KXRyeXtudy5XaW5kb3cuZ2V0KCl9Y2F0Y2goZSl7bj0hMX12YXIgaT0hbixyPW4/bmF2aWdhdG9yLnVzZXJBZ2VudDp2b2lkIDAsdD17Z3VpOm4sdGVybWluYWw6aSxyZWdpc3RlclF1ZXJ5OmV9O3Qubm9kZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2VzcyYmISFwcm9jZXNzLnZlcnNpb25zJiYhIXByb2Nlc3MudmVyc2lvbnMubm9kZSx0LnB3YT10Lmd1aSYmd2luZG93Lm1hdGNoTWVkaWEoXCIoZGlzcGxheS1tb2RlOiBzdGFuZGFsb25lKVwiKS5tYXRjaGVzJiZudWxsIT09ZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdbcmVsPVwibWFuaWZlc3RcIl0nKSx0LnV3cD1cInVuZGVmaW5lZFwiIT10eXBlb2YgV2luZG93cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIE1TQXBwLHQubndqcz0hKCF0Lm5vZGV8fCFwcm9jZXNzLnZlcnNpb25zLm53KSx0LmVsZWN0cm9uPSEoIXQubm9kZXx8IXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24pLHQuY29yZG92YT0hKCF0Lmd1aXx8IXdpbmRvdy5jb3Jkb3ZhKSx0LnBhY2thZ2VkPXQudXdwfHx0Lm53anN8fHQuZWxlY3Ryb258fHQuY29yZG92YSx0LndlYj0hdC5ub2RlJiYhdC5wYWNrYWdlZCx0LmJyb3dzZXI9dC53ZWIsdC53ZWJzaXRlPXQud2ViJiYhdC5wd2EsdC53b3JrZXI9IXQuZ3VpJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZiYmdm9pZCAwIT09c2VsZi5pbXBvcnRTY3JpcHRzLHQuc2VydmljZVdvcmtlcj10LndvcmtlciYmISFuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5jb250cm9sbGVyfHwhMSx0LmFuZHJvaWQ9ISF0Lmd1aSYmci5pbmNsdWRlcyhcIkFuZHJvaWRcIiksdC5jaHJvbWVvcz0hIXQuZ3VpJiZyLmluY2x1ZGVzKFwiQ3JPU1wiKSx0LnRpemVuPSEhdC5ndWkmJnIuaW5jbHVkZXMoXCJUaXplblwiKSx0Lmlvcz10Lmd1aSYmL2lQYWR8aVBob25lfGlQb2QvLnRlc3QocikmJiF3aW5kb3cuTVNTdHJlYW18fCExLHQubGludXhCYXNlZD10LmFuZHJvaWR8fHQudGl6ZW4sdC53aW5kb3dzPXQubm9kZT9cIndpbjMyXCI9PT1wcm9jZXNzLnBsYXRmb3JtOnIuaW5jbHVkZXMoXCJXaW5kb3dzXCIpLHQubWFjb3M9dC5ub2RlP1wiZGFyd2luXCI9PT1wcm9jZXNzLnBsYXRmb3JtOnIuaW5jbHVkZXMoXCJNYWNpbnRvc2hcIiksdC5saW51eD10Lm5vZGU/XCJsaW51eFwiPT09cHJvY2Vzcy5wbGF0Zm9ybTpyLmluY2x1ZGVzKFwiTGludXhcIikmJiF0LmxpbnV4QmFzZWQmJiF0Lm1hY29zLHQuZWRnZUh0bWw9dC5ndWkmJnIuaW5jbHVkZXMoXCJFZGdlL1wiKSx0LmVkZ2VDaHJvbWl1bT10Lmd1aSYmci5pbmNsdWRlcyhcIkVkZy9cIiksdC5lZGdlQW5kcm9pZD10Lmd1aSYmci5pbmNsdWRlcyhcIkVkZ0EvXCIpLHQuZWRnZUlvcz10Lmd1aSYmci5pbmNsdWRlcyhcIkVkZ2lPUy9cIiksdC5jaHJvbWVJb3M9dC5ndWkmJnIuaW5jbHVkZXMoXCJDcmlPUy9cIiksdC5maXJlZm94SW9zPXQuZ3VpJiZyLmluY2x1ZGVzKFwiRnhpT1MvXCIpLHQuZWRnZT10LmVkZ2VIdG1sfHx0LmVkZ2VDaHJvbWl1bXx8dC5lZGdlQW5kcm9pZHx8dC5lZGdlSW9zLHQuc2Ftc3VuZ0Jyb3dzZXI9dC5ndWkmJnIuaW5jbHVkZXMoXCJTYW1zdW5nQnJvd3Nlci9cIiksdC5vcGVyYT10Lmd1aSYmKHIuaW5jbHVkZXMoXCJPcGVyYVwiKXx8ci5pbmNsdWRlcyhcIk9QUi9cIikpLHQuZmlyZWZveD10Lmd1aSYmKHIuaW5jbHVkZXMoXCJGaXJlZm94XCIpfHx0LmZpcmVmb3hJb3MpLHQuY2hyb21lPXQuZ3VpJiYoci5pbmNsdWRlcyhcIkNocm9tZVwiKXx8dC5jaHJvbWVJb3MpJiYhdC5lZGdlJiYhdC5vcGVyYSYmIXQuc2Ftc3VuZ0Jyb3dzZXIsdC5zYWZhcmk9dC5ndWkmJnIuaW5jbHVkZXMoXCJTYWZhcmlcIikmJiF0LmNocm9tZSYmIXQuZWRnZSYmIXQuZmlyZWZveCYmIXQub3BlcmEmJiF0LnNhbXN1bmdCcm93c2VyfHx0LmVkZ2VJb3N8fHQuY2hyb21lSW9zfHx0LmZpcmVmb3hJb3MsdC5pZT10LnRyaWRlbnQ9dC5ndWkmJnIuaW5jbHVkZXMoXCJUcmlkZW50XCIpLHQuYmxpbms9dC5jaHJvbWUmJiF0LmNocm9tZUlvc3x8dC5lZGdlQ2hyb21pdW18fHQuZWRnZUFuZHJvaWR8fHQuc2Ftc3VuZ0Jyb3dzZXIsdC53ZWJraXQ9dC5ibGlua3x8dC5zYWZhcmksdC5nZWNrbz10LmZpcmVmb3gmJiF0LmZpcmVmb3hJb3MmJiF0LndlYmtpdCYmIXQuc2FmYXJpO3ZhciBkPXt9O3Qub249ZnVuY3Rpb24oZSxvKXtkW2VdPWRbZV18fG5ldyBTZXQsZFtlXS5hZGQobyl9LHQub2ZmPXQucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSxvKXtkW2VdJiZkW2VdLmRlbGV0ZShvKX07dmFyIHM9dC5lbWl0PWZ1bmN0aW9uKGUsbyl7ZFtlXSYmZFtlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKG8pfSl9O2lmKHQuZ3VpKXt0LnBpeGVsUmF0aW89cGFyc2VGbG9hdCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpby50b0ZpeGVkKDIpKSx0LmdhbWVjb25zb2xlPXIuaW5jbHVkZXMoXCJYYm94XCIpfHxyLmluY2x1ZGVzKFwiUGxheVN0YXRpb25cIik7dmFyIGE9MDtpZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRjb25uZWN0ZWRcIixmdW5jdGlvbihlKXtyZXR1cm4gYSsrfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJnYW1lcGFkZGlzY29ubmVjdGVkXCIsZnVuY3Rpb24oZSl7cmV0dXJuIGEtLX0pLHQuZ2FtZWNvbnNvbGUpdC5nYW1lcGFkPSEwLHQubW91c2U9ITAsdC50b3VjaD0hMSx0LnR2PSEwLHQuYmF0dGVyeT0hMSx0LnBob25lPXQudGFibGV0PXQuaHlicmlkPXQubGFwdG9wPXQuZGVza3RvcD0hMSx0LmZvcm1mYWN0b3I9XCJnYW1lY29uc29sZVwiO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oKXtvKFwidHZcIixcInR2XCI9PT10LmZvcm1mYWN0b3IpLG8oXCJwaG9uZVwiLFwicGhvbmVcIj09PXQuZm9ybWZhY3RvciksbyhcInRhYmxldFwiLFwidGFibGV0XCI9PT10LmZvcm1mYWN0b3IpLG8oXCJoeWJyaWRcIixcImh5YnJpZFwiPT09dC5mb3JtZmFjdG9yKSxvKFwibGFwdG9wXCIsXCJsYXB0b3BcIj09PXQuZm9ybWZhY3RvciksbyhcImRlc2t0b3BcIixcImRlc2t0b3BcIj09PXQuZm9ybWZhY3Rvcil9LHU9ZnVuY3Rpb24oKXt2YXIgZT1NYXRoLm1pbih3aW5kb3cuc2NyZWVuLndpZHRoLHdpbmRvdy5zY3JlZW4uaGVpZ2h0KTtyZXR1cm4gdC50dj9cInR2XCI6dC50b3VjaCYmZTw2MDA/XCJwaG9uZVwiOnQudG91Y2gmJiF0Lm1vdXNlP1widGFibGV0XCI6dC50b3VjaCYmdC5tb3VzZT9cImh5YnJpZFwiOnQuYmF0dGVyeT9cImxhcHRvcFwiOlwiZGVza3RvcFwifTt0LnRvdWNoPW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLHQudHY9ci5pbmNsdWRlcyhcIlRWXCIpLGE9bmF2aWdhdG9yLmdldEdhbWVwYWRzP0FycmF5LmZyb20obmF2aWdhdG9yLmdldEdhbWVwYWRzKCkpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJnZvaWQgMCE9PWV9KS5sZW5ndGg6MCx0LmdhbWVwYWQ9YT4wLGUoXCIob3JpZW50YXRpb246IHBvcnRyYWl0KVwiLGZ1bmN0aW9uKGUpe3QucG9ydHJhaXQ9ZSx0LmxhbmRzY2FwZT0hZSx0Lm9yaWVudGF0aW9uPWU/XCJwb3J0cmFpdFwiOlwibGFuZHNjYXBlXCIscyhcInBvcnRyYWl0XCIsdC5wb3J0cmFpdCkscyhcImxhbmRzY2FwZVwiLHQubGFuZHNjYXBlKSxzKFwib3JpZW50YXRpb25cIix0Lm9yaWVudGF0aW9uKX0pLGUoXCIoYW55LXBvaW50ZXI6IGNvYXJzZSlcIixmdW5jdGlvbihlKXtvKFwidG91Y2hcIixlKSxvKFwiZm9ybWZhY3RvclwiLHUoKSkmJmMoKX0pLGUoXCIoaG92ZXI6IGhvdmVyKVwiLGZ1bmN0aW9uKGUpe28oXCJtb3VzZVwiLGUpLG8oXCJpbnB1dFwiLGU/XCJtb3VzZVwiOlwidG91Y2hcIiksbyhcImZvcm1mYWN0b3JcIix1KCkpJiZjKCl9KX19cmV0dXJuIHQuY3NwPXQudXdwfHwhMSx0Lm53anM/dC5kZXY9XCJzZGtcIj09PXByb2Nlc3MudmVyc2lvbnNbXCJudy1mbGF2b3JcIl06dC5lbGVjdHJvbj90LmRldj1wcm9jZXNzLmV4ZWNQYXRoLnJlcGxhY2UoL1xcXFwvZyxcIi9cIikuaW5jbHVkZXMoXCJub2RlX21vZHVsZXMvZWxlY3Ryb24vXCIpOnQudXdwP3QuZGV2PVdpbmRvd3MuQXBwbGljYXRpb25Nb2RlbC5QYWNrYWdlLmN1cnJlbnQuaXNEZXZlbG9wbWVudE1vZGU6dC5ub2RlP3QuZGV2PVwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY6dC5kZXY9dm9pZCAwLHR9KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/platform-detect/index.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/index.js": -/*!******************************************!*\ - !*** ./node_modules/seedrandom/index.js ***! - \******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -eval("// A library of seedable RNGs implemented in Javascript.\n//\n// Usage:\n//\n// var seedrandom = require('seedrandom');\n// var random = seedrandom(1); // or any seed.\n// var x = random(); // 0 <= x < 1. Every bit is random.\n// var x = random.quick(); // 0 <= x < 1. 32 bits of randomness.\n\n// alea, a 53-bit multiply-with-carry generator by Johannes Baagøe.\n// Period: ~2^116\n// Reported to pass all BigCrush tests.\nvar alea = __webpack_require__(/*! ./lib/alea */ \"./node_modules/seedrandom/lib/alea.js\");\n\n// xor128, a pure xor-shift generator by George Marsaglia.\n// Period: 2^128-1.\n// Reported to fail: MatrixRank and LinearComp.\nvar xor128 = __webpack_require__(/*! ./lib/xor128 */ \"./node_modules/seedrandom/lib/xor128.js\");\n\n// xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl.\n// Period: 2^192-2^32\n// Reported to fail: CollisionOver, SimpPoker, and LinearComp.\nvar xorwow = __webpack_require__(/*! ./lib/xorwow */ \"./node_modules/seedrandom/lib/xorwow.js\");\n\n// xorshift7, by François Panneton and Pierre L'ecuyer, takes\n// a different approach: it adds robustness by allowing more shifts\n// than Marsaglia's original three. It is a 7-shift generator\n// with 256 bits, that passes BigCrush with no systmatic failures.\n// Period 2^256-1.\n// No systematic BigCrush failures reported.\nvar xorshift7 = __webpack_require__(/*! ./lib/xorshift7 */ \"./node_modules/seedrandom/lib/xorshift7.js\");\n\n// xor4096, by Richard Brent, is a 4096-bit xor-shift with a\n// very long period that also adds a Weyl generator. It also passes\n// BigCrush with no systematic failures. Its long period may\n// be useful if you have many generators and need to avoid\n// collisions.\n// Period: 2^4128-2^32.\n// No systematic BigCrush failures reported.\nvar xor4096 = __webpack_require__(/*! ./lib/xor4096 */ \"./node_modules/seedrandom/lib/xor4096.js\");\n\n// Tyche-i, by Samuel Neves and Filipe Araujo, is a bit-shifting random\n// number generator derived from ChaCha, a modern stream cipher.\n// https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n// Period: ~2^127\n// No systematic BigCrush failures reported.\nvar tychei = __webpack_require__(/*! ./lib/tychei */ \"./node_modules/seedrandom/lib/tychei.js\");\n\n// The original ARC4-based prng included in this library.\n// Period: ~2^1600\nvar sr = __webpack_require__(/*! ./seedrandom */ \"./node_modules/seedrandom/seedrandom.js\");\n\nsr.alea = alea;\nsr.xor128 = xor128;\nsr.xorwow = xorwow;\nsr.xorshift7 = xorshift7;\nsr.xor4096 = xor4096;\nsr.tychei = tychei;\n\nmodule.exports = sr;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLDJCQUEyQjtBQUMzQiwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUJBQU8sQ0FBQyx5REFBWTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLDZEQUFjOztBQUVuQztBQUNBO0FBQ0E7QUFDQSxhQUFhLG1CQUFPLENBQUMsNkRBQWM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQkFBTyxDQUFDLG1FQUFpQjs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG1CQUFPLENBQUMsK0RBQWU7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLG1CQUFPLENBQUMsNkRBQWM7O0FBRW5DO0FBQ0E7QUFDQSxTQUFTLG1CQUFPLENBQUMsNkRBQWM7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9pbmRleC5qcz82MTI1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEEgbGlicmFyeSBvZiBzZWVkYWJsZSBSTkdzIGltcGxlbWVudGVkIGluIEphdmFzY3JpcHQuXG4vL1xuLy8gVXNhZ2U6XG4vL1xuLy8gdmFyIHNlZWRyYW5kb20gPSByZXF1aXJlKCdzZWVkcmFuZG9tJyk7XG4vLyB2YXIgcmFuZG9tID0gc2VlZHJhbmRvbSgxKTsgLy8gb3IgYW55IHNlZWQuXG4vLyB2YXIgeCA9IHJhbmRvbSgpOyAgICAgICAvLyAwIDw9IHggPCAxLiAgRXZlcnkgYml0IGlzIHJhbmRvbS5cbi8vIHZhciB4ID0gcmFuZG9tLnF1aWNrKCk7IC8vIDAgPD0geCA8IDEuICAzMiBiaXRzIG9mIHJhbmRvbW5lc3MuXG5cbi8vIGFsZWEsIGEgNTMtYml0IG11bHRpcGx5LXdpdGgtY2FycnkgZ2VuZXJhdG9yIGJ5IEpvaGFubmVzIEJhYWfDuGUuXG4vLyBQZXJpb2Q6IH4yXjExNlxuLy8gUmVwb3J0ZWQgdG8gcGFzcyBhbGwgQmlnQ3J1c2ggdGVzdHMuXG52YXIgYWxlYSA9IHJlcXVpcmUoJy4vbGliL2FsZWEnKTtcblxuLy8geG9yMTI4LCBhIHB1cmUgeG9yLXNoaWZ0IGdlbmVyYXRvciBieSBHZW9yZ2UgTWFyc2FnbGlhLlxuLy8gUGVyaW9kOiAyXjEyOC0xLlxuLy8gUmVwb3J0ZWQgdG8gZmFpbDogTWF0cml4UmFuayBhbmQgTGluZWFyQ29tcC5cbnZhciB4b3IxMjggPSByZXF1aXJlKCcuL2xpYi94b3IxMjgnKTtcblxuLy8geG9yd293LCBHZW9yZ2UgTWFyc2FnbGlhJ3MgMTYwLWJpdCB4b3Itc2hpZnQgY29tYmluZWQgcGx1cyB3ZXlsLlxuLy8gUGVyaW9kOiAyXjE5Mi0yXjMyXG4vLyBSZXBvcnRlZCB0byBmYWlsOiBDb2xsaXNpb25PdmVyLCBTaW1wUG9rZXIsIGFuZCBMaW5lYXJDb21wLlxudmFyIHhvcndvdyA9IHJlcXVpcmUoJy4vbGliL3hvcndvdycpO1xuXG4vLyB4b3JzaGlmdDcsIGJ5IEZyYW7Dp29pcyBQYW5uZXRvbiBhbmQgUGllcnJlIEwnZWN1eWVyLCB0YWtlc1xuLy8gYSBkaWZmZXJlbnQgYXBwcm9hY2g6IGl0IGFkZHMgcm9idXN0bmVzcyBieSBhbGxvd2luZyBtb3JlIHNoaWZ0c1xuLy8gdGhhbiBNYXJzYWdsaWEncyBvcmlnaW5hbCB0aHJlZS4gIEl0IGlzIGEgNy1zaGlmdCBnZW5lcmF0b3Jcbi8vIHdpdGggMjU2IGJpdHMsIHRoYXQgcGFzc2VzIEJpZ0NydXNoIHdpdGggbm8gc3lzdG1hdGljIGZhaWx1cmVzLlxuLy8gUGVyaW9kIDJeMjU2LTEuXG4vLyBObyBzeXN0ZW1hdGljIEJpZ0NydXNoIGZhaWx1cmVzIHJlcG9ydGVkLlxudmFyIHhvcnNoaWZ0NyA9IHJlcXVpcmUoJy4vbGliL3hvcnNoaWZ0NycpO1xuXG4vLyB4b3I0MDk2LCBieSBSaWNoYXJkIEJyZW50LCBpcyBhIDQwOTYtYml0IHhvci1zaGlmdCB3aXRoIGFcbi8vIHZlcnkgbG9uZyBwZXJpb2QgdGhhdCBhbHNvIGFkZHMgYSBXZXlsIGdlbmVyYXRvci4gSXQgYWxzbyBwYXNzZXNcbi8vIEJpZ0NydXNoIHdpdGggbm8gc3lzdGVtYXRpYyBmYWlsdXJlcy4gIEl0cyBsb25nIHBlcmlvZCBtYXlcbi8vIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBtYW55IGdlbmVyYXRvcnMgYW5kIG5lZWQgdG8gYXZvaWRcbi8vIGNvbGxpc2lvbnMuXG4vLyBQZXJpb2Q6IDJeNDEyOC0yXjMyLlxuLy8gTm8gc3lzdGVtYXRpYyBCaWdDcnVzaCBmYWlsdXJlcyByZXBvcnRlZC5cbnZhciB4b3I0MDk2ID0gcmVxdWlyZSgnLi9saWIveG9yNDA5NicpO1xuXG4vLyBUeWNoZS1pLCBieSBTYW11ZWwgTmV2ZXMgYW5kIEZpbGlwZSBBcmF1am8sIGlzIGEgYml0LXNoaWZ0aW5nIHJhbmRvbVxuLy8gbnVtYmVyIGdlbmVyYXRvciBkZXJpdmVkIGZyb20gQ2hhQ2hhLCBhIG1vZGVybiBzdHJlYW0gY2lwaGVyLlxuLy8gaHR0cHM6Ly9lZGVuLmRlaS51Yy5wdC9+c25ldmVzL3B1YnMvMjAxMS1zbmZhMi5wZGZcbi8vIFBlcmlvZDogfjJeMTI3XG4vLyBObyBzeXN0ZW1hdGljIEJpZ0NydXNoIGZhaWx1cmVzIHJlcG9ydGVkLlxudmFyIHR5Y2hlaSA9IHJlcXVpcmUoJy4vbGliL3R5Y2hlaScpO1xuXG4vLyBUaGUgb3JpZ2luYWwgQVJDNC1iYXNlZCBwcm5nIGluY2x1ZGVkIGluIHRoaXMgbGlicmFyeS5cbi8vIFBlcmlvZDogfjJeMTYwMFxudmFyIHNyID0gcmVxdWlyZSgnLi9zZWVkcmFuZG9tJyk7XG5cbnNyLmFsZWEgPSBhbGVhO1xuc3IueG9yMTI4ID0geG9yMTI4O1xuc3IueG9yd293ID0geG9yd293O1xuc3IueG9yc2hpZnQ3ID0geG9yc2hpZnQ3O1xuc3IueG9yNDA5NiA9IHhvcjQwOTY7XG5zci50eWNoZWkgPSB0eWNoZWk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3I7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/index.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/lib/alea.js": -/*!*********************************************!*\ - !*** ./node_modules/seedrandom/lib/alea.js ***! - \*********************************************/ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;// A port of an algorithm by Johannes Baagøe , 2010\n// http://baagoe.com/en/RandomMusings/javascript/\n// https://github.com/nquinlan/better-random-numbers-for-javascript-mirror\n// Original work is under MIT license -\n\n// Copyright (C) 2010 by Johannes Baagøe \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// \n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n\n(function(global, module, define) {\n\nfunction Alea(seed) {\n var me = this, mash = Mash();\n\n me.next = function() {\n var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32\n me.s0 = me.s1;\n me.s1 = me.s2;\n return me.s2 = t - (me.c = t | 0);\n };\n\n // Apply the seeding algorithm from Baagoe.\n me.c = 1;\n me.s0 = mash(' ');\n me.s1 = mash(' ');\n me.s2 = mash(' ');\n me.s0 -= mash(seed);\n if (me.s0 < 0) { me.s0 += 1; }\n me.s1 -= mash(seed);\n if (me.s1 < 0) { me.s1 += 1; }\n me.s2 -= mash(seed);\n if (me.s2 < 0) { me.s2 += 1; }\n mash = null;\n}\n\nfunction copy(f, t) {\n t.c = f.c;\n t.s0 = f.s0;\n t.s1 = f.s1;\n t.s2 = f.s2;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new Alea(seed),\n state = opts && opts.state,\n prng = xg.next;\n prng.int32 = function() { return (xg.next() * 0x100000000) | 0; }\n prng.double = function() {\n return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53\n };\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nfunction Mash() {\n var n = 0xefc8249d;\n\n var mash = function(data) {\n data = data.toString();\n for (var i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n var h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 0x100000000; // 2^32\n }\n return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n };\n\n return mash;\n}\n\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (__webpack_require__.amdD && __webpack_require__.amdO) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return impl; }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n} else {\n this.alea = impl;\n}\n\n})(\n this,\n true && module, // present in node.js\n __webpack_require__.amdD // present with an AMD loader\n);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIvYWxlYS5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGtCQUFrQjtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLHdCQUFNLElBQUksd0JBQVU7QUFDL0IsRUFBRSxtQ0FBTyxhQUFhLGNBQWM7QUFBQSxrR0FBQztBQUNyQyxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQSxFQUFFLEtBQTJCO0FBQzdCLEVBQUUsd0JBQXVDO0FBQ3pDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi9hbGVhLmpzPzEyMTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQSBwb3J0IG9mIGFuIGFsZ29yaXRobSBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLmNvbT4sIDIwMTBcbi8vIGh0dHA6Ly9iYWFnb2UuY29tL2VuL1JhbmRvbU11c2luZ3MvamF2YXNjcmlwdC9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucXVpbmxhbi9iZXR0ZXItcmFuZG9tLW51bWJlcnMtZm9yLWphdmFzY3JpcHQtbWlycm9yXG4vLyBPcmlnaW5hbCB3b3JrIGlzIHVuZGVyIE1JVCBsaWNlbnNlIC1cblxuLy8gQ29weXJpZ2h0IChDKSAyMDEwIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2Uub3JnPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vIFxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy8gXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuXG5cbihmdW5jdGlvbihnbG9iYWwsIG1vZHVsZSwgZGVmaW5lKSB7XG5cbmZ1bmN0aW9uIEFsZWEoc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBtYXNoID0gTWFzaCgpO1xuXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdCA9IDIwOTE2MzkgKiBtZS5zMCArIG1lLmMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIG1lLnMwID0gbWUuczE7XG4gICAgbWUuczEgPSBtZS5zMjtcbiAgICByZXR1cm4gbWUuczIgPSB0IC0gKG1lLmMgPSB0IHwgMCk7XG4gIH07XG5cbiAgLy8gQXBwbHkgdGhlIHNlZWRpbmcgYWxnb3JpdGhtIGZyb20gQmFhZ29lLlxuICBtZS5jID0gMTtcbiAgbWUuczAgPSBtYXNoKCcgJyk7XG4gIG1lLnMxID0gbWFzaCgnICcpO1xuICBtZS5zMiA9IG1hc2goJyAnKTtcbiAgbWUuczAgLT0gbWFzaChzZWVkKTtcbiAgaWYgKG1lLnMwIDwgMCkgeyBtZS5zMCArPSAxOyB9XG4gIG1lLnMxIC09IG1hc2goc2VlZCk7XG4gIGlmIChtZS5zMSA8IDApIHsgbWUuczEgKz0gMTsgfVxuICBtZS5zMiAtPSBtYXNoKHNlZWQpO1xuICBpZiAobWUuczIgPCAwKSB7IG1lLnMyICs9IDE7IH1cbiAgbWFzaCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmMgPSBmLmM7XG4gIHQuczAgPSBmLnMwO1xuICB0LnMxID0gZi5zMTtcbiAgdC5zMiA9IGYuczI7XG4gIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBpbXBsKHNlZWQsIG9wdHMpIHtcbiAgdmFyIHhnID0gbmV3IEFsZWEoc2VlZCksXG4gICAgICBzdGF0ZSA9IG9wdHMgJiYgb3B0cy5zdGF0ZSxcbiAgICAgIHBybmcgPSB4Zy5uZXh0O1xuICBwcm5nLmludDMyID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpICogMHgxMDAwMDAwMDApIHwgMDsgfVxuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBwcm5nKCkgKyAocHJuZygpICogMHgyMDAwMDAgfCAwKSAqIDEuMTEwMjIzMDI0NjI1MTU2NWUtMTY7IC8vIDJeLTUzXG4gIH07XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAodHlwZW9mKHN0YXRlKSA9PSAnb2JqZWN0JykgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5mdW5jdGlvbiBNYXNoKCkge1xuICB2YXIgbiA9IDB4ZWZjODI0OWQ7XG5cbiAgdmFyIG1hc2ggPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIG4gKz0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICAgICAgdmFyIGggPSAwLjAyNTE5NjAzMjgyNDE2OTM4ICogbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgaCAqPSBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBuICs9IGggKiAweDEwMDAwMDAwMDsgLy8gMl4zMlxuICAgIH1cbiAgICByZXR1cm4gKG4gPj4+IDApICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgfTtcblxuICByZXR1cm4gbWFzaDtcbn1cblxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLmFsZWEgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcyxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuXG5cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/lib/alea.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/lib/tychei.js": -/*!***********************************************!*\ - !*** ./node_modules/seedrandom/lib/tychei.js ***! - \***********************************************/ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;// A Javascript implementaion of the \"Tyche-i\" prng algorithm by\n// Samuel Neves and Filipe Araujo.\n// See https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n // Set up generator function.\n me.next = function() {\n var b = me.b, c = me.c, d = me.d, a = me.a;\n b = (b << 25) ^ (b >>> 7) ^ c;\n c = (c - d) | 0;\n d = (d << 24) ^ (d >>> 8) ^ a;\n a = (a - b) | 0;\n me.b = b = (b << 20) ^ (b >>> 12) ^ c;\n me.c = c = (c - d) | 0;\n me.d = (d << 16) ^ (c >>> 16) ^ a;\n return me.a = (a - b) | 0;\n };\n\n /* The following is non-inverted tyche, which has better internal\n * bit diffusion, but which is about 25% slower than tyche-i in JS.\n me.next = function() {\n var a = me.a, b = me.b, c = me.c, d = me.d;\n a = (me.a + me.b | 0) >>> 0;\n d = me.d ^ a; d = d << 16 ^ d >>> 16;\n c = me.c + d | 0;\n b = me.b ^ c; b = b << 12 ^ d >>> 20;\n me.a = a = a + b | 0;\n d = d ^ a; me.d = d = d << 8 ^ d >>> 24;\n me.c = c = c + d | 0;\n b = b ^ c;\n return me.b = (b << 7 ^ b >>> 25);\n }\n */\n\n me.a = 0;\n me.b = 0;\n me.c = 2654435769 | 0;\n me.d = 1367130551;\n\n if (seed === Math.floor(seed)) {\n // Integer seed.\n me.a = (seed / 0x100000000) | 0;\n me.b = seed | 0;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 20; k++) {\n me.b ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.a = f.a;\n t.b = f.b;\n t.c = f.c;\n t.d = f.d;\n return t;\n};\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (__webpack_require__.amdD && __webpack_require__.amdO) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return impl; }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n} else {\n this.tychei = impl;\n}\n\n})(\n this,\n true && module, // present in node.js\n __webpack_require__.amdD // present with an AMD loader\n);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIvdHljaGVpLmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGtCQUFrQjtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUUsU0FBUyx3QkFBTSxJQUFJLHdCQUFVO0FBQy9CLEVBQUUsbUNBQU8sYUFBYSxjQUFjO0FBQUEsa0dBQUM7QUFDckMsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0EsRUFBRSxLQUEyQjtBQUM3QixFQUFFLHdCQUF1QztBQUN6QyIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIvdHljaGVpLmpzPzg5ZWQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQSBKYXZhc2NyaXB0IGltcGxlbWVudGFpb24gb2YgdGhlIFwiVHljaGUtaVwiIHBybmcgYWxnb3JpdGhtIGJ5XG4vLyBTYW11ZWwgTmV2ZXMgYW5kIEZpbGlwZSBBcmF1am8uXG4vLyBTZWUgaHR0cHM6Ly9lZGVuLmRlaS51Yy5wdC9+c25ldmVzL3B1YnMvMjAxMS1zbmZhMi5wZGZcblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcywgc3Ryc2VlZCA9ICcnO1xuXG4gIC8vIFNldCB1cCBnZW5lcmF0b3IgZnVuY3Rpb24uXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYiA9IG1lLmIsIGMgPSBtZS5jLCBkID0gbWUuZCwgYSA9IG1lLmE7XG4gICAgYiA9IChiIDw8IDI1KSBeIChiID4+PiA3KSBeIGM7XG4gICAgYyA9IChjIC0gZCkgfCAwO1xuICAgIGQgPSAoZCA8PCAyNCkgXiAoZCA+Pj4gOCkgXiBhO1xuICAgIGEgPSAoYSAtIGIpIHwgMDtcbiAgICBtZS5iID0gYiA9IChiIDw8IDIwKSBeIChiID4+PiAxMikgXiBjO1xuICAgIG1lLmMgPSBjID0gKGMgLSBkKSB8IDA7XG4gICAgbWUuZCA9IChkIDw8IDE2KSBeIChjID4+PiAxNikgXiBhO1xuICAgIHJldHVybiBtZS5hID0gKGEgLSBiKSB8IDA7XG4gIH07XG5cbiAgLyogVGhlIGZvbGxvd2luZyBpcyBub24taW52ZXJ0ZWQgdHljaGUsIHdoaWNoIGhhcyBiZXR0ZXIgaW50ZXJuYWxcbiAgICogYml0IGRpZmZ1c2lvbiwgYnV0IHdoaWNoIGlzIGFib3V0IDI1JSBzbG93ZXIgdGhhbiB0eWNoZS1pIGluIEpTLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGEgPSBtZS5hLCBiID0gbWUuYiwgYyA9IG1lLmMsIGQgPSBtZS5kO1xuICAgIGEgPSAobWUuYSArIG1lLmIgfCAwKSA+Pj4gMDtcbiAgICBkID0gbWUuZCBeIGE7IGQgPSBkIDw8IDE2IF4gZCA+Pj4gMTY7XG4gICAgYyA9IG1lLmMgKyBkIHwgMDtcbiAgICBiID0gbWUuYiBeIGM7IGIgPSBiIDw8IDEyIF4gZCA+Pj4gMjA7XG4gICAgbWUuYSA9IGEgPSBhICsgYiB8IDA7XG4gICAgZCA9IGQgXiBhOyBtZS5kID0gZCA9IGQgPDwgOCBeIGQgPj4+IDI0O1xuICAgIG1lLmMgPSBjID0gYyArIGQgfCAwO1xuICAgIGIgPSBiIF4gYztcbiAgICByZXR1cm4gbWUuYiA9IChiIDw8IDcgXiBiID4+PiAyNSk7XG4gIH1cbiAgKi9cblxuICBtZS5hID0gMDtcbiAgbWUuYiA9IDA7XG4gIG1lLmMgPSAyNjU0NDM1NzY5IHwgMDtcbiAgbWUuZCA9IDEzNjcxMzA1NTE7XG5cbiAgaWYgKHNlZWQgPT09IE1hdGguZmxvb3Ioc2VlZCkpIHtcbiAgICAvLyBJbnRlZ2VyIHNlZWQuXG4gICAgbWUuYSA9IChzZWVkIC8gMHgxMDAwMDAwMDApIHwgMDtcbiAgICBtZS5iID0gc2VlZCB8IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RyaW5nIHNlZWQuXG4gICAgc3Ryc2VlZCArPSBzZWVkO1xuICB9XG5cbiAgLy8gTWl4IGluIHN0cmluZyBzZWVkLCB0aGVuIGRpc2NhcmQgYW4gaW5pdGlhbCBiYXRjaCBvZiA2NCB2YWx1ZXMuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgc3Ryc2VlZC5sZW5ndGggKyAyMDsgaysrKSB7XG4gICAgbWUuYiBePSBzdHJzZWVkLmNoYXJDb2RlQXQoaykgfCAwO1xuICAgIG1lLm5leHQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5KGYsIHQpIHtcbiAgdC5hID0gZi5hO1xuICB0LmIgPSBmLmI7XG4gIHQuYyA9IGYuYztcbiAgdC5kID0gZi5kO1xuICByZXR1cm4gdDtcbn07XG5cbmZ1bmN0aW9uIGltcGwoc2VlZCwgb3B0cykge1xuICB2YXIgeGcgPSBuZXcgWG9yR2VuKHNlZWQpLFxuICAgICAgc3RhdGUgPSBvcHRzICYmIG9wdHMuc3RhdGUsXG4gICAgICBwcm5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwOyB9O1xuICBwcm5nLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGRvIHtcbiAgICAgIHZhciB0b3AgPSB4Zy5uZXh0KCkgPj4+IDExLFxuICAgICAgICAgIGJvdCA9ICh4Zy5uZXh0KCkgPj4+IDApIC8gMHgxMDAwMDAwMDAsXG4gICAgICAgICAgcmVzdWx0ID0gKHRvcCArIGJvdCkgLyAoMSA8PCAyMSk7XG4gICAgfSB3aGlsZSAocmVzdWx0ID09PSAwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBwcm5nLmludDMyID0geGcubmV4dDtcbiAgcHJuZy5xdWljayA9IHBybmc7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Yoc3RhdGUpID09ICdvYmplY3QnKSBjb3B5KHN0YXRlLCB4Zyk7XG4gICAgcHJuZy5zdGF0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29weSh4Zywge30pOyB9XG4gIH1cbiAgcmV0dXJuIHBybmc7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBpbXBsO1xufSBlbHNlIGlmIChkZWZpbmUgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBpbXBsOyB9KTtcbn0gZWxzZSB7XG4gIHRoaXMudHljaGVpID0gaW1wbDtcbn1cblxufSkoXG4gIHRoaXMsXG4gICh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUsICAgIC8vIHByZXNlbnQgaW4gbm9kZS5qc1xuICAodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUgICAvLyBwcmVzZW50IHdpdGggYW4gQU1EIGxvYWRlclxuKTtcblxuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/lib/tychei.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/lib/xor128.js": -/*!***********************************************!*\ - !*** ./node_modules/seedrandom/lib/xor128.js ***! - \***********************************************/ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;// A Javascript implementaion of the \"xor128\" prng algorithm by\n// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n\n // Set up generator function.\n me.next = function() {\n var t = me.x ^ (me.x << 11);\n me.x = me.y;\n me.y = me.z;\n me.z = me.w;\n return me.w ^= (me.w >>> 19) ^ t ^ (t >>> 8);\n };\n\n if (seed === (seed | 0)) {\n // Integer seed.\n me.x = seed;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (__webpack_require__.amdD && __webpack_require__.amdO) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return impl; }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n} else {\n this.xor128 = impl;\n}\n\n})(\n this,\n true && module, // present in node.js\n __webpack_require__.amdD // present with an AMD loader\n);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yMTI4LmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsa0JBQWtCO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLHdCQUFNLElBQUksd0JBQVU7QUFDL0IsRUFBRSxtQ0FBTyxhQUFhLGNBQWM7QUFBQSxrR0FBQztBQUNyQyxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQSxFQUFFLEtBQTJCO0FBQzdCLEVBQUUsd0JBQXVDO0FBQ3pDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3IxMjguanM/YjgzOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJ4b3IxMjhcIiBwcm5nIGFsZ29yaXRobSBieVxuLy8gR2VvcmdlIE1hcnNhZ2xpYS4gIFNlZSBodHRwOi8vd3d3LmpzdGF0c29mdC5vcmcvdjA4L2kxNC9wYXBlclxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzLCBzdHJzZWVkID0gJyc7XG5cbiAgbWUueCA9IDA7XG4gIG1lLnkgPSAwO1xuICBtZS56ID0gMDtcbiAgbWUudyA9IDA7XG5cbiAgLy8gU2V0IHVwIGdlbmVyYXRvciBmdW5jdGlvbi5cbiAgbWUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gbWUueCBeIChtZS54IDw8IDExKTtcbiAgICBtZS54ID0gbWUueTtcbiAgICBtZS55ID0gbWUuejtcbiAgICBtZS56ID0gbWUudztcbiAgICByZXR1cm4gbWUudyBePSAobWUudyA+Pj4gMTkpIF4gdCBeICh0ID4+PiA4KTtcbiAgfTtcblxuICBpZiAoc2VlZCA9PT0gKHNlZWQgfCAwKSkge1xuICAgIC8vIEludGVnZXIgc2VlZC5cbiAgICBtZS54ID0gc2VlZDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdHJpbmcgc2VlZC5cbiAgICBzdHJzZWVkICs9IHNlZWQ7XG4gIH1cblxuICAvLyBNaXggaW4gc3RyaW5nIHNlZWQsIHRoZW4gZGlzY2FyZCBhbiBpbml0aWFsIGJhdGNoIG9mIDY0IHZhbHVlcy5cbiAgZm9yICh2YXIgayA9IDA7IGsgPCBzdHJzZWVkLmxlbmd0aCArIDY0OyBrKyspIHtcbiAgICBtZS54IF49IHN0cnNlZWQuY2hhckNvZGVBdChrKSB8IDA7XG4gICAgbWUubmV4dCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LnggPSBmLng7XG4gIHQueSA9IGYueTtcbiAgdC56ID0gZi56O1xuICB0LncgPSBmLnc7XG4gIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBpbXBsKHNlZWQsIG9wdHMpIHtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAodHlwZW9mKHN0YXRlKSA9PSAnb2JqZWN0JykgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcjEyOCA9IGltcGw7XG59XG5cbn0pKFxuICB0aGlzLFxuICAodHlwZW9mIG1vZHVsZSkgPT0gJ29iamVjdCcgJiYgbW9kdWxlLCAgICAvLyBwcmVzZW50IGluIG5vZGUuanNcbiAgKHR5cGVvZiBkZWZpbmUpID09ICdmdW5jdGlvbicgJiYgZGVmaW5lICAgLy8gcHJlc2VudCB3aXRoIGFuIEFNRCBsb2FkZXJcbik7XG5cblxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/lib/xor128.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/lib/xor4096.js": -/*!************************************************!*\ - !*** ./node_modules/seedrandom/lib/xor4096.js ***! - \************************************************/ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.\n//\n// This fast non-cryptographic random number generator is designed for\n// use in Monte-Carlo algorithms. It combines a long-period xorshift\n// generator with a Weyl generator, and it passes all common batteries\n// of stasticial tests for randomness while consuming only a few nanoseconds\n// for each prng generated. For background on the generator, see Brent's\n// paper: \"Some long-period random number generators using shifts and xors.\"\n// http://arxiv.org/pdf/1004.3115v1.pdf\n//\n// Usage:\n//\n// var xor4096 = require('xor4096');\n// random = xor4096(1); // Seed with int32 or string.\n// assert.equal(random(), 0.1520436450538547); // (0, 1) range, 53 bits.\n// assert.equal(random.int32(), 1806534897); // signed int32, 32 bits.\n//\n// For nonzero numeric keys, this impelementation provides a sequence\n// identical to that by Brent's xorgens 3 implementaion in C. This\n// implementation also provides for initalizing the generator with\n// string seeds, or for saving and restoring the state of the generator.\n//\n// On Chrome, this prng benchmarks about 2.1 times slower than\n// Javascript's built-in Math.random().\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this;\n\n // Set up generator function.\n me.next = function() {\n var w = me.w,\n X = me.X, i = me.i, t, v;\n // Update Weyl generator.\n me.w = w = (w + 0x61c88647) | 0;\n // Update xor generator.\n v = X[(i + 34) & 127];\n t = X[i = ((i + 1) & 127)];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n // Update Xor generator array state.\n v = X[i] = v ^ t;\n me.i = i;\n // Result is the combination.\n return (v + (w ^ (w >>> 16))) | 0;\n };\n\n function init(me, seed) {\n var t, v, i, j, w, X = [], limit = 128;\n if (seed === (seed | 0)) {\n // Numeric seeds initialize v, which is used to generates X.\n v = seed;\n seed = null;\n } else {\n // String seeds are mixed into v and X one character at a time.\n seed = seed + '\\0';\n v = 0;\n limit = Math.max(limit, seed.length);\n }\n // Initialize circular array and weyl value.\n for (i = 0, j = -32; j < limit; ++j) {\n // Put the unicode characters into the array, and shuffle them.\n if (seed) v ^= seed.charCodeAt((j + 32) % seed.length);\n // After 32 shuffles, take v as the starting w value.\n if (j === 0) w = v;\n v ^= v << 10;\n v ^= v >>> 15;\n v ^= v << 4;\n v ^= v >>> 13;\n if (j >= 0) {\n w = (w + 0x61c88647) | 0; // Weyl.\n t = (X[j & 127] ^= (v + w)); // Combine xor and weyl to init array.\n i = (0 == t) ? i + 1 : 0; // Count zeroes.\n }\n }\n // We have detected all zeroes; make the key nonzero.\n if (i >= 128) {\n X[(seed && seed.length || 0) & 127] = -1;\n }\n // Run the generator 512 times to further mix the state before using it.\n // Factoring this as a function slows the main generator, so it is just\n // unrolled here. The weyl generator is not advanced while warming up.\n i = 127;\n for (j = 4 * 128; j > 0; --j) {\n v = X[(i + 34) & 127];\n t = X[i = ((i + 1) & 127)];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n X[i] = v ^ t;\n }\n // Storing state as object members is faster than using closure variables.\n me.w = w;\n me.X = X;\n me.i = i;\n }\n\n init(me, seed);\n}\n\nfunction copy(f, t) {\n t.i = f.i;\n t.w = f.w;\n t.X = f.X.slice();\n return t;\n};\n\nfunction impl(seed, opts) {\n if (seed == null) seed = +(new Date);\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.X) copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (__webpack_require__.amdD && __webpack_require__.amdO) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return impl; }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n} else {\n this.xor4096 = impl;\n}\n\n})(\n this, // window object or global\n true && module, // present in node.js\n __webpack_require__.amdD // present with an AMD loader\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yNDA5Ni5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0MsK0NBQStDO0FBQy9DLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixXQUFXO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QyxzQ0FBc0M7QUFDdEMsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixrQkFBa0I7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFLFNBQVMsd0JBQU0sSUFBSSx3QkFBVTtBQUMvQixFQUFFLG1DQUFPLGFBQWEsY0FBYztBQUFBLGtHQUFDO0FBQ3JDLEVBQUU7QUFDRjtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBLEVBQUUsS0FBMkI7QUFDN0IsRUFBRSx3QkFBdUM7QUFDekMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vbGliL3hvcjQwOTYuanM/N2FlYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiBSaWNoYXJkIEJyZW50J3MgWG9yZ2VucyB4b3I0MDk2IGFsZ29yaXRobS5cbi8vXG4vLyBUaGlzIGZhc3Qgbm9uLWNyeXB0b2dyYXBoaWMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgZGVzaWduZWQgZm9yXG4vLyB1c2UgaW4gTW9udGUtQ2FybG8gYWxnb3JpdGhtcy4gSXQgY29tYmluZXMgYSBsb25nLXBlcmlvZCB4b3JzaGlmdFxuLy8gZ2VuZXJhdG9yIHdpdGggYSBXZXlsIGdlbmVyYXRvciwgYW5kIGl0IHBhc3NlcyBhbGwgY29tbW9uIGJhdHRlcmllc1xuLy8gb2Ygc3Rhc3RpY2lhbCB0ZXN0cyBmb3IgcmFuZG9tbmVzcyB3aGlsZSBjb25zdW1pbmcgb25seSBhIGZldyBuYW5vc2Vjb25kc1xuLy8gZm9yIGVhY2ggcHJuZyBnZW5lcmF0ZWQuICBGb3IgYmFja2dyb3VuZCBvbiB0aGUgZ2VuZXJhdG9yLCBzZWUgQnJlbnQnc1xuLy8gcGFwZXI6IFwiU29tZSBsb25nLXBlcmlvZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgdXNpbmcgc2hpZnRzIGFuZCB4b3JzLlwiXG4vLyBodHRwOi8vYXJ4aXYub3JnL3BkZi8xMDA0LjMxMTV2MS5wZGZcbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyB2YXIgeG9yNDA5NiA9IHJlcXVpcmUoJ3hvcjQwOTYnKTtcbi8vIHJhbmRvbSA9IHhvcjQwOTYoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCB3aXRoIGludDMyIG9yIHN0cmluZy5cbi8vIGFzc2VydC5lcXVhbChyYW5kb20oKSwgMC4xNTIwNDM2NDUwNTM4NTQ3KTsgLy8gKDAsIDEpIHJhbmdlLCA1MyBiaXRzLlxuLy8gYXNzZXJ0LmVxdWFsKHJhbmRvbS5pbnQzMigpLCAxODA2NTM0ODk3KTsgICAvLyBzaWduZWQgaW50MzIsIDMyIGJpdHMuXG4vL1xuLy8gRm9yIG5vbnplcm8gbnVtZXJpYyBrZXlzLCB0aGlzIGltcGVsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHNlcXVlbmNlXG4vLyBpZGVudGljYWwgdG8gdGhhdCBieSBCcmVudCdzIHhvcmdlbnMgMyBpbXBsZW1lbnRhaW9uIGluIEMuICBUaGlzXG4vLyBpbXBsZW1lbnRhdGlvbiBhbHNvIHByb3ZpZGVzIGZvciBpbml0YWxpemluZyB0aGUgZ2VuZXJhdG9yIHdpdGhcbi8vIHN0cmluZyBzZWVkcywgb3IgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLlxuLy9cbi8vIE9uIENocm9tZSwgdGhpcyBwcm5nIGJlbmNobWFya3MgYWJvdXQgMi4xIHRpbWVzIHNsb3dlciB0aGFuXG4vLyBKYXZhc2NyaXB0J3MgYnVpbHQtaW4gTWF0aC5yYW5kb20oKS5cblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcztcblxuICAvLyBTZXQgdXAgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICBtZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHcgPSBtZS53LFxuICAgICAgICBYID0gbWUuWCwgaSA9IG1lLmksIHQsIHY7XG4gICAgLy8gVXBkYXRlIFdleWwgZ2VuZXJhdG9yLlxuICAgIG1lLncgPSB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7XG4gICAgLy8gVXBkYXRlIHhvciBnZW5lcmF0b3IuXG4gICAgdiA9IFhbKGkgKyAzNCkgJiAxMjddO1xuICAgIHQgPSBYW2kgPSAoKGkgKyAxKSAmIDEyNyldO1xuICAgIHYgXj0gdiA8PCAxMztcbiAgICB0IF49IHQgPDwgMTc7XG4gICAgdiBePSB2ID4+PiAxNTtcbiAgICB0IF49IHQgPj4+IDEyO1xuICAgIC8vIFVwZGF0ZSBYb3IgZ2VuZXJhdG9yIGFycmF5IHN0YXRlLlxuICAgIHYgPSBYW2ldID0gdiBeIHQ7XG4gICAgbWUuaSA9IGk7XG4gICAgLy8gUmVzdWx0IGlzIHRoZSBjb21iaW5hdGlvbi5cbiAgICByZXR1cm4gKHYgKyAodyBeICh3ID4+PiAxNikpKSB8IDA7XG4gIH07XG5cbiAgZnVuY3Rpb24gaW5pdChtZSwgc2VlZCkge1xuICAgIHZhciB0LCB2LCBpLCBqLCB3LCBYID0gW10sIGxpbWl0ID0gMTI4O1xuICAgIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgICAvLyBOdW1lcmljIHNlZWRzIGluaXRpYWxpemUgdiwgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZXMgWC5cbiAgICAgIHYgPSBzZWVkO1xuICAgICAgc2VlZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0cmluZyBzZWVkcyBhcmUgbWl4ZWQgaW50byB2IGFuZCBYIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLlxuICAgICAgc2VlZCA9IHNlZWQgKyAnXFwwJztcbiAgICAgIHYgPSAwO1xuICAgICAgbGltaXQgPSBNYXRoLm1heChsaW1pdCwgc2VlZC5sZW5ndGgpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIGNpcmN1bGFyIGFycmF5IGFuZCB3ZXlsIHZhbHVlLlxuICAgIGZvciAoaSA9IDAsIGogPSAtMzI7IGogPCBsaW1pdDsgKytqKSB7XG4gICAgICAvLyBQdXQgdGhlIHVuaWNvZGUgY2hhcmFjdGVycyBpbnRvIHRoZSBhcnJheSwgYW5kIHNodWZmbGUgdGhlbS5cbiAgICAgIGlmIChzZWVkKSB2IF49IHNlZWQuY2hhckNvZGVBdCgoaiArIDMyKSAlIHNlZWQubGVuZ3RoKTtcbiAgICAgIC8vIEFmdGVyIDMyIHNodWZmbGVzLCB0YWtlIHYgYXMgdGhlIHN0YXJ0aW5nIHcgdmFsdWUuXG4gICAgICBpZiAoaiA9PT0gMCkgdyA9IHY7XG4gICAgICB2IF49IHYgPDwgMTA7XG4gICAgICB2IF49IHYgPj4+IDE1O1xuICAgICAgdiBePSB2IDw8IDQ7XG4gICAgICB2IF49IHYgPj4+IDEzO1xuICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICB3ID0gKHcgKyAweDYxYzg4NjQ3KSB8IDA7ICAgICAvLyBXZXlsLlxuICAgICAgICB0ID0gKFhbaiAmIDEyN10gXj0gKHYgKyB3KSk7ICAvLyBDb21iaW5lIHhvciBhbmQgd2V5bCB0byBpbml0IGFycmF5LlxuICAgICAgICBpID0gKDAgPT0gdCkgPyBpICsgMSA6IDA7ICAgICAvLyBDb3VudCB6ZXJvZXMuXG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGhhdmUgZGV0ZWN0ZWQgYWxsIHplcm9lczsgbWFrZSB0aGUga2V5IG5vbnplcm8uXG4gICAgaWYgKGkgPj0gMTI4KSB7XG4gICAgICBYWyhzZWVkICYmIHNlZWQubGVuZ3RoIHx8IDApICYgMTI3XSA9IC0xO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIGdlbmVyYXRvciA1MTIgdGltZXMgdG8gZnVydGhlciBtaXggdGhlIHN0YXRlIGJlZm9yZSB1c2luZyBpdC5cbiAgICAvLyBGYWN0b3JpbmcgdGhpcyBhcyBhIGZ1bmN0aW9uIHNsb3dzIHRoZSBtYWluIGdlbmVyYXRvciwgc28gaXQgaXMganVzdFxuICAgIC8vIHVucm9sbGVkIGhlcmUuICBUaGUgd2V5bCBnZW5lcmF0b3IgaXMgbm90IGFkdmFuY2VkIHdoaWxlIHdhcm1pbmcgdXAuXG4gICAgaSA9IDEyNztcbiAgICBmb3IgKGogPSA0ICogMTI4OyBqID4gMDsgLS1qKSB7XG4gICAgICB2ID0gWFsoaSArIDM0KSAmIDEyN107XG4gICAgICB0ID0gWFtpID0gKChpICsgMSkgJiAxMjcpXTtcbiAgICAgIHYgXj0gdiA8PCAxMztcbiAgICAgIHQgXj0gdCA8PCAxNztcbiAgICAgIHYgXj0gdiA+Pj4gMTU7XG4gICAgICB0IF49IHQgPj4+IDEyO1xuICAgICAgWFtpXSA9IHYgXiB0O1xuICAgIH1cbiAgICAvLyBTdG9yaW5nIHN0YXRlIGFzIG9iamVjdCBtZW1iZXJzIGlzIGZhc3RlciB0aGFuIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzLlxuICAgIG1lLncgPSB3O1xuICAgIG1lLlggPSBYO1xuICAgIG1lLmkgPSBpO1xuICB9XG5cbiAgaW5pdChtZSwgc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmkgPSBmLmk7XG4gIHQudyA9IGYudztcbiAgdC5YID0gZi5YLnNsaWNlKCk7XG4gIHJldHVybiB0O1xufTtcblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIGlmIChzZWVkID09IG51bGwpIHNlZWQgPSArKG5ldyBEYXRlKTtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuWCkgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcjQwOTYgPSBpbXBsO1xufVxuXG59KShcbiAgdGhpcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93IG9iamVjdCBvciBnbG9iYWxcbiAgKHR5cGVvZiBtb2R1bGUpID09ICdvYmplY3QnICYmIG1vZHVsZSwgICAgLy8gcHJlc2VudCBpbiBub2RlLmpzXG4gICh0eXBlb2YgZGVmaW5lKSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZSAgIC8vIHByZXNlbnQgd2l0aCBhbiBBTUQgbG9hZGVyXG4pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/lib/xor4096.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/lib/xorshift7.js": -/*!**************************************************!*\ - !*** ./node_modules/seedrandom/lib/xorshift7.js ***! - \**************************************************/ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;// A Javascript implementaion of the \"xorshift7\" algorithm by\n// François Panneton and Pierre L'ecuyer:\n// \"On the Xorgshift Random Number Generators\"\n// http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this;\n\n // Set up generator function.\n me.next = function() {\n // Update xor generator.\n var X = me.x, i = me.i, t, v, w;\n t = X[i]; t ^= (t >>> 7); v = t ^ (t << 24);\n t = X[(i + 1) & 7]; v ^= t ^ (t >>> 10);\n t = X[(i + 3) & 7]; v ^= t ^ (t >>> 3);\n t = X[(i + 4) & 7]; v ^= t ^ (t << 7);\n t = X[(i + 7) & 7]; t = t ^ (t << 13); v ^= t ^ (t << 9);\n X[i] = v;\n me.i = (i + 1) & 7;\n return v;\n };\n\n function init(me, seed) {\n var j, w, X = [];\n\n if (seed === (seed | 0)) {\n // Seed state array using a 32-bit integer.\n w = X[0] = seed;\n } else {\n // Seed state using a string.\n seed = '' + seed;\n for (j = 0; j < seed.length; ++j) {\n X[j & 7] = (X[j & 7] << 15) ^\n (seed.charCodeAt(j) + X[(j + 1) & 7] << 13);\n }\n }\n // Enforce an array length of 8, not all zeroes.\n while (X.length < 8) X.push(0);\n for (j = 0; j < 8 && X[j] === 0; ++j);\n if (j == 8) w = X[7] = -1; else w = X[j];\n\n me.x = X;\n me.i = 0;\n\n // Discard an initial 256 values.\n for (j = 256; j > 0; --j) {\n me.next();\n }\n }\n\n init(me, seed);\n}\n\nfunction copy(f, t) {\n t.x = f.x.slice();\n t.i = f.i;\n return t;\n}\n\nfunction impl(seed, opts) {\n if (seed == null) seed = +(new Date);\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.x) copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (__webpack_require__.amdD && __webpack_require__.amdO) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return impl; }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n} else {\n this.xorshift7 = impl;\n}\n\n})(\n this,\n true && module, // present in node.js\n __webpack_require__.amdD // present with an AMD loader\n);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yc2hpZnQ3LmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxnQkFBZ0I7QUFDOUIsd0JBQXdCO0FBQ3hCLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDLCtCQUErQjs7QUFFL0I7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsa0JBQWtCO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLHdCQUFNLElBQUksd0JBQVU7QUFDL0IsRUFBRSxtQ0FBTyxhQUFhLGNBQWM7QUFBQSxrR0FBQztBQUNyQyxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQSxFQUFFLEtBQTJCO0FBQzdCLEVBQUUsd0JBQXVDO0FBQ3pDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL25vZGVfbW9kdWxlcy9zZWVkcmFuZG9tL2xpYi94b3JzaGlmdDcuanM/Y2FlMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBIEphdmFzY3JpcHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgXCJ4b3JzaGlmdDdcIiBhbGdvcml0aG0gYnlcbi8vIEZyYW7Dp29pcyBQYW5uZXRvbiBhbmQgUGllcnJlIEwnZWN1eWVyOlxuLy8gXCJPbiB0aGUgWG9yZ3NoaWZ0IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yc1wiXG4vLyBodHRwOi8vc2FsdWMuZW5nci51Y29ubi5lZHUvcmVmcy9jcnlwdG8vcm5nL3Bhbm5ldG9uMDVvbnRoZXhvcnNoaWZ0LnBkZlxuXG4oZnVuY3Rpb24oZ2xvYmFsLCBtb2R1bGUsIGRlZmluZSkge1xuXG5mdW5jdGlvbiBYb3JHZW4oc2VlZCkge1xuICB2YXIgbWUgPSB0aGlzO1xuXG4gIC8vIFNldCB1cCBnZW5lcmF0b3IgZnVuY3Rpb24uXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBVcGRhdGUgeG9yIGdlbmVyYXRvci5cbiAgICB2YXIgWCA9IG1lLngsIGkgPSBtZS5pLCB0LCB2LCB3O1xuICAgIHQgPSBYW2ldOyB0IF49ICh0ID4+PiA3KTsgdiA9IHQgXiAodCA8PCAyNCk7XG4gICAgdCA9IFhbKGkgKyAxKSAmIDddOyB2IF49IHQgXiAodCA+Pj4gMTApO1xuICAgIHQgPSBYWyhpICsgMykgJiA3XTsgdiBePSB0IF4gKHQgPj4+IDMpO1xuICAgIHQgPSBYWyhpICsgNCkgJiA3XTsgdiBePSB0IF4gKHQgPDwgNyk7XG4gICAgdCA9IFhbKGkgKyA3KSAmIDddOyB0ID0gdCBeICh0IDw8IDEzKTsgdiBePSB0IF4gKHQgPDwgOSk7XG4gICAgWFtpXSA9IHY7XG4gICAgbWUuaSA9IChpICsgMSkgJiA3O1xuICAgIHJldHVybiB2O1xuICB9O1xuXG4gIGZ1bmN0aW9uIGluaXQobWUsIHNlZWQpIHtcbiAgICB2YXIgaiwgdywgWCA9IFtdO1xuXG4gICAgaWYgKHNlZWQgPT09IChzZWVkIHwgMCkpIHtcbiAgICAgIC8vIFNlZWQgc3RhdGUgYXJyYXkgdXNpbmcgYSAzMi1iaXQgaW50ZWdlci5cbiAgICAgIHcgPSBYWzBdID0gc2VlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VlZCBzdGF0ZSB1c2luZyBhIHN0cmluZy5cbiAgICAgIHNlZWQgPSAnJyArIHNlZWQ7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgc2VlZC5sZW5ndGg7ICsraikge1xuICAgICAgICBYW2ogJiA3XSA9IChYW2ogJiA3XSA8PCAxNSkgXlxuICAgICAgICAgICAgKHNlZWQuY2hhckNvZGVBdChqKSArIFhbKGogKyAxKSAmIDddIDw8IDEzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRW5mb3JjZSBhbiBhcnJheSBsZW5ndGggb2YgOCwgbm90IGFsbCB6ZXJvZXMuXG4gICAgd2hpbGUgKFgubGVuZ3RoIDwgOCkgWC5wdXNoKDApO1xuICAgIGZvciAoaiA9IDA7IGogPCA4ICYmIFhbal0gPT09IDA7ICsraik7XG4gICAgaWYgKGogPT0gOCkgdyA9IFhbN10gPSAtMTsgZWxzZSB3ID0gWFtqXTtcblxuICAgIG1lLnggPSBYO1xuICAgIG1lLmkgPSAwO1xuXG4gICAgLy8gRGlzY2FyZCBhbiBpbml0aWFsIDI1NiB2YWx1ZXMuXG4gICAgZm9yIChqID0gMjU2OyBqID4gMDsgLS1qKSB7XG4gICAgICBtZS5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgaW5pdChtZSwgc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LnggPSBmLnguc2xpY2UoKTtcbiAgdC5pID0gZi5pO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gaW1wbChzZWVkLCBvcHRzKSB7XG4gIGlmIChzZWVkID09IG51bGwpIHNlZWQgPSArKG5ldyBEYXRlKTtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUueCkgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcnNoaWZ0NyA9IGltcGw7XG59XG5cbn0pKFxuICB0aGlzLFxuICAodHlwZW9mIG1vZHVsZSkgPT0gJ29iamVjdCcgJiYgbW9kdWxlLCAgICAvLyBwcmVzZW50IGluIG5vZGUuanNcbiAgKHR5cGVvZiBkZWZpbmUpID09ICdmdW5jdGlvbicgJiYgZGVmaW5lICAgLy8gcHJlc2VudCB3aXRoIGFuIEFNRCBsb2FkZXJcbik7XG5cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/lib/xorshift7.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/lib/xorwow.js": -/*!***********************************************!*\ - !*** ./node_modules/seedrandom/lib/xorwow.js ***! - \***********************************************/ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;// A Javascript implementaion of the \"xorwow\" prng algorithm by\n// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n // Set up generator function.\n me.next = function() {\n var t = (me.x ^ (me.x >>> 2));\n me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v;\n return (me.d = (me.d + 362437 | 0)) +\n (me.v = (me.v ^ (me.v << 4)) ^ (t ^ (t << 1))) | 0;\n };\n\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n me.v = 0;\n\n if (seed === (seed | 0)) {\n // Integer seed.\n me.x = seed;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n if (k == strseed.length) {\n me.d = me.x << 10 ^ me.x >>> 4;\n }\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n t.v = f.v;\n t.d = f.d;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (__webpack_require__.amdD && __webpack_require__.amdO) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return impl; }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n} else {\n this.xorwow = impl;\n}\n\n})(\n this,\n true && module, // present in node.js\n __webpack_require__.amdD // present with an AMD loader\n);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yd293LmpzIiwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGFBQWEsYUFBYTtBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGtCQUFrQjtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUUsU0FBUyx3QkFBTSxJQUFJLHdCQUFVO0FBQy9CLEVBQUUsbUNBQU8sYUFBYSxjQUFjO0FBQUEsa0dBQUM7QUFDckMsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0EsRUFBRSxLQUEyQjtBQUM3QixFQUFFLHdCQUF1QztBQUN6QyIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9saWIveG9yd293LmpzP2E0OWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQSBKYXZhc2NyaXB0IGltcGxlbWVudGFpb24gb2YgdGhlIFwieG9yd293XCIgcHJuZyBhbGdvcml0aG0gYnlcbi8vIEdlb3JnZSBNYXJzYWdsaWEuICBTZWUgaHR0cDovL3d3dy5qc3RhdHNvZnQub3JnL3YwOC9pMTQvcGFwZXJcblxuKGZ1bmN0aW9uKGdsb2JhbCwgbW9kdWxlLCBkZWZpbmUpIHtcblxuZnVuY3Rpb24gWG9yR2VuKHNlZWQpIHtcbiAgdmFyIG1lID0gdGhpcywgc3Ryc2VlZCA9ICcnO1xuXG4gIC8vIFNldCB1cCBnZW5lcmF0b3IgZnVuY3Rpb24uXG4gIG1lLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdCA9IChtZS54IF4gKG1lLnggPj4+IDIpKTtcbiAgICBtZS54ID0gbWUueTsgbWUueSA9IG1lLno7IG1lLnogPSBtZS53OyBtZS53ID0gbWUudjtcbiAgICByZXR1cm4gKG1lLmQgPSAobWUuZCArIDM2MjQzNyB8IDApKSArXG4gICAgICAgKG1lLnYgPSAobWUudiBeIChtZS52IDw8IDQpKSBeICh0IF4gKHQgPDwgMSkpKSB8IDA7XG4gIH07XG5cbiAgbWUueCA9IDA7XG4gIG1lLnkgPSAwO1xuICBtZS56ID0gMDtcbiAgbWUudyA9IDA7XG4gIG1lLnYgPSAwO1xuXG4gIGlmIChzZWVkID09PSAoc2VlZCB8IDApKSB7XG4gICAgLy8gSW50ZWdlciBzZWVkLlxuICAgIG1lLnggPSBzZWVkO1xuICB9IGVsc2Uge1xuICAgIC8vIFN0cmluZyBzZWVkLlxuICAgIHN0cnNlZWQgKz0gc2VlZDtcbiAgfVxuXG4gIC8vIE1peCBpbiBzdHJpbmcgc2VlZCwgdGhlbiBkaXNjYXJkIGFuIGluaXRpYWwgYmF0Y2ggb2YgNjQgdmFsdWVzLlxuICBmb3IgKHZhciBrID0gMDsgayA8IHN0cnNlZWQubGVuZ3RoICsgNjQ7IGsrKykge1xuICAgIG1lLnggXj0gc3Ryc2VlZC5jaGFyQ29kZUF0KGspIHwgMDtcbiAgICBpZiAoayA9PSBzdHJzZWVkLmxlbmd0aCkge1xuICAgICAgbWUuZCA9IG1lLnggPDwgMTAgXiBtZS54ID4+PiA0O1xuICAgIH1cbiAgICBtZS5uZXh0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weShmLCB0KSB7XG4gIHQueCA9IGYueDtcbiAgdC55ID0gZi55O1xuICB0LnogPSBmLno7XG4gIHQudyA9IGYudztcbiAgdC52ID0gZi52O1xuICB0LmQgPSBmLmQ7XG4gIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBpbXBsKHNlZWQsIG9wdHMpIHtcbiAgdmFyIHhnID0gbmV3IFhvckdlbihzZWVkKSxcbiAgICAgIHN0YXRlID0gb3B0cyAmJiBvcHRzLnN0YXRlLFxuICAgICAgcHJuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gKHhnLm5leHQoKSA+Pj4gMCkgLyAweDEwMDAwMDAwMDsgfTtcbiAgcHJuZy5kb3VibGUgPSBmdW5jdGlvbigpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdG9wID0geGcubmV4dCgpID4+PiAxMSxcbiAgICAgICAgICBib3QgPSAoeGcubmV4dCgpID4+PiAwKSAvIDB4MTAwMDAwMDAwLFxuICAgICAgICAgIHJlc3VsdCA9ICh0b3AgKyBib3QpIC8gKDEgPDwgMjEpO1xuICAgIH0gd2hpbGUgKHJlc3VsdCA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcHJuZy5pbnQzMiA9IHhnLm5leHQ7XG4gIHBybmcucXVpY2sgPSBwcm5nO1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAodHlwZW9mKHN0YXRlKSA9PSAnb2JqZWN0JykgY29weShzdGF0ZSwgeGcpO1xuICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoeGcsIHt9KTsgfVxuICB9XG4gIHJldHVybiBwcm5nO1xufVxuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gaW1wbDtcbn0gZWxzZSBpZiAoZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gaW1wbDsgfSk7XG59IGVsc2Uge1xuICB0aGlzLnhvcndvdyA9IGltcGw7XG59XG5cbn0pKFxuICB0aGlzLFxuICAodHlwZW9mIG1vZHVsZSkgPT0gJ29iamVjdCcgJiYgbW9kdWxlLCAgICAvLyBwcmVzZW50IGluIG5vZGUuanNcbiAgKHR5cGVvZiBkZWZpbmUpID09ICdmdW5jdGlvbicgJiYgZGVmaW5lICAgLy8gcHJlc2VudCB3aXRoIGFuIEFNRCBsb2FkZXJcbik7XG5cblxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/lib/xorwow.js\n"); - -/***/ }), - -/***/ "./node_modules/seedrandom/seedrandom.js": -/*!***********************************************!*\ - !*** ./node_modules/seedrandom/seedrandom.js ***! - \***********************************************/ -/***/ ((module, exports, __webpack_require__) => { - -eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*\nCopyright 2014 David Bau.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n(function (pool, math) {\n//\n// The following constants are related to IEEE 754 limits.\n//\n\n// Detect the global object, even if operating in strict mode.\n// http://stackoverflow.com/a/14387057/265298\nvar global = (0, eval)('this'),\n width = 256, // each RC4 output is 0 <= x < 256\n chunks = 6, // at least six RC4 outputs for each double\n digits = 52, // there are 52 significant digits in a double\n rngname = 'random', // rngname: name for Math.random and Math.seedrandom\n startdenom = math.pow(width, chunks),\n significance = math.pow(2, digits),\n overflow = significance * 2,\n mask = width - 1,\n nodecrypto; // node.js crypto module, initialized at the bottom.\n\n//\n// seedrandom()\n// This is the seedrandom function described above.\n//\nfunction seedrandom(seed, options, callback) {\n var key = [];\n options = (options == true) ? { entropy: true } : (options || {});\n\n // Flatten the seed string or build one from local entropy if needed.\n var shortseed = mixkey(flatten(\n options.entropy ? [seed, tostring(pool)] :\n (seed == null) ? autoseed() : seed, 3), key);\n\n // Use the seed to initialize an ARC4 generator.\n var arc4 = new ARC4(key);\n\n // This function returns a random double in [0, 1) that contains\n // randomness in every bit of the mantissa of the IEEE 754 value.\n var prng = function() {\n var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48\n d = startdenom, // and denominator d = 2 ^ 48.\n x = 0; // and no 'extra last byte'.\n while (n < significance) { // Fill up all significant digits by\n n = (n + x) * width; // shifting numerator and\n d *= width; // denominator and generating a\n x = arc4.g(1); // new least-significant-byte.\n }\n while (n >= overflow) { // To avoid rounding up, before adding\n n /= 2; // last byte, shift everything\n d /= 2; // right using integer math until\n x >>>= 1; // we have exactly the desired bits.\n }\n return (n + x) / d; // Form the number within [0, 1).\n };\n\n prng.int32 = function() { return arc4.g(4) | 0; }\n prng.quick = function() { return arc4.g(4) / 0x100000000; }\n prng.double = prng;\n\n // Mix the randomness into accumulated entropy.\n mixkey(tostring(arc4.S), pool);\n\n // Calling convention: what to return as a function of prng, seed, is_math.\n return (options.pass || callback ||\n function(prng, seed, is_math_call, state) {\n if (state) {\n // Load the arc4 state from the given state if it has an S array.\n if (state.S) { copy(state, arc4); }\n // Only provide the .state method if requested via options.state.\n prng.state = function() { return copy(arc4, {}); }\n }\n\n // If called as a method of Math (Math.seedrandom()), mutate\n // Math.random because that is how seedrandom.js has worked since v1.0.\n if (is_math_call) { math[rngname] = prng; return seed; }\n\n // Otherwise, it is a newer calling convention, so return the\n // prng directly.\n else return prng;\n })(\n prng,\n shortseed,\n 'global' in options ? options.global : (this == math),\n options.state);\n}\nmath['seed' + rngname] = seedrandom;\n\n//\n// ARC4\n//\n// An ARC4 implementation. The constructor takes a key in the form of\n// an array of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates\n// the next (count) outputs from ARC4. Its return value is a number x\n// that is in the range 0 <= x < (width ^ count).\n//\nfunction ARC4(key) {\n var t, keylen = key.length,\n me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\n\n // The empty key [] is treated as [0].\n if (!keylen) { key = [keylen++]; }\n\n // Set up S using the standard key scheduling algorithm.\n while (i < width) {\n s[i] = i++;\n }\n for (i = 0; i < width; i++) {\n s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];\n s[j] = t;\n }\n\n // The \"g\" method returns the next (count) outputs as one number.\n (me.g = function(count) {\n // Using instance members instead of closure state nearly doubles speed.\n var t, r = 0,\n i = me.i, j = me.j, s = me.S;\n while (count--) {\n t = s[i = mask & (i + 1)];\n r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];\n }\n me.i = i; me.j = j;\n return r;\n // For robust unpredictability, the function call below automatically\n // discards an initial batch of values. This is called RC4-drop[256].\n // See http://google.com/search?q=rsa+fluhrer+response&btnI\n })(width);\n}\n\n//\n// copy()\n// Copies internal state of ARC4 to or from a plain object.\n//\nfunction copy(f, t) {\n t.i = f.i;\n t.j = f.j;\n t.S = f.S.slice();\n return t;\n};\n\n//\n// flatten()\n// Converts an object tree to nested arrays of strings.\n//\nfunction flatten(obj, depth) {\n var result = [], typ = (typeof obj), prop;\n if (depth && typ == 'object') {\n for (prop in obj) {\n try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\n }\n }\n return (result.length ? result : typ == 'string' ? obj : obj + '\\0');\n}\n\n//\n// mixkey()\n// Mixes a string seed into a key that is an array of integers, and\n// returns a shortened string seed that is equivalent to the result key.\n//\nfunction mixkey(seed, key) {\n var stringseed = seed + '', smear, j = 0;\n while (j < stringseed.length) {\n key[mask & j] =\n mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));\n }\n return tostring(key);\n}\n\n//\n// autoseed()\n// Returns an object for autoseeding, using window.crypto and Node crypto\n// module if available.\n//\nfunction autoseed() {\n try {\n var out;\n if (nodecrypto && (out = nodecrypto.randomBytes)) {\n // The use of 'out' to remember randomBytes makes tight minified code.\n out = out(width);\n } else {\n out = new Uint8Array(width);\n (global.crypto || global.msCrypto).getRandomValues(out);\n }\n return tostring(out);\n } catch (e) {\n var browser = global.navigator,\n plugins = browser && browser.plugins;\n return [+new Date, global, plugins, global.screen, tostring(pool)];\n }\n}\n\n//\n// tostring()\n// Converts an array of charcodes to a string\n//\nfunction tostring(a) {\n return String.fromCharCode.apply(0, a);\n}\n\n//\n// When seedrandom.js is loaded, we immediately mix a few bits\n// from the built-in RNG into the entropy pool. Because we do\n// not want to interfere with deterministic PRNG state later,\n// seedrandom will not call math.random on its own again after\n// initialization.\n//\nmixkey(math.random(), pool);\n\n//\n// Nodejs and AMD support: export the implementation as a module using\n// either convention.\n//\nif ( true && module.exports) {\n module.exports = seedrandom;\n // When in node.js, try using crypto package for autoseeding.\n try {\n nodecrypto = __webpack_require__(/*! crypto */ \"?d4c0\");\n } catch (ex) {}\n} else if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return seedrandom; }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n\n// End anonymous scope, and pass initial values.\n})(\n [], // pool: entropy pool starts empty\n Math // math: package containing random, pow, and seedrandom\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2VlZHJhbmRvbS9zZWVkcmFuZG9tLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsZ0JBQWdCLGdCQUFnQjs7QUFFbEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLHdDQUF3QztBQUN4Qyx3Q0FBd0M7QUFDeEMsd0NBQXdDO0FBQ3hDLHdDQUF3QztBQUN4QztBQUNBLHdDQUF3QztBQUN4Qyx3Q0FBd0M7QUFDeEMsd0NBQXdDO0FBQ3hDLHdDQUF3QztBQUN4QztBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQSw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLG9DQUFvQyxvQkFBb0I7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QixzQkFBc0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksOENBQThDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUEyQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxxQkFBUTtBQUNqQyxJQUFJO0FBQ0osRUFBRSxTQUFTLElBQTJDO0FBQ3RELEVBQUUsbUNBQU8sYUFBYSxvQkFBb0I7QUFBQSxrR0FBQztBQUMzQzs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL3NlZWRyYW5kb20vc2VlZHJhbmRvbS5qcz9hNDlkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxNCBEYXZpZCBCYXUuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG5cIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbmRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xucGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG50aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG5pbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcbkNMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG5UT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRVxuU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbiovXG5cbihmdW5jdGlvbiAocG9vbCwgbWF0aCkge1xuLy9cbi8vIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSByZWxhdGVkIHRvIElFRUUgNzU0IGxpbWl0cy5cbi8vXG5cbi8vIERldGVjdCB0aGUgZ2xvYmFsIG9iamVjdCwgZXZlbiBpZiBvcGVyYXRpbmcgaW4gc3RyaWN0IG1vZGUuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDM4NzA1Ny8yNjUyOThcbnZhciBnbG9iYWwgPSAoMCwgZXZhbCkoJ3RoaXMnKSxcbiAgICB3aWR0aCA9IDI1NiwgICAgICAgIC8vIGVhY2ggUkM0IG91dHB1dCBpcyAwIDw9IHggPCAyNTZcbiAgICBjaHVua3MgPSA2LCAgICAgICAgIC8vIGF0IGxlYXN0IHNpeCBSQzQgb3V0cHV0cyBmb3IgZWFjaCBkb3VibGVcbiAgICBkaWdpdHMgPSA1MiwgICAgICAgIC8vIHRoZXJlIGFyZSA1MiBzaWduaWZpY2FudCBkaWdpdHMgaW4gYSBkb3VibGVcbiAgICBybmduYW1lID0gJ3JhbmRvbScsIC8vIHJuZ25hbWU6IG5hbWUgZm9yIE1hdGgucmFuZG9tIGFuZCBNYXRoLnNlZWRyYW5kb21cbiAgICBzdGFydGRlbm9tID0gbWF0aC5wb3cod2lkdGgsIGNodW5rcyksXG4gICAgc2lnbmlmaWNhbmNlID0gbWF0aC5wb3coMiwgZGlnaXRzKSxcbiAgICBvdmVyZmxvdyA9IHNpZ25pZmljYW5jZSAqIDIsXG4gICAgbWFzayA9IHdpZHRoIC0gMSxcbiAgICBub2RlY3J5cHRvOyAgICAgICAgIC8vIG5vZGUuanMgY3J5cHRvIG1vZHVsZSwgaW5pdGlhbGl6ZWQgYXQgdGhlIGJvdHRvbS5cblxuLy9cbi8vIHNlZWRyYW5kb20oKVxuLy8gVGhpcyBpcyB0aGUgc2VlZHJhbmRvbSBmdW5jdGlvbiBkZXNjcmliZWQgYWJvdmUuXG4vL1xuZnVuY3Rpb24gc2VlZHJhbmRvbShzZWVkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIga2V5ID0gW107XG4gIG9wdGlvbnMgPSAob3B0aW9ucyA9PSB0cnVlKSA/IHsgZW50cm9weTogdHJ1ZSB9IDogKG9wdGlvbnMgfHwge30pO1xuXG4gIC8vIEZsYXR0ZW4gdGhlIHNlZWQgc3RyaW5nIG9yIGJ1aWxkIG9uZSBmcm9tIGxvY2FsIGVudHJvcHkgaWYgbmVlZGVkLlxuICB2YXIgc2hvcnRzZWVkID0gbWl4a2V5KGZsYXR0ZW4oXG4gICAgb3B0aW9ucy5lbnRyb3B5ID8gW3NlZWQsIHRvc3RyaW5nKHBvb2wpXSA6XG4gICAgKHNlZWQgPT0gbnVsbCkgPyBhdXRvc2VlZCgpIDogc2VlZCwgMyksIGtleSk7XG5cbiAgLy8gVXNlIHRoZSBzZWVkIHRvIGluaXRpYWxpemUgYW4gQVJDNCBnZW5lcmF0b3IuXG4gIHZhciBhcmM0ID0gbmV3IEFSQzQoa2V5KTtcblxuICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSByYW5kb20gZG91YmxlIGluIFswLCAxKSB0aGF0IGNvbnRhaW5zXG4gIC8vIHJhbmRvbW5lc3MgaW4gZXZlcnkgYml0IG9mIHRoZSBtYW50aXNzYSBvZiB0aGUgSUVFRSA3NTQgdmFsdWUuXG4gIHZhciBwcm5nID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG4gPSBhcmM0LmcoY2h1bmtzKSwgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCBhIG51bWVyYXRvciBuIDwgMiBeIDQ4XG4gICAgICAgIGQgPSBzdGFydGRlbm9tLCAgICAgICAgICAgICAgICAgLy8gICBhbmQgZGVub21pbmF0b3IgZCA9IDIgXiA0OC5cbiAgICAgICAgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGFuZCBubyAnZXh0cmEgbGFzdCBieXRlJy5cbiAgICB3aGlsZSAobiA8IHNpZ25pZmljYW5jZSkgeyAgICAgICAgICAvLyBGaWxsIHVwIGFsbCBzaWduaWZpY2FudCBkaWdpdHMgYnlcbiAgICAgIG4gPSAobiArIHgpICogd2lkdGg7ICAgICAgICAgICAgICAvLyAgIHNoaWZ0aW5nIG51bWVyYXRvciBhbmRcbiAgICAgIGQgKj0gd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGRlbm9taW5hdG9yIGFuZCBnZW5lcmF0aW5nIGFcbiAgICAgIHggPSBhcmM0LmcoMSk7ICAgICAgICAgICAgICAgICAgICAvLyAgIG5ldyBsZWFzdC1zaWduaWZpY2FudC1ieXRlLlxuICAgIH1cbiAgICB3aGlsZSAobiA+PSBvdmVyZmxvdykgeyAgICAgICAgICAgICAvLyBUbyBhdm9pZCByb3VuZGluZyB1cCwgYmVmb3JlIGFkZGluZ1xuICAgICAgbiAvPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbGFzdCBieXRlLCBzaGlmdCBldmVyeXRoaW5nXG4gICAgICBkIC89IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByaWdodCB1c2luZyBpbnRlZ2VyIG1hdGggdW50aWxcbiAgICAgIHggPj4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdlIGhhdmUgZXhhY3RseSB0aGUgZGVzaXJlZCBiaXRzLlxuICAgIH1cbiAgICByZXR1cm4gKG4gKyB4KSAvIGQ7ICAgICAgICAgICAgICAgICAvLyBGb3JtIHRoZSBudW1iZXIgd2l0aGluIFswLCAxKS5cbiAgfTtcblxuICBwcm5nLmludDMyID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcmM0LmcoNCkgfCAwOyB9XG4gIHBybmcucXVpY2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGFyYzQuZyg0KSAvIDB4MTAwMDAwMDAwOyB9XG4gIHBybmcuZG91YmxlID0gcHJuZztcblxuICAvLyBNaXggdGhlIHJhbmRvbW5lc3MgaW50byBhY2N1bXVsYXRlZCBlbnRyb3B5LlxuICBtaXhrZXkodG9zdHJpbmcoYXJjNC5TKSwgcG9vbCk7XG5cbiAgLy8gQ2FsbGluZyBjb252ZW50aW9uOiB3aGF0IHRvIHJldHVybiBhcyBhIGZ1bmN0aW9uIG9mIHBybmcsIHNlZWQsIGlzX21hdGguXG4gIHJldHVybiAob3B0aW9ucy5wYXNzIHx8IGNhbGxiYWNrIHx8XG4gICAgICBmdW5jdGlvbihwcm5nLCBzZWVkLCBpc19tYXRoX2NhbGwsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIC8vIExvYWQgdGhlIGFyYzQgc3RhdGUgZnJvbSB0aGUgZ2l2ZW4gc3RhdGUgaWYgaXQgaGFzIGFuIFMgYXJyYXkuXG4gICAgICAgICAgaWYgKHN0YXRlLlMpIHsgY29weShzdGF0ZSwgYXJjNCk7IH1cbiAgICAgICAgICAvLyBPbmx5IHByb3ZpZGUgdGhlIC5zdGF0ZSBtZXRob2QgaWYgcmVxdWVzdGVkIHZpYSBvcHRpb25zLnN0YXRlLlxuICAgICAgICAgIHBybmcuc3RhdGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvcHkoYXJjNCwge30pOyB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBjYWxsZWQgYXMgYSBtZXRob2Qgb2YgTWF0aCAoTWF0aC5zZWVkcmFuZG9tKCkpLCBtdXRhdGVcbiAgICAgICAgLy8gTWF0aC5yYW5kb20gYmVjYXVzZSB0aGF0IGlzIGhvdyBzZWVkcmFuZG9tLmpzIGhhcyB3b3JrZWQgc2luY2UgdjEuMC5cbiAgICAgICAgaWYgKGlzX21hdGhfY2FsbCkgeyBtYXRoW3JuZ25hbWVdID0gcHJuZzsgcmV0dXJuIHNlZWQ7IH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIGl0IGlzIGEgbmV3ZXIgY2FsbGluZyBjb252ZW50aW9uLCBzbyByZXR1cm4gdGhlXG4gICAgICAgIC8vIHBybmcgZGlyZWN0bHkuXG4gICAgICAgIGVsc2UgcmV0dXJuIHBybmc7XG4gICAgICB9KShcbiAgcHJuZyxcbiAgc2hvcnRzZWVkLFxuICAnZ2xvYmFsJyBpbiBvcHRpb25zID8gb3B0aW9ucy5nbG9iYWwgOiAodGhpcyA9PSBtYXRoKSxcbiAgb3B0aW9ucy5zdGF0ZSk7XG59XG5tYXRoWydzZWVkJyArIHJuZ25hbWVdID0gc2VlZHJhbmRvbTtcblxuLy9cbi8vIEFSQzRcbi8vXG4vLyBBbiBBUkM0IGltcGxlbWVudGF0aW9uLiAgVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEga2V5IGluIHRoZSBmb3JtIG9mXG4vLyBhbiBhcnJheSBvZiBhdCBtb3N0ICh3aWR0aCkgaW50ZWdlcnMgdGhhdCBzaG91bGQgYmUgMCA8PSB4IDwgKHdpZHRoKS5cbi8vXG4vLyBUaGUgZyhjb3VudCkgbWV0aG9kIHJldHVybnMgYSBwc2V1ZG9yYW5kb20gaW50ZWdlciB0aGF0IGNvbmNhdGVuYXRlc1xuLy8gdGhlIG5leHQgKGNvdW50KSBvdXRwdXRzIGZyb20gQVJDNC4gIEl0cyByZXR1cm4gdmFsdWUgaXMgYSBudW1iZXIgeFxuLy8gdGhhdCBpcyBpbiB0aGUgcmFuZ2UgMCA8PSB4IDwgKHdpZHRoIF4gY291bnQpLlxuLy9cbmZ1bmN0aW9uIEFSQzQoa2V5KSB7XG4gIHZhciB0LCBrZXlsZW4gPSBrZXkubGVuZ3RoLFxuICAgICAgbWUgPSB0aGlzLCBpID0gMCwgaiA9IG1lLmkgPSBtZS5qID0gMCwgcyA9IG1lLlMgPSBbXTtcblxuICAvLyBUaGUgZW1wdHkga2V5IFtdIGlzIHRyZWF0ZWQgYXMgWzBdLlxuICBpZiAoIWtleWxlbikgeyBrZXkgPSBba2V5bGVuKytdOyB9XG5cbiAgLy8gU2V0IHVwIFMgdXNpbmcgdGhlIHN0YW5kYXJkIGtleSBzY2hlZHVsaW5nIGFsZ29yaXRobS5cbiAgd2hpbGUgKGkgPCB3aWR0aCkge1xuICAgIHNbaV0gPSBpKys7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICBzW2ldID0gc1tqID0gbWFzayAmIChqICsga2V5W2kgJSBrZXlsZW5dICsgKHQgPSBzW2ldKSldO1xuICAgIHNbal0gPSB0O1xuICB9XG5cbiAgLy8gVGhlIFwiZ1wiIG1ldGhvZCByZXR1cm5zIHRoZSBuZXh0IChjb3VudCkgb3V0cHV0cyBhcyBvbmUgbnVtYmVyLlxuICAobWUuZyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgLy8gVXNpbmcgaW5zdGFuY2UgbWVtYmVycyBpbnN0ZWFkIG9mIGNsb3N1cmUgc3RhdGUgbmVhcmx5IGRvdWJsZXMgc3BlZWQuXG4gICAgdmFyIHQsIHIgPSAwLFxuICAgICAgICBpID0gbWUuaSwgaiA9IG1lLmosIHMgPSBtZS5TO1xuICAgIHdoaWxlIChjb3VudC0tKSB7XG4gICAgICB0ID0gc1tpID0gbWFzayAmIChpICsgMSldO1xuICAgICAgciA9IHIgKiB3aWR0aCArIHNbbWFzayAmICgoc1tpXSA9IHNbaiA9IG1hc2sgJiAoaiArIHQpXSkgKyAoc1tqXSA9IHQpKV07XG4gICAgfVxuICAgIG1lLmkgPSBpOyBtZS5qID0gajtcbiAgICByZXR1cm4gcjtcbiAgICAvLyBGb3Igcm9idXN0IHVucHJlZGljdGFiaWxpdHksIHRoZSBmdW5jdGlvbiBjYWxsIGJlbG93IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBkaXNjYXJkcyBhbiBpbml0aWFsIGJhdGNoIG9mIHZhbHVlcy4gIFRoaXMgaXMgY2FsbGVkIFJDNC1kcm9wWzI1Nl0uXG4gICAgLy8gU2VlIGh0dHA6Ly9nb29nbGUuY29tL3NlYXJjaD9xPXJzYStmbHVocmVyK3Jlc3BvbnNlJmJ0bklcbiAgfSkod2lkdGgpO1xufVxuXG4vL1xuLy8gY29weSgpXG4vLyBDb3BpZXMgaW50ZXJuYWwgc3RhdGUgb2YgQVJDNCB0byBvciBmcm9tIGEgcGxhaW4gb2JqZWN0LlxuLy9cbmZ1bmN0aW9uIGNvcHkoZiwgdCkge1xuICB0LmkgPSBmLmk7XG4gIHQuaiA9IGYuajtcbiAgdC5TID0gZi5TLnNsaWNlKCk7XG4gIHJldHVybiB0O1xufTtcblxuLy9cbi8vIGZsYXR0ZW4oKVxuLy8gQ29udmVydHMgYW4gb2JqZWN0IHRyZWUgdG8gbmVzdGVkIGFycmF5cyBvZiBzdHJpbmdzLlxuLy9cbmZ1bmN0aW9uIGZsYXR0ZW4ob2JqLCBkZXB0aCkge1xuICB2YXIgcmVzdWx0ID0gW10sIHR5cCA9ICh0eXBlb2Ygb2JqKSwgcHJvcDtcbiAgaWYgKGRlcHRoICYmIHR5cCA9PSAnb2JqZWN0Jykge1xuICAgIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICAgIHRyeSB7IHJlc3VsdC5wdXNoKGZsYXR0ZW4ob2JqW3Byb3BdLCBkZXB0aCAtIDEpKTsgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gIH1cbiAgcmV0dXJuIChyZXN1bHQubGVuZ3RoID8gcmVzdWx0IDogdHlwID09ICdzdHJpbmcnID8gb2JqIDogb2JqICsgJ1xcMCcpO1xufVxuXG4vL1xuLy8gbWl4a2V5KClcbi8vIE1peGVzIGEgc3RyaW5nIHNlZWQgaW50byBhIGtleSB0aGF0IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLCBhbmRcbi8vIHJldHVybnMgYSBzaG9ydGVuZWQgc3RyaW5nIHNlZWQgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoZSByZXN1bHQga2V5LlxuLy9cbmZ1bmN0aW9uIG1peGtleShzZWVkLCBrZXkpIHtcbiAgdmFyIHN0cmluZ3NlZWQgPSBzZWVkICsgJycsIHNtZWFyLCBqID0gMDtcbiAgd2hpbGUgKGogPCBzdHJpbmdzZWVkLmxlbmd0aCkge1xuICAgIGtleVttYXNrICYgal0gPVxuICAgICAgbWFzayAmICgoc21lYXIgXj0ga2V5W21hc2sgJiBqXSAqIDE5KSArIHN0cmluZ3NlZWQuY2hhckNvZGVBdChqKyspKTtcbiAgfVxuICByZXR1cm4gdG9zdHJpbmcoa2V5KTtcbn1cblxuLy9cbi8vIGF1dG9zZWVkKClcbi8vIFJldHVybnMgYW4gb2JqZWN0IGZvciBhdXRvc2VlZGluZywgdXNpbmcgd2luZG93LmNyeXB0byBhbmQgTm9kZSBjcnlwdG9cbi8vIG1vZHVsZSBpZiBhdmFpbGFibGUuXG4vL1xuZnVuY3Rpb24gYXV0b3NlZWQoKSB7XG4gIHRyeSB7XG4gICAgdmFyIG91dDtcbiAgICBpZiAobm9kZWNyeXB0byAmJiAob3V0ID0gbm9kZWNyeXB0by5yYW5kb21CeXRlcykpIHtcbiAgICAgIC8vIFRoZSB1c2Ugb2YgJ291dCcgdG8gcmVtZW1iZXIgcmFuZG9tQnl0ZXMgbWFrZXMgdGlnaHQgbWluaWZpZWQgY29kZS5cbiAgICAgIG91dCA9IG91dCh3aWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICAgIChnbG9iYWwuY3J5cHRvIHx8IGdsb2JhbC5tc0NyeXB0bykuZ2V0UmFuZG9tVmFsdWVzKG91dCk7XG4gICAgfVxuICAgIHJldHVybiB0b3N0cmluZyhvdXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIGJyb3dzZXIgPSBnbG9iYWwubmF2aWdhdG9yLFxuICAgICAgICBwbHVnaW5zID0gYnJvd3NlciAmJiBicm93c2VyLnBsdWdpbnM7XG4gICAgcmV0dXJuIFsrbmV3IERhdGUsIGdsb2JhbCwgcGx1Z2lucywgZ2xvYmFsLnNjcmVlbiwgdG9zdHJpbmcocG9vbCldO1xuICB9XG59XG5cbi8vXG4vLyB0b3N0cmluZygpXG4vLyBDb252ZXJ0cyBhbiBhcnJheSBvZiBjaGFyY29kZXMgdG8gYSBzdHJpbmdcbi8vXG5mdW5jdGlvbiB0b3N0cmluZyhhKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KDAsIGEpO1xufVxuXG4vL1xuLy8gV2hlbiBzZWVkcmFuZG9tLmpzIGlzIGxvYWRlZCwgd2UgaW1tZWRpYXRlbHkgbWl4IGEgZmV3IGJpdHNcbi8vIGZyb20gdGhlIGJ1aWx0LWluIFJORyBpbnRvIHRoZSBlbnRyb3B5IHBvb2wuICBCZWNhdXNlIHdlIGRvXG4vLyBub3Qgd2FudCB0byBpbnRlcmZlcmUgd2l0aCBkZXRlcm1pbmlzdGljIFBSTkcgc3RhdGUgbGF0ZXIsXG4vLyBzZWVkcmFuZG9tIHdpbGwgbm90IGNhbGwgbWF0aC5yYW5kb20gb24gaXRzIG93biBhZ2FpbiBhZnRlclxuLy8gaW5pdGlhbGl6YXRpb24uXG4vL1xubWl4a2V5KG1hdGgucmFuZG9tKCksIHBvb2wpO1xuXG4vL1xuLy8gTm9kZWpzIGFuZCBBTUQgc3VwcG9ydDogZXhwb3J0IHRoZSBpbXBsZW1lbnRhdGlvbiBhcyBhIG1vZHVsZSB1c2luZ1xuLy8gZWl0aGVyIGNvbnZlbnRpb24uXG4vL1xuaWYgKCh0eXBlb2YgbW9kdWxlKSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNlZWRyYW5kb207XG4gIC8vIFdoZW4gaW4gbm9kZS5qcywgdHJ5IHVzaW5nIGNyeXB0byBwYWNrYWdlIGZvciBhdXRvc2VlZGluZy5cbiAgdHJ5IHtcbiAgICBub2RlY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gIH0gY2F0Y2ggKGV4KSB7fVxufSBlbHNlIGlmICgodHlwZW9mIGRlZmluZSkgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIHNlZWRyYW5kb207IH0pO1xufVxuXG4vLyBFbmQgYW5vbnltb3VzIHNjb3BlLCBhbmQgcGFzcyBpbml0aWFsIHZhbHVlcy5cbn0pKFxuICBbXSwgICAgIC8vIHBvb2w6IGVudHJvcHkgcG9vbCBzdGFydHMgZW1wdHlcbiAgTWF0aCAgICAvLyBtYXRoOiBwYWNrYWdlIGNvbnRhaW5pbmcgcmFuZG9tLCBwb3csIGFuZCBzZWVkcmFuZG9tXG4pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/seedrandom/seedrandom.js\n"); - -/***/ }), - -/***/ "./node_modules/shuffle-seed/index.js": -/*!********************************************!*\ - !*** ./node_modules/shuffle-seed/index.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -eval("var seedrandom = __webpack_require__(/*! seedrandom */ \"./node_modules/seedrandom/index.js\");\nvar self = __webpack_require__(/*! ./shuffle-seed */ \"./node_modules/shuffle-seed/shuffle-seed.js\");\n\nmodule.exports = self;\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2h1ZmZsZS1zZWVkL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLHNEQUFZO0FBQ3JDLFdBQVcsbUJBQU8sQ0FBQyxtRUFBZ0I7O0FBRW5DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL25vZGVfbW9kdWxlcy9zaHVmZmxlLXNlZWQvaW5kZXguanM/YzhjYiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2VlZHJhbmRvbSA9IHJlcXVpcmUoJ3NlZWRyYW5kb20nKTtcbnZhciBzZWxmID0gcmVxdWlyZSgnLi9zaHVmZmxlLXNlZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/shuffle-seed/index.js\n"); - -/***/ }), - -/***/ "./node_modules/shuffle-seed/shuffle-seed.js": -/*!***************************************************!*\ - !*** ./node_modules/shuffle-seed/shuffle-seed.js ***! - \***************************************************/ -/***/ (function(module) { - -eval(";(function() {\n\tvar self = {};\n\n\tif(Math.seedrandom) seedrandom = Math.seedrandom;\n\n\tvar isArray = function($){\n\t\treturn Object.prototype.toString.call( $ ) === '[object Array]'\n\t}\n\n\tvar extend = function(obj) {\n\t\tfor (var i = 1; i < arguments.length; i++) for (var key in arguments[i]) obj[key] = arguments[i][key];\n\t\treturn obj;\n\t}\n\n\tvar seedify = function(seed){\n\t\tif (/(number|string)/i.test(Object.prototype.toString.call(seed).match(/^\\[object (.*)\\]$/)[1])) return seed;\n\t\tif (isNaN(seed)) return Number(String((this.strSeed = seed)).split('').map(function(x){return x.charCodeAt(0)}).join(''));\n\t\treturn seed;\n\t}\n\n\tvar seedRand = function(func,min,max){\n\t\treturn Math.floor(func() * (max - min + 1)) + min;\n\t}\n\n\tself.shuffle = function(arr,seed){\n\t\tif (!isArray(arr)) return null;\n\t\tseed = seedify(seed) || 'none';\n\n\t\tvar size = arr.length;\n\t\tvar rng = seedrandom(seed);\n\t\tvar resp = [];\n\t\tvar keys = [];\n\n\t\tfor(var i=0;i { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../../../../node_modules/css-loader/dist/cjs.js!../../../../../../../node_modules/sass-loader/dist/cjs.js!./index.scss */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/sass-loader/dist/cjs.js!./src/assessment/extensions/ui/themes/juniorQuest/sass/index.scss\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\n\n options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\n \noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\n\n\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_node_modules_sass_loader_dist_cjs_js_index_scss__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3VpL3RoZW1lcy9qdW5pb3JRdWVzdC9zYXNzL2luZGV4LnNjc3MiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsTUFBaUg7QUFDakgsTUFBdUc7QUFDdkcsTUFBOEc7QUFDOUcsTUFBaUk7QUFDakksTUFBMEg7QUFDMUgsTUFBMEg7QUFDMUgsTUFBZ0w7QUFDaEw7QUFDQTs7QUFFQTs7QUFFQSw0QkFBNEIscUdBQW1CO0FBQy9DLHdCQUF3QixrSEFBYTs7QUFFckMsdUJBQXVCLHVHQUFhO0FBQ3BDO0FBQ0EsaUJBQWlCLCtGQUFNO0FBQ3ZCLDZCQUE2QixzR0FBa0I7O0FBRS9DLGFBQWEsMEdBQUcsQ0FBQyw0SEFBTzs7OztBQUkwSDtBQUNsSixPQUFPLGlFQUFlLDRIQUFPLElBQUksNEhBQU8sVUFBVSw0SEFBTyxtQkFBbUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3VpL3RoZW1lcy9qdW5pb3JRdWVzdC9zYXNzL2luZGV4LnNjc3M/MGE3NiJdLCJzb3VyY2VzQ29udGVudCI6WyJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LnNjc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvZGlzdC9janMuanMhLi9pbmRleC5zY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/extensions/ui/themes/juniorQuest/sass/index.scss\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": -/*!****************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! - \****************************************************************************/ -/***/ ((module) => { - -eval("\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw2QkFBNkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzPzJkYmEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": -/*!********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! - \********************************************************************/ -/***/ ((module) => { - -eval("\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzP2IyMTQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertBySelector.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": -/*!**********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! - \**********************************************************************/ -/***/ ((module) => { - -eval("\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanM/ZGU2YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertStyleElement.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! - \**********************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -eval("\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLGNBQWMsS0FBd0MsR0FBRyxzQkFBaUIsR0FBRyxDQUFJO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzP2RkY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": -/*!***************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! - \***************************************************************/ -/***/ ((module) => { - -eval("\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcz9lNDc5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleDomAPI.js\n"); - -/***/ }), - -/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": -/*!*********************************************************************!*\ - !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! - \*********************************************************************/ -/***/ ((module) => { - -eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcz8xZGRlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleTagTransform.js\n"); - -/***/ }), - -/***/ "./src/assessment/core.js": -/*!********************************!*\ - !*** ./src/assessment/core.js ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LT: () => (/* binding */ LT)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _core_diagnostics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./core/diagnostics */ \"./src/assessment/core/diagnostics.js\");\n/* harmony import */ var _core_items__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./core/items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _core_player__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./core/player */ \"./src/assessment/core/player.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./core/questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var _core_sections__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./core/sections */ \"./src/assessment/core/sections.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/logger */ \"./src/utils/logger.js\");\n\n\n\n\n\n\n\n\n\nconst utils = {\n utils: {\n logger: _utils_logger__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n },\n};\n\nconst LT = { ..._core_app__WEBPACK_IMPORTED_MODULE_0__, ..._core_items__WEBPACK_IMPORTED_MODULE_3__, ..._core_activity__WEBPACK_IMPORTED_MODULE_1__, ..._core_player__WEBPACK_IMPORTED_MODULE_4__, ..._core_questions__WEBPACK_IMPORTED_MODULE_5__, ..._core_sections__WEBPACK_IMPORTED_MODULE_6__, ..._core_diagnostics__WEBPACK_IMPORTED_MODULE_2__, ...utils };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFrQztBQUNVO0FBQ007QUFDWjtBQUNFO0FBQ007QUFDRjtBQUNQOztBQUVyQztBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTDs7QUFFTyxhQUFhLEdBQUcsc0NBQUcsS0FBSyx3Q0FBSyxLQUFLLDJDQUFRLEtBQUsseUNBQU0sS0FBSyw0Q0FBUyxLQUFLLDJDQUFRLEtBQUssOENBQVciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvY29yZS5qcz84NGE3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuL2NvcmUvYXBwJztcbmltcG9ydCAqIGFzIGFjdGl2aXR5IGZyb20gJy4vY29yZS9hY3Rpdml0eSc7XG5pbXBvcnQgKiBhcyBkaWFnbm9zdGljcyBmcm9tICcuL2NvcmUvZGlhZ25vc3RpY3MnO1xuaW1wb3J0ICogYXMgaXRlbXMgZnJvbSAnLi9jb3JlL2l0ZW1zJztcbmltcG9ydCAqIGFzIHBsYXllciBmcm9tICcuL2NvcmUvcGxheWVyJztcbmltcG9ydCAqIGFzIHF1ZXN0aW9ucyBmcm9tICcuL2NvcmUvcXVlc3Rpb25zJztcbmltcG9ydCAqIGFzIHNlY3Rpb25zIGZyb20gJy4vY29yZS9zZWN0aW9ucyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5cbmNvbnN0IHV0aWxzID0ge1xuICAgIHV0aWxzOiB7XG4gICAgICAgIGxvZ2dlcixcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IExUID0geyAuLi5hcHAsIC4uLml0ZW1zLCAuLi5hY3Rpdml0eSwgLi4ucGxheWVyLCAuLi5xdWVzdGlvbnMsIC4uLnNlY3Rpb25zLCAuLi5kaWFnbm9zdGljcywgLi4udXRpbHMgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/core.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/activity.js": -/*!*****************************************!*\ - !*** ./src/assessment/core/activity.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ activity: () => (/* binding */ activity),\n/* harmony export */ activityId: () => (/* binding */ activityId),\n/* harmony export */ activitySubTitle: () => (/* binding */ activitySubTitle),\n/* harmony export */ activityTags: () => (/* binding */ activityTags),\n/* harmony export */ activityTemplateId: () => (/* binding */ activityTemplateId),\n/* harmony export */ activityTitle: () => (/* binding */ activityTitle),\n/* harmony export */ adaptiveType: () => (/* binding */ adaptiveType),\n/* harmony export */ annotationsConfig: () => (/* binding */ annotationsConfig),\n/* harmony export */ autoSaveConfig: () => (/* binding */ autoSaveConfig),\n/* harmony export */ elapsedTime: () => (/* binding */ elapsedTime),\n/* harmony export */ hasActivityTemplate: () => (/* binding */ hasActivityTemplate),\n/* harmony export */ hasAnnotations: () => (/* binding */ hasAnnotations),\n/* harmony export */ hasAutoSave: () => (/* binding */ hasAutoSave),\n/* harmony export */ hasEvents: () => (/* binding */ hasEvents),\n/* harmony export */ hasItemPool: () => (/* binding */ hasItemPool),\n/* harmony export */ hasResourceItems: () => (/* binding */ hasResourceItems),\n/* harmony export */ hasSections: () => (/* binding */ hasSections),\n/* harmony export */ hasShuffledItems: () => (/* binding */ hasShuffledItems),\n/* harmony export */ hasTryAgain: () => (/* binding */ hasTryAgain),\n/* harmony export */ isAdaptive: () => (/* binding */ isAdaptive),\n/* harmony export */ isResuming: () => (/* binding */ isResuming),\n/* harmony export */ itemBank: () => (/* binding */ itemBank),\n/* harmony export */ itemPool: () => (/* binding */ itemPool),\n/* harmony export */ maxTime: () => (/* binding */ maxTime),\n/* harmony export */ region: () => (/* binding */ region),\n/* harmony export */ resourceItems: () => (/* binding */ resourceItems),\n/* harmony export */ sessionId: () => (/* binding */ sessionId),\n/* harmony export */ state: () => (/* binding */ state),\n/* harmony export */ timeRemaining: () => (/* binding */ timeRemaining),\n/* harmony export */ totalItems: () => (/* binding */ totalItems),\n/* harmony export */ userId: () => (/* binding */ userId)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _sections__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sections */ \"./src/assessment/core/sections.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n\n\n\n\n/**\n * Everything relating to the activity currently\n * loaded by Items API.\n * @module Assessment/Activity\n */\n\n/**\n * The activity configuration object, including anything\n * overridden at runtime if using activity templates.\n * @since 0.1.0\n * @returns {object}\n */\nfunction activity() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getActivity();\n}\n\n/**\n * The activity id used for this activity instance\n * used to group related sessions.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activityId() {\n return activity().activity_id;\n}\n\n/**\n * The `activity_template_id` if templates are used.\n * Returns '' if templates aren't being used.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activityTemplateId() {\n return activity().activity_template_id;\n}\n\n/**\n * The visible title from the configuration object.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activityTitle() {\n return activity().config.title;\n}\n\n/**\n * The visible subtitle from the configuration object.\n * @since 0.1.0\n * @returns {string}\n */\nfunction activitySubTitle() {\n return activity().config.subtitle;\n}\n\n/**\n * All tags that have been set against items in the activity.\n * Requires `retrieve_tags` to be set to `true` in the\n * Items API configuration.\n * @since 2.9.0\n * @returns {array}\n */\nfunction activityTags() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getTags();\n}\n\n/**\n * The adaptive type as defined in the configuration.\n * Returns '' if the activity isn't adaptive.\n * @since 0.1.0\n * @returns {string}\n */\nfunction adaptiveType() {\n if (isAdaptive() && activity().adaptive.hasOwnProperty('type')) {\n return activity().adaptive.type;\n } else {\n return '';\n }\n}\n\n/**\n * The annotations configuration object.\n * @since 0.1.0\n * @returns {object}\n */\nfunction annotationsConfig() {\n return hasAnnotations() && activity()?.config?.annotations_api_init_options ? activity().config.annotations_api_init_options : {};\n}\n\n/**\n * The auto-save configuration object. Returns `true` or an\n * object based on what was in the configuration.\n * @since 0.1.0\n * @returns {boolean | object}\n */\nfunction autoSaveConfig() {\n const a = activity();\n return a?.config?.navigation?.auto_save ? a.config.navigation.auto_save : {};\n}\n\n/**\n * The current elapsed time for the session. Returns whether\n * the timer is visible or not.\n * @since 2.6.0\n * @returns {number}\n */\nfunction elapsedTime() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getTime();\n}\n\n/**\n * Whether this activity was loaded from an activity template.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasActivityTemplate() {\n return activity().hasOwnProperty('activity_template_id');\n}\n\n/**\n * Whether annotations have been configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasAnnotations() {\n const a = activity();\n return Boolean(a?.config?.annotations === true || a?.config?.annotations_api_init_options);\n}\n\n/**\n * Whether auto-save is configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasAutoSave() {\n const a = activity();\n return (\n a.hasOwnProperty('config') &&\n a.config.hasOwnProperty('navigation') &&\n a.config.navigation.hasOwnProperty('auto_save') &&\n a.config.navigation.auto_save !== false\n );\n}\n\n/**\n * Whether items have been shuffled within this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasShuffledItems() {\n return Boolean(activity()?.config?.configuration?.shuffle_items);\n}\n\n/**\n * Whether events have been configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasEvents() {\n const a = activity();\n return a.hasOwnProperty('events') && a.events !== false;\n}\n\n/**\n * Whether an item pool has been configured with this activity.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasItemPool() {\n const a = activity();\n return a.hasOwnProperty('item_pool_id');\n}\n\n/**\n * Whether this activity contains resource item(s).\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasResourceItems() {\n return Boolean(activity()?.config?.navigation?.resource_items);\n}\n\n/**\n * Whether this activity contains sections.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction hasSections() {\n return activity().hasOwnProperty('sections');\n}\n\n/**\n * Whether the activity has try again enabled.\n * @since 1.4.0\n * @returns {boolean}\n */\nfunction hasTryAgain() {\n return activity()?.dynamic_items.hasOwnProperty('try_again');\n}\n\n/**\n * Whether this activity is adaptive.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isAdaptive() {\n return activity().hasOwnProperty('adaptive');\n}\n\n/**\n * Whether the user is resuming the session.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isResuming() {\n return activity().existing_session;\n}\n\n/**\n * The global `organisation_id` used for this activity instance.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemBank() {\n return activity()?.organisation_id;\n}\n\n/**\n * The `item_pool_id` used for this activity instance.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemPool() {\n return activity()?.item_pool_id;\n}\n\n/**\n * The maximum time allowed for this session. If `0`, it\n * means unlimited time.\n * @since 2.6.0\n * @returns {number}\n */\nfunction maxTime() {\n return activity()?.config?.time?.max_time ? activity().config.time.max_time : 0;\n}\n\n/**\n * Which UI region the session was set up with. Values include:\n * - `main`\n * - `horizontal`\n * - `horizontal-fixed`\n *\n * `undefined` will mean that no `regions` key was found in the\n * Items API configuration, meaning the player defaults to the\n * legacy UI region (not recommended).\n * @since 1.1.0\n * @returns {string}\n */\nfunction region() {\n return activity()?.config?.regions;\n}\n\n/**\n * The resource item references used for this activity instance.\n * @since 0.1.0\n * @returns {array}\n */\nfunction resourceItems() {\n return activity()?.config?.navigation?.resource_items;\n}\n\n/**\n * The `session_id` used for this activity instance.\n * @since 0.1.0\n * @returns {string}\n */\nfunction sessionId() {\n return activity()?.session_id;\n}\n\n/**\n * The current `state` of this activity instance. Possible\n * values:\n * - `initial`\n * - `resume`\n * - `review`\n * - `preview`\n * @since 0.1.0\n * @returns {string}\n */\nfunction state() {\n let s;\n switch (activity()?.state) {\n case undefined:\n s = 'initial';\n break;\n default:\n s = activity().state;\n break;\n }\n return s;\n}\n\n/**\n * The time remaining in the session. If `max_time` hasn't\n * been set, the session is unlimited, so this returns `null`.\n * @since 2.6.0\n * @returns {number|null}\n */\nfunction timeRemaining() {\n if (maxTime() === 0) return null;\n return maxTime() - elapsedTime();\n}\n\n/**\n * The total number of items in the activity, including\n * items within sections if relevant.\n * @since 0.1.0\n * @returns {number}\n */\nfunction totalItems() {\n if (hasSections()) {\n let numItems = 0;\n let allSections = _sections__WEBPACK_IMPORTED_MODULE_1__.sections();\n for (let i = 0; i < allSections.length; i++) {\n numItems += allSections[i].items.length;\n }\n return numItems;\n } else if (isAdaptive()) {\n if (activity().hasOwnProperty('items')) {\n return activity().items.length;\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info('This is an adaptive session, no items array found');\n return 0;\n }\n } else {\n return activity().items.length;\n }\n}\n\n/**\n * The `user_id` as defined in the configuration.\n * @since 0.1.0\n * @returns {string}\n */\nfunction userId() {\n return activity()?.user_id;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2FjdGl2aXR5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBNkI7QUFDVTtBQUNDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxXQUFXLDZDQUFlO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyw2Q0FBZTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLFdBQVcsNkNBQWU7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0EsMEJBQTBCLCtDQUFpQjtBQUMzQyx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsVUFBVTtBQUNWLFlBQVkscURBQU07QUFDbEI7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvYWN0aXZpdHkuanM/MzY3YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi9hcHAnO1xuaW1wb3J0ICogYXMgc2VjdGlvbnMgZnJvbSAnLi9zZWN0aW9ucyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5cbi8qKlxuICogRXZlcnl0aGluZyByZWxhdGluZyB0byB0aGUgYWN0aXZpdHkgY3VycmVudGx5XG4gKiBsb2FkZWQgYnkgSXRlbXMgQVBJLlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L0FjdGl2aXR5XG4gKi9cblxuLyoqXG4gKiBUaGUgYWN0aXZpdHkgY29uZmlndXJhdGlvbiBvYmplY3QsIGluY2x1ZGluZyBhbnl0aGluZ1xuICogb3ZlcnJpZGRlbiBhdCBydW50aW1lIGlmIHVzaW5nIGFjdGl2aXR5IHRlbXBsYXRlcy5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdGl2aXR5KCkge1xuICAgIHJldHVybiBhcHAuYXBwSW5zdGFuY2UoKS5nZXRBY3Rpdml0eSgpO1xufVxuXG4vKipcbiAqIFRoZSBhY3Rpdml0eSBpZCB1c2VkIGZvciB0aGlzIGFjdGl2aXR5IGluc3RhbmNlXG4gKiB1c2VkIHRvIGdyb3VwIHJlbGF0ZWQgc2Vzc2lvbnMuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3Rpdml0eUlkKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmFjdGl2aXR5X2lkO1xufVxuXG4vKipcbiAqIFRoZSBgYWN0aXZpdHlfdGVtcGxhdGVfaWRgIGlmIHRlbXBsYXRlcyBhcmUgdXNlZC5cbiAqIFJldHVybnMgJycgaWYgdGVtcGxhdGVzIGFyZW4ndCBiZWluZyB1c2VkLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZpdHlUZW1wbGF0ZUlkKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmFjdGl2aXR5X3RlbXBsYXRlX2lkO1xufVxuXG4vKipcbiAqIFRoZSB2aXNpYmxlIHRpdGxlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZpdHlUaXRsZSgpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKS5jb25maWcudGl0bGU7XG59XG5cbi8qKlxuICogVGhlIHZpc2libGUgc3VidGl0bGUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3Rpdml0eVN1YlRpdGxlKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmNvbmZpZy5zdWJ0aXRsZTtcbn1cblxuLyoqXG4gKiBBbGwgdGFncyB0aGF0IGhhdmUgYmVlbiBzZXQgYWdhaW5zdCBpdGVtcyBpbiB0aGUgYWN0aXZpdHkuXG4gKiBSZXF1aXJlcyBgcmV0cmlldmVfdGFnc2AgdG8gYmUgc2V0IHRvIGB0cnVlYCBpbiB0aGVcbiAqIEl0ZW1zIEFQSSBjb25maWd1cmF0aW9uLlxuICogQHNpbmNlIDIuOS4wXG4gKiBAcmV0dXJucyB7YXJyYXl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3Rpdml0eVRhZ3MoKSB7XG4gICAgcmV0dXJuIGFwcC5hcHBJbnN0YW5jZSgpLmdldFRhZ3MoKTtcbn1cblxuLyoqXG4gKiBUaGUgYWRhcHRpdmUgdHlwZSBhcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uLlxuICogUmV0dXJucyAnJyBpZiB0aGUgYWN0aXZpdHkgaXNuJ3QgYWRhcHRpdmUuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGFwdGl2ZVR5cGUoKSB7XG4gICAgaWYgKGlzQWRhcHRpdmUoKSAmJiBhY3Rpdml0eSgpLmFkYXB0aXZlLmhhc093blByb3BlcnR5KCd0eXBlJykpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2aXR5KCkuYWRhcHRpdmUudHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBhbm5vdGF0aW9ucyBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25zQ29uZmlnKCkge1xuICAgIHJldHVybiBoYXNBbm5vdGF0aW9ucygpICYmIGFjdGl2aXR5KCk/LmNvbmZpZz8uYW5ub3RhdGlvbnNfYXBpX2luaXRfb3B0aW9ucyA/IGFjdGl2aXR5KCkuY29uZmlnLmFubm90YXRpb25zX2FwaV9pbml0X29wdGlvbnMgOiB7fTtcbn1cblxuLyoqXG4gKiBUaGUgYXV0by1zYXZlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBSZXR1cm5zIGB0cnVlYCBvciBhblxuICogb2JqZWN0IGJhc2VkIG9uIHdoYXQgd2FzIGluIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG9iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9TYXZlQ29uZmlnKCkge1xuICAgIGNvbnN0IGEgPSBhY3Rpdml0eSgpO1xuICAgIHJldHVybiBhPy5jb25maWc/Lm5hdmlnYXRpb24/LmF1dG9fc2F2ZSA/IGEuY29uZmlnLm5hdmlnYXRpb24uYXV0b19zYXZlIDoge307XG59XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZWxhcHNlZCB0aW1lIGZvciB0aGUgc2Vzc2lvbi4gUmV0dXJucyB3aGV0aGVyXG4gKiB0aGUgdGltZXIgaXMgdmlzaWJsZSBvciBub3QuXG4gKiBAc2luY2UgMi42LjBcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGFwc2VkVGltZSgpIHtcbiAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0VGltZSgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyBhY3Rpdml0eSB3YXMgbG9hZGVkIGZyb20gYW4gYWN0aXZpdHkgdGVtcGxhdGUuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQWN0aXZpdHlUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKS5oYXNPd25Qcm9wZXJ0eSgnYWN0aXZpdHlfdGVtcGxhdGVfaWQnKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFubm90YXRpb25zIGhhdmUgYmVlbiBjb25maWd1cmVkIHdpdGggdGhpcyBhY3Rpdml0eS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNBbm5vdGF0aW9ucygpIHtcbiAgICBjb25zdCBhID0gYWN0aXZpdHkoKTtcbiAgICByZXR1cm4gQm9vbGVhbihhPy5jb25maWc/LmFubm90YXRpb25zID09PSB0cnVlIHx8IGE/LmNvbmZpZz8uYW5ub3RhdGlvbnNfYXBpX2luaXRfb3B0aW9ucyk7XG59XG5cbi8qKlxuICogV2hldGhlciBhdXRvLXNhdmUgaXMgY29uZmlndXJlZCB3aXRoIHRoaXMgYWN0aXZpdHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQXV0b1NhdmUoKSB7XG4gICAgY29uc3QgYSA9IGFjdGl2aXR5KCk7XG4gICAgcmV0dXJuIChcbiAgICAgICAgYS5oYXNPd25Qcm9wZXJ0eSgnY29uZmlnJykgJiZcbiAgICAgICAgYS5jb25maWcuaGFzT3duUHJvcGVydHkoJ25hdmlnYXRpb24nKSAmJlxuICAgICAgICBhLmNvbmZpZy5uYXZpZ2F0aW9uLmhhc093blByb3BlcnR5KCdhdXRvX3NhdmUnKSAmJlxuICAgICAgICBhLmNvbmZpZy5uYXZpZ2F0aW9uLmF1dG9fc2F2ZSAhPT0gZmFsc2VcbiAgICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgaXRlbXMgaGF2ZSBiZWVuIHNodWZmbGVkIHdpdGhpbiB0aGlzIGFjdGl2aXR5LlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1NodWZmbGVkSXRlbXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYWN0aXZpdHkoKT8uY29uZmlnPy5jb25maWd1cmF0aW9uPy5zaHVmZmxlX2l0ZW1zKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGV2ZW50cyBoYXZlIGJlZW4gY29uZmlndXJlZCB3aXRoIHRoaXMgYWN0aXZpdHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRXZlbnRzKCkge1xuICAgIGNvbnN0IGEgPSBhY3Rpdml0eSgpO1xuICAgIHJldHVybiBhLmhhc093blByb3BlcnR5KCdldmVudHMnKSAmJiBhLmV2ZW50cyAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBpdGVtIHBvb2wgaGFzIGJlZW4gY29uZmlndXJlZCB3aXRoIHRoaXMgYWN0aXZpdHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSXRlbVBvb2woKSB7XG4gICAgY29uc3QgYSA9IGFjdGl2aXR5KCk7XG4gICAgcmV0dXJuIGEuaGFzT3duUHJvcGVydHkoJ2l0ZW1fcG9vbF9pZCcpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyBhY3Rpdml0eSBjb250YWlucyByZXNvdXJjZSBpdGVtKHMpLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc291cmNlSXRlbXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYWN0aXZpdHkoKT8uY29uZmlnPy5uYXZpZ2F0aW9uPy5yZXNvdXJjZV9pdGVtcyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIGFjdGl2aXR5IGNvbnRhaW5zIHNlY3Rpb25zLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1NlY3Rpb25zKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmhhc093blByb3BlcnR5KCdzZWN0aW9ucycpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGFjdGl2aXR5IGhhcyB0cnkgYWdhaW4gZW5hYmxlZC5cbiAqIEBzaW5jZSAxLjQuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUcnlBZ2FpbigpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKT8uZHluYW1pY19pdGVtcy5oYXNPd25Qcm9wZXJ0eSgndHJ5X2FnYWluJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIGFjdGl2aXR5IGlzIGFkYXB0aXZlLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWRhcHRpdmUoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCkuaGFzT3duUHJvcGVydHkoJ2FkYXB0aXZlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgdXNlciBpcyByZXN1bWluZyB0aGUgc2Vzc2lvbi5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3VtaW5nKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpLmV4aXN0aW5nX3Nlc3Npb247XG59XG5cbi8qKlxuICogVGhlIGdsb2JhbCBgb3JnYW5pc2F0aW9uX2lkYCB1c2VkIGZvciB0aGlzIGFjdGl2aXR5IGluc3RhbmNlLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlbUJhbmsoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/Lm9yZ2FuaXNhdGlvbl9pZDtcbn1cblxuLyoqXG4gKiBUaGUgYGl0ZW1fcG9vbF9pZGAgdXNlZCBmb3IgdGhpcyBhY3Rpdml0eSBpbnN0YW5jZS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1Qb29sKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpPy5pdGVtX3Bvb2xfaWQ7XG59XG5cbi8qKlxuICogVGhlIG1heGltdW0gdGltZSBhbGxvd2VkIGZvciB0aGlzIHNlc3Npb24uIElmIGAwYCwgaXRcbiAqIG1lYW5zIHVubGltaXRlZCB0aW1lLlxuICogQHNpbmNlIDIuNi4wXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4VGltZSgpIHtcbiAgICByZXR1cm4gYWN0aXZpdHkoKT8uY29uZmlnPy50aW1lPy5tYXhfdGltZSA/IGFjdGl2aXR5KCkuY29uZmlnLnRpbWUubWF4X3RpbWUgOiAwO1xufVxuXG4vKipcbiAqIFdoaWNoIFVJIHJlZ2lvbiB0aGUgc2Vzc2lvbiB3YXMgc2V0IHVwIHdpdGguIFZhbHVlcyBpbmNsdWRlOlxuICogLSBgbWFpbmBcbiAqIC0gYGhvcml6b250YWxgXG4gKiAtIGBob3Jpem9udGFsLWZpeGVkYFxuICpcbiAqIGB1bmRlZmluZWRgIHdpbGwgbWVhbiB0aGF0IG5vIGByZWdpb25zYCBrZXkgd2FzIGZvdW5kIGluIHRoZVxuICogSXRlbXMgQVBJIGNvbmZpZ3VyYXRpb24sIG1lYW5pbmcgdGhlIHBsYXllciBkZWZhdWx0cyB0byB0aGVcbiAqIGxlZ2FjeSBVSSByZWdpb24gKG5vdCByZWNvbW1lbmRlZCkuXG4gKiBAc2luY2UgMS4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb24oKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/LmNvbmZpZz8ucmVnaW9ucztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgaXRlbSByZWZlcmVuY2VzIHVzZWQgZm9yIHRoaXMgYWN0aXZpdHkgaW5zdGFuY2UuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHthcnJheX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc291cmNlSXRlbXMoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/LmNvbmZpZz8ubmF2aWdhdGlvbj8ucmVzb3VyY2VfaXRlbXM7XG59XG5cbi8qKlxuICogVGhlIGBzZXNzaW9uX2lkYCB1c2VkIGZvciB0aGlzIGFjdGl2aXR5IGluc3RhbmNlLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2Vzc2lvbklkKCkge1xuICAgIHJldHVybiBhY3Rpdml0eSgpPy5zZXNzaW9uX2lkO1xufVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IGBzdGF0ZWAgb2YgdGhpcyBhY3Rpdml0eSBpbnN0YW5jZS4gUG9zc2libGVcbiAqIHZhbHVlczpcbiAqICAtIGBpbml0aWFsYFxuICogIC0gYHJlc3VtZWBcbiAqICAtIGByZXZpZXdgXG4gKiAgLSBgcHJldmlld2BcbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXRlKCkge1xuICAgIGxldCBzO1xuICAgIHN3aXRjaCAoYWN0aXZpdHkoKT8uc3RhdGUpIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICBzID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzID0gYWN0aXZpdHkoKS5zdGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBUaGUgdGltZSByZW1haW5pbmcgaW4gdGhlIHNlc3Npb24uIElmIGBtYXhfdGltZWAgaGFzbid0XG4gKiBiZWVuIHNldCwgdGhlIHNlc3Npb24gaXMgdW5saW1pdGVkLCBzbyB0aGlzIHJldHVybnMgYG51bGxgLlxuICogQHNpbmNlIDIuNi4wXG4gKiBAcmV0dXJucyB7bnVtYmVyfG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lUmVtYWluaW5nKCkge1xuICAgIGlmIChtYXhUaW1lKCkgPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBtYXhUaW1lKCkgLSBlbGFwc2VkVGltZSgpO1xufVxuXG4vKipcbiAqIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFjdGl2aXR5LCBpbmNsdWRpbmdcbiAqIGl0ZW1zIHdpdGhpbiBzZWN0aW9ucyBpZiByZWxldmFudC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdGFsSXRlbXMoKSB7XG4gICAgaWYgKGhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgbGV0IG51bUl0ZW1zID0gMDtcbiAgICAgICAgbGV0IGFsbFNlY3Rpb25zID0gc2VjdGlvbnMuc2VjdGlvbnMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbnVtSXRlbXMgKz0gYWxsU2VjdGlvbnNbaV0uaXRlbXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1JdGVtcztcbiAgICB9IGVsc2UgaWYgKGlzQWRhcHRpdmUoKSkge1xuICAgICAgICBpZiAoYWN0aXZpdHkoKS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGl2aXR5KCkuaXRlbXMubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1RoaXMgaXMgYW4gYWRhcHRpdmUgc2Vzc2lvbiwgbm8gaXRlbXMgYXJyYXkgZm91bmQnKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2aXR5KCkuaXRlbXMubGVuZ3RoO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgYHVzZXJfaWRgIGFzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VySWQoKSB7XG4gICAgcmV0dXJuIGFjdGl2aXR5KCk/LnVzZXJfaWQ7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/core/activity.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/app.js": -/*!************************************!*\ - !*** ./src/assessment/core/app.js ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ annotationsApp: () => (/* binding */ annotationsApp),\n/* harmony export */ appInstance: () => (/* binding */ appInstance),\n/* harmony export */ assessApp: () => (/* binding */ assessApp),\n/* harmony export */ eventsApp: () => (/* binding */ eventsApp),\n/* harmony export */ init: () => (/* binding */ init),\n/* harmony export */ questionsApp: () => (/* binding */ questionsApp)\n/* harmony export */ });\n/* harmony import */ var _diagnostics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./diagnostics */ \"./src/assessment/core/diagnostics.js\");\n/* harmony import */ var _questions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questions */ \"./src/assessment/core/questions.js\");\n\n\n\n/**\n * Learnosity Toolkit constructor module.\n * @module Assessment/App\n */\n\nconst state = {};\n\n/**\n * Constructor method for Learnosity Toolkit.\n * @since 0.1.0\n * @param {object} app - Items API app instance\n * @example\n * // Declare and set your variable with the Items API LearnosityItems.init() method\n * const itemsApp = LearnosityItems.init(signedConfigObject);\n *\n * // Pass that app instance to the Toolkit constructor in the Items API readyListener()\n * import { LT } from '[path/to/tookit/index]';\n * LT.init(itemsApp);\n *\n * // Can be handy in the global scope for development\n * window.LT = LT;\n */\nfunction init(app) {\n state.app = app;\n setupListeners();\n}\n\n/**\n * Returns the Items API app instance that the host page declared.\n * @since 0.1.0\n * @returns {object}\n */\nfunction appInstance() {\n return state.app;\n}\n\n/**\n * The Annotations API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction annotationsApp() {\n return appInstance().annotationsApp() !== undefined ? appInstance().annotationsApp() : null;\n}\n\n/**\n * The Assess API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction assessApp() {\n return appInstance().assessApp();\n}\n\n/**\n * The Events API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction eventsApp() {\n return appInstance().eventsApp();\n}\n\n/**\n * The Questions API app instance, or `null` if not loaded.\n * @since 0.1.0\n * @returns {object | null}\n */\nfunction questionsApp() {\n return appInstance().questionsApp();\n}\n\n/**\n * Sets up item and question listeners to pass to the diagnostics module.\n * Should not be called externally.\n * @since 0.1.0\n * @ignore\n */\nfunction setupListeners() {\n // Sends all Items and Assess API events for handling.\n state.app.on('all', e => {\n (0,_diagnostics__WEBPACK_IMPORTED_MODULE_0__.handleEvent)(e);\n });\n\n // Sends Questions API `changed` event for handling.\n state.app.on('item:load', e => {\n let response_ids = (0,_questions__WEBPACK_IMPORTED_MODULE_1__.questionResponseIds)();\n response_ids.forEach(id => {\n state.app.question(id).on('changed', ev => {\n (0,_diagnostics__WEBPACK_IMPORTED_MODULE_0__.handleEvent)('changed');\n });\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2FwcC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUE0QztBQUNNOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHlEQUFXO0FBQ25CLEtBQUs7O0FBRUw7QUFDQTtBQUNBLDJCQUEyQiwrREFBbUI7QUFDOUM7QUFDQTtBQUNBLGdCQUFnQix5REFBVztBQUMzQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9jb3JlL2FwcC5qcz85MWRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhhbmRsZUV2ZW50IH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgeyBxdWVzdGlvblJlc3BvbnNlSWRzIH0gZnJvbSAnLi9xdWVzdGlvbnMnO1xuXG4vKipcbiAqIExlYXJub3NpdHkgVG9vbGtpdCBjb25zdHJ1Y3RvciBtb2R1bGUuXG4gKiBAbW9kdWxlIEFzc2Vzc21lbnQvQXBwXG4gKi9cblxuY29uc3Qgc3RhdGUgPSB7fTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBtZXRob2QgZm9yIExlYXJub3NpdHkgVG9vbGtpdC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtvYmplY3R9IGFwcCAtIEl0ZW1zIEFQSSBhcHAgaW5zdGFuY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWNsYXJlIGFuZCBzZXQgeW91ciB2YXJpYWJsZSB3aXRoIHRoZSBJdGVtcyBBUEkgTGVhcm5vc2l0eUl0ZW1zLmluaXQoKSBtZXRob2RcbiAqIGNvbnN0IGl0ZW1zQXBwID0gTGVhcm5vc2l0eUl0ZW1zLmluaXQoc2lnbmVkQ29uZmlnT2JqZWN0KTtcbiAqXG4gKiAvLyBQYXNzIHRoYXQgYXBwIGluc3RhbmNlIHRvIHRoZSBUb29sa2l0IGNvbnN0cnVjdG9yIGluIHRoZSBJdGVtcyBBUEkgcmVhZHlMaXN0ZW5lcigpXG4gKiBpbXBvcnQgeyBMVCB9IGZyb20gJ1twYXRoL3RvL3Rvb2tpdC9pbmRleF0nO1xuICogTFQuaW5pdChpdGVtc0FwcCk7XG4gKlxuICogLy8gQ2FuIGJlIGhhbmR5IGluIHRoZSBnbG9iYWwgc2NvcGUgZm9yIGRldmVsb3BtZW50XG4gKiB3aW5kb3cuTFQgPSBMVDtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQoYXBwKSB7XG4gICAgc3RhdGUuYXBwID0gYXBwO1xuICAgIHNldHVwTGlzdGVuZXJzKCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgSXRlbXMgQVBJIGFwcCBpbnN0YW5jZSB0aGF0IHRoZSBob3N0IHBhZ2UgZGVjbGFyZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gc3RhdGUuYXBwO1xufVxuXG4vKipcbiAqIFRoZSBBbm5vdGF0aW9ucyBBUEkgYXBwIGluc3RhbmNlLCBvciBgbnVsbGAgaWYgbm90IGxvYWRlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdCB8IG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uc0FwcCgpIHtcbiAgICByZXR1cm4gYXBwSW5zdGFuY2UoKS5hbm5vdGF0aW9uc0FwcCgpICE9PSB1bmRlZmluZWQgPyBhcHBJbnN0YW5jZSgpLmFubm90YXRpb25zQXBwKCkgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBBc3Nlc3MgQVBJIGFwcCBpbnN0YW5jZSwgb3IgYG51bGxgIGlmIG5vdCBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXNzQXBwKCkge1xuICAgIHJldHVybiBhcHBJbnN0YW5jZSgpLmFzc2Vzc0FwcCgpO1xufVxuXG4vKipcbiAqIFRoZSBFdmVudHMgQVBJIGFwcCBpbnN0YW5jZSwgb3IgYG51bGxgIGlmIG5vdCBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRzQXBwKCkge1xuICAgIHJldHVybiBhcHBJbnN0YW5jZSgpLmV2ZW50c0FwcCgpO1xufVxuXG4vKipcbiAqIFRoZSBRdWVzdGlvbnMgQVBJIGFwcCBpbnN0YW5jZSwgb3IgYG51bGxgIGlmIG5vdCBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb25zQXBwKCkge1xuICAgIHJldHVybiBhcHBJbnN0YW5jZSgpLnF1ZXN0aW9uc0FwcCgpO1xufVxuXG4vKipcbiAqIFNldHMgdXAgaXRlbSBhbmQgcXVlc3Rpb24gbGlzdGVuZXJzIHRvIHBhc3MgdG8gdGhlIGRpYWdub3N0aWNzIG1vZHVsZS5cbiAqIFNob3VsZCBub3QgYmUgY2FsbGVkIGV4dGVybmFsbHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0dXBMaXN0ZW5lcnMoKSB7XG4gICAgLy8gU2VuZHMgYWxsIEl0ZW1zIGFuZCBBc3Nlc3MgQVBJIGV2ZW50cyBmb3IgaGFuZGxpbmcuXG4gICAgc3RhdGUuYXBwLm9uKCdhbGwnLCBlID0+IHtcbiAgICAgICAgaGFuZGxlRXZlbnQoZSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZW5kcyBRdWVzdGlvbnMgQVBJIGBjaGFuZ2VkYCBldmVudCBmb3IgaGFuZGxpbmcuXG4gICAgc3RhdGUuYXBwLm9uKCdpdGVtOmxvYWQnLCBlID0+IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlX2lkcyA9IHF1ZXN0aW9uUmVzcG9uc2VJZHMoKTtcbiAgICAgICAgcmVzcG9uc2VfaWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgc3RhdGUuYXBwLnF1ZXN0aW9uKGlkKS5vbignY2hhbmdlZCcsIGV2ID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVFdmVudCgnY2hhbmdlZCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/app.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/diagnostics.js": -/*!********************************************!*\ - !*** ./src/assessment/core/diagnostics.js ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ diagnostics: () => (/* binding */ diagnostics),\n/* harmony export */ filterEvent: () => (/* binding */ filterEvent),\n/* harmony export */ handleEvent: () => (/* binding */ handleEvent),\n/* harmony export */ listen: () => (/* binding */ listen)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _dist_version_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../dist/version.js */ \"./dist/version.js\");\n\n\n\n\n\n/**\n * Diagnostic/metadata information for Items API.\n * @module Assessment/Diagnostics\n */\n\nconst state = {\n events: {\n broadcast: false,\n listenFor: 'item',\n },\n};\n\n/**\n * Returns an object of diagnostic information about\n * the current session.\n * @since 0.1.0\n * @returns {object}\n * @example\n * // Sample returned object\n * {\n * \"apps\": {\n * \"annotations\": {\n * \"app\": {},\n * \"config\": true,\n * \"enabled\": true\n * },\n * \"assess\": {\n * \"app\": {}\n * },\n * \"events\": {\n * \"app\": null,\n * \"enabled\": false\n * },\n * \"items\": {\n * \"app\": {},\n * \"metadata\": {\n * \"items_api_version\": \"v1.118.3\"\n * }\n * },\n * \"questions\": {\n * \"app\": {}\n * }\n * },\n * \"activity\": {\n * \"activity\": \"items-api-demo\",\n * \"autoSave\": {\n * \"config\": {\n * \"save_interval_duration\": 300\n * },\n * \"enabled\": true\n * },\n * \"itemBank\": 6,\n * \"session\": \"f85afe9c-342e-4363-8d70-ad3c665566c0\",\n * \"state\": \"initial\",\n * \"type\": \"submit_practice\",\n * \"user\": \"labs-site\"\n * },\n * \"versions\": {\n * \"requested\": \"v2023.2.LTS\",\n * \"mapped\": \"v2.197\",\n * \"concrete\": \"v2.197.5\",\n * \"server\": \"v2023.2.LTS\",\n * \"assets\": \"v2.197.5\"\n * }\n * }\n */\nfunction diagnostics() {\n let v = window.LearnosityApp ? LearnosityApp.versions : {};\n let d = {\n apps: {\n annotations: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.annotationsApp(),\n config: _activity__WEBPACK_IMPORTED_MODULE_1__.annotationsConfig(),\n enabled: _activity__WEBPACK_IMPORTED_MODULE_1__.hasAnnotations(),\n },\n assess: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.assessApp(),\n },\n events: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.eventsApp(),\n enabled: _activity__WEBPACK_IMPORTED_MODULE_1__.hasEvents(),\n },\n items: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.appInstance(),\n metadata: _activity__WEBPACK_IMPORTED_MODULE_1__.activity().config.metadata,\n },\n questions: {\n app: _app__WEBPACK_IMPORTED_MODULE_0__.questionsApp(),\n },\n },\n activity: {\n activity: _activity__WEBPACK_IMPORTED_MODULE_1__.activityId(),\n activityTemplate: _activity__WEBPACK_IMPORTED_MODULE_1__.activityTemplateId(),\n autoSave: {\n config: _activity__WEBPACK_IMPORTED_MODULE_1__.autoSaveConfig(),\n enabled: _activity__WEBPACK_IMPORTED_MODULE_1__.hasAutoSave(),\n },\n itemBank: _activity__WEBPACK_IMPORTED_MODULE_1__.itemBank(),\n itemPool: _activity__WEBPACK_IMPORTED_MODULE_1__.itemPool(),\n session: _activity__WEBPACK_IMPORTED_MODULE_1__.sessionId(),\n state: _activity__WEBPACK_IMPORTED_MODULE_1__.state(),\n type: _activity__WEBPACK_IMPORTED_MODULE_1__.activity().type,\n user: _activity__WEBPACK_IMPORTED_MODULE_1__.userId(),\n },\n LT: {\n version: _dist_version_js__WEBPACK_IMPORTED_MODULE_3__.version,\n },\n versions: v,\n };\n return d;\n}\n\n/**\n * Which event(s) you want to listen for on the console.\n * You must call `listen()` first to start broadcasting.\n *\n * Pass any of the following:\n * - exact event (https://reference.learnosity.com/items-api/events) or;\n * - `*` for all events or;\n * - left or right wildcards via `*`\n * @since 0.1.0\n * @param {string} event\n * @example\n * LT.listen();\n * LT.filterEvent('item*');\n */\nfunction filterEvent(event) {\n const regex = /^[a-zA-Z:*]*$/;\n if (regex.test(event)) {\n state.events.listenFor = event;\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].warn('Invalid event type');\n }\n}\n\n/**\n * Accepts an event when triggered, optionally write to the console.\n * This is triggered internally so should not be called directly.\n * @since 0.1.0\n * @param {string} event\n * @ignore\n */\nfunction handleEvent(event) {\n if (state.events.broadcast) {\n const eventPattern = state.events.listenFor;\n const eventListeningFor = eventPattern.replaceAll('*', '');\n if ((eventPattern.length === 1 && eventPattern === '*') || eventPattern === 'all') {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n } else if (eventPattern.startsWith('*') && !eventPattern.endsWith('*')) {\n if (event.endsWith(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n } else if (eventPattern.endsWith('*') && !eventPattern.startsWith('*')) {\n if (event.startsWith(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n } else if (eventPattern.startsWith('*') && eventPattern.endsWith('*')) {\n if (event.includes(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n } else {\n if (event.startsWith(eventListeningFor)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(event);\n }\n }\n }\n}\n\n/**\n * Enables or disabled any console logging of events.\n * Defaults to `true`, turn off by passing a falsy.\n * @since 0.1.0\n * @param {boolean=} status\n */\nfunction listen(status = true) {\n state.events.broadcast = Boolean(status);\n if (Boolean(status)) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(`👂 listening for '${state.events.listenFor}'`);\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info('🚫👂 not listening');\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2RpYWdub3N0aWNzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQTZCO0FBQ1U7QUFDQztBQUNXOztBQUVuRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixnREFBa0I7QUFDdkMsd0JBQXdCLHdEQUEwQjtBQUNsRCx5QkFBeUIscURBQXVCO0FBQ2hELGFBQWE7QUFDYjtBQUNBLHFCQUFxQiwyQ0FBYTtBQUNsQyxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsMkNBQWE7QUFDbEMseUJBQXlCLGdEQUFrQjtBQUMzQyxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsNkNBQWU7QUFDcEMsMEJBQTBCLCtDQUFpQjtBQUMzQyxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsOENBQWdCO0FBQ3JDLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxzQkFBc0IsaURBQW1CO0FBQ3pDLDhCQUE4Qix5REFBMkI7QUFDekQ7QUFDQSx3QkFBd0IscURBQXVCO0FBQy9DLHlCQUF5QixrREFBb0I7QUFDN0MsYUFBYTtBQUNiLHNCQUFzQiwrQ0FBaUI7QUFDdkMsc0JBQXNCLCtDQUFpQjtBQUN2QyxxQkFBcUIsZ0RBQWtCO0FBQ3ZDLG1CQUFtQiw0Q0FBYztBQUNqQyxrQkFBa0IsK0NBQWlCO0FBQ25DLGtCQUFrQiw2Q0FBZTtBQUNqQyxTQUFTO0FBQ1Q7QUFDQSxxQkFBcUIscURBQU87QUFDNUIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLFFBQVEscURBQU07QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxREFBTTtBQUNsQixVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxnQkFBZ0IscURBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDTztBQUNQO0FBQ0E7QUFDQSxRQUFRLHFEQUFNLDJCQUEyQix1QkFBdUI7QUFDaEUsTUFBTTtBQUNOLFFBQVEscURBQU07QUFDZDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvZGlhZ25vc3RpY3MuanM/YjZiZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi9hcHAnO1xuaW1wb3J0ICogYXMgYWN0aXZpdHkgZnJvbSAnLi9hY3Rpdml0eSc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vZGlzdC92ZXJzaW9uLmpzJztcblxuLyoqXG4gKiBEaWFnbm9zdGljL21ldGFkYXRhIGluZm9ybWF0aW9uIGZvciBJdGVtcyBBUEkuXG4gKiBAbW9kdWxlIEFzc2Vzc21lbnQvRGlhZ25vc3RpY3NcbiAqL1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICBldmVudHM6IHtcbiAgICAgICAgYnJvYWRjYXN0OiBmYWxzZSxcbiAgICAgICAgbGlzdGVuRm9yOiAnaXRlbScsXG4gICAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgb2YgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBhYm91dFxuICogdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gU2FtcGxlIHJldHVybmVkIG9iamVjdFxuICogIHtcbiAqICAgICAgXCJhcHBzXCI6IHtcbiAqICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge1xuICogICAgICAgICAgICAgIFwiYXBwXCI6IHt9LFxuICogICAgICAgICAgICAgIFwiY29uZmlnXCI6IHRydWUsXG4gKiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IHRydWVcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcImFzc2Vzc1wiOiB7XG4gKiAgICAgICAgICAgICAgXCJhcHBcIjoge31cbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcImV2ZW50c1wiOiB7XG4gKiAgICAgICAgICAgICAgXCJhcHBcIjogbnVsbCxcbiAqICAgICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2VcbiAqICAgICAgICAgIH0sXG4gKiAgICAgICAgICBcIml0ZW1zXCI6IHtcbiAqICAgICAgICAgICAgICBcImFwcFwiOiB7fSxcbiAqICAgICAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgXCJpdGVtc19hcGlfdmVyc2lvblwiOiBcInYxLjExOC4zXCJcbiAqICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICB9LFxuICogICAgICAgICAgXCJxdWVzdGlvbnNcIjoge1xuICogICAgICAgICAgICAgIFwiYXBwXCI6IHt9XG4gKiAgICAgICAgICB9XG4gKiAgICAgIH0sXG4gKiAgICAgIFwiYWN0aXZpdHlcIjoge1xuICogICAgICAgICAgXCJhY3Rpdml0eVwiOiBcIml0ZW1zLWFwaS1kZW1vXCIsXG4gKiAgICAgICAgICBcImF1dG9TYXZlXCI6IHtcbiAqICAgICAgICAgICAgICBcImNvbmZpZ1wiOiB7XG4gKiAgICAgICAgICAgICAgICAgIFwic2F2ZV9pbnRlcnZhbF9kdXJhdGlvblwiOiAzMDBcbiAqICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlXG4gKiAgICAgICAgICB9LFxuICogICAgICAgICAgXCJpdGVtQmFua1wiOiA2LFxuICogICAgICAgICAgXCJzZXNzaW9uXCI6IFwiZjg1YWZlOWMtMzQyZS00MzYzLThkNzAtYWQzYzY2NTU2NmMwXCIsXG4gKiAgICAgICAgICBcInN0YXRlXCI6IFwiaW5pdGlhbFwiLFxuICogICAgICAgICAgXCJ0eXBlXCI6IFwic3VibWl0X3ByYWN0aWNlXCIsXG4gKiAgICAgICAgICBcInVzZXJcIjogXCJsYWJzLXNpdGVcIlxuICogICAgICB9LFxuICogICAgICBcInZlcnNpb25zXCI6IHtcbiAqICAgICAgICAgIFwicmVxdWVzdGVkXCI6IFwidjIwMjMuMi5MVFNcIixcbiAqICAgICAgICAgIFwibWFwcGVkXCI6IFwidjIuMTk3XCIsXG4gKiAgICAgICAgICBcImNvbmNyZXRlXCI6IFwidjIuMTk3LjVcIixcbiAqICAgICAgICAgIFwic2VydmVyXCI6IFwidjIwMjMuMi5MVFNcIixcbiAqICAgICAgICAgIFwiYXNzZXRzXCI6IFwidjIuMTk3LjVcIlxuICogICAgICB9XG4gKiAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlhZ25vc3RpY3MoKSB7XG4gICAgbGV0IHYgPSB3aW5kb3cuTGVhcm5vc2l0eUFwcCA/IExlYXJub3NpdHlBcHAudmVyc2lvbnMgOiB7fTtcbiAgICBsZXQgZCA9IHtcbiAgICAgICAgYXBwczoge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBhcHA6IGFwcC5hbm5vdGF0aW9uc0FwcCgpLFxuICAgICAgICAgICAgICAgIGNvbmZpZzogYWN0aXZpdHkuYW5ub3RhdGlvbnNDb25maWcoKSxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBhY3Rpdml0eS5oYXNBbm5vdGF0aW9ucygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzc2Vzczoge1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLmFzc2Vzc0FwcCgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLmV2ZW50c0FwcCgpLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGFjdGl2aXR5Lmhhc0V2ZW50cygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgYXBwOiBhcHAuYXBwSW5zdGFuY2UoKSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogYWN0aXZpdHkuYWN0aXZpdHkoKS5jb25maWcubWV0YWRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcXVlc3Rpb25zOiB7XG4gICAgICAgICAgICAgICAgYXBwOiBhcHAucXVlc3Rpb25zQXBwKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhY3Rpdml0eToge1xuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5LmFjdGl2aXR5SWQoKSxcbiAgICAgICAgICAgIGFjdGl2aXR5VGVtcGxhdGU6IGFjdGl2aXR5LmFjdGl2aXR5VGVtcGxhdGVJZCgpLFxuICAgICAgICAgICAgYXV0b1NhdmU6IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IGFjdGl2aXR5LmF1dG9TYXZlQ29uZmlnKCksXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogYWN0aXZpdHkuaGFzQXV0b1NhdmUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpdGVtQmFuazogYWN0aXZpdHkuaXRlbUJhbmsoKSxcbiAgICAgICAgICAgIGl0ZW1Qb29sOiBhY3Rpdml0eS5pdGVtUG9vbCgpLFxuICAgICAgICAgICAgc2Vzc2lvbjogYWN0aXZpdHkuc2Vzc2lvbklkKCksXG4gICAgICAgICAgICBzdGF0ZTogYWN0aXZpdHkuc3RhdGUoKSxcbiAgICAgICAgICAgIHR5cGU6IGFjdGl2aXR5LmFjdGl2aXR5KCkudHlwZSxcbiAgICAgICAgICAgIHVzZXI6IGFjdGl2aXR5LnVzZXJJZCgpLFxuICAgICAgICB9LFxuICAgICAgICBMVDoge1xuICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgdmVyc2lvbnM6IHYsXG4gICAgfTtcbiAgICByZXR1cm4gZDtcbn1cblxuLyoqXG4gKiBXaGljaCBldmVudChzKSB5b3Ugd2FudCB0byBsaXN0ZW4gZm9yIG9uIHRoZSBjb25zb2xlLlxuICogWW91IG11c3QgY2FsbCBgbGlzdGVuKClgIGZpcnN0IHRvIHN0YXJ0IGJyb2FkY2FzdGluZy5cbiAqXG4gKiBQYXNzIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICogLSBleGFjdCBldmVudCAoaHR0cHM6Ly9yZWZlcmVuY2UubGVhcm5vc2l0eS5jb20vaXRlbXMtYXBpL2V2ZW50cykgb3I7XG4gKiAtIGAqYCBmb3IgYWxsIGV2ZW50cyBvcjtcbiAqIC0gbGVmdCBvciByaWdodCB3aWxkY2FyZHMgdmlhIGAqYFxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAqIEBleGFtcGxlXG4gKiBMVC5saXN0ZW4oKTtcbiAqIExULmZpbHRlckV2ZW50KCdpdGVtKicpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCByZWdleCA9IC9eW2EtekEtWjoqXSokLztcbiAgICBpZiAocmVnZXgudGVzdChldmVudCkpIHtcbiAgICAgICAgc3RhdGUuZXZlbnRzLmxpc3RlbkZvciA9IGV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdJbnZhbGlkIGV2ZW50IHR5cGUnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyBhbiBldmVudCB3aGVuIHRyaWdnZXJlZCwgb3B0aW9uYWxseSB3cml0ZSB0byB0aGUgY29uc29sZS5cbiAqIFRoaXMgaXMgdHJpZ2dlcmVkIGludGVybmFsbHkgc28gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICBpZiAoc3RhdGUuZXZlbnRzLmJyb2FkY2FzdCkge1xuICAgICAgICBjb25zdCBldmVudFBhdHRlcm4gPSBzdGF0ZS5ldmVudHMubGlzdGVuRm9yO1xuICAgICAgICBjb25zdCBldmVudExpc3RlbmluZ0ZvciA9IGV2ZW50UGF0dGVybi5yZXBsYWNlQWxsKCcqJywgJycpO1xuICAgICAgICBpZiAoKGV2ZW50UGF0dGVybi5sZW5ndGggPT09IDEgJiYgZXZlbnRQYXR0ZXJuID09PSAnKicpIHx8IGV2ZW50UGF0dGVybiA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudFBhdHRlcm4uc3RhcnRzV2l0aCgnKicpICYmICFldmVudFBhdHRlcm4uZW5kc1dpdGgoJyonKSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmVuZHNXaXRoKGV2ZW50TGlzdGVuaW5nRm9yKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudFBhdHRlcm4uZW5kc1dpdGgoJyonKSAmJiAhZXZlbnRQYXR0ZXJuLnN0YXJ0c1dpdGgoJyonKSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnN0YXJ0c1dpdGgoZXZlbnRMaXN0ZW5pbmdGb3IpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50UGF0dGVybi5zdGFydHNXaXRoKCcqJykgJiYgZXZlbnRQYXR0ZXJuLmVuZHNXaXRoKCcqJykpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5pbmNsdWRlcyhldmVudExpc3RlbmluZ0ZvcikpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc3RhcnRzV2l0aChldmVudExpc3RlbmluZ0ZvcikpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlZCBhbnkgY29uc29sZSBsb2dnaW5nIG9mIGV2ZW50cy5cbiAqIERlZmF1bHRzIHRvIGB0cnVlYCwgdHVybiBvZmYgYnkgcGFzc2luZyBhIGZhbHN5LlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzdGF0dXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihzdGF0dXMgPSB0cnVlKSB7XG4gICAgc3RhdGUuZXZlbnRzLmJyb2FkY2FzdCA9IEJvb2xlYW4oc3RhdHVzKTtcbiAgICBpZiAoQm9vbGVhbihzdGF0dXMpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGDwn5GCIGxpc3RlbmluZyBmb3IgJyR7c3RhdGUuZXZlbnRzLmxpc3RlbkZvcn0nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ/Cfmqvwn5GCIG5vdCBsaXN0ZW5pbmcnKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/core/diagnostics.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/items.js": -/*!**************************************!*\ - !*** ./src/assessment/core/items.js ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ dynamic: () => (/* binding */ dynamic),\n/* harmony export */ flag: () => (/* binding */ flag),\n/* harmony export */ isDynamicItem: () => (/* binding */ isDynamicItem),\n/* harmony export */ isFirstItem: () => (/* binding */ isFirstItem),\n/* harmony export */ isFlagged: () => (/* binding */ isFlagged),\n/* harmony export */ isItemFullyAttempted: () => (/* binding */ isItemFullyAttempted),\n/* harmony export */ isLastItem: () => (/* binding */ isLastItem),\n/* harmony export */ isMaskingEnabled: () => (/* binding */ isMaskingEnabled),\n/* harmony export */ item: () => (/* binding */ item),\n/* harmony export */ itemAttemptStatus: () => (/* binding */ itemAttemptStatus),\n/* harmony export */ itemByResponseId: () => (/* binding */ itemByResponseId),\n/* harmony export */ itemElement: () => (/* binding */ itemElement),\n/* harmony export */ itemPosition: () => (/* binding */ itemPosition),\n/* harmony export */ itemReference: () => (/* binding */ itemReference),\n/* harmony export */ itemTags: () => (/* binding */ itemTags)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _questions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var _sections__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sections */ \"./src/assessment/core/sections.js\");\n\n\n\n\n\n/**\n * Everything relating to the items in the activity.\n * @module Assessment/Items\n */\n\n/**\n * The dynamic object for the current item. Useful when\n * using dynamic content with try again.\n * https://reference.learnosity.com/items-api/methods/item/dynamic\n * @since 1.4.0\n * @returns {object}\n */\nfunction dynamic() {\n const reference = itemReference();\n return _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().item(reference).dynamic || {};\n}\n\n/**\n * Toggles the `user_flagged` state on the current item.\n * @since 1.4.0\n */\nfunction flag() {\n const reference = itemReference();\n _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().item(reference).flag();\n}\n\n/**\n * Whether the current item has dynamic content.\n * @since 1.4.0\n * @returns {boolean}\n */\nfunction isDynamicItem() {\n return item()?.source.hasOwnProperty('data_table_seed');\n}\n\n/**\n * Whether the current item is the first item in the activity.\n * This ignores sections, so will be a global check.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isFirstItem() {\n let reference;\n\n if (_activity__WEBPACK_IMPORTED_MODULE_1__.hasSections()) {\n reference = typeof _sections__WEBPACK_IMPORTED_MODULE_3__.sections()[0].items[0] === 'object' ? _sections__WEBPACK_IMPORTED_MODULE_3__.sections()[0].items[0].reference : _sections__WEBPACK_IMPORTED_MODULE_3__.sections()[0].items[0];\n return reference === item().reference;\n } else {\n reference = typeof _activity__WEBPACK_IMPORTED_MODULE_1__.activity().items[0] === 'object' ? _activity__WEBPACK_IMPORTED_MODULE_1__.activity().items[0].reference : _activity__WEBPACK_IMPORTED_MODULE_1__.activity().items[0];\n return reference === item().reference;\n }\n}\n\n/**\n * Whether the current item is the last item in the activity.\n * This ignores sections, so will be a global check.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isLastItem() {\n return item().is_last_item;\n}\n\n/**\n * Whether the current item has been flagged by the user.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isFlagged() {\n return item().user_flagged;\n}\n\n/**\n * Checks whether the entire item has been fully attempted.\n * Returns `false` if _all_ possible responses haven't been\n * attempted (eg on cloze types). Handles multi-part items.\n * @since 0.1.0\n * @param {string} reference Optionally pass an exact item reference.\n * @returns {boolean}\n */\nfunction isItemFullyAttempted(reference) {\n let itemQuestions;\n let attempted;\n let r;\n\n if (reference) {\n itemQuestions = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getItems()[reference]['questions'];\n } else {\n itemQuestions = _questions__WEBPACK_IMPORTED_MODULE_2__.questions();\n }\n\n if (Array.isArray(itemQuestions) && itemQuestions.length) {\n for (let i = 0; i < itemQuestions.length; i++) {\n let q = itemQuestions[i];\n r = _questions__WEBPACK_IMPORTED_MODULE_2__.questionResponse(q.response_id);\n if (r) {\n if (q.hasOwnProperty('metadata') && q.metadata.hasOwnProperty('valid_response_count')) {\n if (Array.isArray(r.value)) {\n const undefinedValues = r.value.filter(v => v === undefined);\n if (undefinedValues.length) {\n // A single question wasn't fully attempted\n return false;\n }\n const nullValues = r.value.filter(v => v === null);\n if (nullValues.length) {\n // A single question wasn't fully attempted\n return false;\n }\n }\n }\n attempted = true;\n } else {\n // We found at least one question with no response object\n return false;\n }\n }\n } else {\n attempted = true; // Technically not correct, but avoids logic problems by the caller\n }\n\n return attempted;\n}\n\n/**\n * Whether the current item has answer masking enabled.\n * @since 0.4.0\n * @returns {boolean}\n */\nfunction isMaskingEnabled() {\n return Boolean(document.querySelector('.lrn-masking'));\n}\n\n/**\n * JSON object for the current item.\n * @since 0.1.0\n * @param {string} reference Optionally pass an exact item reference.\n * @returns {object} An item JSON object.\n */\nfunction item(reference) {\n if (reference) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getItems()[reference];\n }\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getCurrentItem();\n}\n\n/**\n * Whether the current item has been attempted. Return value can be:\n * - `not_attempted`\n * - `fully_attempted`\n * - `partially_attempted`\n *\n * Partially attempted items may be where there are 2+ questions\n * on the item and only 1 has been attempted.\n *\n * Note that if a question accepts multiple responses, eg multiple\n * dropdown elements, this method will return `fully_attempted` even\n * if not all responses have been attempted. If you want to check _all_\n * responses have been attempted use `isItemFullyAttempted()`.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemAttemptStatus() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getCurrentItem().attempt_status;\n}\n\n/**\n * Returns an item object by response id.\n * @since 1.1.0\n * @param {string} response_id\n * @returns {object} An item JSON object.\n */\nfunction itemByResponseId(response_id) {\n const items = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getItems();\n let item;\n\n for (const ref in items) {\n if (items[ref].response_ids.includes(response_id)) {\n item = items[ref];\n break;\n }\n }\n\n return item;\n}\n\n/**\n * The current item DOM element.\n * @since 0.4.0\n * @returns {object} HTML DOM element\n * ```\n *
\n * ...\n *
\n * ```\n */\nfunction itemElement() {\n return document.querySelector(`div[data-reference='${itemReference()}']`);\n}\n\n/**\n * The current item position, 1-based (not 0-based), in the activity.\n * This ignores sections, so returns the global item position.\n * @since 0.1.0\n * @returns {number}\n */\nfunction itemPosition() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().assessApp().getItemPosition(itemReference()) + 1;\n}\n\n/**\n * The reference of the current item.\n * @since 0.1.0\n * @returns {string}\n */\nfunction itemReference() {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getCurrentItem().reference;\n}\n\n/**\n * All tags that have been set against the current item.\n * Requires `retrieve_tags` to be set to `true` in the\n * Items API configuration.\n * @since 2.9.0\n * @returns {array}\n */\nfunction itemTags(reference) {\n const tags = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getTags();\n const itemRef = reference || itemReference();\n\n return tags[itemRef] || [];\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL2l0ZW1zLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBNkI7QUFDVTtBQUNFO0FBQ0Y7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0EsV0FBVywyQ0FBYTtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxJQUFJLDJDQUFhO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7O0FBRUEsUUFBUSxrREFBb0I7QUFDNUIsMkJBQTJCLCtDQUFpQiw4QkFBOEIsK0NBQWlCLDJCQUEyQiwrQ0FBaUI7QUFDdkk7QUFDQSxNQUFNO0FBQ04sMkJBQTJCLCtDQUFpQiwyQkFBMkIsK0NBQWlCLHdCQUF3QiwrQ0FBaUI7QUFDakk7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLDZDQUFlO0FBQ3ZDLE1BQU07QUFDTix3QkFBd0IsaURBQW1CO0FBQzNDOztBQUVBO0FBQ0Esd0JBQXdCLDBCQUEwQjtBQUNsRDtBQUNBLGdCQUFnQix3REFBMEI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQO0FBQ0EsZUFBZSw2Q0FBZTtBQUM5QjtBQUNBLFdBQVcsNkNBQWU7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyw2Q0FBZTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ087QUFDUCxrQkFBa0IsNkNBQWU7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AseURBQXlELGdCQUFnQjtBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyw2Q0FBZTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLFdBQVcsNkNBQWU7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsaUJBQWlCLDZDQUFlO0FBQ2hDOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvY29yZS9pdGVtcy5qcz9jNzk5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuL2FwcCc7XG5pbXBvcnQgKiBhcyBhY3Rpdml0eSBmcm9tICcuL2FjdGl2aXR5JztcbmltcG9ydCAqIGFzIHF1ZXN0aW9ucyBmcm9tICcuL3F1ZXN0aW9ucyc7XG5pbXBvcnQgKiBhcyBzZWN0aW9ucyBmcm9tICcuL3NlY3Rpb25zJztcblxuLyoqXG4gKiBFdmVyeXRoaW5nIHJlbGF0aW5nIHRvIHRoZSBpdGVtcyBpbiB0aGUgYWN0aXZpdHkuXG4gKiBAbW9kdWxlIEFzc2Vzc21lbnQvSXRlbXNcbiAqL1xuXG4vKipcbiAqIFRoZSBkeW5hbWljIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgaXRlbS4gVXNlZnVsIHdoZW5cbiAqIHVzaW5nIGR5bmFtaWMgY29udGVudCB3aXRoIHRyeSBhZ2Fpbi5cbiAqIGh0dHBzOi8vcmVmZXJlbmNlLmxlYXJub3NpdHkuY29tL2l0ZW1zLWFwaS9tZXRob2RzL2l0ZW0vZHluYW1pY1xuICogQHNpbmNlIDEuNC4wXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pYygpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBpdGVtUmVmZXJlbmNlKCk7XG4gICAgcmV0dXJuIGFwcC5hc3Nlc3NBcHAoKS5pdGVtKHJlZmVyZW5jZSkuZHluYW1pYyB8fCB7fTtcbn1cblxuLyoqXG4gKiBUb2dnbGVzIHRoZSBgdXNlcl9mbGFnZ2VkYCBzdGF0ZSBvbiB0aGUgY3VycmVudCBpdGVtLlxuICogQHNpbmNlIDEuNC4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGFnKCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGl0ZW1SZWZlcmVuY2UoKTtcbiAgICBhcHAuYXNzZXNzQXBwKCkuaXRlbShyZWZlcmVuY2UpLmZsYWcoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaGFzIGR5bmFtaWMgY29udGVudC5cbiAqIEBzaW5jZSAxLjQuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWNJdGVtKCkge1xuICAgIHJldHVybiBpdGVtKCk/LnNvdXJjZS5oYXNPd25Qcm9wZXJ0eSgnZGF0YV90YWJsZV9zZWVkJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBpdGVtIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBhY3Rpdml0eS5cbiAqIFRoaXMgaWdub3JlcyBzZWN0aW9ucywgc28gd2lsbCBiZSBhIGdsb2JhbCBjaGVjay5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SXRlbSgpIHtcbiAgICBsZXQgcmVmZXJlbmNlO1xuXG4gICAgaWYgKGFjdGl2aXR5Lmhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgcmVmZXJlbmNlID0gdHlwZW9mIHNlY3Rpb25zLnNlY3Rpb25zKClbMF0uaXRlbXNbMF0gPT09ICdvYmplY3QnID8gc2VjdGlvbnMuc2VjdGlvbnMoKVswXS5pdGVtc1swXS5yZWZlcmVuY2UgOiBzZWN0aW9ucy5zZWN0aW9ucygpWzBdLml0ZW1zWzBdO1xuICAgICAgICByZXR1cm4gcmVmZXJlbmNlID09PSBpdGVtKCkucmVmZXJlbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZmVyZW5jZSA9IHR5cGVvZiBhY3Rpdml0eS5hY3Rpdml0eSgpLml0ZW1zWzBdID09PSAnb2JqZWN0JyA/IGFjdGl2aXR5LmFjdGl2aXR5KCkuaXRlbXNbMF0ucmVmZXJlbmNlIDogYWN0aXZpdHkuYWN0aXZpdHkoKS5pdGVtc1swXTtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZSA9PT0gaXRlbSgpLnJlZmVyZW5jZTtcbiAgICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBpdGVtIGlzIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFjdGl2aXR5LlxuICogVGhpcyBpZ25vcmVzIHNlY3Rpb25zLCBzbyB3aWxsIGJlIGEgZ2xvYmFsIGNoZWNrLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGFzdEl0ZW0oKSB7XG4gICAgcmV0dXJuIGl0ZW0oKS5pc19sYXN0X2l0ZW07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBpdGVtIGhhcyBiZWVuIGZsYWdnZWQgYnkgdGhlIHVzZXIuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGbGFnZ2VkKCkge1xuICAgIHJldHVybiBpdGVtKCkudXNlcl9mbGFnZ2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbnRpcmUgaXRlbSBoYXMgYmVlbiBmdWxseSBhdHRlbXB0ZWQuXG4gKiBSZXR1cm5zIGBmYWxzZWAgaWYgX2FsbF8gcG9zc2libGUgcmVzcG9uc2VzIGhhdmVuJ3QgYmVlblxuICogYXR0ZW1wdGVkIChlZyBvbiBjbG96ZSB0eXBlcykuIEhhbmRsZXMgbXVsdGktcGFydCBpdGVtcy5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZSBPcHRpb25hbGx5IHBhc3MgYW4gZXhhY3QgaXRlbSByZWZlcmVuY2UuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSXRlbUZ1bGx5QXR0ZW1wdGVkKHJlZmVyZW5jZSkge1xuICAgIGxldCBpdGVtUXVlc3Rpb25zO1xuICAgIGxldCBhdHRlbXB0ZWQ7XG4gICAgbGV0IHI7XG5cbiAgICBpZiAocmVmZXJlbmNlKSB7XG4gICAgICAgIGl0ZW1RdWVzdGlvbnMgPSBhcHAuYXBwSW5zdGFuY2UoKS5nZXRJdGVtcygpW3JlZmVyZW5jZV1bJ3F1ZXN0aW9ucyddO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1RdWVzdGlvbnMgPSBxdWVzdGlvbnMucXVlc3Rpb25zKCk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbVF1ZXN0aW9ucykgJiYgaXRlbVF1ZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcSA9IGl0ZW1RdWVzdGlvbnNbaV07XG4gICAgICAgICAgICByID0gcXVlc3Rpb25zLnF1ZXN0aW9uUmVzcG9uc2UocS5yZXNwb25zZV9pZCk7XG4gICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgIGlmIChxLmhhc093blByb3BlcnR5KCdtZXRhZGF0YScpICYmIHEubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ3ZhbGlkX3Jlc3BvbnNlX2NvdW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuZGVmaW5lZFZhbHVlcyA9IHIudmFsdWUuZmlsdGVyKHYgPT4gdiA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmRlZmluZWRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaW5nbGUgcXVlc3Rpb24gd2Fzbid0IGZ1bGx5IGF0dGVtcHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bGxWYWx1ZXMgPSByLnZhbHVlLmZpbHRlcih2ID0+IHYgPT09IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaW5nbGUgcXVlc3Rpb24gd2Fzbid0IGZ1bGx5IGF0dGVtcHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhdCBsZWFzdCBvbmUgcXVlc3Rpb24gd2l0aCBubyByZXNwb25zZSBvYmplY3RcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlOyAvLyBUZWNobmljYWxseSBub3QgY29ycmVjdCwgYnV0IGF2b2lkcyBsb2dpYyBwcm9ibGVtcyBieSB0aGUgY2FsbGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dGVtcHRlZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaGFzIGFuc3dlciBtYXNraW5nIGVuYWJsZWQuXG4gKiBAc2luY2UgMC40LjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXNraW5nRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubHJuLW1hc2tpbmcnKSk7XG59XG5cbi8qKlxuICogSlNPTiBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGl0ZW0uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2UgT3B0aW9uYWxseSBwYXNzIGFuIGV4YWN0IGl0ZW0gcmVmZXJlbmNlLlxuICogQHJldHVybnMge29iamVjdH0gQW4gaXRlbSBKU09OIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZW0ocmVmZXJlbmNlKSB7XG4gICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0SXRlbXMoKVtyZWZlcmVuY2VdO1xuICAgIH1cbiAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0Q3VycmVudEl0ZW0oKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaGFzIGJlZW4gYXR0ZW1wdGVkLiBSZXR1cm4gdmFsdWUgY2FuIGJlOlxuICogIC0gYG5vdF9hdHRlbXB0ZWRgXG4gKiAgLSBgZnVsbHlfYXR0ZW1wdGVkYFxuICogIC0gYHBhcnRpYWxseV9hdHRlbXB0ZWRgXG4gKlxuICogUGFydGlhbGx5IGF0dGVtcHRlZCBpdGVtcyBtYXkgYmUgd2hlcmUgdGhlcmUgYXJlIDIrIHF1ZXN0aW9uc1xuICogb24gdGhlIGl0ZW0gYW5kIG9ubHkgMSBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gKlxuICogTm90ZSB0aGF0IGlmIGEgcXVlc3Rpb24gYWNjZXB0cyBtdWx0aXBsZSByZXNwb25zZXMsIGVnIG11bHRpcGxlXG4gKiBkcm9wZG93biBlbGVtZW50cywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYGZ1bGx5X2F0dGVtcHRlZGAgZXZlblxuICogaWYgbm90IGFsbCByZXNwb25zZXMgaGF2ZSBiZWVuIGF0dGVtcHRlZC4gSWYgeW91IHdhbnQgdG8gY2hlY2sgX2FsbF9cbiAqIHJlc3BvbnNlcyBoYXZlIGJlZW4gYXR0ZW1wdGVkIHVzZSBgaXNJdGVtRnVsbHlBdHRlbXB0ZWQoKWAuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtQXR0ZW1wdFN0YXR1cygpIHtcbiAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0Q3VycmVudEl0ZW0oKS5hdHRlbXB0X3N0YXR1cztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZW0gb2JqZWN0IGJ5IHJlc3BvbnNlIGlkLlxuICogQHNpbmNlIDEuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2VfaWRcbiAqIEByZXR1cm5zIHtvYmplY3R9IEFuIGl0ZW0gSlNPTiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtQnlSZXNwb25zZUlkKHJlc3BvbnNlX2lkKSB7XG4gICAgY29uc3QgaXRlbXMgPSBhcHAuYXBwSW5zdGFuY2UoKS5nZXRJdGVtcygpO1xuICAgIGxldCBpdGVtO1xuXG4gICAgZm9yIChjb25zdCByZWYgaW4gaXRlbXMpIHtcbiAgICAgICAgaWYgKGl0ZW1zW3JlZl0ucmVzcG9uc2VfaWRzLmluY2x1ZGVzKHJlc3BvbnNlX2lkKSkge1xuICAgICAgICAgICAgaXRlbSA9IGl0ZW1zW3JlZl07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtO1xufVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IGl0ZW0gRE9NIGVsZW1lbnQuXG4gKiBAc2luY2UgMC40LjBcbiAqIEByZXR1cm5zIHtvYmplY3R9IEhUTUwgRE9NIGVsZW1lbnRcbiAqIGBgYFxuICogPGRpdiBkYXRhLXJlZmVyZW5jZT1cIltpdGVtLXJlZmVyZW5jZV1cIiBjbGFzcz1cImxlYXJub3NpdHktaXRlbSBscm4tc2Nyb2xsYWJsZS1jb250YWluZXIgaXRlbSBscm4tYXNzZXNzLWl0ZW1cIj5cbiAqICAgLi4uXG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlbUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGRpdltkYXRhLXJlZmVyZW5jZT0nJHtpdGVtUmVmZXJlbmNlKCl9J11gKTtcbn1cblxuLyoqXG4gKiBUaGUgY3VycmVudCBpdGVtIHBvc2l0aW9uLCAxLWJhc2VkIChub3QgMC1iYXNlZCksIGluIHRoZSBhY3Rpdml0eS5cbiAqIFRoaXMgaWdub3JlcyBzZWN0aW9ucywgc28gcmV0dXJucyB0aGUgZ2xvYmFsIGl0ZW0gcG9zaXRpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIGFwcC5hcHBJbnN0YW5jZSgpLmFzc2Vzc0FwcCgpLmdldEl0ZW1Qb3NpdGlvbihpdGVtUmVmZXJlbmNlKCkpICsgMTtcbn1cblxuLyoqXG4gKiBUaGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGl0ZW0uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVtUmVmZXJlbmNlKCkge1xuICAgIHJldHVybiBhcHAuYXBwSW5zdGFuY2UoKS5nZXRDdXJyZW50SXRlbSgpLnJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBBbGwgdGFncyB0aGF0IGhhdmUgYmVlbiBzZXQgYWdhaW5zdCB0aGUgY3VycmVudCBpdGVtLlxuICogUmVxdWlyZXMgYHJldHJpZXZlX3RhZ3NgIHRvIGJlIHNldCB0byBgdHJ1ZWAgaW4gdGhlXG4gKiBJdGVtcyBBUEkgY29uZmlndXJhdGlvbi5cbiAqIEBzaW5jZSAyLjkuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlbVRhZ3MocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgdGFncyA9IGFwcC5hcHBJbnN0YW5jZSgpLmdldFRhZ3MoKTtcbiAgICBjb25zdCBpdGVtUmVmID0gcmVmZXJlbmNlIHx8IGl0ZW1SZWZlcmVuY2UoKTtcblxuICAgIHJldHVybiB0YWdzW2l0ZW1SZWZdIHx8IFtdO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/items.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/player.js": -/*!***************************************!*\ - !*** ./src/assessment/core/player.js ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ dialog: () => (/* binding */ dialog),\n/* harmony export */ hideDialog: () => (/* binding */ hideDialog),\n/* harmony export */ isResponsiveMode: () => (/* binding */ isResponsiveMode),\n/* harmony export */ isReviewScreen: () => (/* binding */ isReviewScreen),\n/* harmony export */ navigate: () => (/* binding */ navigate),\n/* harmony export */ next: () => (/* binding */ next),\n/* harmony export */ previous: () => (/* binding */ previous),\n/* harmony export */ review: () => (/* binding */ review),\n/* harmony export */ submit: () => (/* binding */ submit)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n\n\n\n\n/**\n * Everything relating to the assessment player.\n * @module Assessment/Player\n */\n\n/**\n * Renders an Items API custom dialog.\n * @since 0.1.0\n * @param {object} config - Dialog configuration\n * @see https://help.learnosity.com/hc/en-us/articles/360000755558-Using-Custom-Dialogs-During-Assessments\n * @example\n * LT.dialog({\n * \"header\": \"My heading\",\n * \"body\": \"Custom body with html support\",\n * \"buttons\": [\n * {\n * \"button_id\": \"my_primary_button\",\n * \"label\": \"My Primary Button\",\n * \"is_primary\": true\n * },\n * {\n * \"button_id\": \"my_standard_button\",\n * \"label\": \"My Standard Button\",\n * \"is_primary\": false\n * }\n * ]\n * });\n */\nfunction dialog(config) {\n _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().dialogs().custom.show(config);\n}\n\n/**\n * Hides a custom dialog.\n * @since 1.1.0\n */\nfunction hideDialog() {\n _app__WEBPACK_IMPORTED_MODULE_0__.assessApp().dialogs().custom.hide();\n}\n\n/**\n * Checks whether the player is in responsive mode. This will be either the\n * small or medium breakpoints. See more https://help.learnosity.com/hc/en-us/articles/360000758337-Customizing-the-Assessment-Player-experience-with-User-Interface-Regions#responsive-behavior\n * @since 1.2.0\n * @returns {boolean}\n */\nfunction isResponsiveMode() {\n return Boolean(document.querySelector('.has-menu-region'));\n}\n\n/**\n * Check that the review screen has been loaded.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isReviewScreen() {\n let loaded = false;\n // The API event fires when loading the panel. We need a delay to\n // detect that this particular panel has loaded.\n setTimeout(() => {\n if (document.getElementsByClassName('review-screen')[0].getAttribute('aria-hidden') === null) {\n loaded = true;\n }\n return loaded;\n }, 500);\n}\n\n/**\n * Generic function to call API navigation methods. Supports:\n * - `previous`\n * - `next`\n * - `review`\n * - `submit`\n * - Number (0-based) representing the item index\n *\n * Internally this calls `next()`, `previous()`, `review()`, or `goto()`\n * and `submit()`.\n * @since 0.1.0\n * @param {string} target\n */\nfunction navigate(target) {\n switch (target) {\n case 'previous':\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().items().previous();\n break;\n case 'next':\n if (!_items__WEBPACK_IMPORTED_MODULE_1__.isLastItem()) {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().items().next();\n }\n break;\n case 'review':\n // Allow opening and closing the `Review progress` modal.\n if (document.getElementsByClassName('review-screen')[0].getAttribute('aria-hidden') === null) {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().dialogs().reviewScreen.hide();\n } else {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().dialogs().reviewScreen.show();\n }\n break;\n case 'submit':\n let submitSettings = {\n show_submit_confirmation: true,\n show_submit_ui: true,\n success: function (response_ids) {\n alert('Test saved!');\n },\n error: function (event) {\n alert('Test submit failed...check browser log');\n console.log('Submission failed: ', event);\n },\n };\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().submit(submitSettings);\n break;\n default:\n if (typeof Number(target) === 'number' && Number(target) >= 0) {\n _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().items().goto(Number(target));\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].warn(`Invalid target (${target})`);\n }\n }\n}\n\n/**\n * Navigates to the next item. No-op if on\n * the last item.\n * @since 0.1.0\n */\nfunction next() {\n navigate('next');\n}\n\n/**\n * Navigates to the previous item. No-op if on\n * item #1.\n * @since 0.1.0\n */\nfunction previous() {\n navigate('previous');\n}\n\n/**\n * Toggles the review screen.\n * @since 0.1.0\n */\nfunction review() {\n navigate('review');\n}\n\n/**\n * Submits the session.\n * @since 0.1.0\n */\nfunction submit() {\n navigate('submit');\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL3BsYXllci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBNkI7QUFDSTtBQUNPOztBQUV4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ087QUFDUCxJQUFJLDJDQUFhO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxJQUFJLDJDQUFhO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ087QUFDUDtBQUNBO0FBQ0EsWUFBWSw2Q0FBZTtBQUMzQjtBQUNBO0FBQ0EsaUJBQWlCLDhDQUFnQjtBQUNqQyxnQkFBZ0IsNkNBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw2Q0FBZTtBQUMvQixjQUFjO0FBQ2QsZ0JBQWdCLDZDQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsWUFBWSw2Q0FBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNkNBQWU7QUFDL0IsY0FBYztBQUNkLGdCQUFnQixxREFBTSx5QkFBeUIsT0FBTztBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvcGxheWVyLmpzPzJkYWMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXBwIGZyb20gJy4vYXBwJztcbmltcG9ydCAqIGFzIGl0ZW1zIGZyb20gJy4vaXRlbXMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgcmVsYXRpbmcgdG8gdGhlIGFzc2Vzc21lbnQgcGxheWVyLlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L1BsYXllclxuICovXG5cbi8qKlxuICogUmVuZGVycyBhbiBJdGVtcyBBUEkgY3VzdG9tIGRpYWxvZy5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIERpYWxvZyBjb25maWd1cmF0aW9uXG4gKiBAc2VlIGh0dHBzOi8vaGVscC5sZWFybm9zaXR5LmNvbS9oYy9lbi11cy9hcnRpY2xlcy8zNjAwMDA3NTU1NTgtVXNpbmctQ3VzdG9tLURpYWxvZ3MtRHVyaW5nLUFzc2Vzc21lbnRzXG4gKiBAZXhhbXBsZVxuICogTFQuZGlhbG9nKHtcbiAqICAgICBcImhlYWRlclwiOiBcIk15IGhlYWRpbmdcIixcbiAqICAgICBcImJvZHlcIjogIFwiQ3VzdG9tIGJvZHkgd2l0aCA8c3Ryb25nPmh0bWw8L3N0cm9uZz4gc3VwcG9ydFwiLFxuICogICAgIFwiYnV0dG9uc1wiOiBbXG4gKiAgICAgICAgIHtcbiAqICAgICAgICAgICAgIFwiYnV0dG9uX2lkXCI6IFwibXlfcHJpbWFyeV9idXR0b25cIixcbiAqICAgICAgICAgICAgIFwibGFiZWxcIjogXCJNeSBQcmltYXJ5IEJ1dHRvblwiLFxuICogICAgICAgICAgICAgXCJpc19wcmltYXJ5XCI6IHRydWVcbiAqICAgICAgICAgfSxcbiAqICAgICAgICAge1xuICogICAgICAgICAgICAgXCJidXR0b25faWRcIjogXCJteV9zdGFuZGFyZF9idXR0b25cIixcbiAqICAgICAgICAgICAgIFwibGFiZWxcIjogXCJNeSBTdGFuZGFyZCBCdXR0b25cIixcbiAqICAgICAgICAgICAgIFwiaXNfcHJpbWFyeVwiOiBmYWxzZVxuICogICAgICAgICB9XG4gKiAgICAgXVxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWFsb2coY29uZmlnKSB7XG4gICAgYXBwLmFzc2Vzc0FwcCgpLmRpYWxvZ3MoKS5jdXN0b20uc2hvdyhjb25maWcpO1xufVxuXG4vKipcbiAqIEhpZGVzIGEgY3VzdG9tIGRpYWxvZy5cbiAqIEBzaW5jZSAxLjEuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZURpYWxvZygpIHtcbiAgICBhcHAuYXNzZXNzQXBwKCkuZGlhbG9ncygpLmN1c3RvbS5oaWRlKCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiByZXNwb25zaXZlIG1vZGUuIFRoaXMgd2lsbCBiZSBlaXRoZXIgdGhlXG4gKiBzbWFsbCBvciBtZWRpdW0gYnJlYWtwb2ludHMuIFNlZSBtb3JlIGh0dHBzOi8vaGVscC5sZWFybm9zaXR5LmNvbS9oYy9lbi11cy9hcnRpY2xlcy8zNjAwMDA3NTgzMzctQ3VzdG9taXppbmctdGhlLUFzc2Vzc21lbnQtUGxheWVyLWV4cGVyaWVuY2Utd2l0aC1Vc2VyLUludGVyZmFjZS1SZWdpb25zI3Jlc3BvbnNpdmUtYmVoYXZpb3JcbiAqIEBzaW5jZSAxLjIuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3BvbnNpdmVNb2RlKCkge1xuICAgIHJldHVybiBCb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oYXMtbWVudS1yZWdpb24nKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgcmV2aWV3IHNjcmVlbiBoYXMgYmVlbiBsb2FkZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXZpZXdTY3JlZW4oKSB7XG4gICAgbGV0IGxvYWRlZCA9IGZhbHNlO1xuICAgIC8vIFRoZSBBUEkgZXZlbnQgZmlyZXMgd2hlbiBsb2FkaW5nIHRoZSBwYW5lbC4gV2UgbmVlZCBhIGRlbGF5IHRvXG4gICAgLy8gZGV0ZWN0IHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHBhbmVsIGhhcyBsb2FkZWQuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyZXZpZXctc2NyZWVuJylbMF0uZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpID09PSBudWxsKSB7XG4gICAgICAgICAgICBsb2FkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2FkZWQ7XG4gICAgfSwgNTAwKTtcbn1cblxuLyoqXG4gKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGNhbGwgQVBJIG5hdmlnYXRpb24gbWV0aG9kcy4gU3VwcG9ydHM6XG4gKiAgLSBgcHJldmlvdXNgXG4gKiAgLSBgbmV4dGBcbiAqICAtIGByZXZpZXdgXG4gKiAgLSBgc3VibWl0YFxuICogIC0gTnVtYmVyICgwLWJhc2VkKSByZXByZXNlbnRpbmcgdGhlIGl0ZW0gaW5kZXhcbiAqXG4gKiBJbnRlcm5hbGx5IHRoaXMgY2FsbHMgYG5leHQoKWAsIGBwcmV2aW91cygpYCwgYHJldmlldygpYCwgb3IgYGdvdG8oKWBcbiAqIGFuZCBgc3VibWl0KClgLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXZpZ2F0ZSh0YXJnZXQpIHtcbiAgICBzd2l0Y2ggKHRhcmdldCkge1xuICAgICAgICBjYXNlICdwcmV2aW91cyc6XG4gICAgICAgICAgICBhcHAuYXBwSW5zdGFuY2UoKS5pdGVtcygpLnByZXZpb3VzKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgICBpZiAoIWl0ZW1zLmlzTGFzdEl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLml0ZW1zKCkubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Jldmlldyc6XG4gICAgICAgICAgICAvLyBBbGxvdyBvcGVuaW5nIGFuZCBjbG9zaW5nIHRoZSBgUmV2aWV3IHByb2dyZXNzYCBtb2RhbC5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyZXZpZXctc2NyZWVuJylbMF0uZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXBwLmFwcEluc3RhbmNlKCkuZGlhbG9ncygpLnJldmlld1NjcmVlbi5oaWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLmRpYWxvZ3MoKS5yZXZpZXdTY3JlZW4uc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgICAgICBsZXQgc3VibWl0U2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgc2hvd19zdWJtaXRfY29uZmlybWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dfc3VibWl0X3VpOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZV9pZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ1Rlc3Qgc2F2ZWQhJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KCdUZXN0IHN1Ym1pdCBmYWlsZWQuLi5jaGVjayBicm93c2VyIGxvZycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VibWlzc2lvbiBmYWlsZWQ6ICcsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLnN1Ym1pdChzdWJtaXRTZXR0aW5ncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTnVtYmVyKHRhcmdldCkgPT09ICdudW1iZXInICYmIE51bWJlcih0YXJnZXQpID49IDApIHtcbiAgICAgICAgICAgICAgICBhcHAuYXBwSW5zdGFuY2UoKS5pdGVtcygpLmdvdG8oTnVtYmVyKHRhcmdldCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgSW52YWxpZCB0YXJnZXQgKCR7dGFyZ2V0fSlgKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogTmF2aWdhdGVzIHRvIHRoZSBuZXh0IGl0ZW0uIE5vLW9wIGlmIG9uXG4gKiB0aGUgbGFzdCBpdGVtLlxuICogQHNpbmNlIDAuMS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0KCkge1xuICAgIG5hdmlnYXRlKCduZXh0Jyk7XG59XG5cbi8qKlxuICogTmF2aWdhdGVzIHRvIHRoZSBwcmV2aW91cyBpdGVtLiBOby1vcCBpZiBvblxuICogaXRlbSAjMS5cbiAqIEBzaW5jZSAwLjEuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJldmlvdXMoKSB7XG4gICAgbmF2aWdhdGUoJ3ByZXZpb3VzJyk7XG59XG5cbi8qKlxuICogVG9nZ2xlcyB0aGUgcmV2aWV3IHNjcmVlbi5cbiAqIEBzaW5jZSAwLjEuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2aWV3KCkge1xuICAgIG5hdmlnYXRlKCdyZXZpZXcnKTtcbn1cblxuLyoqXG4gKiBTdWJtaXRzIHRoZSBzZXNzaW9uLlxuICogQHNpbmNlIDAuMS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJtaXQoKSB7XG4gICAgbmF2aWdhdGUoJ3N1Ym1pdCcpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/player.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/questions.js": -/*!******************************************!*\ - !*** ./src/assessment/core/questions.js ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasCheckAnswer: () => (/* binding */ hasCheckAnswer),\n/* harmony export */ isAutoScorable: () => (/* binding */ isAutoScorable),\n/* harmony export */ question: () => (/* binding */ question),\n/* harmony export */ questionInstance: () => (/* binding */ questionInstance),\n/* harmony export */ questionResponse: () => (/* binding */ questionResponse),\n/* harmony export */ questionResponseIds: () => (/* binding */ questionResponseIds),\n/* harmony export */ questionScore: () => (/* binding */ questionScore),\n/* harmony export */ questions: () => (/* binding */ questions)\n/* harmony export */ });\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _utils_validation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/validation */ \"./src/utils/validation.js\");\n\n\n\n\n\n\n/**\n * Everything relating to questions currently\n * loaded by Items API.\n * @module Assessment/Questions\n */\n\n/**\n * Checks whether the \"Check Answer\" button is enabled for the\n * current question, including if enabled via activity override.\n * @since 2.11.0\n * @param {string=} response_id\n * @returns {boolean}\n */\nfunction hasCheckAnswer(response_id) {\n if (!isAutoScorable(response_id)) return false;\n\n const hasActivityOverride =\n (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)()?.config?.questions_api_init_options?.attribute_overrides &&\n (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)().config.questions_api_init_options.attribute_overrides.hasOwnProperty('instant_feedback') &&\n typeof (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback === 'boolean';\n const q = question(response_id);\n\n if (hasActivityOverride) return (0,_activity__WEBPACK_IMPORTED_MODULE_2__.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback;\n\n return q.hasOwnProperty('instant_feedback') && typeof q.instant_feedback === 'boolean' ? q.instant_feedback : false;\n}\n\n/**\n * Checks whether the question is auto-scorable. This includes\n * questions that are technically auto-scorable but don't have\n * a validation object set (including when the validation is\n * ignored in Items API configuration).\n * @since 2.11.0\n * @param {string=} response_id\n * @returns {boolean}\n */\nfunction isAutoScorable(response_id) {\n const q = question(response_id);\n const check = questionInstance(response_id).checkValidation();\n return check.has_validation;\n}\n\n/**\n * Returns the question JSON on the current item.\n *\n * If the item is multi-part, pass `response_id` to return\n * the desired question. This argument will also look across\n * all items for the requested `response_id`.\n *\n * Returns {} if no question was found on the current item.\n * @since 0.1.0\n * @param {string=} response_id\n * @returns {object} A question JSON object.\n */\nfunction question(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(id).getQuestion();\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_3__[\"default\"].error(`Question not found (index ${id})`);\n return {};\n }\n}\n\n/**\n * Returns the question app instance on the current item.\n *\n * If the item is multi-part, pass `response_id` to return the\n * desired question.\n * @since 0.4.0\n * @param {string=} response_id\n * @returns {object} A question app instance.\n */\nfunction questionInstance(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(id);\n } else {\n return {};\n }\n}\n\n/**\n * Returns all question JSON on the current item.\n *\n * Returns [] if no questions were found.\n * @since 0.1.0\n * @returns {array}\n */\nfunction questions() {\n return _items__WEBPACK_IMPORTED_MODULE_1__.item().questions;\n}\n\n/**\n * A response object for a question on the\n * current item. Defaults to the first question.\n *\n * Pass `response_id` if you want a different question\n * response returned in the case of a multi-part item.\n *\n * Returns {} if no questions found on the item.\n * @since 0.1.0\n * @param {string=} response_id\n * @returns {object} The response object for the question, null if no attempts yet.\n */\nfunction questionResponse(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return response(id);\n } else {\n return {};\n }\n}\n\n/**\n * Array of `response_id` string values for all questions on the current item.\n * @since 0.1.0\n * @returns {array}\n */\nfunction questionResponseIds() {\n return questions().map(r => r.response_id);\n}\n\n/**\n * The score object for a question on the current item.\n * Defaults to the first question.\n *\n * Pass `response_id` if you want a different question\n * response returned in the case of a multi-part item.\n *\n * Returns {} if no questions found on the item, or a\n * non-autoscoreable question.\n * @since 0.1.0\n * @param {string=} response_id\n * @returns {object} The score object for the question.\n */\nfunction questionScore(response_id) {\n let id = response_id ? response_id : questionResponseIds()[0];\n\n if (id) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getScores()[id] || {};\n } else {\n return {};\n }\n}\n\n/**\n * A response object for a single question on the current item.\n *\n * Returns {} if a response isn't found.\n * @since 0.1.0\n * @param {string} response_id\n * @returns {object | null} The response object for the question\n * @ignore\n */\nfunction response(response_id) {\n const r = _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(response_id);\n\n if (r) {\n return _app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(response_id).getResponse();\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_3__[\"default\"].error(`Response not found ${response_id}`);\n return undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL3F1ZXN0aW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQTZCO0FBQ0k7QUFDSztBQUNFO0FBQ1U7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYTtBQUNiO0FBQ087QUFDUDs7QUFFQTtBQUNBLFFBQVEsbURBQVE7QUFDaEIsUUFBUSxtREFBUTtBQUNoQixlQUFlLG1EQUFRO0FBQ3ZCOztBQUVBLG9DQUFvQyxtREFBUTs7QUFFNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQOztBQUVBO0FBQ0EsZUFBZSw2Q0FBZTtBQUM5QixNQUFNO0FBQ04sUUFBUSxxREFBTSxvQ0FBb0MsR0FBRztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7O0FBRUE7QUFDQSxlQUFlLDZDQUFlO0FBQzlCLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsV0FBVyx3Q0FBVTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7O0FBRUE7QUFDQSxlQUFlLDZDQUFlO0FBQzlCLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsZUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxjQUFjLDZDQUFlOztBQUU3QjtBQUNBLGVBQWUsNkNBQWU7QUFDOUIsTUFBTTtBQUNOLFFBQVEscURBQU0sNkJBQTZCLFlBQVk7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2NvcmUvcXVlc3Rpb25zLmpzPzY0NjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXBwIGZyb20gJy4vYXBwJztcbmltcG9ydCAqIGFzIGl0ZW1zIGZyb20gJy4vaXRlbXMnO1xuaW1wb3J0IHsgYWN0aXZpdHkgfSBmcm9tICcuL2FjdGl2aXR5JztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGhhc1ZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdGlvbic7XG5cbi8qKlxuICogRXZlcnl0aGluZyByZWxhdGluZyB0byBxdWVzdGlvbnMgY3VycmVudGx5XG4gKiBsb2FkZWQgYnkgSXRlbXMgQVBJLlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L1F1ZXN0aW9uc1xuICovXG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIFwiQ2hlY2sgQW5zd2VyXCIgYnV0dG9uIGlzIGVuYWJsZWQgZm9yIHRoZVxuICogY3VycmVudCBxdWVzdGlvbiwgaW5jbHVkaW5nIGlmIGVuYWJsZWQgdmlhIGFjdGl2aXR5IG92ZXJyaWRlLlxuICogQHNpbmNlIDIuMTEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDaGVja0Fuc3dlcihyZXNwb25zZV9pZCkge1xuICAgIGlmICghaXNBdXRvU2NvcmFibGUocmVzcG9uc2VfaWQpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBoYXNBY3Rpdml0eU92ZXJyaWRlID1cbiAgICAgICAgYWN0aXZpdHkoKT8uY29uZmlnPy5xdWVzdGlvbnNfYXBpX2luaXRfb3B0aW9ucz8uYXR0cmlidXRlX292ZXJyaWRlcyAmJlxuICAgICAgICBhY3Rpdml0eSgpLmNvbmZpZy5xdWVzdGlvbnNfYXBpX2luaXRfb3B0aW9ucy5hdHRyaWJ1dGVfb3ZlcnJpZGVzLmhhc093blByb3BlcnR5KCdpbnN0YW50X2ZlZWRiYWNrJykgJiZcbiAgICAgICAgdHlwZW9mIGFjdGl2aXR5KCkuY29uZmlnLnF1ZXN0aW9uc19hcGlfaW5pdF9vcHRpb25zLmF0dHJpYnV0ZV9vdmVycmlkZXMuaW5zdGFudF9mZWVkYmFjayA9PT0gJ2Jvb2xlYW4nO1xuICAgIGNvbnN0IHEgPSBxdWVzdGlvbihyZXNwb25zZV9pZCk7XG5cbiAgICBpZiAoaGFzQWN0aXZpdHlPdmVycmlkZSkgcmV0dXJuIGFjdGl2aXR5KCkuY29uZmlnLnF1ZXN0aW9uc19hcGlfaW5pdF9vcHRpb25zLmF0dHJpYnV0ZV9vdmVycmlkZXMuaW5zdGFudF9mZWVkYmFjaztcblxuICAgIHJldHVybiBxLmhhc093blByb3BlcnR5KCdpbnN0YW50X2ZlZWRiYWNrJykgJiYgdHlwZW9mIHEuaW5zdGFudF9mZWVkYmFjayA9PT0gJ2Jvb2xlYW4nID8gcS5pbnN0YW50X2ZlZWRiYWNrIDogZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHF1ZXN0aW9uIGlzIGF1dG8tc2NvcmFibGUuIFRoaXMgaW5jbHVkZXNcbiAqIHF1ZXN0aW9ucyB0aGF0IGFyZSB0ZWNobmljYWxseSBhdXRvLXNjb3JhYmxlIGJ1dCBkb24ndCBoYXZlXG4gKiBhIHZhbGlkYXRpb24gb2JqZWN0IHNldCAoaW5jbHVkaW5nIHdoZW4gdGhlIHZhbGlkYXRpb24gaXNcbiAqIGlnbm9yZWQgaW4gSXRlbXMgQVBJIGNvbmZpZ3VyYXRpb24pLlxuICogQHNpbmNlIDIuMTEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dG9TY29yYWJsZShyZXNwb25zZV9pZCkge1xuICAgIGNvbnN0IHEgPSBxdWVzdGlvbihyZXNwb25zZV9pZCk7XG4gICAgY29uc3QgY2hlY2sgPSBxdWVzdGlvbkluc3RhbmNlKHJlc3BvbnNlX2lkKS5jaGVja1ZhbGlkYXRpb24oKTtcbiAgICByZXR1cm4gY2hlY2suaGFzX3ZhbGlkYXRpb247XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcXVlc3Rpb24gSlNPTiBvbiB0aGUgY3VycmVudCBpdGVtLlxuICpcbiAqIElmIHRoZSBpdGVtIGlzIG11bHRpLXBhcnQsIHBhc3MgYHJlc3BvbnNlX2lkYCB0byByZXR1cm5cbiAqIHRoZSBkZXNpcmVkIHF1ZXN0aW9uLiBUaGlzIGFyZ3VtZW50IHdpbGwgYWxzbyBsb29rIGFjcm9zc1xuICogYWxsIGl0ZW1zIGZvciB0aGUgcmVxdWVzdGVkIGByZXNwb25zZV9pZGAuXG4gKlxuICogUmV0dXJucyB7fSBpZiBubyBxdWVzdGlvbiB3YXMgZm91bmQgb24gdGhlIGN1cnJlbnQgaXRlbS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge29iamVjdH0gQSBxdWVzdGlvbiBKU09OIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uKHJlc3BvbnNlX2lkKSB7XG4gICAgbGV0IGlkID0gcmVzcG9uc2VfaWQgPyByZXNwb25zZV9pZCA6IHF1ZXN0aW9uUmVzcG9uc2VJZHMoKVswXTtcblxuICAgIGlmIChpZCkge1xuICAgICAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkucXVlc3Rpb24oaWQpLmdldFF1ZXN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBRdWVzdGlvbiBub3QgZm91bmQgKGluZGV4ICR7aWR9KWApO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHF1ZXN0aW9uIGFwcCBpbnN0YW5jZSBvbiB0aGUgY3VycmVudCBpdGVtLlxuICpcbiAqIElmIHRoZSBpdGVtIGlzIG11bHRpLXBhcnQsIHBhc3MgYHJlc3BvbnNlX2lkYCB0byByZXR1cm4gdGhlXG4gKiBkZXNpcmVkIHF1ZXN0aW9uLlxuICogQHNpbmNlIDAuNC4wXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlc3BvbnNlX2lkXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBBIHF1ZXN0aW9uIGFwcCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uSW5zdGFuY2UocmVzcG9uc2VfaWQpIHtcbiAgICBsZXQgaWQgPSByZXNwb25zZV9pZCA/IHJlc3BvbnNlX2lkIDogcXVlc3Rpb25SZXNwb25zZUlkcygpWzBdO1xuXG4gICAgaWYgKGlkKSB7XG4gICAgICAgIHJldHVybiBhcHAuYXBwSW5zdGFuY2UoKS5xdWVzdGlvbihpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBxdWVzdGlvbiBKU09OIG9uIHRoZSBjdXJyZW50IGl0ZW0uXG4gKlxuICogUmV0dXJucyBbXSBpZiBubyBxdWVzdGlvbnMgd2VyZSBmb3VuZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb25zKCkge1xuICAgIHJldHVybiBpdGVtcy5pdGVtKCkucXVlc3Rpb25zO1xufVxuXG4vKipcbiAqIEEgcmVzcG9uc2Ugb2JqZWN0IGZvciBhIHF1ZXN0aW9uIG9uIHRoZVxuICogY3VycmVudCBpdGVtLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcXVlc3Rpb24uXG4gKlxuICogUGFzcyBgcmVzcG9uc2VfaWRgIGlmIHlvdSB3YW50IGEgZGlmZmVyZW50IHF1ZXN0aW9uXG4gKiByZXNwb25zZSByZXR1cm5lZCBpbiB0aGUgY2FzZSBvZiBhIG11bHRpLXBhcnQgaXRlbS5cbiAqXG4gKiBSZXR1cm5zIHt9IGlmIG5vIHF1ZXN0aW9ucyBmb3VuZCBvbiB0aGUgaXRlbS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHtzdHJpbmc9fSByZXNwb25zZV9pZFxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlIG9iamVjdCBmb3IgdGhlIHF1ZXN0aW9uLCBudWxsIGlmIG5vIGF0dGVtcHRzIHlldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uUmVzcG9uc2UocmVzcG9uc2VfaWQpIHtcbiAgICBsZXQgaWQgPSByZXNwb25zZV9pZCA/IHJlc3BvbnNlX2lkIDogcXVlc3Rpb25SZXNwb25zZUlkcygpWzBdO1xuXG4gICAgaWYgKGlkKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuLyoqXG4gKiBBcnJheSBvZiBgcmVzcG9uc2VfaWRgIHN0cmluZyB2YWx1ZXMgZm9yIGFsbCBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgaXRlbS5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb25SZXNwb25zZUlkcygpIHtcbiAgICByZXR1cm4gcXVlc3Rpb25zKCkubWFwKHIgPT4gci5yZXNwb25zZV9pZCk7XG59XG5cbi8qKlxuICogVGhlIHNjb3JlIG9iamVjdCBmb3IgYSBxdWVzdGlvbiBvbiB0aGUgY3VycmVudCBpdGVtLlxuICogRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uLlxuICpcbiAqIFBhc3MgYHJlc3BvbnNlX2lkYCBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBxdWVzdGlvblxuICogcmVzcG9uc2UgcmV0dXJuZWQgaW4gdGhlIGNhc2Ugb2YgYSBtdWx0aS1wYXJ0IGl0ZW0uXG4gKlxuICogUmV0dXJucyB7fSBpZiBubyBxdWVzdGlvbnMgZm91bmQgb24gdGhlIGl0ZW0sIG9yIGFcbiAqIG5vbi1hdXRvc2NvcmVhYmxlIHF1ZXN0aW9uLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlc3BvbnNlX2lkXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgc2NvcmUgb2JqZWN0IGZvciB0aGUgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWVzdGlvblNjb3JlKHJlc3BvbnNlX2lkKSB7XG4gICAgbGV0IGlkID0gcmVzcG9uc2VfaWQgPyByZXNwb25zZV9pZCA6IHF1ZXN0aW9uUmVzcG9uc2VJZHMoKVswXTtcblxuICAgIGlmIChpZCkge1xuICAgICAgICByZXR1cm4gYXBwLmFwcEluc3RhbmNlKCkuZ2V0U2NvcmVzKClbaWRdIHx8IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cbi8qKlxuICogQSByZXNwb25zZSBvYmplY3QgZm9yIGEgc2luZ2xlIHF1ZXN0aW9uIG9uIHRoZSBjdXJyZW50IGl0ZW0uXG4gKlxuICogUmV0dXJucyB7fSBpZiBhIHJlc3BvbnNlIGlzbid0IGZvdW5kLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2VfaWRcbiAqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfSBUaGUgcmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgcXVlc3Rpb25cbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gcmVzcG9uc2UocmVzcG9uc2VfaWQpIHtcbiAgICBjb25zdCByID0gYXBwLmFwcEluc3RhbmNlKCkucXVlc3Rpb24ocmVzcG9uc2VfaWQpO1xuXG4gICAgaWYgKHIpIHtcbiAgICAgICAgcmV0dXJuIGFwcC5hcHBJbnN0YW5jZSgpLnF1ZXN0aW9uKHJlc3BvbnNlX2lkKS5nZXRSZXNwb25zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgUmVzcG9uc2Ugbm90IGZvdW5kICR7cmVzcG9uc2VfaWR9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/questions.js\n"); - -/***/ }), - -/***/ "./src/assessment/core/sections.js": -/*!*****************************************!*\ - !*** ./src/assessment/core/sections.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isFirstItemInSection: () => (/* binding */ isFirstItemInSection),\n/* harmony export */ isLastItemInSection: () => (/* binding */ isLastItemInSection),\n/* harmony export */ section: () => (/* binding */ section),\n/* harmony export */ sectionHasShuffledItems: () => (/* binding */ sectionHasShuffledItems),\n/* harmony export */ sectionIndex: () => (/* binding */ sectionIndex),\n/* harmony export */ sectionItemPosition: () => (/* binding */ sectionItemPosition),\n/* harmony export */ sections: () => (/* binding */ sections),\n/* harmony export */ totalItemsInSection: () => (/* binding */ totalItemsInSection)\n/* harmony export */ });\n/* harmony import */ var _activity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./items */ \"./src/assessment/core/items.js\");\n\n\n\n/**\n * Everything relating to any sections defined\n * in the activity.\n * @module Assessment/Sections\n */\n\n/**\n * Whether the current item is the first in this section.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isFirstItemInSection() {\n return sectionItemPosition() === 1;\n}\n\n/**\n * Whether the current item is the last in this section.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction isLastItemInSection() {\n return sectionItemPosition() === totalItemsInSection();\n}\n\n/**\n * The current section of the activity.\n *\n * Returns {} if sections aren't being used.\n * @since 0.1.0\n * @returns {object}\n */\nfunction section() {\n if (_activity__WEBPACK_IMPORTED_MODULE_0__.hasSections()) {\n const currentRef = _items__WEBPACK_IMPORTED_MODULE_1__.itemReference();\n const allSections = sections();\n let section = -1;\n let found = false;\n for (let s = 0; s < allSections.length; s++) {\n if (found) {\n break;\n }\n ++section;\n for (let i = 0; i < allSections[s].items.length; i++) {\n if (currentRef === allSections[s].items[i].reference) {\n found = true;\n break;\n }\n }\n }\n return sections()[section];\n } else {\n return {};\n }\n}\n\n/**\n * Whether items have been shuffled within this section.\n * @since 0.1.0\n * @returns {boolean}\n */\nfunction sectionHasShuffledItems() {\n return Boolean(section()?.config?.configuration?.shuffle_items);\n}\n\n/**\n * The index of the current section, 1-based.\n *\n * Returns 0 if sections aren't being used.\n * @since 0.1.0\n * @returns {number}\n */\nfunction sectionIndex() {\n if (_activity__WEBPACK_IMPORTED_MODULE_0__.hasSections()) {\n const currentRef = _items__WEBPACK_IMPORTED_MODULE_1__.itemReference();\n const sections = sections();\n let section = 0;\n let found = false;\n for (let s = 0; s < sections.length; s++) {\n if (found) {\n break;\n }\n ++section;\n for (let i = 0; i < sections[s].items.length; i++) {\n if (currentRef === sections[s].items[i].reference) {\n found = true;\n break;\n }\n }\n }\n return section;\n } else {\n return 0;\n }\n}\n\n/**\n * The item position in the current section.\n *\n * Returns `null` if the activity isn't using sections.\n * @since 0.1.0\n * @returns {number|null}\n */\nfunction sectionItemPosition() {\n const currentRef = _items__WEBPACK_IMPORTED_MODULE_1__.itemReference();\n const currentSection = section();\n let itemPos = 0;\n\n if (!Object.keys(currentSection).length) {\n return null;\n }\n\n for (let i = 0; i < currentSection.items.length; i++) {\n ++itemPos;\n if (currentRef === currentSection.items[i].reference) {\n break;\n }\n }\n return itemPos;\n}\n\n/**\n * An array of section objects.\n *\n * Returns [] if sections aren't being used.\n * @since 0.1.0\n * @returns {array}\n */\nfunction sections() {\n if (_activity__WEBPACK_IMPORTED_MODULE_0__.hasSections()) {\n return _activity__WEBPACK_IMPORTED_MODULE_0__.activity().sections;\n } else {\n return [];\n }\n}\n\n/**\n * The total number of items in the current section.\n *\n * Returns `null` if sections aren't being used.\n * @since 0.1.0\n * @returns {number|null}\n */\nfunction totalItemsInSection() {\n return section()?.items?.length || null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9jb3JlL3NlY3Rpb25zLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBdUM7QUFDTjs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsUUFBUSxrREFBb0I7QUFDNUIsMkJBQTJCLGlEQUFtQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGlDQUFpQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLFFBQVEsa0RBQW9CO0FBQzVCLDJCQUEyQixpREFBbUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw4QkFBOEI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLHVCQUF1QixpREFBbUI7QUFDMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGlDQUFpQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxRQUFRLGtEQUFvQjtBQUM1QixlQUFlLCtDQUFpQjtBQUNoQyxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvY29yZS9zZWN0aW9ucy5qcz84NDMyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFjdGl2aXR5IGZyb20gJy4vYWN0aXZpdHknO1xuaW1wb3J0ICogYXMgaXRlbXMgZnJvbSAnLi9pdGVtcyc7XG5cbi8qKlxuICogRXZlcnl0aGluZyByZWxhdGluZyB0byBhbnkgc2VjdGlvbnMgZGVmaW5lZFxuICogaW4gdGhlIGFjdGl2aXR5LlxuICogQG1vZHVsZSBBc3Nlc3NtZW50L1NlY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGl0ZW0gaXMgdGhlIGZpcnN0IGluIHRoaXMgc2VjdGlvbi5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SXRlbUluU2VjdGlvbigpIHtcbiAgICByZXR1cm4gc2VjdGlvbkl0ZW1Qb3NpdGlvbigpID09PSAxO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgaXRlbSBpcyB0aGUgbGFzdCBpbiB0aGlzIHNlY3Rpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYXN0SXRlbUluU2VjdGlvbigpIHtcbiAgICByZXR1cm4gc2VjdGlvbkl0ZW1Qb3NpdGlvbigpID09PSB0b3RhbEl0ZW1zSW5TZWN0aW9uKCk7XG59XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgc2VjdGlvbiBvZiB0aGUgYWN0aXZpdHkuXG4gKlxuICogUmV0dXJucyB7fSBpZiBzZWN0aW9ucyBhcmVuJ3QgYmVpbmcgdXNlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlY3Rpb24oKSB7XG4gICAgaWYgKGFjdGl2aXR5Lmhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFJlZiA9IGl0ZW1zLml0ZW1SZWZlcmVuY2UoKTtcbiAgICAgICAgY29uc3QgYWxsU2VjdGlvbnMgPSBzZWN0aW9ucygpO1xuICAgICAgICBsZXQgc2VjdGlvbiA9IC0xO1xuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBhbGxTZWN0aW9ucy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICArK3NlY3Rpb247XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFNlY3Rpb25zW3NdLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSZWYgPT09IGFsbFNlY3Rpb25zW3NdLml0ZW1zW2ldLnJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VjdGlvbnMoKVtzZWN0aW9uXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgaXRlbXMgaGF2ZSBiZWVuIHNodWZmbGVkIHdpdGhpbiB0aGlzIHNlY3Rpb24uXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbkhhc1NodWZmbGVkSXRlbXMoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oc2VjdGlvbigpPy5jb25maWc/LmNvbmZpZ3VyYXRpb24/LnNodWZmbGVfaXRlbXMpO1xufVxuXG4vKipcbiAqIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLCAxLWJhc2VkLlxuICpcbiAqIFJldHVybnMgMCBpZiBzZWN0aW9ucyBhcmVuJ3QgYmVpbmcgdXNlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlY3Rpb25JbmRleCgpIHtcbiAgICBpZiAoYWN0aXZpdHkuaGFzU2VjdGlvbnMoKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UmVmID0gaXRlbXMuaXRlbVJlZmVyZW5jZSgpO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zKCk7XG4gICAgICAgIGxldCBzZWN0aW9uID0gMDtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc2VjdGlvbnMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytzZWN0aW9uO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWN0aW9uc1tzXS5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UmVmID09PSBzZWN0aW9uc1tzXS5pdGVtc1tpXS5yZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBpdGVtIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IHNlY3Rpb24uXG4gKlxuICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIGFjdGl2aXR5IGlzbid0IHVzaW5nIHNlY3Rpb25zLlxuICogQHNpbmNlIDAuMS4wXG4gKiBAcmV0dXJucyB7bnVtYmVyfG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWN0aW9uSXRlbVBvc2l0aW9uKCkge1xuICAgIGNvbnN0IGN1cnJlbnRSZWYgPSBpdGVtcy5pdGVtUmVmZXJlbmNlKCk7XG4gICAgY29uc3QgY3VycmVudFNlY3Rpb24gPSBzZWN0aW9uKCk7XG4gICAgbGV0IGl0ZW1Qb3MgPSAwO1xuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhjdXJyZW50U2VjdGlvbikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudFNlY3Rpb24uaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgKytpdGVtUG9zO1xuICAgICAgICBpZiAoY3VycmVudFJlZiA9PT0gY3VycmVudFNlY3Rpb24uaXRlbXNbaV0ucmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXRlbVBvcztcbn1cblxuLyoqXG4gKiBBbiBhcnJheSBvZiBzZWN0aW9uIG9iamVjdHMuXG4gKlxuICogUmV0dXJucyBbXSBpZiBzZWN0aW9ucyBhcmVuJ3QgYmVpbmcgdXNlZC5cbiAqIEBzaW5jZSAwLjEuMFxuICogQHJldHVybnMge2FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbnMoKSB7XG4gICAgaWYgKGFjdGl2aXR5Lmhhc1NlY3Rpb25zKCkpIHtcbiAgICAgICAgcmV0dXJuIGFjdGl2aXR5LmFjdGl2aXR5KCkuc2VjdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjdXJyZW50IHNlY3Rpb24uXG4gKlxuICogUmV0dXJucyBgbnVsbGAgaWYgc2VjdGlvbnMgYXJlbid0IGJlaW5nIHVzZWQuXG4gKiBAc2luY2UgMC4xLjBcbiAqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdGFsSXRlbXNJblNlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNlY3Rpb24oKT8uaXRlbXM/Lmxlbmd0aCB8fCBudWxsO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/core/sections.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/aria/ariaCountOnNav.js": -/*!************************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/aria/ariaCountOnNav.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/activity */ \"./src/assessment/core/activity.js\");\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Listens for the item load event and appends\n * ` of {totalItems}` to the aria-label for the\n * previous and next buttons.\n * @module Extensions/Assessment/ariaCountOnNav\n */\n\n/**\n * Executes on item load to add custom label.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.ariaCountOnNav.run();\n * @since 0.3.0\n */\nfunction run() {\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', () => {\n let numItems = _core_activity__WEBPACK_IMPORTED_MODULE_1__.totalItems();\n let elPrevious = Array.from(document.getElementsByClassName('item-prev'));\n let elNext = Array.from(document.getElementsByClassName('item-next'));\n let elNav = elPrevious.concat(elNext);\n\n for (let i = 0; i < elNav.length; i++) {\n let attr = elNav[i].getAttribute('aria-label');\n elNav[i].setAttribute('aria-live', attr + ' of ' + numItems);\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvYXJpYS9hcmlhQ291bnRPbk5hdi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBeUM7QUFDVTs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFdBQVc7QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDTztBQUNQLElBQUksa0RBQWU7QUFDbkIsdUJBQXVCLHNEQUFtQjtBQUMxQztBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvZXh0ZW5zaW9ucy9hY2Nlc3NpYmlsaXR5L2FyaWEvYXJpYUNvdW50T25OYXYuanM/ZmE4NyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi4vLi4vLi4vY29yZS9hcHAnO1xuaW1wb3J0ICogYXMgYWN0aXZpdHkgZnJvbSAnLi4vLi4vLi4vY29yZS9hY3Rpdml0eSc7XG5cbi8qKlxuICogRXh0ZW5zaW9ucyBhZGQgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0byBJdGVtcyBBUEkuXG4gKiBUaGV5IHJlbHkgb24gbW9kdWxlcyB3aXRoaW4gTFQgYmVpbmcgYXZhaWxhYmxlLlxuICpcbiAqIC0tXG4gKlxuICogTGlzdGVucyBmb3IgdGhlIGl0ZW0gbG9hZCBldmVudCBhbmQgYXBwZW5kc1xuICogYCBvZiB7dG90YWxJdGVtc31gIHRvIHRoZSBhcmlhLWxhYmVsIGZvciB0aGVcbiAqIHByZXZpb3VzIGFuZCBuZXh0IGJ1dHRvbnMuXG4gKiBAbW9kdWxlIEV4dGVuc2lvbnMvQXNzZXNzbWVudC9hcmlhQ291bnRPbk5hdlxuICovXG5cbi8qKlxuICogRXhlY3V0ZXMgb24gaXRlbSBsb2FkIHRvIGFkZCBjdXN0b20gbGFiZWwuXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTFQgfSBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2luZGV4JztcbiAqXG4gKiBMVC5pbml0KGl0ZW1zQXBwKTsgLy8gU2V0IHVwIExUIHdpdGggdGhlIEl0ZW1zIEFQSSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB2YXJpYWJsZVxuICogTFQuZXh0ZW5zaW9ucy5hcmlhQ291bnRPbk5hdi5ydW4oKTtcbiAqIEBzaW5jZSAwLjMuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuKCkge1xuICAgIGFwcC5hcHBJbnN0YW5jZSgpLm9uKCdpdGVtOmxvYWQnLCAoKSA9PiB7XG4gICAgICAgIGxldCBudW1JdGVtcyA9IGFjdGl2aXR5LnRvdGFsSXRlbXMoKTtcbiAgICAgICAgbGV0IGVsUHJldmlvdXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2l0ZW0tcHJldicpKTtcbiAgICAgICAgbGV0IGVsTmV4dCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaXRlbS1uZXh0JykpO1xuICAgICAgICBsZXQgZWxOYXYgPSBlbFByZXZpb3VzLmNvbmNhdChlbE5leHQpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxOYXYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyID0gZWxOYXZbaV0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG4gICAgICAgICAgICBlbE5hdltpXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIGF0dHIgKyAnIG9mICcgKyBudW1JdGVtcyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/aria/ariaCountOnNav.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/columnResizer.js": -/*!*********************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/columnResizer.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/items */ \"./src/assessment/core/items.js\");\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Adds a UI border in between the left and right columns (for\n * items with 2 columns) providing the ability for the end user\n * to resize the layout by dragging the element left or right.\n *

\"\"

\n * @module Extensions/Assessment/columnResizer\n */\n\nconst state = {\n renderedCss: false,\n resize: {\n triggered: false,\n },\n};\n\n/**\n * Sets up an item load listener to add a UI element allowing\n * users to drag to resize the column divider.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.columnResizer.run();\n * @since 0.5.0\n */\nfunction run() {\n if (!state.renderedCss) injectCSS();\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', () => {\n setupResizer();\n });\n window.addEventListener('resize', debounce(setupResizer, 250));\n}\n\n/**\n * Adds the UI element to resize the 2-columns.\n *\n * Does nothing on a single column item.\n *\n * Doesn't render if in responsive mode.\n * @since 0.5.0\n * @ignore\n */\nfunction setupResizer() {\n let elItem = _core_items__WEBPACK_IMPORTED_MODULE_1__.itemElement();\n let elColumns = elItem.querySelectorAll('[class^=\"col-\"]');\n let hasResizer = Boolean(elItem.querySelector('.lrn-resizer'));\n let isResponsiveMode = Boolean(document.querySelector('.lrn-layout-single-column'));\n\n // Only add the resizable UI if we have 2 columns\n if (elColumns.length === 2) {\n if (!isResponsiveMode && !hasResizer) {\n let elResizer = document.createElement('div');\n elResizer.setAttribute('tooltip', 'Click and hold to drag column width');\n // elResizer.setAttribute('tabindex', '0');\n let elTab = document.createElement('span');\n elTab.innerHTML = '↤ ↦';\n\n elResizer.classList.add('lrn-resizer');\n elColumns[0].classList.add('lrn-column-left');\n elColumns[1].classList.add('lrn-column-right');\n\n elResizer.append(elTab);\n elColumns[0].after(elResizer);\n } else if (isResponsiveMode && hasResizer) {\n clearResizer(elItem, elColumns);\n }\n\n doResize(elItem);\n }\n}\n\n/**\n * Removes resizer UI element and width attribute\n * from the left column.\n * @since 0.5.0\n * @ignore\n */\nfunction clearResizer(elItem, elColumns) {\n let elResizer = elItem.querySelector('.lrn-resizer');\n if (elResizer) {\n elResizer.remove();\n }\n elColumns[0].removeAttribute('style');\n window.dispatchEvent(new Event('resize'));\n}\n\n/**\n * JavaScript logic for the column resize feature.\n * @since 0.5.0\n * @ignore\n */\nfunction doResize(elItem) {\n const resizable = function (elResizer) {\n const prevSibling = elResizer.previousElementSibling;\n\n let x = 0;\n let prevSiblingWidth = 0;\n\n const handleInteractionStart = e => {\n if (e instanceof MouseEvent) {\n x = e.clientX;\n } else {\n x = e.targetTouches[0].clientX;\n }\n const rect = prevSibling.getBoundingClientRect();\n prevSiblingWidth = rect.width;\n\n // Mouse events\n document.addEventListener('mousemove', handleInteractionMove);\n document.addEventListener('mouseup', handleInteractionEnd);\n\n // Touch events\n document.addEventListener('touchmove', handleInteractionMove);\n document.addEventListener('touchend', handleInteractionEnd);\n };\n\n const handleInteractionMove = e => {\n let dx;\n if (e instanceof MouseEvent) {\n dx = e.clientX - x;\n } else {\n dx = e.targetTouches[0].clientX - x;\n }\n const w = ((prevSiblingWidth + dx) * 100) / elResizer.parentNode.getBoundingClientRect().width;\n if (w >= 10 && w <= 90) prevSibling.style.width = w + '%';\n };\n\n const handleInteractionEnd = () => {\n // Mouse events\n document.removeEventListener('mousemove', handleInteractionMove);\n document.removeEventListener('mouseup', handleInteractionEnd);\n\n // Touch events\n document.removeEventListener('touchmove', handleInteractionMove);\n document.removeEventListener('touchend', handleInteractionEnd);\n };\n\n elResizer.addEventListener('mousedown', handleInteractionStart);\n elResizer.addEventListener('touchstart', handleInteractionStart);\n };\n\n let elResizer = elItem.querySelector('.lrn-resizer');\n if (elResizer) resizable(elResizer);\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 0.5.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity column resizer styles */\n.lrn-resizer {\n background-color: #e8e8e8;\n cursor: grab;\n width: 3px;\n padding: 0;\n position: relative;\n}\n.lrn-resizer span {\n position: relative;\n width: 45px;\n height: 30px;\n border: 1px solid #e4e4e4;\n left: -22px;\n border-radius: 3px;\n cursor: grab;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.5em;\n z-index: 2;\n padding-bottom: 3px;\n color: #444;\n\n -webkit-user-select: none;\n user-select: none;\n\n background: rgb(233,233,233);\n background: linear-gradient(0deg, rgba(233,233,233,1) 0%, rgba(250,250,250,1) 51%, rgba(238,238,238,1) 100%);\n}\n.row {\n display: flex;\n}\n.col-xs-6.lrn-column-left {\n display: flex;\n min-width: 5em;\n overflow: hidden;\n}\n.col-xs-6.lrn-column-right {\n display: flex;\n\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 5em;\n overflow: hidden;\n}\n.lrn-column-left .lrn_widget,\n.lrn-column-right .lrn_widget {\n padding: 1.5em;\n}\n@media (max-width: 650px) {\n .lrn-resizer {\n display: none;\n }\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n\n/**\n * Generic debounce function.\n * @param {*} func\n * @param {number} wait\n * @since 0.5.0\n * @ignore\n */\nfunction debounce(func, wait) {\n if (!state.resize.triggered) {\n state.resize.triggered = true;\n func.apply(this);\n }\n let timeout;\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n state.resize.triggered = false;\n func.apply(this, args);\n }, wait);\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvY29sdW1uUmVzaXplci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBeUM7QUFDRzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxJQUFJLGtEQUFlO0FBQ25CO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsb0RBQWdCO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvYWNjZXNzaWJpbGl0eS91eC9jb2x1bW5SZXNpemVyLmpzP2M1NDYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXBwIGZyb20gJy4uLy4uLy4uL2NvcmUvYXBwJztcbmltcG9ydCAqIGFzIGl0ZW0gZnJvbSAnLi4vLi4vLi4vY29yZS9pdGVtcyc7XG5cbi8qKlxuICogRXh0ZW5zaW9ucyBhZGQgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0byBJdGVtcyBBUEkuXG4gKiBUaGV5IHJlbHkgb24gbW9kdWxlcyB3aXRoaW4gTFQgYmVpbmcgYXZhaWxhYmxlLlxuICpcbiAqIC0tXG4gKlxuICogQWRkcyBhIFVJIGJvcmRlciBpbiBiZXR3ZWVuIHRoZSBsZWZ0IGFuZCByaWdodCBjb2x1bW5zIChmb3JcbiAqIGl0ZW1zIHdpdGggMiBjb2x1bW5zKSBwcm92aWRpbmcgdGhlIGFiaWxpdHkgZm9yIHRoZSBlbmQgdXNlclxuICogdG8gcmVzaXplIHRoZSBsYXlvdXQgYnkgZHJhZ2dpbmcgdGhlIGVsZW1lbnQgbGVmdCBvciByaWdodC5cbiAqIDxwPjxpbWcgc3JjPVwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21pY2hhZWxzaGFybWFuL0xUL21haW4vc3JjL2Fzc2V0cy9pbWFnZXMvcmVzaXplLmdpZlwiIGFsdD1cIlwiIHdpZHRoPVwiOTAwXCI+PC9wPlxuICogQG1vZHVsZSBFeHRlbnNpb25zL0Fzc2Vzc21lbnQvY29sdW1uUmVzaXplclxuICovXG5cbmNvbnN0IHN0YXRlID0ge1xuICAgIHJlbmRlcmVkQ3NzOiBmYWxzZSxcbiAgICByZXNpemU6IHtcbiAgICAgICAgdHJpZ2dlcmVkOiBmYWxzZSxcbiAgICB9LFxufTtcblxuLyoqXG4gKiBTZXRzIHVwIGFuIGl0ZW0gbG9hZCBsaXN0ZW5lciB0byBhZGQgYSBVSSBlbGVtZW50IGFsbG93aW5nXG4gKiB1c2VycyB0byBkcmFnIHRvIHJlc2l6ZSB0aGUgY29sdW1uIGRpdmlkZXIuXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTFQgfSBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2luZGV4JztcbiAqXG4gKiBMVC5pbml0KGl0ZW1zQXBwKTsgLy8gU2V0IHVwIExUIHdpdGggdGhlIEl0ZW1zIEFQSSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB2YXJpYWJsZVxuICogTFQuZXh0ZW5zaW9ucy5jb2x1bW5SZXNpemVyLnJ1bigpO1xuICogQHNpbmNlIDAuNS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW4oKSB7XG4gICAgaWYgKCFzdGF0ZS5yZW5kZXJlZENzcykgaW5qZWN0Q1NTKCk7XG4gICAgYXBwLmFwcEluc3RhbmNlKCkub24oJ2l0ZW06bG9hZCcsICgpID0+IHtcbiAgICAgICAgc2V0dXBSZXNpemVyKCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGRlYm91bmNlKHNldHVwUmVzaXplciwgMjUwKSk7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgVUkgZWxlbWVudCB0byByZXNpemUgdGhlIDItY29sdW1ucy5cbiAqXG4gKiBEb2VzIG5vdGhpbmcgb24gYSBzaW5nbGUgY29sdW1uIGl0ZW0uXG4gKlxuICogRG9lc24ndCByZW5kZXIgaWYgaW4gcmVzcG9uc2l2ZSBtb2RlLlxuICogQHNpbmNlIDAuNS4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHNldHVwUmVzaXplcigpIHtcbiAgICBsZXQgZWxJdGVtID0gaXRlbS5pdGVtRWxlbWVudCgpO1xuICAgIGxldCBlbENvbHVtbnMgPSBlbEl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnW2NsYXNzXj1cImNvbC1cIl0nKTtcbiAgICBsZXQgaGFzUmVzaXplciA9IEJvb2xlYW4oZWxJdGVtLnF1ZXJ5U2VsZWN0b3IoJy5scm4tcmVzaXplcicpKTtcbiAgICBsZXQgaXNSZXNwb25zaXZlTW9kZSA9IEJvb2xlYW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxybi1sYXlvdXQtc2luZ2xlLWNvbHVtbicpKTtcblxuICAgIC8vIE9ubHkgYWRkIHRoZSByZXNpemFibGUgVUkgaWYgd2UgaGF2ZSAyIGNvbHVtbnNcbiAgICBpZiAoZWxDb2x1bW5zLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoIWlzUmVzcG9uc2l2ZU1vZGUgJiYgIWhhc1Jlc2l6ZXIpIHtcbiAgICAgICAgICAgIGxldCBlbFJlc2l6ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGVsUmVzaXplci5zZXRBdHRyaWJ1dGUoJ3Rvb2x0aXAnLCAnQ2xpY2sgYW5kIGhvbGQgdG8gZHJhZyBjb2x1bW4gd2lkdGgnKTtcbiAgICAgICAgICAgIC8vIGVsUmVzaXplci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgIGxldCBlbFRhYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIGVsVGFiLmlubmVySFRNTCA9ICfihqQg4oamJztcblxuICAgICAgICAgICAgZWxSZXNpemVyLmNsYXNzTGlzdC5hZGQoJ2xybi1yZXNpemVyJyk7XG4gICAgICAgICAgICBlbENvbHVtbnNbMF0uY2xhc3NMaXN0LmFkZCgnbHJuLWNvbHVtbi1sZWZ0Jyk7XG4gICAgICAgICAgICBlbENvbHVtbnNbMV0uY2xhc3NMaXN0LmFkZCgnbHJuLWNvbHVtbi1yaWdodCcpO1xuXG4gICAgICAgICAgICBlbFJlc2l6ZXIuYXBwZW5kKGVsVGFiKTtcbiAgICAgICAgICAgIGVsQ29sdW1uc1swXS5hZnRlcihlbFJlc2l6ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2l2ZU1vZGUgJiYgaGFzUmVzaXplcikge1xuICAgICAgICAgICAgY2xlYXJSZXNpemVyKGVsSXRlbSwgZWxDb2x1bW5zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvUmVzaXplKGVsSXRlbSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgcmVzaXplciBVSSBlbGVtZW50IGFuZCB3aWR0aCBhdHRyaWJ1dGVcbiAqIGZyb20gdGhlIGxlZnQgY29sdW1uLlxuICogQHNpbmNlIDAuNS4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyUmVzaXplcihlbEl0ZW0sIGVsQ29sdW1ucykge1xuICAgIGxldCBlbFJlc2l6ZXIgPSBlbEl0ZW0ucXVlcnlTZWxlY3RvcignLmxybi1yZXNpemVyJyk7XG4gICAgaWYgKGVsUmVzaXplcikge1xuICAgICAgICBlbFJlc2l6ZXIucmVtb3ZlKCk7XG4gICAgfVxuICAgIGVsQ29sdW1uc1swXS5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG59XG5cbi8qKlxuICogSmF2YVNjcmlwdCBsb2dpYyBmb3IgdGhlIGNvbHVtbiByZXNpemUgZmVhdHVyZS5cbiAqIEBzaW5jZSAwLjUuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBkb1Jlc2l6ZShlbEl0ZW0pIHtcbiAgICBjb25zdCByZXNpemFibGUgPSBmdW5jdGlvbiAoZWxSZXNpemVyKSB7XG4gICAgICAgIGNvbnN0IHByZXZTaWJsaW5nID0gZWxSZXNpemVyLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgbGV0IHggPSAwO1xuICAgICAgICBsZXQgcHJldlNpYmxpbmdXaWR0aCA9IDA7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlSW50ZXJhY3Rpb25TdGFydCA9IGUgPT4ge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgeCA9IGUuY2xpZW50WDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHByZXZTaWJsaW5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcHJldlNpYmxpbmdXaWR0aCA9IHJlY3Qud2lkdGg7XG5cbiAgICAgICAgICAgIC8vIE1vdXNlIGV2ZW50c1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlSW50ZXJhY3Rpb25Nb3ZlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVJbnRlcmFjdGlvbkVuZCk7XG5cbiAgICAgICAgICAgIC8vIFRvdWNoIGV2ZW50c1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlSW50ZXJhY3Rpb25Nb3ZlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaGFuZGxlSW50ZXJhY3Rpb25FbmQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZUludGVyYWN0aW9uTW92ZSA9IGUgPT4ge1xuICAgICAgICAgICAgbGV0IGR4O1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZHggPSBlLmNsaWVudFggLSB4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkeCA9IGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYIC0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHcgPSAoKHByZXZTaWJsaW5nV2lkdGggKyBkeCkgKiAxMDApIC8gZWxSZXNpemVyLnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICBpZiAodyA+PSAxMCAmJiB3IDw9IDkwKSBwcmV2U2libGluZy5zdHlsZS53aWR0aCA9IHcgKyAnJSc7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlSW50ZXJhY3Rpb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBNb3VzZSBldmVudHNcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZUludGVyYWN0aW9uTW92ZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlSW50ZXJhY3Rpb25FbmQpO1xuXG4gICAgICAgICAgICAvLyBUb3VjaCBldmVudHNcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZUludGVyYWN0aW9uTW92ZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZUludGVyYWN0aW9uRW5kKTtcbiAgICAgICAgfTtcblxuICAgICAgICBlbFJlc2l6ZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlSW50ZXJhY3Rpb25TdGFydCk7XG4gICAgICAgIGVsUmVzaXplci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgaGFuZGxlSW50ZXJhY3Rpb25TdGFydCk7XG4gICAgfTtcblxuICAgIGxldCBlbFJlc2l6ZXIgPSBlbEl0ZW0ucXVlcnlTZWxlY3RvcignLmxybi1yZXNpemVyJyk7XG4gICAgaWYgKGVsUmVzaXplcikgcmVzaXphYmxlKGVsUmVzaXplcik7XG59XG5cbi8qKlxuICogSW5qZWN0cyB0aGUgbmVjZXNzYXJ5IENTUyB0byB0aGUgaGVhZGVyXG4gKiBAc2luY2UgMC41LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gaW5qZWN0Q1NTKCkge1xuICAgIGNvbnN0IGVsU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNvbnN0IGNzcyA9IGBcbi8qIExlYXJub3NpdHkgY29sdW1uIHJlc2l6ZXIgc3R5bGVzICovXG4ubHJuLXJlc2l6ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOGU4ZTg7XG4gICAgY3Vyc29yOiBncmFiO1xuICAgIHdpZHRoOiAzcHg7XG4gICAgcGFkZGluZzogMDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4ubHJuLXJlc2l6ZXIgc3BhbiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiA0NXB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZTRlNGU0O1xuICAgIGxlZnQ6IC0yMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBjdXJzb3I6IGdyYWI7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMS41ZW07XG4gICAgei1pbmRleDogMjtcbiAgICBwYWRkaW5nLWJvdHRvbTogM3B4O1xuICAgIGNvbG9yOiAjNDQ0O1xuXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcblxuICAgIGJhY2tncm91bmQ6IHJnYigyMzMsMjMzLDIzMyk7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDBkZWcsIHJnYmEoMjMzLDIzMywyMzMsMSkgMCUsIHJnYmEoMjUwLDI1MCwyNTAsMSkgNTElLCByZ2JhKDIzOCwyMzgsMjM4LDEpIDEwMCUpO1xufVxuLnJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cbi5jb2wteHMtNi5scm4tY29sdW1uLWxlZnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWluLXdpZHRoOiA1ZW07XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jb2wteHMtNi5scm4tY29sdW1uLXJpZ2h0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgZmxleDogMTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgbWluLXdpZHRoOiA1ZW07XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5scm4tY29sdW1uLWxlZnQgLmxybl93aWRnZXQsXG4ubHJuLWNvbHVtbi1yaWdodCAubHJuX3dpZGdldCB7XG4gICAgcGFkZGluZzogMS41ZW07XG59XG5AbWVkaWEgKG1heC13aWR0aDogNjUwcHgpIHtcbiAgICAubHJuLXJlc2l6ZXIge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbmA7XG5cbiAgICBlbFN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGVsU3R5bGUpO1xuXG4gICAgc3RhdGUucmVuZGVyZWRDc3MgPSB0cnVlO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgZGVib3VuY2UgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGZ1bmNcbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0XG4gKiBAc2luY2UgMC41LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCkge1xuICAgIGlmICghc3RhdGUucmVzaXplLnRyaWdnZXJlZCkge1xuICAgICAgICBzdGF0ZS5yZXNpemUudHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgZnVuYy5hcHBseSh0aGlzKTtcbiAgICB9XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgc3RhdGUucmVzaXplLnRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfSwgd2FpdCk7XG4gICAgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/columnResizer.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/hideAlternatives.js": -/*!************************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/hideAlternatives.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var shuffle_seed__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! shuffle-seed */ \"./node_modules/shuffle-seed/index.js\");\n/* harmony import */ var shuffle_seed__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(shuffle_seed__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Hides a number of MCQ distractors/alternatives, that aren't\n * the correct answer, as an accommodation capability for\n * students wanting to avoid cognitive load.\n * @module Extensions/Assessment/hideAlternatives\n */\n\n/**\n * Sets up an item load listener to hide distractor(s).\n * @param {number=} num The number of MCQ options to hide. Defaults to `1`.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.hideAlternatives.run();\n * @since 0.3.0\n */\nfunction run(num) {\n let numToHide = num || 1;\n let qt = 'mcq'; // Limited to MCQ only (see targeted classnames when hiding options)\n let logPrefix = 'LRN Hide Alternatives:';\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', () => {\n let qs = _core_questions__WEBPACK_IMPORTED_MODULE_1__.questions();\n\n Object.values(qs).forEach(function (question) {\n if (question.type === qt) {\n if (isSingleResponseMode(question)) {\n if (hasValidNumToHide(question, numToHide)) {\n if (hasValidationObject(question)) {\n if (hasCorrectAnswers(question.validation)) {\n // Create a question options list excluding the correct answer\n let optionsList = [];\n let correctAnswers = getCorrectAnswers(question.validation);\n Object.values(correctAnswers).forEach(function (answer) {\n Object.values(question.options).forEach(function (option) {\n if (answer !== option.value) {\n optionsList.push(option.value);\n }\n });\n });\n // Shuffle the options list\n let optionsToHide = [];\n for (let j = 0; j < numToHide; j++) {\n optionsToHide.push(shuffle_seed__WEBPACK_IMPORTED_MODULE_2__.shuffle(optionsList, question.response_id)[j]);\n }\n // Hide the option(s)\n let responsesEl = document.getElementById(question.response_id).getElementsByClassName('lrn_mcqgroup');\n for (let i = 0; i < responsesEl[0].children.length; i++) {\n let inputEl = responsesEl[0].children[i].getElementsByClassName('lrn-input');\n for (const val of optionsToHide) {\n if (inputEl[0].getAttribute('value') === val) {\n responsesEl[0].children[i].style.display = 'none';\n }\n }\n }\n } else {\n console.info(logPrefix, 'No correct answer found in validation object');\n }\n } else {\n console.info(logPrefix, ' No validation object found');\n }\n } else {\n console.info(logPrefix, 'Invalid number of options to hide:', numToHide);\n }\n } else {\n console.info(logPrefix, 'Only supports single response mode');\n }\n }\n });\n });\n}\n\n/**\n * @param {object} question The question JSON object to inspect\n * @return {boolean} Whether the question was set up with single responses\n * @since 0.3.0\n * @ignore\n */\nfunction isSingleResponseMode(question) {\n return !question.multiple_responses || question.multiple_responses === false;\n}\n\n/**\n * @param {object} question The question JSON object to inspect\n * @return {boolean} Whether the caller passes a correct number of options to hide\n * @since 0.3.0\n * @ignore\n */\nfunction hasValidNumToHide(question, num) {\n return question.options.length - num > 1;\n}\n\n/**\n * @param {object} question The question JSON object to inspect\n * @return {boolean} Whether the object contains a `validation` key\n * @since 0.3.0\n * @ignore\n */\nfunction hasValidationObject(question) {\n return 'validation' in question ? question.validation : false;\n}\n\n/**\n * @param {object} validation The question validation object to inspect\n * @return {boolean} Whether the object contains a `validation` key\n * @since 0.3.0\n * @ignore\n */\nfunction hasCorrectAnswers(validation) {\n return Boolean(validation.valid_response.value && validation.valid_response.value.length);\n}\n\n/**\n * @param {object} validation The question validation object\n * @return {array} The correct responses as set by the author\n * @since 0.3.0\n * @ignore\n */\nfunction getCorrectAnswers(validation) {\n return validation.valid_response.value;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvaGlkZUFsdGVybmF0aXZlcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUF5QztBQUNZO0FBQ1Q7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0Esb0JBQW9CO0FBQ3BCOztBQUVBLElBQUksa0RBQWU7QUFDbkIsaUJBQWlCLHNEQUFtQjs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGdEQUFnRCxlQUFlO0FBQy9ELHVEQUF1RCxpREFBbUI7QUFDMUU7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELG9DQUFvQztBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvaGlkZUFsdGVybmF0aXZlcy5qcz9kZmZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuLi8uLi8uLi9jb3JlL2FwcCc7XG5pbXBvcnQgKiBhcyBxdWVzdGlvbnMgZnJvbSAnLi4vLi4vLi4vY29yZS9xdWVzdGlvbnMnO1xuaW1wb3J0ICogYXMgc2h1ZmZsZVNlZWQgZnJvbSAnc2h1ZmZsZS1zZWVkJztcblxuLyoqXG4gKiBFeHRlbnNpb25zIGFkZCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHRvIEl0ZW1zIEFQSS5cbiAqIFRoZXkgcmVseSBvbiBtb2R1bGVzIHdpdGhpbiBMVCBiZWluZyBhdmFpbGFibGUuXG4gKlxuICogLS1cbiAqXG4gKiBIaWRlcyBhIG51bWJlciBvZiBNQ1EgZGlzdHJhY3RvcnMvYWx0ZXJuYXRpdmVzLCB0aGF0IGFyZW4ndFxuICogdGhlIGNvcnJlY3QgYW5zd2VyLCBhcyBhbiBhY2NvbW1vZGF0aW9uIGNhcGFiaWxpdHkgZm9yXG4gKiBzdHVkZW50cyB3YW50aW5nIHRvIGF2b2lkIGNvZ25pdGl2ZSBsb2FkLlxuICogQG1vZHVsZSBFeHRlbnNpb25zL0Fzc2Vzc21lbnQvaGlkZUFsdGVybmF0aXZlc1xuICovXG5cbi8qKlxuICogU2V0cyB1cCBhbiBpdGVtIGxvYWQgbGlzdGVuZXIgdG8gaGlkZSBkaXN0cmFjdG9yKHMpLlxuICogQHBhcmFtIHtudW1iZXI9fSBudW0gVGhlIG51bWJlciBvZiBNQ1Egb3B0aW9ucyB0byBoaWRlLiBEZWZhdWx0cyB0byBgMWAuXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTFQgfSBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2luZGV4JztcbiAqXG4gKiBMVC5pbml0KGl0ZW1zQXBwKTsgLy8gU2V0IHVwIExUIHdpdGggdGhlIEl0ZW1zIEFQSSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB2YXJpYWJsZVxuICogTFQuZXh0ZW5zaW9ucy5oaWRlQWx0ZXJuYXRpdmVzLnJ1bigpO1xuICogQHNpbmNlIDAuMy4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW4obnVtKSB7XG4gICAgbGV0IG51bVRvSGlkZSA9IG51bSB8fCAxO1xuICAgIGxldCBxdCA9ICdtY3EnOyAvLyBMaW1pdGVkIHRvIE1DUSBvbmx5IChzZWUgdGFyZ2V0ZWQgY2xhc3NuYW1lcyB3aGVuIGhpZGluZyBvcHRpb25zKVxuICAgIGxldCBsb2dQcmVmaXggPSAnTFJOIEhpZGUgQWx0ZXJuYXRpdmVzOic7XG5cbiAgICBhcHAuYXBwSW5zdGFuY2UoKS5vbignaXRlbTpsb2FkJywgKCkgPT4ge1xuICAgICAgICBsZXQgcXMgPSBxdWVzdGlvbnMucXVlc3Rpb25zKCk7XG5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyhxcykuZm9yRWFjaChmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbi50eXBlID09PSBxdCkge1xuICAgICAgICAgICAgICAgIGlmIChpc1NpbmdsZVJlc3BvbnNlTW9kZShxdWVzdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1ZhbGlkTnVtVG9IaWRlKHF1ZXN0aW9uLCBudW1Ub0hpZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRhdGlvbk9iamVjdChxdWVzdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ29ycmVjdEFuc3dlcnMocXVlc3Rpb24udmFsaWRhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcXVlc3Rpb24gb3B0aW9ucyBsaXN0IGV4Y2x1ZGluZyB0aGUgY29ycmVjdCBhbnN3ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvbnNMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3JyZWN0QW5zd2VycyA9IGdldENvcnJlY3RBbnN3ZXJzKHF1ZXN0aW9uLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGNvcnJlY3RBbnN3ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChhbnN3ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMocXVlc3Rpb24ub3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuc3dlciAhPT0gb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNMaXN0LnB1c2gob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNodWZmbGUgdGhlIG9wdGlvbnMgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uc1RvSGlkZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bVRvSGlkZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVG9IaWRlLnB1c2goc2h1ZmZsZVNlZWQuc2h1ZmZsZShvcHRpb25zTGlzdCwgcXVlc3Rpb24ucmVzcG9uc2VfaWQpW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIaWRlIHRoZSBvcHRpb24ocylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocXVlc3Rpb24ucmVzcG9uc2VfaWQpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xybl9tY3Fncm91cCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlc0VsWzBdLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRFbCA9IHJlc3BvbnNlc0VsWzBdLmNoaWxkcmVuW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xybi1pbnB1dCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWwgb2Ygb3B0aW9uc1RvSGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsWzBdLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA9PT0gdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlc0VsWzBdLmNoaWxkcmVuW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGxvZ1ByZWZpeCwgJ05vIGNvcnJlY3QgYW5zd2VyIGZvdW5kIGluIHZhbGlkYXRpb24gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8obG9nUHJlZml4LCAnIE5vIHZhbGlkYXRpb24gb2JqZWN0IGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8obG9nUHJlZml4LCAnSW52YWxpZCBudW1iZXIgb2Ygb3B0aW9ucyB0byBoaWRlOicsIG51bVRvSGlkZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8obG9nUHJlZml4LCAnT25seSBzdXBwb3J0cyBzaW5nbGUgcmVzcG9uc2UgbW9kZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHF1ZXN0aW9uIFRoZSBxdWVzdGlvbiBKU09OIG9iamVjdCB0byBpbnNwZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBxdWVzdGlvbiB3YXMgc2V0IHVwIHdpdGggc2luZ2xlIHJlc3BvbnNlc1xuICogQHNpbmNlIDAuMy4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGlzU2luZ2xlUmVzcG9uc2VNb2RlKHF1ZXN0aW9uKSB7XG4gICAgcmV0dXJuICFxdWVzdGlvbi5tdWx0aXBsZV9yZXNwb25zZXMgfHwgcXVlc3Rpb24ubXVsdGlwbGVfcmVzcG9uc2VzID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcXVlc3Rpb24gVGhlIHF1ZXN0aW9uIEpTT04gb2JqZWN0IHRvIGluc3BlY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGNhbGxlciBwYXNzZXMgYSBjb3JyZWN0IG51bWJlciBvZiBvcHRpb25zIHRvIGhpZGVcbiAqIEBzaW5jZSAwLjMuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBoYXNWYWxpZE51bVRvSGlkZShxdWVzdGlvbiwgbnVtKSB7XG4gICAgcmV0dXJuIHF1ZXN0aW9uLm9wdGlvbnMubGVuZ3RoIC0gbnVtID4gMTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcXVlc3Rpb24gVGhlIHF1ZXN0aW9uIEpTT04gb2JqZWN0IHRvIGluc3BlY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG9iamVjdCBjb250YWlucyBhIGB2YWxpZGF0aW9uYCBrZXlcbiAqIEBzaW5jZSAwLjMuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBoYXNWYWxpZGF0aW9uT2JqZWN0KHF1ZXN0aW9uKSB7XG4gICAgcmV0dXJuICd2YWxpZGF0aW9uJyBpbiBxdWVzdGlvbiA/IHF1ZXN0aW9uLnZhbGlkYXRpb24gOiBmYWxzZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsaWRhdGlvbiBUaGUgcXVlc3Rpb24gdmFsaWRhdGlvbiBvYmplY3QgdG8gaW5zcGVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgb2JqZWN0IGNvbnRhaW5zIGEgYHZhbGlkYXRpb25gIGtleVxuICogQHNpbmNlIDAuMy4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGhhc0NvcnJlY3RBbnN3ZXJzKHZhbGlkYXRpb24pIHtcbiAgICByZXR1cm4gQm9vbGVhbih2YWxpZGF0aW9uLnZhbGlkX3Jlc3BvbnNlLnZhbHVlICYmIHZhbGlkYXRpb24udmFsaWRfcmVzcG9uc2UudmFsdWUubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsaWRhdGlvbiBUaGUgcXVlc3Rpb24gdmFsaWRhdGlvbiBvYmplY3RcbiAqIEByZXR1cm4ge2FycmF5fSBUaGUgY29ycmVjdCByZXNwb25zZXMgYXMgc2V0IGJ5IHRoZSBhdXRob3JcbiAqIEBzaW5jZSAwLjMuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBnZXRDb3JyZWN0QW5zd2Vycyh2YWxpZGF0aW9uKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRpb24udmFsaWRfcmVzcG9uc2UudmFsdWU7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/hideAlternatives.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/keyboardShortcuts.js": -/*!*************************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/keyboardShortcuts.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../core/questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var platform_detect__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! platform-detect */ \"./node_modules/platform-detect/index.js\");\n/* harmony import */ var platform_detect__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(platform_detect__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var mousetrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! mousetrap */ \"./node_modules/mousetrap/mousetrap.js\");\n/* harmony import */ var mousetrap__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(mousetrap__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Enables keyboard shortcuts to perform an action against\n * a question or on the assessment player.\n * @module Extensions/Assessment/keyboardShortcuts\n */\n\nconst state = {\n supportedPlatforms: ['chromeos', 'macos', 'windows'],\n};\n\n/**\n * Sets up listeners to enable item or player keyboard shortcuts.\n *\n * Supports:\n * - setting an MCQ response on items with a single MC questions, not multi-part.\n * - enabling answer masking mode.\n * - setting a mask on MCQ possible responses.\n * - toggle flagging of an item.\n *\n * All listeners will fire when you call `run()`. Pass a custom\n * map if you want to remove any shortcuts.\n *\n * See example section below for bindings.\n * @param {object=} map A map of keyboard shortcut options.\n * ```\n * // Default configuration:\n * {\n * global: [\n * {\n * bindings: {\n * chromeos: ['ctrl+shift+v'],\n * macos: ['command+shift+v'],\n * windows: ['ctrl+shift+v'],\n * },\n * type: 'item.flag',\n * },\n * {\n * bindings: {\n * chromeos: ['ctrl+alt+0'],\n * macos: ['command+option+0'],\n * windows: ['ctrl+alt+0'],\n * },\n * type: 'masking.enable',\n * },\n * ],\n * item: [\n * {\n * bindings: {\n * chromeos: ['ctrl+shift+1', 'ctrl+shift+2', 'ctrl+shift+3', 'ctrl+shift+4', 'ctrl+shift+5', 'ctrl+shift+6'],\n * macos: ['command+ctrl+1', 'command+ctrl+2', 'command+ctrl+3', 'command+ctrl+4', 'command+ctrl+5', 'command+ctrl+6'],\n * windows: ['ctrl+shift+1', 'ctrl+shift+2', 'ctrl+shift+3', 'ctrl+shift+4', 'ctrl+shift+5', 'ctrl+shift+6'],\n * },\n * restrictTo: ['mcq'],\n * type: 'response.set',\n * },\n * {\n * bindings: {\n * chromeos: ['ctrl+alt+1', 'ctrl+alt+2', 'ctrl+alt+3', 'ctrl+alt+4', 'ctrl+alt+5', 'ctrl+alt+6'],\n * macos: ['command+option+1', 'command+option+2', 'command+option+3', 'command+option+4', 'command+option+5', 'command+option+6'],\n * windows: ['ctrl+alt+1', 'ctrl+alt+2', 'ctrl+alt+3', 'ctrl+alt+4', 'ctrl+alt+5', 'ctrl+alt+6'],\n * },\n * type: 'response.mask',\n * },\n * ],\n * };\n * ```\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.keyboardShortcuts.run();\n * @since 0.4.0\n */\nfunction run(map = getDefaultBindings()) {\n const currentPlatform = getPlatform();\n\n state.bindings = map;\n\n if (currentPlatform) {\n overrideCallback();\n\n // Global (player wide) bindings\n if (state.bindings.hasOwnProperty('global') && Array.isArray(state.bindings.global)) {\n state.bindings.global.forEach(obj => {\n if (obj.hasOwnProperty('type')) {\n switch (obj.type) {\n case 'item.flag':\n toggleFlag(obj.bindings[currentPlatform]);\n break;\n\n case 'masking.enable':\n enableMasking(obj.bindings[currentPlatform]);\n break;\n\n default:\n break;\n }\n }\n });\n }\n\n // Per item bindings\n if (state.bindings.hasOwnProperty('item') && Array.isArray(state.bindings.item)) {\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', () => {\n state.bindings.item.forEach(obj => {\n if (obj.hasOwnProperty('type')) {\n switch (obj.type) {\n case 'response.mask':\n setResponseMask(obj.bindings[currentPlatform]);\n break;\n\n case 'response.set':\n setMcqOption(obj.bindings[currentPlatform]);\n break;\n\n default:\n break;\n }\n }\n });\n });\n }\n }\n}\n\n/**\n * Enables masking mode for a single question on the active\n * item (if supported).\n * @param {object} bindings Platform specific bindings for this action.\n * @since 0.4.0\n * @ignore\n */\nfunction enableMasking(bindings) {\n let q = _core_questions__WEBPACK_IMPORTED_MODULE_2__.questionInstance();\n\n if (q.isMaskable()) {\n mousetrap__WEBPACK_IMPORTED_MODULE_4__.bind(bindings, e => {\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().questionsApp().masking(!_core_items__WEBPACK_IMPORTED_MODULE_1__.isMaskingEnabled());\n });\n } else {\n // Ignoring items with more than one question\n }\n}\n\n/**\n * The default key bindings object.\n * @returns {object}\n * @since 0.4.0\n * @ignore\n */\nfunction getDefaultBindings() {\n return {\n global: [\n {\n bindings: {\n chromeos: ['ctrl+shift+v'],\n macos: ['command+shift+v'],\n windows: ['ctrl+shift+v'],\n },\n type: 'item.flag',\n },\n {\n bindings: {\n chromeos: ['ctrl+alt+0'],\n macos: ['command+option+0'],\n windows: ['ctrl+alt+0'],\n },\n type: 'masking.enable',\n },\n ],\n item: [\n {\n bindings: {\n chromeos: ['ctrl+shift+1', 'ctrl+shift+2', 'ctrl+shift+3', 'ctrl+shift+4', 'ctrl+shift+5', 'ctrl+shift+6'],\n macos: ['command+ctrl+1', 'command+ctrl+2', 'command+ctrl+3', 'command+ctrl+4', 'command+ctrl+5', 'command+ctrl+6'],\n windows: ['ctrl+shift+1', 'ctrl+shift+2', 'ctrl+shift+3', 'ctrl+shift+4', 'ctrl+shift+5', 'ctrl+shift+6'],\n },\n restrictTo: ['mcq'],\n type: 'response.set',\n },\n {\n bindings: {\n chromeos: ['ctrl+alt+1', 'ctrl+alt+2', 'ctrl+alt+3', 'ctrl+alt+4', 'ctrl+alt+5', 'ctrl+alt+6'],\n macos: ['command+option+1', 'command+option+2', 'command+option+3', 'command+option+4', 'command+option+5', 'command+option+6'],\n windows: ['ctrl+alt+1', 'ctrl+alt+2', 'ctrl+alt+3', 'ctrl+alt+4', 'ctrl+alt+5', 'ctrl+alt+6'],\n },\n type: 'response.mask',\n },\n ],\n };\n}\n\n/**\n * Checks to see whether the user platform is supported\n * for keyboard shortcuts. Eg we won't support touch\n * platforms.\n * @returns {boolean}\n * @since 0.4.0\n * @ignore\n */\nfunction getPlatform() {\n let currentPlatform;\n\n state.supportedPlatforms.forEach(p => {\n if (platform_detect__WEBPACK_IMPORTED_MODULE_3__[p]) {\n currentPlatform = p;\n }\n });\n\n return currentPlatform;\n}\n\n/**\n * Override the default stop callback method of mousetrap\n * because if the focus is on an MCQ element (radio or\n * checkbox) we still want to fire an event if the user\n * chooses a different option.\n * @since 0.4.0\n * @ignore\n */\nfunction overrideCallback() {\n mousetrap__WEBPACK_IMPORTED_MODULE_4__.prototype.stopCallback = function (e, element, combo) {\n let activeEl = document.activeElement;\n\n // We don't stop if focus is on a radio button\n if (activeEl.getAttribute('type') === 'radio' || activeEl.getAttribute('type') === 'checkbox') {\n return false;\n }\n\n // if the element has the class \"mousetrap\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {\n return false;\n }\n\n // stop for input, select, and textarea\n return (\n element.tagName == 'INPUT' ||\n element.tagName == 'SELECT' ||\n element.tagName == 'TEXTAREA' ||\n (element.contentEditable && element.contentEditable == 'true')\n );\n };\n}\n\n/**\n * Manually clicks an MCQ possible response.\n * @param {object} bindings Platform specific bindings for this action.\n * @since 0.4.0\n * @ignore\n */\nfunction setMcqOption(bindings) {\n let qs = _core_questions__WEBPACK_IMPORTED_MODULE_2__.questions();\n let numMCQs = 0;\n\n qs.forEach(q => {\n if (q.type === 'mcq') {\n numMCQs++;\n }\n });\n\n if (numMCQs === 1) {\n Object.values(qs).forEach(function (question) {\n if (question.type === 'mcq') {\n mousetrap__WEBPACK_IMPORTED_MODULE_4__.bind(bindings, e => {\n if (question.options?.length >= e.key) {\n let domWrapper = document.getElementById(`${question.response_id}`);\n let domOptions = domWrapper.querySelectorAll('.lrn-input');\n domOptions[e.key - 1].click();\n }\n });\n }\n });\n } else {\n // Ignoring items with more than one MCQ\n }\n}\n\n/**\n * Manually masks a possible response.\n * @param {object} bindings Platform specific bindings for this action.\n * @since 0.4.0\n * @ignore\n */\nfunction setResponseMask(bindings) {\n let qs = _core_questions__WEBPACK_IMPORTED_MODULE_2__.questions();\n let numMCQs = 0;\n\n qs.forEach(q => {\n if (q.type === 'mcq') {\n numMCQs++;\n }\n });\n\n if (numMCQs === 1) {\n Object.values(qs).forEach(function (question) {\n if (question.type === 'mcq') {\n mousetrap__WEBPACK_IMPORTED_MODULE_4__.bind(bindings, (e, combo) => {\n if (_core_items__WEBPACK_IMPORTED_MODULE_1__.isMaskingEnabled()) {\n let index = Number(combo.at(-1));\n if (question.options?.length >= index) {\n let domWrapper = _core_items__WEBPACK_IMPORTED_MODULE_1__.itemElement();\n let domOptions = domWrapper.querySelectorAll('.lrn-mcq-option');\n let elMask = domOptions[index - 1].querySelector('.lrn-mask');\n if (elMask) {\n elMask.click();\n }\n }\n }\n });\n }\n });\n } else {\n // Ignoring items with more than one MCQ\n }\n}\n\n/**\n * Manually toggles the item flag button.\n * @param {object} bindings Platform specific bindings for this action.\n * @since 0.4.0\n * @ignore\n */\nfunction toggleFlag(bindings) {\n mousetrap__WEBPACK_IMPORTED_MODULE_4__.bind(bindings, (e, combo) => {\n _core_items__WEBPACK_IMPORTED_MODULE_1__.flag();\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgva2V5Ym9hcmRTaG9ydGN1dHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBeUM7QUFDSTtBQUNRO0FBQ1Q7QUFDTDs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBLFlBQVksa0RBQWU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNkRBQTBCOztBQUV0QztBQUNBLFFBQVEsMkNBQWM7QUFDdEIsWUFBWSxrREFBZSwyQkFBMkIseURBQXNCO0FBQzVFLFNBQVM7QUFDVCxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksNENBQVE7QUFDcEI7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdEQUFtQjtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsc0RBQW1CO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMkNBQWM7QUFDOUI7QUFDQSxvRUFBb0UscUJBQXFCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVCxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHNEQUFtQjtBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDJDQUFjO0FBQzlCLHdCQUF3Qix5REFBc0I7QUFDOUM7QUFDQTtBQUNBLDZDQUE2QyxvREFBaUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1QsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwyQ0FBYztBQUNsQixRQUFRLDZDQUFVO0FBQ2xCLEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgva2V5Ym9hcmRTaG9ydGN1dHMuanM/NzEwYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi4vLi4vLi4vY29yZS9hcHAnO1xuaW1wb3J0ICogYXMgaXRlbXMgZnJvbSAnLi4vLi4vLi4vY29yZS9pdGVtcyc7XG5pbXBvcnQgKiBhcyBxdWVzdGlvbnMgZnJvbSAnLi4vLi4vLi4vY29yZS9xdWVzdGlvbnMnO1xuaW1wb3J0ICogYXMgcGxhdGZvcm0gZnJvbSAncGxhdGZvcm0tZGV0ZWN0JztcbmltcG9ydCAqIGFzIE1vdXNldHJhcCBmcm9tICdtb3VzZXRyYXAnO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIEVuYWJsZXMga2V5Ym9hcmQgc2hvcnRjdXRzIHRvIHBlcmZvcm0gYW4gYWN0aW9uIGFnYWluc3RcbiAqIGEgcXVlc3Rpb24gb3Igb24gdGhlIGFzc2Vzc21lbnQgcGxheWVyLlxuICogQG1vZHVsZSBFeHRlbnNpb25zL0Fzc2Vzc21lbnQva2V5Ym9hcmRTaG9ydGN1dHNcbiAqL1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICBzdXBwb3J0ZWRQbGF0Zm9ybXM6IFsnY2hyb21lb3MnLCAnbWFjb3MnLCAnd2luZG93cyddLFxufTtcblxuLyoqXG4gKiBTZXRzIHVwIGxpc3RlbmVycyB0byBlbmFibGUgaXRlbSBvciBwbGF5ZXIga2V5Ym9hcmQgc2hvcnRjdXRzLlxuICpcbiAqIFN1cHBvcnRzOlxuICogIC0gc2V0dGluZyBhbiBNQ1EgcmVzcG9uc2Ugb24gaXRlbXMgd2l0aCBhIHNpbmdsZSBNQyBxdWVzdGlvbnMsIG5vdCBtdWx0aS1wYXJ0LlxuICogIC0gZW5hYmxpbmcgYW5zd2VyIG1hc2tpbmcgbW9kZS5cbiAqICAtIHNldHRpbmcgYSBtYXNrIG9uIE1DUSBwb3NzaWJsZSByZXNwb25zZXMuXG4gKiAgLSB0b2dnbGUgZmxhZ2dpbmcgb2YgYW4gaXRlbS5cbiAqXG4gKiBBbGwgbGlzdGVuZXJzIHdpbGwgZmlyZSB3aGVuIHlvdSBjYWxsIGBydW4oKWAuIFBhc3MgYSBjdXN0b21cbiAqIG1hcCBpZiB5b3Ugd2FudCB0byByZW1vdmUgYW55IHNob3J0Y3V0cy5cbiAqXG4gKiBTZWUgZXhhbXBsZSBzZWN0aW9uIGJlbG93IGZvciBiaW5kaW5ncy5cbiAqIEBwYXJhbSB7b2JqZWN0PX0gbWFwIEEgbWFwIG9mIGtleWJvYXJkIHNob3J0Y3V0IG9wdGlvbnMuXG4gKiBgYGBcbiAqIC8vIERlZmF1bHQgY29uZmlndXJhdGlvbjpcbiAqIHtcbiAqICAgICBnbG9iYWw6IFtcbiAqICAgICAgICAge1xuICogICAgICAgICAgICAgYmluZGluZ3M6IHtcbiAqICAgICAgICAgICAgICAgICBjaHJvbWVvczogWydjdHJsK3NoaWZ0K3YnXSxcbiAqICAgICAgICAgICAgICAgICBtYWNvczogWydjb21tYW5kK3NoaWZ0K3YnXSxcbiAqICAgICAgICAgICAgICAgICB3aW5kb3dzOiBbJ2N0cmwrc2hpZnQrdiddLFxuICogICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgIHR5cGU6ICdpdGVtLmZsYWcnLFxuICogICAgICAgICB9LFxuICogICAgICAgICB7XG4gKiAgICAgICAgICAgICBiaW5kaW5nczoge1xuICogICAgICAgICAgICAgICAgIGNocm9tZW9zOiBbJ2N0cmwrYWx0KzAnXSxcbiAqICAgICAgICAgICAgICAgICBtYWNvczogWydjb21tYW5kK29wdGlvbiswJ10sXG4gKiAgICAgICAgICAgICAgICAgd2luZG93czogWydjdHJsK2FsdCswJ10sXG4gKiAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgdHlwZTogJ21hc2tpbmcuZW5hYmxlJyxcbiAqICAgICAgICAgfSxcbiAqICAgICBdLFxuICogICAgIGl0ZW06IFtcbiAqICAgICAgICAge1xuICogICAgICAgICAgICAgYmluZGluZ3M6IHtcbiAqICAgICAgICAgICAgICAgICBjaHJvbWVvczogWydjdHJsK3NoaWZ0KzEnLCAnY3RybCtzaGlmdCsyJywgJ2N0cmwrc2hpZnQrMycsICdjdHJsK3NoaWZ0KzQnLCAnY3RybCtzaGlmdCs1JywgJ2N0cmwrc2hpZnQrNiddLFxuICogICAgICAgICAgICAgICAgIG1hY29zOiBbJ2NvbW1hbmQrY3RybCsxJywgJ2NvbW1hbmQrY3RybCsyJywgJ2NvbW1hbmQrY3RybCszJywgJ2NvbW1hbmQrY3RybCs0JywgJ2NvbW1hbmQrY3RybCs1JywgJ2NvbW1hbmQrY3RybCs2J10sXG4gKiAgICAgICAgICAgICAgICAgd2luZG93czogWydjdHJsK3NoaWZ0KzEnLCAnY3RybCtzaGlmdCsyJywgJ2N0cmwrc2hpZnQrMycsICdjdHJsK3NoaWZ0KzQnLCAnY3RybCtzaGlmdCs1JywgJ2N0cmwrc2hpZnQrNiddLFxuICogICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgIHJlc3RyaWN0VG86IFsnbWNxJ10sXG4gKiAgICAgICAgICAgICB0eXBlOiAncmVzcG9uc2Uuc2V0JyxcbiAqICAgICAgICAgfSxcbiAqICAgICAgICAge1xuICogICAgICAgICAgICAgYmluZGluZ3M6IHtcbiAqICAgICAgICAgICAgICAgICBjaHJvbWVvczogWydjdHJsK2FsdCsxJywgJ2N0cmwrYWx0KzInLCAnY3RybCthbHQrMycsICdjdHJsK2FsdCs0JywgJ2N0cmwrYWx0KzUnLCAnY3RybCthbHQrNiddLFxuICogICAgICAgICAgICAgICAgIG1hY29zOiBbJ2NvbW1hbmQrb3B0aW9uKzEnLCAnY29tbWFuZCtvcHRpb24rMicsICdjb21tYW5kK29wdGlvbiszJywgJ2NvbW1hbmQrb3B0aW9uKzQnLCAnY29tbWFuZCtvcHRpb24rNScsICdjb21tYW5kK29wdGlvbis2J10sXG4gKiAgICAgICAgICAgICAgICAgd2luZG93czogWydjdHJsK2FsdCsxJywgJ2N0cmwrYWx0KzInLCAnY3RybCthbHQrMycsICdjdHJsK2FsdCs0JywgJ2N0cmwrYWx0KzUnLCAnY3RybCthbHQrNiddLFxuICogICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZS5tYXNrJyxcbiAqICAgICAgICAgfSxcbiAqICAgICBdLFxuICogfTtcbiAqIGBgYFxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IExUIH0gZnJvbSAnQGNhc3Bpbmd1cy9sdC9zcmMvYXNzZXNzbWVudC9pbmRleCc7XG4gKlxuICogTFQuaW5pdChpdGVtc0FwcCk7IC8vIFNldCB1cCBMVCB3aXRoIHRoZSBJdGVtcyBBUEkgYXBwbGljYXRpb24gaW5zdGFuY2UgdmFyaWFibGVcbiAqIExULmV4dGVuc2lvbnMua2V5Ym9hcmRTaG9ydGN1dHMucnVuKCk7XG4gKiBAc2luY2UgMC40LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bihtYXAgPSBnZXREZWZhdWx0QmluZGluZ3MoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRQbGF0Zm9ybSA9IGdldFBsYXRmb3JtKCk7XG5cbiAgICBzdGF0ZS5iaW5kaW5ncyA9IG1hcDtcblxuICAgIGlmIChjdXJyZW50UGxhdGZvcm0pIHtcbiAgICAgICAgb3ZlcnJpZGVDYWxsYmFjaygpO1xuXG4gICAgICAgIC8vIEdsb2JhbCAocGxheWVyIHdpZGUpIGJpbmRpbmdzXG4gICAgICAgIGlmIChzdGF0ZS5iaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eSgnZ2xvYmFsJykgJiYgQXJyYXkuaXNBcnJheShzdGF0ZS5iaW5kaW5ncy5nbG9iYWwpKSB7XG4gICAgICAgICAgICBzdGF0ZS5iaW5kaW5ncy5nbG9iYWwuZm9yRWFjaChvYmogPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpdGVtLmZsYWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUZsYWcob2JqLmJpbmRpbmdzW2N1cnJlbnRQbGF0Zm9ybV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXNraW5nLmVuYWJsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlTWFza2luZyhvYmouYmluZGluZ3NbY3VycmVudFBsYXRmb3JtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlciBpdGVtIGJpbmRpbmdzXG4gICAgICAgIGlmIChzdGF0ZS5iaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eSgnaXRlbScpICYmIEFycmF5LmlzQXJyYXkoc3RhdGUuYmluZGluZ3MuaXRlbSkpIHtcbiAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLm9uKCdpdGVtOmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUuYmluZGluZ3MuaXRlbS5mb3JFYWNoKG9iaiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvYmoudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Jlc3BvbnNlLm1hc2snOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZU1hc2sob2JqLmJpbmRpbmdzW2N1cnJlbnRQbGF0Zm9ybV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Jlc3BvbnNlLnNldCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1jcU9wdGlvbihvYmouYmluZGluZ3NbY3VycmVudFBsYXRmb3JtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgbWFza2luZyBtb2RlIGZvciBhIHNpbmdsZSBxdWVzdGlvbiBvbiB0aGUgYWN0aXZlXG4gKiBpdGVtIChpZiBzdXBwb3J0ZWQpLlxuICogQHBhcmFtIHtvYmplY3R9IGJpbmRpbmdzIFBsYXRmb3JtIHNwZWNpZmljIGJpbmRpbmdzIGZvciB0aGlzIGFjdGlvbi5cbiAqIEBzaW5jZSAwLjQuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBlbmFibGVNYXNraW5nKGJpbmRpbmdzKSB7XG4gICAgbGV0IHEgPSBxdWVzdGlvbnMucXVlc3Rpb25JbnN0YW5jZSgpO1xuXG4gICAgaWYgKHEuaXNNYXNrYWJsZSgpKSB7XG4gICAgICAgIE1vdXNldHJhcC5iaW5kKGJpbmRpbmdzLCBlID0+IHtcbiAgICAgICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLnF1ZXN0aW9uc0FwcCgpLm1hc2tpbmcoIWl0ZW1zLmlzTWFza2luZ0VuYWJsZWQoKSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElnbm9yaW5nIGl0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBxdWVzdGlvblxuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBrZXkgYmluZGluZ3Mgb2JqZWN0LlxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBzaW5jZSAwLjQuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0QmluZGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2xvYmFsOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmluZGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY2hyb21lb3M6IFsnY3RybCtzaGlmdCt2J10sXG4gICAgICAgICAgICAgICAgICAgIG1hY29zOiBbJ2NvbW1hbmQrc2hpZnQrdiddLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dzOiBbJ2N0cmwrc2hpZnQrdiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ2l0ZW0uZmxhZycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJpbmRpbmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNocm9tZW9zOiBbJ2N0cmwrYWx0KzAnXSxcbiAgICAgICAgICAgICAgICAgICAgbWFjb3M6IFsnY29tbWFuZCtvcHRpb24rMCddLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dzOiBbJ2N0cmwrYWx0KzAnXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdtYXNraW5nLmVuYWJsZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpdGVtOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmluZGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY2hyb21lb3M6IFsnY3RybCtzaGlmdCsxJywgJ2N0cmwrc2hpZnQrMicsICdjdHJsK3NoaWZ0KzMnLCAnY3RybCtzaGlmdCs0JywgJ2N0cmwrc2hpZnQrNScsICdjdHJsK3NoaWZ0KzYnXSxcbiAgICAgICAgICAgICAgICAgICAgbWFjb3M6IFsnY29tbWFuZCtjdHJsKzEnLCAnY29tbWFuZCtjdHJsKzInLCAnY29tbWFuZCtjdHJsKzMnLCAnY29tbWFuZCtjdHJsKzQnLCAnY29tbWFuZCtjdHJsKzUnLCAnY29tbWFuZCtjdHJsKzYnXSxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93czogWydjdHJsK3NoaWZ0KzEnLCAnY3RybCtzaGlmdCsyJywgJ2N0cmwrc2hpZnQrMycsICdjdHJsK3NoaWZ0KzQnLCAnY3RybCtzaGlmdCs1JywgJ2N0cmwrc2hpZnQrNiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVzdHJpY3RUbzogWydtY3EnXSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVzcG9uc2Uuc2V0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmluZGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY2hyb21lb3M6IFsnY3RybCthbHQrMScsICdjdHJsK2FsdCsyJywgJ2N0cmwrYWx0KzMnLCAnY3RybCthbHQrNCcsICdjdHJsK2FsdCs1JywgJ2N0cmwrYWx0KzYnXSxcbiAgICAgICAgICAgICAgICAgICAgbWFjb3M6IFsnY29tbWFuZCtvcHRpb24rMScsICdjb21tYW5kK29wdGlvbisyJywgJ2NvbW1hbmQrb3B0aW9uKzMnLCAnY29tbWFuZCtvcHRpb24rNCcsICdjb21tYW5kK29wdGlvbis1JywgJ2NvbW1hbmQrb3B0aW9uKzYnXSxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93czogWydjdHJsK2FsdCsxJywgJ2N0cmwrYWx0KzInLCAnY3RybCthbHQrMycsICdjdHJsK2FsdCs0JywgJ2N0cmwrYWx0KzUnLCAnY3RybCthbHQrNiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlLm1hc2snLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgd2hldGhlciB0aGUgdXNlciBwbGF0Zm9ybSBpcyBzdXBwb3J0ZWRcbiAqIGZvciBrZXlib2FyZCBzaG9ydGN1dHMuIEVnIHdlIHdvbid0IHN1cHBvcnQgdG91Y2hcbiAqIHBsYXRmb3Jtcy5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHNpbmNlIDAuNC4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGdldFBsYXRmb3JtKCkge1xuICAgIGxldCBjdXJyZW50UGxhdGZvcm07XG5cbiAgICBzdGF0ZS5zdXBwb3J0ZWRQbGF0Zm9ybXMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgaWYgKHBsYXRmb3JtW3BdKSB7XG4gICAgICAgICAgICBjdXJyZW50UGxhdGZvcm0gPSBwO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3VycmVudFBsYXRmb3JtO1xufVxuXG4vKipcbiAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHN0b3AgY2FsbGJhY2sgbWV0aG9kIG9mIG1vdXNldHJhcFxuICogYmVjYXVzZSBpZiB0aGUgZm9jdXMgaXMgb24gYW4gTUNRIGVsZW1lbnQgKHJhZGlvIG9yXG4gKiBjaGVja2JveCkgd2Ugc3RpbGwgd2FudCB0byBmaXJlIGFuIGV2ZW50IGlmIHRoZSB1c2VyXG4gKiBjaG9vc2VzIGEgZGlmZmVyZW50IG9wdGlvbi5cbiAqIEBzaW5jZSAwLjQuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBvdmVycmlkZUNhbGxiYWNrKCkge1xuICAgIE1vdXNldHJhcC5wcm90b3R5cGUuc3RvcENhbGxiYWNrID0gZnVuY3Rpb24gKGUsIGVsZW1lbnQsIGNvbWJvKSB7XG4gICAgICAgIGxldCBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gV2UgZG9uJ3Qgc3RvcCBpZiBmb2N1cyBpcyBvbiBhIHJhZGlvIGJ1dHRvblxuICAgICAgICBpZiAoYWN0aXZlRWwuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdyYWRpbycgfHwgYWN0aXZlRWwuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgY2xhc3MgXCJtb3VzZXRyYXBcIiB0aGVuIG5vIG5lZWQgdG8gc3RvcFxuICAgICAgICBpZiAoKCcgJyArIGVsZW1lbnQuY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKCcgbW91c2V0cmFwICcpID4gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0b3AgZm9yIGlucHV0LCBzZWxlY3QsIGFuZCB0ZXh0YXJlYVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZWxlbWVudC50YWdOYW1lID09ICdJTlBVVCcgfHxcbiAgICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PSAnU0VMRUNUJyB8fFxuICAgICAgICAgICAgZWxlbWVudC50YWdOYW1lID09ICdURVhUQVJFQScgfHxcbiAgICAgICAgICAgIChlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSAmJiBlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9PSAndHJ1ZScpXG4gICAgICAgICk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBNYW51YWxseSBjbGlja3MgYW4gTUNRIHBvc3NpYmxlIHJlc3BvbnNlLlxuICogQHBhcmFtIHtvYmplY3R9IGJpbmRpbmdzIFBsYXRmb3JtIHNwZWNpZmljIGJpbmRpbmdzIGZvciB0aGlzIGFjdGlvbi5cbiAqIEBzaW5jZSAwLjQuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBzZXRNY3FPcHRpb24oYmluZGluZ3MpIHtcbiAgICBsZXQgcXMgPSBxdWVzdGlvbnMucXVlc3Rpb25zKCk7XG4gICAgbGV0IG51bU1DUXMgPSAwO1xuXG4gICAgcXMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgaWYgKHEudHlwZSA9PT0gJ21jcScpIHtcbiAgICAgICAgICAgIG51bU1DUXMrKztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG51bU1DUXMgPT09IDEpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhxcykuZm9yRWFjaChmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbi50eXBlID09PSAnbWNxJykge1xuICAgICAgICAgICAgICAgIE1vdXNldHJhcC5iaW5kKGJpbmRpbmdzLCBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLm9wdGlvbnM/Lmxlbmd0aCA+PSBlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbVdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtxdWVzdGlvbi5yZXNwb25zZV9pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb21PcHRpb25zID0gZG9tV3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCcubHJuLWlucHV0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb21PcHRpb25zW2Uua2V5IC0gMV0uY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZ25vcmluZyBpdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgTUNRXG4gICAgfVxufVxuXG4vKipcbiAqIE1hbnVhbGx5IG1hc2tzIGEgcG9zc2libGUgcmVzcG9uc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gYmluZGluZ3MgUGxhdGZvcm0gc3BlY2lmaWMgYmluZGluZ3MgZm9yIHRoaXMgYWN0aW9uLlxuICogQHNpbmNlIDAuNC4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHNldFJlc3BvbnNlTWFzayhiaW5kaW5ncykge1xuICAgIGxldCBxcyA9IHF1ZXN0aW9ucy5xdWVzdGlvbnMoKTtcbiAgICBsZXQgbnVtTUNRcyA9IDA7XG5cbiAgICBxcy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICBpZiAocS50eXBlID09PSAnbWNxJykge1xuICAgICAgICAgICAgbnVtTUNRcysrO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobnVtTUNRcyA9PT0gMSkge1xuICAgICAgICBPYmplY3QudmFsdWVzKHFzKS5mb3JFYWNoKGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLnR5cGUgPT09ICdtY3EnKSB7XG4gICAgICAgICAgICAgICAgTW91c2V0cmFwLmJpbmQoYmluZGluZ3MsIChlLCBjb21ibykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMuaXNNYXNraW5nRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBOdW1iZXIoY29tYm8uYXQoLTEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvbi5vcHRpb25zPy5sZW5ndGggPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tV3JhcHBlciA9IGl0ZW1zLml0ZW1FbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbU9wdGlvbnMgPSBkb21XcmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5scm4tbWNxLW9wdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbE1hc2sgPSBkb21PcHRpb25zW2luZGV4IC0gMV0ucXVlcnlTZWxlY3RvcignLmxybi1tYXNrJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsTWFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbE1hc2suY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWdub3JpbmcgaXRlbXMgd2l0aCBtb3JlIHRoYW4gb25lIE1DUVxuICAgIH1cbn1cblxuLyoqXG4gKiBNYW51YWxseSB0b2dnbGVzIHRoZSBpdGVtIGZsYWcgYnV0dG9uLlxuICogQHBhcmFtIHtvYmplY3R9IGJpbmRpbmdzIFBsYXRmb3JtIHNwZWNpZmljIGJpbmRpbmdzIGZvciB0aGlzIGFjdGlvbi5cbiAqIEBzaW5jZSAwLjQuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiB0b2dnbGVGbGFnKGJpbmRpbmdzKSB7XG4gICAgTW91c2V0cmFwLmJpbmQoYmluZGluZ3MsIChlLCBjb21ibykgPT4ge1xuICAgICAgICBpdGVtcy5mbGFnKCk7XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/keyboardShortcuts.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/magnifier.js": -/*!*****************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/magnifier.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/items */ \"./src/assessment/core/items.js\");\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Allows the end-user to launch a magnifier to move around\n * the screen and zoom in on whatever content they move it\n * on top of.\n *\n * TODO:\n * - make movable via keyboard\n *\n *

\"\"

\n * @module Extensions/Assessment/magnifier\n */\n\n/**\n * Sets up the screen magnifier.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.magnifier.run();\n *\n * Options argument to override defaults which are:\n * {\n * zoom: 4,\n * shape: 'square',\n * width: 310,\n * height: 310,\n * }\n * @param {object} options Optional config object to override defaults\n * @param {string} classname CSS class value of the element to launch the magnifier\n * @since 0.7.0\n */\nfunction run(options, classname = 'lrn__magnifier') {\n if (!options) {\n options = {\n zoom: 4,\n shape: 'square',\n width: 350,\n height: 350,\n };\n }\n const elButtons = document.querySelectorAll(`.${classname}`);\n const magnifier = new HTMLMagnifier(options);\n\n elButtons.forEach(btn => {\n btn.addEventListener('click', () => {\n magnifier.toggle();\n });\n });\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', checkImageContent(magnifier));\n}\n\n/* global MutationObserver */\nfunction HTMLMagnifier(options) {\n const _this = this;\n\n _this.options = Object.assign(\n {\n zoom: 2,\n shape: 'square',\n width: 200,\n height: 200,\n },\n options\n );\n\n const magnifierTemplate = `
\n
\n
\n
`;\n\n const MutationObserver = window.MutationObserver || window.WebKitMutationObserver;\n\n let magnifier, magnifierContent;\n let observerObj;\n let syncTimeout;\n let isVisible = false;\n let magnifierBody;\n let events = {};\n\n document.addEventListener('keydown', function (event) {\n if (event.key === 'Escape') {\n if (_this.isVisible()) {\n _this.hide();\n }\n }\n });\n\n function setPosition(element, left, top) {\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n }\n\n function setDimensions(element, width, height) {\n element.style.width = `${width}px`;\n element.style.height = `${height}px`;\n }\n\n function setupMagnifier() {\n switch (_this.options.shape) {\n case 'square':\n setDimensions(magnifier, _this.options.width, _this.options.height);\n break;\n case 'circle':\n setDimensions(magnifier, _this.options.width, _this.options.height);\n magnifier.style.borderRadius = '50%';\n break;\n }\n magnifierContent.style.WebkitTransform =\n magnifierContent.style.MozTransform =\n magnifierContent.style.OTransform =\n magnifierContent.style.MsTransform =\n magnifierContent.style.transform =\n `scale(${_this.options.zoom})`;\n }\n\n function isDescendant(parent, child) {\n let node = child;\n while (node != null) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n }\n\n function syncContent() {\n if (isVisible) {\n prepareContent();\n syncViewport();\n syncScrollBars();\n }\n }\n\n function syncContentQueued() {\n if (isVisible) {\n window.clearTimeout(syncTimeout);\n syncTimeout = window.setTimeout(syncContent, 100);\n }\n }\n\n function domChanged() {\n if (isVisible) {\n syncContentQueued();\n }\n }\n\n function unBindDOMObserver() {\n if (observerObj) {\n observerObj.disconnect();\n observerObj = null;\n }\n if (document.removeEventListener) {\n document.removeEventListener('DOMNodeInserted', domChanged, false);\n document.removeEventListener('DOMNodeRemoved', domChanged, false);\n }\n }\n\n function bindDOMObserver() {\n if (MutationObserver) {\n observerObj = new MutationObserver(function (mutations, observer) {\n for (let i = 0; i < mutations.length; i++) {\n if (!isDescendant(magnifier, mutations[i].target)) {\n try {\n triggerEvent('checkMutation', mutations[i]);\n domChanged();\n break;\n } catch (error) {}\n }\n }\n });\n observerObj.observe(document, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['class', 'width', 'height', 'style'],\n attributeOldValue: true,\n });\n } else if (document.addEventListener) {\n document.addEventListener('DOMNodeInserted', domChanged, false);\n document.addEventListener('DOMNodeRemoved', domChanged, false);\n }\n }\n\n function triggerEvent(event, data) {\n const handlers = events[event];\n if (handlers) {\n for (let i = 0; i < handlers.length; i++) {\n handlers[i].call(_this, data);\n }\n }\n }\n\n function syncViewport() {\n const x1 = magnifier.offsetLeft;\n const y1 = magnifier.offsetTop;\n const x2 = document.body.scrollLeft;\n const y2 = document.body.scrollTop;\n const left = -x1 * _this.options.zoom - x2 * _this.options.zoom;\n const top = -y1 * _this.options.zoom - y2 * _this.options.zoom;\n setPosition(magnifierContent, left, top);\n triggerEvent('viewPortChanged', magnifierBody);\n }\n\n function removeSelectors(container, selector) {\n const elements = container.querySelectorAll(selector);\n if (elements.length > 0) {\n for (let i = 0; i < elements.length; i++) {\n elements[i].parentNode.removeChild(elements[i]);\n }\n }\n }\n\n function prepareContent() {\n magnifierContent.innerHTML = '';\n const bodyOriginal = document.body;\n const bodyCopy = bodyOriginal.cloneNode(true);\n const color = bodyOriginal.style.backgroundColor;\n if (color) {\n magnifier.css('background-color', color);\n }\n bodyCopy.style.cursor = 'auto';\n bodyCopy.style.paddingTop = '0px';\n bodyCopy.setAttribute('unselectable', 'on');\n const canvasOriginal = bodyOriginal.querySelectorAll('canvas');\n const canvasCopy = bodyCopy.querySelectorAll('canvas');\n if (canvasOriginal.length > 0) {\n if (canvasOriginal.length === canvasCopy.length) {\n for (let i = 0; i < canvasOriginal.length; i++) {\n let ctx = canvasCopy[i].getContext('2d');\n ctx.drawImage(canvasOriginal[i], 0, 0);\n }\n }\n }\n removeSelectors(bodyCopy, 'script');\n removeSelectors(bodyCopy, 'audio');\n removeSelectors(bodyCopy, 'video');\n removeSelectors(bodyCopy, '.magnifier');\n triggerEvent('prepareContent', bodyCopy);\n magnifierContent.appendChild(bodyCopy);\n const width = document.body.clientWidth;\n const height = document.body.clientHeight;\n setDimensions(magnifierContent, width, height);\n magnifierBody = magnifierContent.querySelector('body');\n triggerEvent('contentUpdated', magnifierBody);\n }\n\n function initScrollBars() {\n triggerEvent('initScrollBars', magnifierBody);\n }\n\n function syncScroll(ctrl) {\n const selectors = [];\n if (ctrl.getAttribute) {\n if (ctrl.getAttribute('id')) {\n selectors.push('#' + ctrl.getAttribute('id'));\n }\n if (ctrl.className) {\n selectors.push('.' + ctrl.className.split(' ').join('.'));\n }\n for (let i = 0; i < selectors.length; i++) {\n let t = magnifierBody.querySelectorAll(selectors[i]);\n if (t.length == 1) {\n t[0].scrollTop = ctrl.scrollTop;\n t[0].scrollLeft = ctrl.scrollLeft;\n return true;\n }\n }\n } else if (ctrl == document) {\n syncViewport();\n }\n return false;\n }\n\n function syncScrollBars(e) {\n if (isVisible) {\n if (e && e.target) {\n syncScroll(e.target);\n } else {\n let scrolled = [];\n let elements = document.querySelectorAll('div');\n for (let i = 0; i < elements.length; i++) {\n if (elements[i].scrollTop > 0) {\n scrolled.push(elements[i]);\n }\n }\n for (let i = 0; i < scrolled.length; i++) {\n if (!isDescendant(magnifier, scrolled[i])) {\n syncScroll(scrolled[i]);\n }\n }\n }\n triggerEvent('syncScrollBars', magnifierBody);\n }\n }\n\n function makeDraggable(ctrl, options) {\n const _this = this;\n\n let dragObject = null;\n let dragHandler = null;\n\n options = options || {};\n options.exclude = ['INPUT', 'TEXTAREA', 'SELECT', 'A', 'BUTTON'];\n\n if (options.handler) {\n dragHandler = ctrl.querySelector(options.handler);\n } else {\n dragHandler = ctrl;\n }\n\n function setPosition(element, left, top) {\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n }\n\n let drg_h, drg_w, pos_y, pos_x, ofs_x, ofs_y;\n\n ctrl.style.cursor = 'move';\n\n function downHandler(e) {\n const target = e.target || e.srcElement;\n const parent = target.parentNode;\n\n if (target && options.exclude.indexOf(target.tagName.toUpperCase()) == -1) {\n if (!parent || options.exclude.indexOf(parent.tagName.toUpperCase()) == -1) {\n // img in a\n dragObject = ctrl;\n\n const pageX = e.pageX || e.touches[0].pageX;\n const pageY = e.pageY || e.touches[0].pageY;\n\n ofs_x = dragObject.getBoundingClientRect().left - dragObject.offsetLeft;\n ofs_y = dragObject.getBoundingClientRect().top - dragObject.offsetTop;\n\n pos_x = pageX - (dragObject.getBoundingClientRect().left + document.body.scrollLeft);\n pos_y = pageY - (dragObject.getBoundingClientRect().top + document.body.scrollTop);\n\n e.preventDefault();\n }\n }\n }\n\n function moveHandler(e) {\n if (dragObject !== null) {\n const pageX = e.pageX || e.touches[0].pageX;\n const pageY = e.pageY || e.touches[0].pageY;\n const left = pageX - pos_x - ofs_x - document.body.scrollLeft;\n const top = pageY - pos_y - ofs_y - document.body.scrollTop;\n\n setPosition(dragObject, left, top);\n if (options.ondrag) {\n options.ondrag.call(e);\n }\n }\n }\n\n function upHandler(e) {\n if (dragObject !== null) {\n dragObject = null;\n }\n }\n\n dragHandler.addEventListener('mousedown', function (e) {\n downHandler(e);\n });\n\n window.addEventListener('mousemove', function (e) {\n moveHandler(e);\n });\n\n window.addEventListener('mouseup', function (e) {\n upHandler(e);\n });\n\n dragHandler.addEventListener('touchstart', function (e) {\n downHandler(e);\n });\n\n window.addEventListener('touchmove', function (e) {\n moveHandler(e);\n });\n\n window.addEventListener('touchend', function (e) {\n upHandler(e);\n });\n\n return _this;\n }\n\n function init() {\n const div = document.createElement('div');\n div.innerHTML = magnifierTemplate;\n magnifier = div.querySelector('.magnifier');\n document.body.appendChild(magnifier);\n magnifierContent = magnifier.querySelector('.magnifier-content');\n if (window.addEventListener) {\n window.addEventListener('resize', syncContent, false);\n window.addEventListener('scroll', syncScrollBars, true);\n }\n makeDraggable(magnifier, {\n ondrag: syncViewport,\n });\n }\n\n _this.setZoom = function (value) {\n _this.options.zoom = value;\n setupMagnifier();\n };\n\n _this.setShape = function (shape, width, height) {\n _this.options.shape = shape;\n if (width) {\n _this.options.width = width;\n }\n if (height) {\n _this.options.height = height;\n }\n setupMagnifier();\n };\n\n _this.setWidth = function (value) {\n _this.options.width = value;\n setupMagnifier();\n };\n\n _this.setHeight = function (value) {\n _this.options.height = value;\n setupMagnifier();\n };\n\n _this.getZoom = function () {\n return _this.options.zoom;\n };\n\n _this.getShape = function () {\n return _this.options.shape;\n };\n\n _this.getWidth = function () {\n return _this.options.width;\n };\n\n _this.getHeight = function () {\n return _this.options.height;\n };\n\n _this.isVisible = function () {\n return isVisible;\n };\n\n _this.on = function (event, callback) {\n events[event] = events[event] || [];\n events[event].push(callback);\n };\n\n _this.syncScrollBars = function (event) {\n syncScrollBars();\n };\n\n _this.syncContent = function (event) {\n syncContentQueued();\n };\n\n _this.hide = function (event) {\n unBindDOMObserver();\n magnifierContent.innerHTML = '';\n magnifier.style.display = 'none';\n isVisible = false;\n };\n\n _this.show = function (event) {\n let left, top;\n if (event) {\n left = event.pageX - 175;\n top = event.pageY - 175;\n } else {\n left = 200;\n top = 200;\n }\n setupMagnifier();\n prepareContent();\n setPosition(magnifier, left, top);\n magnifier.style.display = '';\n syncViewport();\n syncScrollBars();\n initScrollBars();\n // bindDOMObserver();\n isVisible = true;\n };\n\n _this.toggle = function (event) {\n if (_this.isVisible()) {\n _this.hide();\n } else {\n _this.show();\n }\n };\n\n init();\n\n return _this;\n}\n\nfunction checkImageContent(magnifier) {\n let elItem = _core_items__WEBPACK_IMPORTED_MODULE_1__.itemElement();\n let elImages = elItem.querySelectorAll('img');\n\n if (elImages) {\n elImages.forEach(img => {\n img.addEventListener('click', e => {\n if (!magnifier.isVisible()) {\n magnifier.show(e);\n }\n });\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvbWFnbmlmaWVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUF5QztBQUNJOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFVBQVU7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUwsSUFBSSxrREFBZTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUEsMkVBQTJFLGdCQUFnQixpQkFBaUIsd0JBQXdCLHVCQUF1QixtQkFBbUIsY0FBYztBQUM1TCwrRUFBK0UsVUFBVSxpQkFBaUIsZ0JBQWdCLGtCQUFrQixtQkFBbUIsZUFBZSwyQkFBMkIsZ0NBQWdDLCtCQUErQixtQ0FBbUMsOEJBQThCLGtCQUFrQix1QkFBdUIsMEJBQTBCO0FBQzVZLHVGQUF1RixTQUFTLFVBQVUsWUFBWSxhQUFhLGFBQWEsNkJBQTZCLHdCQUF3QixhQUFhO0FBQ2xOOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsZ0NBQWdDLEtBQUs7QUFDckMsK0JBQStCLElBQUk7QUFDbkM7O0FBRUE7QUFDQSxpQ0FBaUMsTUFBTTtBQUN2QyxrQ0FBa0MsT0FBTztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsbUJBQW1CO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxzQkFBc0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywyQkFBMkI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHNCQUFzQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsZ0NBQWdDLHFCQUFxQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxxQkFBcUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsS0FBSztBQUN6QyxtQ0FBbUMsSUFBSTtBQUN2Qzs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsb0RBQWlCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvbWFnbmlmaWVyLmpzPzkzMjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXBwIGZyb20gJy4uLy4uLy4uL2NvcmUvYXBwJztcbmltcG9ydCAqIGFzIGl0ZW1zIGZyb20gJy4uLy4uLy4uL2NvcmUvaXRlbXMnO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIEFsbG93cyB0aGUgZW5kLXVzZXIgdG8gbGF1bmNoIGEgbWFnbmlmaWVyIHRvIG1vdmUgYXJvdW5kXG4gKiB0aGUgc2NyZWVuIGFuZCB6b29tIGluIG9uIHdoYXRldmVyIGNvbnRlbnQgdGhleSBtb3ZlIGl0XG4gKiBvbiB0b3Agb2YuXG4gKlxuICogVE9ETzpcbiAqICAtIG1ha2UgbW92YWJsZSB2aWEga2V5Ym9hcmRcbiAqXG4gKiA8cD48aW1nIHNyYz1cImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taWNoYWVsc2hhcm1hbi9MVC9tYWluL3NyYy9hc3NldHMvaW1hZ2VzL21hZ25pZmllci5wbmdcIiBhbHQ9XCJcIiB3aWR0aD1cIjgwMFwiPjwvcD5cbiAqIEBtb2R1bGUgRXh0ZW5zaW9ucy9Bc3Nlc3NtZW50L21hZ25pZmllclxuICovXG5cbi8qKlxuICogU2V0cyB1cCB0aGUgc2NyZWVuIG1hZ25pZmllci5cbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBMVCB9IGZyb20gJ0BjYXNwaW5ndXMvbHQvc3JjL2Fzc2Vzc21lbnQvaW5kZXgnO1xuICpcbiAqIExULmluaXQoaXRlbXNBcHApOyAvLyBTZXQgdXAgTFQgd2l0aCB0aGUgSXRlbXMgQVBJIGFwcGxpY2F0aW9uIGluc3RhbmNlIHZhcmlhYmxlXG4gKiBMVC5leHRlbnNpb25zLm1hZ25pZmllci5ydW4oKTtcbiAqXG4gKiBPcHRpb25zIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGRlZmF1bHRzIHdoaWNoIGFyZTpcbiAqIHtcbiAqICAgICB6b29tOiA0LFxuICogICAgIHNoYXBlOiAnc3F1YXJlJyxcbiAqICAgICB3aWR0aDogMzEwLFxuICogICAgIGhlaWdodDogMzEwLFxuICogfVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgT3B0aW9uYWwgY29uZmlnIG9iamVjdCB0byBvdmVycmlkZSBkZWZhdWx0c1xuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSBDU1MgY2xhc3MgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gbGF1bmNoIHRoZSBtYWduaWZpZXJcbiAqIEBzaW5jZSAwLjcuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuKG9wdGlvbnMsIGNsYXNzbmFtZSA9ICdscm5fX21hZ25pZmllcicpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHpvb206IDQsXG4gICAgICAgICAgICBzaGFwZTogJ3NxdWFyZScsXG4gICAgICAgICAgICB3aWR0aDogMzUwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNTAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGVsQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke2NsYXNzbmFtZX1gKTtcbiAgICBjb25zdCBtYWduaWZpZXIgPSBuZXcgSFRNTE1hZ25pZmllcihvcHRpb25zKTtcblxuICAgIGVsQnV0dG9ucy5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIG1hZ25pZmllci50b2dnbGUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBhcHAuYXBwSW5zdGFuY2UoKS5vbignaXRlbTpsb2FkJywgY2hlY2tJbWFnZUNvbnRlbnQobWFnbmlmaWVyKSk7XG59XG5cbi8qIGdsb2JhbCBNdXRhdGlvbk9ic2VydmVyICovXG5mdW5jdGlvbiBIVE1MTWFnbmlmaWVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgICAgem9vbTogMixcbiAgICAgICAgICAgIHNoYXBlOiAnc3F1YXJlJyxcbiAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBtYWduaWZpZXJUZW1wbGF0ZSA9IGA8ZGl2IGNsYXNzPVwibWFnbmlmaWVyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO3Bvc2l0aW9uOiBmaXhlZDtvdmVyZmxvdzogaGlkZGVuO2JhY2tncm91bmQtY29sb3I6IHdoaXRlO2JvcmRlcjogMXB4IHNvbGlkICM1NTU7Ym9yZGVyLXJhZGl1czogNHB4O3otaW5kZXg6MTAwMDA7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWduaWZpZXItY29udGVudFwiIHN0eWxlPVwidG9wOiAwcHg7bGVmdDogMHB4O21hcmdpbi1sZWZ0OiAwcHg7bWFyZ2luLXRvcDogMHB4O292ZXJmbG93OiB2aXNpYmxlO3Bvc2l0aW9uOiBhYnNvbHV0ZTtkaXNwbGF5OiBibG9jazt0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDstbW96LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wOy1tcy10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wOy1vLXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO3VzZXItc2VsZWN0OiBub25lOy1tb3otdXNlci1zZWxlY3Q6IG5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtwYWRkaW5nLXRvcDogMHB4XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWduaWZpZXItZ2xhc3NcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDBweDtsZWZ0OiAwcHg7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO29wYWNpdHk6IDAuMDstbXMtZmlsdGVyOiBhbHBoYShvcGFjaXR5PTApO2JhY2tncm91bmQtY29sb3I6IHdoaXRlO2N1cnNvcjogbW92ZTtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuXG4gICAgY29uc3QgTXV0YXRpb25PYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgbGV0IG1hZ25pZmllciwgbWFnbmlmaWVyQ29udGVudDtcbiAgICBsZXQgb2JzZXJ2ZXJPYmo7XG4gICAgbGV0IHN5bmNUaW1lb3V0O1xuICAgIGxldCBpc1Zpc2libGUgPSBmYWxzZTtcbiAgICBsZXQgbWFnbmlmaWVyQm9keTtcbiAgICBsZXQgZXZlbnRzID0ge307XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaXNWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldFBvc2l0aW9uKGVsZW1lbnQsIGxlZnQsIHRvcCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldERpbWVuc2lvbnMoZWxlbWVudCwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0dXBNYWduaWZpZXIoKSB7XG4gICAgICAgIHN3aXRjaCAoX3RoaXMub3B0aW9ucy5zaGFwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3F1YXJlJzpcbiAgICAgICAgICAgICAgICBzZXREaW1lbnNpb25zKG1hZ25pZmllciwgX3RoaXMub3B0aW9ucy53aWR0aCwgX3RoaXMub3B0aW9ucy5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAgICAgICAgICBzZXREaW1lbnNpb25zKG1hZ25pZmllciwgX3RoaXMub3B0aW9ucy53aWR0aCwgX3RoaXMub3B0aW9ucy5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIG1hZ25pZmllci5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNTAlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBtYWduaWZpZXJDb250ZW50LnN0eWxlLldlYmtpdFRyYW5zZm9ybSA9XG4gICAgICAgICAgICBtYWduaWZpZXJDb250ZW50LnN0eWxlLk1velRyYW5zZm9ybSA9XG4gICAgICAgICAgICBtYWduaWZpZXJDb250ZW50LnN0eWxlLk9UcmFuc2Zvcm0gPVxuICAgICAgICAgICAgbWFnbmlmaWVyQ29udGVudC5zdHlsZS5Nc1RyYW5zZm9ybSA9XG4gICAgICAgICAgICBtYWduaWZpZXJDb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9XG4gICAgICAgICAgICAgICAgYHNjYWxlKCR7X3RoaXMub3B0aW9ucy56b29tfSlgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGVzY2VuZGFudChwYXJlbnQsIGNoaWxkKSB7XG4gICAgICAgIGxldCBub2RlID0gY2hpbGQ7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3luY0NvbnRlbnQoKSB7XG4gICAgICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgICAgICAgIHByZXBhcmVDb250ZW50KCk7XG4gICAgICAgICAgICBzeW5jVmlld3BvcnQoKTtcbiAgICAgICAgICAgIHN5bmNTY3JvbGxCYXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzeW5jQ29udGVudFF1ZXVlZCgpIHtcbiAgICAgICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzeW5jVGltZW91dCk7XG4gICAgICAgICAgICBzeW5jVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KHN5bmNDb250ZW50LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9tQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgICAgICAgc3luY0NvbnRlbnRRdWV1ZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuQmluZERPTU9ic2VydmVyKCkge1xuICAgICAgICBpZiAob2JzZXJ2ZXJPYmopIHtcbiAgICAgICAgICAgIG9ic2VydmVyT2JqLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIG9ic2VydmVyT2JqID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgZG9tQ2hhbmdlZCwgZmFsc2UpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBkb21DaGFuZ2VkLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiaW5kRE9NT2JzZXJ2ZXIoKSB7XG4gICAgICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgICAgICBvYnNlcnZlck9iaiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMsIG9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Rlc2NlbmRhbnQobWFnbmlmaWVyLCBtdXRhdGlvbnNbaV0udGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ2NoZWNrTXV0YXRpb24nLCBtdXRhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbUNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlck9iai5vYnNlcnZlKGRvY3VtZW50LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ3N0eWxlJ10sXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlT2xkVmFsdWU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBkb21DaGFuZ2VkLCBmYWxzZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGRvbUNoYW5nZWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChldmVudCwgZGF0YSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1tldmVudF07XG4gICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2ldLmNhbGwoX3RoaXMsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3luY1ZpZXdwb3J0KCkge1xuICAgICAgICBjb25zdCB4MSA9IG1hZ25pZmllci5vZmZzZXRMZWZ0O1xuICAgICAgICBjb25zdCB5MSA9IG1hZ25pZmllci5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHgyID0gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xuICAgICAgICBjb25zdCB5MiA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuICAgICAgICBjb25zdCBsZWZ0ID0gLXgxICogX3RoaXMub3B0aW9ucy56b29tIC0geDIgKiBfdGhpcy5vcHRpb25zLnpvb207XG4gICAgICAgIGNvbnN0IHRvcCA9IC15MSAqIF90aGlzLm9wdGlvbnMuem9vbSAtIHkyICogX3RoaXMub3B0aW9ucy56b29tO1xuICAgICAgICBzZXRQb3NpdGlvbihtYWduaWZpZXJDb250ZW50LCBsZWZ0LCB0b3ApO1xuICAgICAgICB0cmlnZ2VyRXZlbnQoJ3ZpZXdQb3J0Q2hhbmdlZCcsIG1hZ25pZmllckJvZHkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZVNlbGVjdG9ycyhjb250YWluZXIsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcGFyZUNvbnRlbnQoKSB7XG4gICAgICAgIG1hZ25pZmllckNvbnRlbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGNvbnN0IGJvZHlPcmlnaW5hbCA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIGNvbnN0IGJvZHlDb3B5ID0gYm9keU9yaWdpbmFsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBib2R5T3JpZ2luYWwuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIG1hZ25pZmllci5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBjb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgYm9keUNvcHkuc3R5bGUuY3Vyc29yID0gJ2F1dG8nO1xuICAgICAgICBib2R5Q29weS5zdHlsZS5wYWRkaW5nVG9wID0gJzBweCc7XG4gICAgICAgIGJvZHlDb3B5LnNldEF0dHJpYnV0ZSgndW5zZWxlY3RhYmxlJywgJ29uJyk7XG4gICAgICAgIGNvbnN0IGNhbnZhc09yaWdpbmFsID0gYm9keU9yaWdpbmFsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjYW52YXNDb3B5ID0gYm9keUNvcHkucXVlcnlTZWxlY3RvckFsbCgnY2FudmFzJyk7XG4gICAgICAgIGlmIChjYW52YXNPcmlnaW5hbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoY2FudmFzT3JpZ2luYWwubGVuZ3RoID09PSBjYW52YXNDb3B5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FudmFzT3JpZ2luYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN0eCA9IGNhbnZhc0NvcHlbaV0uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShjYW52YXNPcmlnaW5hbFtpXSwgMCwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZVNlbGVjdG9ycyhib2R5Q29weSwgJ3NjcmlwdCcpO1xuICAgICAgICByZW1vdmVTZWxlY3RvcnMoYm9keUNvcHksICdhdWRpbycpO1xuICAgICAgICByZW1vdmVTZWxlY3RvcnMoYm9keUNvcHksICd2aWRlbycpO1xuICAgICAgICByZW1vdmVTZWxlY3RvcnMoYm9keUNvcHksICcubWFnbmlmaWVyJyk7XG4gICAgICAgIHRyaWdnZXJFdmVudCgncHJlcGFyZUNvbnRlbnQnLCBib2R5Q29weSk7XG4gICAgICAgIG1hZ25pZmllckNvbnRlbnQuYXBwZW5kQ2hpbGQoYm9keUNvcHkpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xuICAgICAgICBzZXREaW1lbnNpb25zKG1hZ25pZmllckNvbnRlbnQsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBtYWduaWZpZXJCb2R5ID0gbWFnbmlmaWVyQ29udGVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG4gICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudFVwZGF0ZWQnLCBtYWduaWZpZXJCb2R5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbml0U2Nyb2xsQmFycygpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KCdpbml0U2Nyb2xsQmFycycsIG1hZ25pZmllckJvZHkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN5bmNTY3JvbGwoY3RybCkge1xuICAgICAgICBjb25zdCBzZWxlY3RvcnMgPSBbXTtcbiAgICAgICAgaWYgKGN0cmwuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoY3RybC5nZXRBdHRyaWJ1dGUoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvcnMucHVzaCgnIycgKyBjdHJsLmdldEF0dHJpYnV0ZSgnaWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3RybC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvcnMucHVzaCgnLicgKyBjdHJsLmNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJy4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbWFnbmlmaWVyQm9keS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdFswXS5zY3JvbGxUb3AgPSBjdHJsLnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICAgICAgdFswXS5zY3JvbGxMZWZ0ID0gY3RybC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3RybCA9PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgc3luY1ZpZXdwb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN5bmNTY3JvbGxCYXJzKGUpIHtcbiAgICAgICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBzeW5jU2Nyb2xsKGUudGFyZ2V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjcm9sbGVkID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uc2Nyb2xsVG9wID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWQucHVzaChlbGVtZW50c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY3JvbGxlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRGVzY2VuZGFudChtYWduaWZpZXIsIHNjcm9sbGVkW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3luY1Njcm9sbChzY3JvbGxlZFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ3N5bmNTY3JvbGxCYXJzJywgbWFnbmlmaWVyQm9keSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRHJhZ2dhYmxlKGN0cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGxldCBkcmFnT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgbGV0IGRyYWdIYW5kbGVyID0gbnVsbDtcblxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5leGNsdWRlID0gWydJTlBVVCcsICdURVhUQVJFQScsICdTRUxFQ1QnLCAnQScsICdCVVRUT04nXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICAgICAgICBkcmFnSGFuZGxlciA9IGN0cmwucXVlcnlTZWxlY3RvcihvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHJhZ0hhbmRsZXIgPSBjdHJsO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2V0UG9zaXRpb24oZWxlbWVudCwgbGVmdCwgdG9wKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkcmdfaCwgZHJnX3csIHBvc195LCBwb3NfeCwgb2ZzX3gsIG9mc195O1xuXG4gICAgICAgIGN0cmwuc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xuXG4gICAgICAgIGZ1bmN0aW9uIGRvd25IYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRhcmdldC5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0ICYmIG9wdGlvbnMuZXhjbHVkZS5pbmRleE9mKHRhcmdldC50YWdOYW1lLnRvVXBwZXJDYXNlKCkpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgb3B0aW9ucy5leGNsdWRlLmluZGV4T2YocGFyZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW1nIGluIGFcbiAgICAgICAgICAgICAgICAgICAgZHJhZ09iamVjdCA9IGN0cmw7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZVggPSBlLnBhZ2VYIHx8IGUudG91Y2hlc1swXS5wYWdlWDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZVkgPSBlLnBhZ2VZIHx8IGUudG91Y2hlc1swXS5wYWdlWTtcblxuICAgICAgICAgICAgICAgICAgICBvZnNfeCA9IGRyYWdPYmplY3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRyYWdPYmplY3Qub2Zmc2V0TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgb2ZzX3kgPSBkcmFnT2JqZWN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIGRyYWdPYmplY3Qub2Zmc2V0VG9wO1xuXG4gICAgICAgICAgICAgICAgICAgIHBvc194ID0gcGFnZVggLSAoZHJhZ09iamVjdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgcG9zX3kgPSBwYWdlWSAtIChkcmFnT2JqZWN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKTtcblxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbW92ZUhhbmRsZXIoZSkge1xuICAgICAgICAgICAgaWYgKGRyYWdPYmplY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlWCA9IGUucGFnZVggfHwgZS50b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VZID0gZS5wYWdlWSB8fCBlLnRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHBhZ2VYIC0gcG9zX3ggLSBvZnNfeCAtIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBwYWdlWSAtIHBvc195IC0gb2ZzX3kgLSBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcblxuICAgICAgICAgICAgICAgIHNldFBvc2l0aW9uKGRyYWdPYmplY3QsIGxlZnQsIHRvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub25kcmFnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25kcmFnLmNhbGwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdXBIYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIGlmIChkcmFnT2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZHJhZ09iamVjdCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkcmFnSGFuZGxlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZG93bkhhbmRsZXIoZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgbW92ZUhhbmRsZXIoZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHVwSGFuZGxlcihlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZHJhZ0hhbmRsZXIuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBkb3duSGFuZGxlcihlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBtb3ZlSGFuZGxlcihlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHVwSGFuZGxlcihlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuaW5uZXJIVE1MID0gbWFnbmlmaWVyVGVtcGxhdGU7XG4gICAgICAgIG1hZ25pZmllciA9IGRpdi5xdWVyeVNlbGVjdG9yKCcubWFnbmlmaWVyJyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobWFnbmlmaWVyKTtcbiAgICAgICAgbWFnbmlmaWVyQ29udGVudCA9IG1hZ25pZmllci5xdWVyeVNlbGVjdG9yKCcubWFnbmlmaWVyLWNvbnRlbnQnKTtcbiAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc3luY0NvbnRlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzeW5jU2Nyb2xsQmFycywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbWFrZURyYWdnYWJsZShtYWduaWZpZXIsIHtcbiAgICAgICAgICAgIG9uZHJhZzogc3luY1ZpZXdwb3J0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdGhpcy5zZXRab29tID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIF90aGlzLm9wdGlvbnMuem9vbSA9IHZhbHVlO1xuICAgICAgICBzZXR1cE1hZ25pZmllcigpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRTaGFwZSA9IGZ1bmN0aW9uIChzaGFwZSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBfdGhpcy5vcHRpb25zLnNoYXBlID0gc2hhcGU7XG4gICAgICAgIGlmICh3aWR0aCkge1xuICAgICAgICAgICAgX3RoaXMub3B0aW9ucy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHQpIHtcbiAgICAgICAgICAgIF90aGlzLm9wdGlvbnMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHNldHVwTWFnbmlmaWVyKCk7XG4gICAgfTtcblxuICAgIF90aGlzLnNldFdpZHRoID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIF90aGlzLm9wdGlvbnMud2lkdGggPSB2YWx1ZTtcbiAgICAgICAgc2V0dXBNYWduaWZpZXIoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIF90aGlzLm9wdGlvbnMuaGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIHNldHVwTWFnbmlmaWVyKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldFpvb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5vcHRpb25zLnpvb207XG4gICAgfTtcblxuICAgIF90aGlzLmdldFNoYXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMub3B0aW9ucy5zaGFwZTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5vcHRpb25zLndpZHRoO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5vcHRpb25zLmhlaWdodDtcbiAgICB9O1xuXG4gICAgX3RoaXMuaXNWaXNpYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaXNWaXNpYmxlO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbiA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2spIHtcbiAgICAgICAgZXZlbnRzW2V2ZW50XSA9IGV2ZW50c1tldmVudF0gfHwgW107XG4gICAgICAgIGV2ZW50c1tldmVudF0ucHVzaChjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIF90aGlzLnN5bmNTY3JvbGxCYXJzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHN5bmNTY3JvbGxCYXJzKCk7XG4gICAgfTtcblxuICAgIF90aGlzLnN5bmNDb250ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHN5bmNDb250ZW50UXVldWVkKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhpZGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdW5CaW5kRE9NT2JzZXJ2ZXIoKTtcbiAgICAgICAgbWFnbmlmaWVyQ29udGVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgbWFnbmlmaWVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBfdGhpcy5zaG93ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGxldCBsZWZ0LCB0b3A7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgbGVmdCA9IGV2ZW50LnBhZ2VYIC0gMTc1O1xuICAgICAgICAgICAgdG9wID0gZXZlbnQucGFnZVkgLSAxNzU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZWZ0ID0gMjAwO1xuICAgICAgICAgICAgdG9wID0gMjAwO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwTWFnbmlmaWVyKCk7XG4gICAgICAgIHByZXBhcmVDb250ZW50KCk7XG4gICAgICAgIHNldFBvc2l0aW9uKG1hZ25pZmllciwgbGVmdCwgdG9wKTtcbiAgICAgICAgbWFnbmlmaWVyLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgc3luY1ZpZXdwb3J0KCk7XG4gICAgICAgIHN5bmNTY3JvbGxCYXJzKCk7XG4gICAgICAgIGluaXRTY3JvbGxCYXJzKCk7XG4gICAgICAgIC8vIGJpbmRET01PYnNlcnZlcigpO1xuICAgICAgICBpc1Zpc2libGUgPSB0cnVlO1xuICAgIH07XG5cbiAgICBfdGhpcy50b2dnbGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKF90aGlzLmlzVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICBfdGhpcy5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaW5pdCgpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xufVxuXG5mdW5jdGlvbiBjaGVja0ltYWdlQ29udGVudChtYWduaWZpZXIpIHtcbiAgICBsZXQgZWxJdGVtID0gaXRlbXMuaXRlbUVsZW1lbnQoKTtcbiAgICBsZXQgZWxJbWFnZXMgPSBlbEl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7XG5cbiAgICBpZiAoZWxJbWFnZXMpIHtcbiAgICAgICAgZWxJbWFnZXMuZm9yRWFjaChpbWcgPT4ge1xuICAgICAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYWduaWZpZXIuaXNWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFnbmlmaWVyLnNob3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/magnifier.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/mcqLabelPrefix.js": -/*!**********************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/mcqLabelPrefix.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../core/questions */ \"./src/assessment/core/questions.js\");\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Adds a prefix to all multiple-choice labels (correct\n * answer and distractors).\n *\n * Ignores block UI and radio button under option.\n *\n * Supports\n * - multi-select MCQs\n * - shuffle responses\n * - columns\n *\n *

\"\"

\n * @module Extensions/Assessment/mcqLabelPrefix\n */\n\nconst state = {\n chosenMask: 'upperAlpha',\n prefixMask: {\n lowerAlpha: 97,\n upperAlpha: 65,\n numeric: 49,\n },\n explicitPrefixes: [],\n renderedCss: false,\n suffix: '.',\n};\n\n/**\n * Sets up an item load listener to add a prefix to all\n * MCQ possible response labels.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.mcqLabelPrefix.run();\n * @param {string} mask Which mask pattern to use. Supports `upperAlpha` (default), `lowerAlpha`, and `numeric`.\n * @param {string} suffix Any suffix you want added to the label prefix. Defaults to `.`.\n * @param {array} prefixes Array of custom string prefixes to use.\n * @since 0.6.0\n */\nfunction run(mask = 'upperAlpha', suffix = '.', prefixes) {\n if (state.prefixMask.hasOwnProperty(mask)) {\n state.chosenMask = mask;\n }\n if (suffix && typeof suffix === 'string') {\n state.suffix = suffix;\n }\n if (prefixes && Array.isArray(prefixes)) {\n state.explicitPrefixes = prefixes;\n }\n\n if (!state.renderedCss) injectCSS();\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', () => {\n addPrefix(_core_questions__WEBPACK_IMPORTED_MODULE_2__.questions());\n });\n}\n\n/**\n *\n * @param {array} q Array of questions, if any, on the current item\n * @since 0.6.0\n * @ignore\n */\nfunction addPrefix(itemQuestions) {\n const asciiStart = state.prefixMask[state.chosenMask];\n const suffix = state.suffix;\n\n try {\n for (let q of itemQuestions) {\n if (q.type === 'mcq' && q?.ui_style?.type !== 'block' && q?.ui_style?.type !== 'horizontal-input-bottom') {\n let r = q.response_id;\n let elOptions = document.getElementById(r).querySelectorAll('.lrn-mcq-option');\n let responseIndex = 0;\n for (let o of elOptions) {\n let elLabels = o.querySelector('.lrn-possible-answer').children;\n let elExistingPrefixes = o.querySelector('.lrn-prefix-label');\n // If we haven't already printed prefixes\n if (!elExistingPrefixes) {\n let prefixValue;\n // Check whether we're using a prefix mask or an explicit set of prefixes\n if (\n Array.isArray(state.explicitPrefixes) &&\n state.explicitPrefixes.length &&\n typeof state.explicitPrefixes[responseIndex] === 'string'\n ) {\n prefixValue = state.explicitPrefixes[responseIndex];\n } else {\n prefixValue = String.fromCharCode(asciiStart + responseIndex);\n }\n for (let i = 0; i < elLabels.length; i++) {\n let p = document.createElement('span');\n p.classList.add('lrn-prefix-label');\n p.append(`${prefixValue}${suffix}`);\n elLabels[i].prepend(p);\n }\n responseIndex++;\n }\n }\n }\n }\n } catch (err) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].error(err);\n }\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 0.6.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity MCQ label prefix styles */\n.lrn-prefix-label {\n padding-right: 15px;\n font-weight: 500;\n}\n@media (max-width: 750px) {\n .lrn-prefix-label {\n padding-right: 10px;\n }\n}\n@media (max-width: 650px) {\n .lrn-prefix-label {\n padding-right: 5px;\n }\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvbWNxTGFiZWxQcmVmaXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUF5QztBQUNLO0FBQ007O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxJQUFJLGtEQUFlO0FBQ25CLGtCQUFrQixzREFBa0I7QUFDcEMsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSx3Q0FBd0MscUJBQXFCO0FBQzdEO0FBQ0E7QUFDQSx3Q0FBd0MsWUFBWSxFQUFFLE9BQU87QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sUUFBUSxxREFBTTtBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvbWNxTGFiZWxQcmVmaXguanM/NzJkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi4vLi4vLi4vY29yZS9hcHAnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0ICogYXMgcXVlc3Rpb24gZnJvbSAnLi4vLi4vLi4vY29yZS9xdWVzdGlvbnMnO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIEFkZHMgYSBwcmVmaXggdG8gYWxsIG11bHRpcGxlLWNob2ljZSBsYWJlbHMgKGNvcnJlY3RcbiAqIGFuc3dlciBhbmQgZGlzdHJhY3RvcnMpLlxuICpcbiAqIElnbm9yZXMgYmxvY2sgVUkgYW5kIHJhZGlvIGJ1dHRvbiB1bmRlciBvcHRpb24uXG4gKlxuICogU3VwcG9ydHNcbiAqICAtIG11bHRpLXNlbGVjdCBNQ1FzXG4gKiAgLSBzaHVmZmxlIHJlc3BvbnNlc1xuICogIC0gY29sdW1uc1xuICpcbiAqIDxwPjxpbWcgc3JjPVwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21pY2hhZWxzaGFybWFuL0xUL21haW4vc3JjL2Fzc2V0cy9pbWFnZXMvbWNxcHJlZml4LnBuZ1wiIGFsdD1cIlwiIHdpZHRoPVwiNjYwXCI+PC9wPlxuICogQG1vZHVsZSBFeHRlbnNpb25zL0Fzc2Vzc21lbnQvbWNxTGFiZWxQcmVmaXhcbiAqL1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICBjaG9zZW5NYXNrOiAndXBwZXJBbHBoYScsXG4gICAgcHJlZml4TWFzazoge1xuICAgICAgICBsb3dlckFscGhhOiA5NyxcbiAgICAgICAgdXBwZXJBbHBoYTogNjUsXG4gICAgICAgIG51bWVyaWM6IDQ5LFxuICAgIH0sXG4gICAgZXhwbGljaXRQcmVmaXhlczogW10sXG4gICAgcmVuZGVyZWRDc3M6IGZhbHNlLFxuICAgIHN1ZmZpeDogJy4nLFxufTtcblxuLyoqXG4gKiBTZXRzIHVwIGFuIGl0ZW0gbG9hZCBsaXN0ZW5lciB0byBhZGQgYSBwcmVmaXggdG8gYWxsXG4gKiBNQ1EgcG9zc2libGUgcmVzcG9uc2UgbGFiZWxzLlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IExUIH0gZnJvbSAnQGNhc3Bpbmd1cy9sdC9zcmMvYXNzZXNzbWVudC9pbmRleCc7XG4gKlxuICogTFQuaW5pdChpdGVtc0FwcCk7IC8vIFNldCB1cCBMVCB3aXRoIHRoZSBJdGVtcyBBUEkgYXBwbGljYXRpb24gaW5zdGFuY2UgdmFyaWFibGVcbiAqIExULmV4dGVuc2lvbnMubWNxTGFiZWxQcmVmaXgucnVuKCk7XG4gKiBAcGFyYW0ge3N0cmluZ30gbWFzayBXaGljaCBtYXNrIHBhdHRlcm4gdG8gdXNlLiBTdXBwb3J0cyBgdXBwZXJBbHBoYWAgKGRlZmF1bHQpLCBgbG93ZXJBbHBoYWAsIGFuZCBgbnVtZXJpY2AuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4IEFueSBzdWZmaXggeW91IHdhbnQgYWRkZWQgdG8gdGhlIGxhYmVsIHByZWZpeC4gRGVmYXVsdHMgdG8gYC5gLlxuICogQHBhcmFtIHthcnJheX0gcHJlZml4ZXMgQXJyYXkgb2YgY3VzdG9tIHN0cmluZyBwcmVmaXhlcyB0byB1c2UuXG4gKiBAc2luY2UgMC42LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bihtYXNrID0gJ3VwcGVyQWxwaGEnLCBzdWZmaXggPSAnLicsIHByZWZpeGVzKSB7XG4gICAgaWYgKHN0YXRlLnByZWZpeE1hc2suaGFzT3duUHJvcGVydHkobWFzaykpIHtcbiAgICAgICAgc3RhdGUuY2hvc2VuTWFzayA9IG1hc2s7XG4gICAgfVxuICAgIGlmIChzdWZmaXggJiYgdHlwZW9mIHN1ZmZpeCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RhdGUuc3VmZml4ID0gc3VmZml4O1xuICAgIH1cbiAgICBpZiAocHJlZml4ZXMgJiYgQXJyYXkuaXNBcnJheShwcmVmaXhlcykpIHtcbiAgICAgICAgc3RhdGUuZXhwbGljaXRQcmVmaXhlcyA9IHByZWZpeGVzO1xuICAgIH1cblxuICAgIGlmICghc3RhdGUucmVuZGVyZWRDc3MpIGluamVjdENTUygpO1xuXG4gICAgYXBwLmFwcEluc3RhbmNlKCkub24oJ2l0ZW06bG9hZCcsICgpID0+IHtcbiAgICAgICAgYWRkUHJlZml4KHF1ZXN0aW9uLnF1ZXN0aW9ucygpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHthcnJheX0gcSBBcnJheSBvZiBxdWVzdGlvbnMsIGlmIGFueSwgb24gdGhlIGN1cnJlbnQgaXRlbVxuICogQHNpbmNlIDAuNi4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGFkZFByZWZpeChpdGVtUXVlc3Rpb25zKSB7XG4gICAgY29uc3QgYXNjaWlTdGFydCA9IHN0YXRlLnByZWZpeE1hc2tbc3RhdGUuY2hvc2VuTWFza107XG4gICAgY29uc3Qgc3VmZml4ID0gc3RhdGUuc3VmZml4O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgcSBvZiBpdGVtUXVlc3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAocS50eXBlID09PSAnbWNxJyAmJiBxPy51aV9zdHlsZT8udHlwZSAhPT0gJ2Jsb2NrJyAmJiBxPy51aV9zdHlsZT8udHlwZSAhPT0gJ2hvcml6b250YWwtaW5wdXQtYm90dG9tJykge1xuICAgICAgICAgICAgICAgIGxldCByID0gcS5yZXNwb25zZV9pZDtcbiAgICAgICAgICAgICAgICBsZXQgZWxPcHRpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocikucXVlcnlTZWxlY3RvckFsbCgnLmxybi1tY3Etb3B0aW9uJyk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG8gb2YgZWxPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbExhYmVscyA9IG8ucXVlcnlTZWxlY3RvcignLmxybi1wb3NzaWJsZS1hbnN3ZXInKS5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsRXhpc3RpbmdQcmVmaXhlcyA9IG8ucXVlcnlTZWxlY3RvcignLmxybi1wcmVmaXgtbGFiZWwnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHByaW50ZWQgcHJlZml4ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbEV4aXN0aW5nUHJlZml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmVmaXhWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2UncmUgdXNpbmcgYSBwcmVmaXggbWFzayBvciBhbiBleHBsaWNpdCBzZXQgb2YgcHJlZml4ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHN0YXRlLmV4cGxpY2l0UHJlZml4ZXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXhwbGljaXRQcmVmaXhlcy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc3RhdGUuZXhwbGljaXRQcmVmaXhlc1tyZXNwb25zZUluZGV4XSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeFZhbHVlID0gc3RhdGUuZXhwbGljaXRQcmVmaXhlc1tyZXNwb25zZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4VmFsdWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFzY2lpU3RhcnQgKyByZXNwb25zZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxMYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2xybi1wcmVmaXgtbGFiZWwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZChgJHtwcmVmaXhWYWx1ZX0ke3N1ZmZpeH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbExhYmVsc1tpXS5wcmVwZW5kKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbmplY3RzIHRoZSBuZWNlc3NhcnkgQ1NTIHRvIHRoZSBoZWFkZXJcbiAqIEBzaW5jZSAwLjYuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBpbmplY3RDU1MoKSB7XG4gICAgY29uc3QgZWxTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgY3NzID0gYFxuLyogTGVhcm5vc2l0eSBNQ1EgbGFiZWwgcHJlZml4IHN0eWxlcyAqL1xuLmxybi1wcmVmaXgtbGFiZWwge1xuICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA3NTBweCkge1xuICAgIC5scm4tcHJlZml4LWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgICB9XG59XG5AbWVkaWEgKG1heC13aWR0aDogNjUwcHgpIHtcbiAgICAubHJuLXByZWZpeC1sYWJlbCB7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgICB9XG59XG5gO1xuXG4gICAgZWxTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChlbFN0eWxlKTtcblxuICAgIHN0YXRlLnJlbmRlcmVkQ3NzID0gdHJ1ZTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/mcqLabelPrefix.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/pageOverlay.js": -/*!*******************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/pageOverlay.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ halt: () => (/* binding */ halt),\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Adds a semi-transparent overlay on top of the entire page.\n * This is for users who have sensitivity to bright light,\n * high contrast, or blue light.\n *\n *

\"\"

\n * @module Extensions/Assessment/pageOverlay\n */\n\nconst state = {\n color: 'rgba(250, 170, 140, 0.5)',\n renderedCss: false,\n zindex: 99999,\n};\n\n/**\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.pageOverlay.run();\n * @param {string} customColor A custom color value to use for the overlay. Recommend rgba. Defaults to rgba(250, 170, 140, 0.5)\n * @param {number} customZIndex A custom z-index value to use for the overlay. Defaults to 99999.\n * @since 0.9.0\n */\nfunction run(customColor, customZIndex) {\n if (customColor && typeof customColor === 'string') {\n state.color = customColor;\n }\n if (customZIndex && typeof customZIndex === 'number') {\n state.zindex = customZIndex;\n }\n\n const elOverlayExists = document.querySelector('.lrn__overlay');\n\n if (!elOverlayExists) {\n const elOverlay = document.createElement('div');\n\n elOverlay.classList.add('lrn__overlay');\n document.querySelector('body').append(elOverlay);\n }\n\n if (!state.renderedCss) injectCSS();\n}\n\n/**\n * Turns off the page overlay.\n * @since 0.9.0\n */\nfunction halt() {\n const elOverlay = document.querySelector('.lrn__overlay');\n if (elOverlay) {\n elOverlay.remove();\n }\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 0.9.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity page overlay styles */\n.lrn__overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${state.color};\n z-index: ${state.zindex};\n pointer-events: none;\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvcGFnZU92ZXJsYXkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvcGFnZU92ZXJsYXkuanM/MWRkNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIEFkZHMgYSBzZW1pLXRyYW5zcGFyZW50IG92ZXJsYXkgb24gdG9wIG9mIHRoZSBlbnRpcmUgcGFnZS5cbiAqIFRoaXMgaXMgZm9yIHVzZXJzIHdobyBoYXZlIHNlbnNpdGl2aXR5IHRvIGJyaWdodCBsaWdodCxcbiAqIGhpZ2ggY29udHJhc3QsIG9yIGJsdWUgbGlnaHQuXG4gKlxuICogPHA+PGltZyBzcmM9XCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWljaGFlbHNoYXJtYW4vTFQvbWFpbi9zcmMvYXNzZXRzL2ltYWdlcy9wYWdlb3ZlcmxheS5wbmdcIiBhbHQ9XCJcIiB3aWR0aD1cIjg2MFwiPjwvcD5cbiAqIEBtb2R1bGUgRXh0ZW5zaW9ucy9Bc3Nlc3NtZW50L3BhZ2VPdmVybGF5XG4gKi9cblxuY29uc3Qgc3RhdGUgPSB7XG4gICAgY29sb3I6ICdyZ2JhKDI1MCwgMTcwLCAxNDAsIDAuNSknLFxuICAgIHJlbmRlcmVkQ3NzOiBmYWxzZSxcbiAgICB6aW5kZXg6IDk5OTk5LFxufTtcblxuLyoqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTFQgfSBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2luZGV4JztcbiAqXG4gKiBMVC5pbml0KGl0ZW1zQXBwKTsgLy8gU2V0IHVwIExUIHdpdGggdGhlIEl0ZW1zIEFQSSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB2YXJpYWJsZVxuICogTFQuZXh0ZW5zaW9ucy5wYWdlT3ZlcmxheS5ydW4oKTtcbiAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21Db2xvciBBIGN1c3RvbSBjb2xvciB2YWx1ZSB0byB1c2UgZm9yIHRoZSBvdmVybGF5LiBSZWNvbW1lbmQgcmdiYS4gRGVmYXVsdHMgdG8gcmdiYSgyNTAsIDE3MCwgMTQwLCAwLjUpXG4gKiBAcGFyYW0ge251bWJlcn0gY3VzdG9tWkluZGV4IEEgY3VzdG9tIHotaW5kZXggdmFsdWUgdG8gdXNlIGZvciB0aGUgb3ZlcmxheS4gRGVmYXVsdHMgdG8gOTk5OTkuXG4gKiBAc2luY2UgMC45LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bihjdXN0b21Db2xvciwgY3VzdG9tWkluZGV4KSB7XG4gICAgaWYgKGN1c3RvbUNvbG9yICYmIHR5cGVvZiBjdXN0b21Db2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RhdGUuY29sb3IgPSBjdXN0b21Db2xvcjtcbiAgICB9XG4gICAgaWYgKGN1c3RvbVpJbmRleCAmJiB0eXBlb2YgY3VzdG9tWkluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBzdGF0ZS56aW5kZXggPSBjdXN0b21aSW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgZWxPdmVybGF5RXhpc3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxybl9fb3ZlcmxheScpO1xuXG4gICAgaWYgKCFlbE92ZXJsYXlFeGlzdHMpIHtcbiAgICAgICAgY29uc3QgZWxPdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgZWxPdmVybGF5LmNsYXNzTGlzdC5hZGQoJ2xybl9fb3ZlcmxheScpO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuYXBwZW5kKGVsT3ZlcmxheSk7XG4gICAgfVxuXG4gICAgaWYgKCFzdGF0ZS5yZW5kZXJlZENzcykgaW5qZWN0Q1NTKCk7XG59XG5cbi8qKlxuICogVHVybnMgb2ZmIHRoZSBwYWdlIG92ZXJsYXkuXG4gKiBAc2luY2UgMC45LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbHQoKSB7XG4gICAgY29uc3QgZWxPdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxybl9fb3ZlcmxheScpO1xuICAgIGlmIChlbE92ZXJsYXkpIHtcbiAgICAgICAgZWxPdmVybGF5LnJlbW92ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbmplY3RzIHRoZSBuZWNlc3NhcnkgQ1NTIHRvIHRoZSBoZWFkZXJcbiAqIEBzaW5jZSAwLjkuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBpbmplY3RDU1MoKSB7XG4gICAgY29uc3QgZWxTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgY3NzID0gYFxuLyogTGVhcm5vc2l0eSBwYWdlIG92ZXJsYXkgc3R5bGVzICovXG4ubHJuX19vdmVybGF5IHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7c3RhdGUuY29sb3J9O1xuICAgIHotaW5kZXg6ICR7c3RhdGUuemluZGV4fTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbmA7XG5cbiAgICBlbFN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGVsU3R5bGUpO1xuXG4gICAgc3RhdGUucmVuZGVyZWRDc3MgPSB0cnVlO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/pageOverlay.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/resetResponse.js": -/*!*********************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/resetResponse.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../core/questions */ \"./src/assessment/core/questions.js\");\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Resets a question by clearing (resetting) the UI\n * and setting the `attempted` status to false.\n *\n * Supports all question types, however we set to multiple choice (`mcq`) by default.\n * If you want all types, pass `['*']` as the second argument.\n * If you want a subset, pass an array of type alias' as the second argument.\n * See the `type` property for each type here https://reference.learnosity.com/questions-api/questiontypes\n *\n *

\"\"

\n * @module Extensions/Assessment/resetResponse\n */\n\nconst state = {\n class: 'lrn__resetResponse',\n label: 'Reset question',\n renderedCss: false,\n types: ['mcq'],\n};\n\n/**\n * Sets up an item load listener and injects a reset response button\n * to the UI at the bottom of each configured question on the item.\n *\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.resetResponse.run();\n * @param {string} label A custom label to use for the reset button.\n * @param {array} type Which question types to support. `['*']` for all types.\n * @since 0.8.0\n */\nfunction run(customLabel, customTypes) {\n if (customLabel && typeof customLabel === 'string') {\n state.label = customLabel;\n }\n if (customTypes && Array.isArray(customTypes)) {\n state.types = customTypes;\n }\n\n if (!state.renderedCss) injectCSS();\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', () => {\n setupResetUI();\n });\n}\n\n/**\n * Injects a custom button to supported types.\n * Adds an event listener on click.\n * @since 0.8.0\n * @ignore\n */\nfunction setupResetUI() {\n const itemQuestions = _core_questions__WEBPACK_IMPORTED_MODULE_2__.questions();\n\n // Add a reset UI to each supported question type on the item\n try {\n for (const q of itemQuestions) {\n if (state.types.includes('*') || state.types.includes(q.type)) {\n const r = q.response_id;\n const elQuestion = document.getElementById(r);\n const elResponse = elQuestion.querySelector('.lrn_response');\n let elResetUI = elQuestion.querySelector(`.${state.class}`);\n if (!elResetUI) {\n elResponse.append(getResetUI());\n elResetUI = elQuestion.querySelector(`.${state.class}`);\n elResetUI.addEventListener('click', resetResponse);\n }\n }\n }\n } catch (err) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].error(err);\n }\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 0.8.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity reset question styles */\n.lrn .lrn_btn.${state.class} {\n margin-top: 1em;\n margin-bottom: 0.5em;\n clear: both;\n display: block;\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n\n/**\n * Generates the HTML for the UI to reset a question.\n * @since 0.8.0\n * @ignore\n * @returns {object} HTML of reset UI element\n */\nfunction getResetUI() {\n const elWrapper = document.createElement('button');\n const elLabel = document.createElement('span');\n\n elWrapper.classList.add('lds-btn', 'lds-btn-secondary', 'lrn_btn', state.class);\n elLabel.append(state.label);\n elWrapper.append(elLabel);\n\n return elWrapper;\n}\n\n/**\n * Calls resetResponse() on the question instance\n * @param {object} e Question instance where the button was clicked\n * @since 0.8.0\n * @ignore\n */\nfunction resetResponse(e) {\n const elQuestion = e.srcElement.closest('.lrn_widget');\n const responseId = elQuestion.getAttribute('id');\n const questionInstance = _core_app__WEBPACK_IMPORTED_MODULE_0__.questionsApp().question(responseId);\n questionInstance.resetResponse();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvcmVzZXRSZXNwb25zZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQXlDO0FBQ0s7QUFDTTs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLElBQUksa0RBQWU7QUFDbkI7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsc0RBQWtCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxZQUFZO0FBQ3pFO0FBQ0E7QUFDQSw2REFBNkQsWUFBWTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixRQUFRLHFEQUFNO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixtREFBZ0I7QUFDN0M7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvcmVzZXRSZXNwb25zZS5qcz9kNWFiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuLi8uLi8uLi9jb3JlL2FwcCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgKiBhcyBxdWVzdGlvbiBmcm9tICcuLi8uLi8uLi9jb3JlL3F1ZXN0aW9ucyc7XG5cbi8qKlxuICogRXh0ZW5zaW9ucyBhZGQgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0byBJdGVtcyBBUEkuXG4gKiBUaGV5IHJlbHkgb24gbW9kdWxlcyB3aXRoaW4gTFQgYmVpbmcgYXZhaWxhYmxlLlxuICpcbiAqIC0tXG4gKlxuICogUmVzZXRzIGEgcXVlc3Rpb24gYnkgY2xlYXJpbmcgKHJlc2V0dGluZykgdGhlIFVJXG4gKiBhbmQgc2V0dGluZyB0aGUgYGF0dGVtcHRlZGAgc3RhdHVzIHRvIGZhbHNlLlxuICpcbiAqIFN1cHBvcnRzIGFsbCBxdWVzdGlvbiB0eXBlcywgaG93ZXZlciB3ZSBzZXQgdG8gbXVsdGlwbGUgY2hvaWNlIChgbWNxYCkgYnkgZGVmYXVsdC5cbiAqIElmIHlvdSB3YW50IGFsbCB0eXBlcywgcGFzcyBgWycqJ11gIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gKiBJZiB5b3Ugd2FudCBhIHN1YnNldCwgcGFzcyBhbiBhcnJheSBvZiB0eXBlIGFsaWFzJyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICogU2VlIHRoZSBgdHlwZWAgcHJvcGVydHkgZm9yIGVhY2ggdHlwZSBoZXJlIGh0dHBzOi8vcmVmZXJlbmNlLmxlYXJub3NpdHkuY29tL3F1ZXN0aW9ucy1hcGkvcXVlc3Rpb250eXBlc1xuICpcbiAqIDxwPjxpbWcgc3JjPVwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21pY2hhZWxzaGFybWFuL0xUL21haW4vc3JjL2Fzc2V0cy9pbWFnZXMvcmVzZXRyZXNwb25zZS5naWZcIiBhbHQ9XCJcIiB3aWR0aD1cIjYwMFwiPjwvcD5cbiAqIEBtb2R1bGUgRXh0ZW5zaW9ucy9Bc3Nlc3NtZW50L3Jlc2V0UmVzcG9uc2VcbiAqL1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICBjbGFzczogJ2xybl9fcmVzZXRSZXNwb25zZScsXG4gICAgbGFiZWw6ICdSZXNldCBxdWVzdGlvbicsXG4gICAgcmVuZGVyZWRDc3M6IGZhbHNlLFxuICAgIHR5cGVzOiBbJ21jcSddLFxufTtcblxuLyoqXG4gKiBTZXRzIHVwIGFuIGl0ZW0gbG9hZCBsaXN0ZW5lciBhbmQgaW5qZWN0cyBhIHJlc2V0IHJlc3BvbnNlIGJ1dHRvblxuICogdG8gdGhlIFVJIGF0IHRoZSBib3R0b20gb2YgZWFjaCBjb25maWd1cmVkIHF1ZXN0aW9uIG9uIHRoZSBpdGVtLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBMVCB9IGZyb20gJ0BjYXNwaW5ndXMvbHQvc3JjL2Fzc2Vzc21lbnQvaW5kZXgnO1xuICpcbiAqIExULmluaXQoaXRlbXNBcHApOyAvLyBTZXQgdXAgTFQgd2l0aCB0aGUgSXRlbXMgQVBJIGFwcGxpY2F0aW9uIGluc3RhbmNlIHZhcmlhYmxlXG4gKiBMVC5leHRlbnNpb25zLnJlc2V0UmVzcG9uc2UucnVuKCk7XG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgQSBjdXN0b20gbGFiZWwgdG8gdXNlIGZvciB0aGUgcmVzZXQgYnV0dG9uLlxuICogQHBhcmFtIHthcnJheX0gdHlwZSBXaGljaCBxdWVzdGlvbiB0eXBlcyB0byBzdXBwb3J0LiBgWycqJ11gIGZvciBhbGwgdHlwZXMuXG4gKiBAc2luY2UgMC44LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bihjdXN0b21MYWJlbCwgY3VzdG9tVHlwZXMpIHtcbiAgICBpZiAoY3VzdG9tTGFiZWwgJiYgdHlwZW9mIGN1c3RvbUxhYmVsID09PSAnc3RyaW5nJykge1xuICAgICAgICBzdGF0ZS5sYWJlbCA9IGN1c3RvbUxhYmVsO1xuICAgIH1cbiAgICBpZiAoY3VzdG9tVHlwZXMgJiYgQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcykpIHtcbiAgICAgICAgc3RhdGUudHlwZXMgPSBjdXN0b21UeXBlcztcbiAgICB9XG5cbiAgICBpZiAoIXN0YXRlLnJlbmRlcmVkQ3NzKSBpbmplY3RDU1MoKTtcblxuICAgIGFwcC5hcHBJbnN0YW5jZSgpLm9uKCdpdGVtOmxvYWQnLCAoKSA9PiB7XG4gICAgICAgIHNldHVwUmVzZXRVSSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEluamVjdHMgYSBjdXN0b20gYnV0dG9uIHRvIHN1cHBvcnRlZCB0eXBlcy5cbiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgb24gY2xpY2suXG4gKiBAc2luY2UgMC44LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0dXBSZXNldFVJKCkge1xuICAgIGNvbnN0IGl0ZW1RdWVzdGlvbnMgPSBxdWVzdGlvbi5xdWVzdGlvbnMoKTtcblxuICAgIC8vIEFkZCBhIHJlc2V0IFVJIHRvIGVhY2ggc3VwcG9ydGVkIHF1ZXN0aW9uIHR5cGUgb24gdGhlIGl0ZW1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKGNvbnN0IHEgb2YgaXRlbVF1ZXN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnR5cGVzLmluY2x1ZGVzKCcqJykgfHwgc3RhdGUudHlwZXMuaW5jbHVkZXMocS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBxLnJlc3BvbnNlX2lkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsUXVlc3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbFJlc3BvbnNlID0gZWxRdWVzdGlvbi5xdWVyeVNlbGVjdG9yKCcubHJuX3Jlc3BvbnNlJyk7XG4gICAgICAgICAgICAgICAgbGV0IGVsUmVzZXRVSSA9IGVsUXVlc3Rpb24ucXVlcnlTZWxlY3RvcihgLiR7c3RhdGUuY2xhc3N9YCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbFJlc2V0VUkpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxSZXNwb25zZS5hcHBlbmQoZ2V0UmVzZXRVSSgpKTtcbiAgICAgICAgICAgICAgICAgICAgZWxSZXNldFVJID0gZWxRdWVzdGlvbi5xdWVyeVNlbGVjdG9yKGAuJHtzdGF0ZS5jbGFzc31gKTtcbiAgICAgICAgICAgICAgICAgICAgZWxSZXNldFVJLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbmplY3RzIHRoZSBuZWNlc3NhcnkgQ1NTIHRvIHRoZSBoZWFkZXJcbiAqIEBzaW5jZSAwLjguMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBpbmplY3RDU1MoKSB7XG4gICAgY29uc3QgZWxTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgY3NzID0gYFxuLyogTGVhcm5vc2l0eSByZXNldCBxdWVzdGlvbiBzdHlsZXMgKi9cbi5scm4gLmxybl9idG4uJHtzdGF0ZS5jbGFzc30ge1xuICAgIG1hcmdpbi10b3A6IDFlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTtcbiAgICBjbGVhcjogYm90aDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cbmA7XG5cbiAgICBlbFN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGVsU3R5bGUpO1xuXG4gICAgc3RhdGUucmVuZGVyZWRDc3MgPSB0cnVlO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIFVJIHRvIHJlc2V0IGEgcXVlc3Rpb24uXG4gKiBAc2luY2UgMC44LjBcbiAqIEBpZ25vcmVcbiAqIEByZXR1cm5zIHtvYmplY3R9IEhUTUwgb2YgcmVzZXQgVUkgZWxlbWVudFxuICovXG5mdW5jdGlvbiBnZXRSZXNldFVJKCkge1xuICAgIGNvbnN0IGVsV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGNvbnN0IGVsTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICBlbFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnbGRzLWJ0bicsICdsZHMtYnRuLXNlY29uZGFyeScsICdscm5fYnRuJywgc3RhdGUuY2xhc3MpO1xuICAgIGVsTGFiZWwuYXBwZW5kKHN0YXRlLmxhYmVsKTtcbiAgICBlbFdyYXBwZXIuYXBwZW5kKGVsTGFiZWwpO1xuXG4gICAgcmV0dXJuIGVsV3JhcHBlcjtcbn1cblxuLyoqXG4gKiBDYWxscyByZXNldFJlc3BvbnNlKCkgb24gdGhlIHF1ZXN0aW9uIGluc3RhbmNlXG4gKiBAcGFyYW0ge29iamVjdH0gZSBRdWVzdGlvbiBpbnN0YW5jZSB3aGVyZSB0aGUgYnV0dG9uIHdhcyBjbGlja2VkXG4gKiBAc2luY2UgMC44LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gcmVzZXRSZXNwb25zZShlKSB7XG4gICAgY29uc3QgZWxRdWVzdGlvbiA9IGUuc3JjRWxlbWVudC5jbG9zZXN0KCcubHJuX3dpZGdldCcpO1xuICAgIGNvbnN0IHJlc3BvbnNlSWQgPSBlbFF1ZXN0aW9uLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICBjb25zdCBxdWVzdGlvbkluc3RhbmNlID0gYXBwLnF1ZXN0aW9uc0FwcCgpLnF1ZXN0aW9uKHJlc3BvbnNlSWQpO1xuICAgIHF1ZXN0aW9uSW5zdGFuY2UucmVzZXRSZXNwb25zZSgpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/resetResponse.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/toggleTimer.js": -/*!*******************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/toggleTimer.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_activity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../utils/logger */ \"./src/utils/logger.js\");\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Allows the end-user to toggle visibility of the timer,\n * leaving the clock icon only. This can reduce test anxiety.\n *\n * Note: this does not work on the smallest (mobile) breakpoint\n * because that is a separate layout that doesn't include the\n * clock icon. It's a future TODO to rectify this extension\n * in the narrowest layout.\n *

\"Animated

\n * @module Extensions/Assessment/toggleTimer\n */\n\nconst state = {\n forceRenderTimer: false,\n renderedCss: false,\n};\n\n/**\n * Wraps clock and timer elements inside a button. Adds a\n * click event to toggle the timer.\n *\n * By passing `showTimerLimit`, you can force render the timer\n * in the final moments. Will force render one time only, if\n * the user hides the timer again we don't force render.\n *\n * @param {number} showTimerLimit The clock value to force render the timer element.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.toggleTimer.run();\n * @since 2.6.0\n */\nfunction run(showTimerLimit = 60) {\n const elLrnResponsiveWrapper = document.querySelector('.lrn-sm');\n const elTimerWrapper = document.querySelector('.lrn-timer-wrapper');\n\n if (elLrnResponsiveWrapper && elTimerWrapper) {\n if (!state.renderedCss) injectCSS();\n\n const childElements = Array.from(elTimerWrapper.children);\n const elTimerButton = document.createElement('button');\n\n elTimerButton.classList.add('lrn_btn', 'lt__timer-button');\n elTimerButton.setAttribute('type', 'button');\n elTimerButton.setAttribute('aria-label', `${elTimerWrapper.getAttribute('aria-label')}, click to toggle visibility of the timer.`);\n\n elTimerWrapper.innerHTML = '';\n elTimerWrapper.appendChild(elTimerButton);\n childElements.forEach(child => {\n elTimerButton.appendChild(child);\n });\n\n elTimerButton.addEventListener('click', () => {\n toggleTimer(elTimerWrapper);\n });\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('time:change', () => {\n const timeRemaining = _core_activity__WEBPACK_IMPORTED_MODULE_1__.timeRemaining();\n if (\n !state.forceRenderTimer &&\n typeof timeRemaining === 'number' &&\n timeRemaining <= Number(showTimerLimit) &&\n elTimerWrapper.classList.contains('lt__timer-hide')\n ) {\n state.forceRenderTimer = true;\n elTimerWrapper.classList.remove('lt__timer-hide');\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].info(`Force show the timer limit (${showTimerLimit}) reached.`);\n }\n });\n }\n}\n\n/**\n * Adds a classname to toggle visibility of the timer.\n * @param {object} elTimerWrapper DOM element of timer.\n * @since 2.6.0\n * @ignore\n */\nfunction toggleTimer(elTimerWrapper) {\n elTimerWrapper.classList.toggle('lt__timer-hide');\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 2.6.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity toggle timer styles */\n.lrn.lrn-assess .lrn-region:not(.lrn-items-region) .lrn_btn.lt__timer-button {\n font-size: inherit;\n}\n\n.lrn-assess .lrn_btn.lt__timer-button .timer {\n padding: 8px;\n height: 29px;\n position: relative;\n top: -4px;\n}\n\n.lrn.lrn-assess .lt__timer-wrapper.lt__timer-hide .lrn_btn.lt__timer-button .timer .clock:before {\n padding-right: 0;\n}\n\n.lrn-timer-wrapper.lt__timer-hide .lt__timer-button .timer > *:not(.clock) {\n display: none;\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvdG9nZ2xlVGltZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUF5QztBQUNVO0FBQ0w7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9ELDBDQUEwQzs7QUFFOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVULFFBQVEsa0RBQWU7QUFDdkIsa0NBQWtDLHlEQUFzQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHFEQUFNLHFDQUFxQyxlQUFlO0FBQzFFO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvYWNjZXNzaWJpbGl0eS91eC90b2dnbGVUaW1lci5qcz8xODU5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuLi8uLi8uLi9jb3JlL2FwcCc7XG5pbXBvcnQgKiBhcyBhY3Rpdml0eSBmcm9tICcuLi8uLi8uLi9jb3JlL2FjdGl2aXR5JztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvbG9nZ2VyJztcblxuLyoqXG4gKiBFeHRlbnNpb25zIGFkZCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHRvIEl0ZW1zIEFQSS5cbiAqIFRoZXkgcmVseSBvbiBtb2R1bGVzIHdpdGhpbiBMVCBiZWluZyBhdmFpbGFibGUuXG4gKlxuICogLS1cbiAqXG4gKiBBbGxvd3MgdGhlIGVuZC11c2VyIHRvIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIHRoZSB0aW1lcixcbiAqIGxlYXZpbmcgdGhlIGNsb2NrIGljb24gb25seS4gVGhpcyBjYW4gcmVkdWNlIHRlc3QgYW54aWV0eS5cbiAqXG4gKiBOb3RlOiB0aGlzIGRvZXMgbm90IHdvcmsgb24gdGhlIHNtYWxsZXN0IChtb2JpbGUpIGJyZWFrcG9pbnRcbiAqIGJlY2F1c2UgdGhhdCBpcyBhIHNlcGFyYXRlIGxheW91dCB0aGF0IGRvZXNuJ3QgaW5jbHVkZSB0aGVcbiAqIGNsb2NrIGljb24uIEl0J3MgYSBmdXR1cmUgVE9ETyB0byByZWN0aWZ5IHRoaXMgZXh0ZW5zaW9uXG4gKiBpbiB0aGUgbmFycm93ZXN0IGxheW91dC5cbiAqIDxwPjxpbWcgc3JjPVwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21pY2hhZWxzaGFybWFuL0xUL21haW4vc3JjL2Fzc2V0cy9pbWFnZXMvdG9nZ2xldGltZXIuZ2lmXCIgYWx0PVwiQW5pbWF0ZWQgZ2lmIHNob3dpbmcgdGhlIHRvZ2dsZSB0aW1lciBmZWF0dXJlXCIgd2lkdGg9XCI5MDBcIj48L3A+XG4gKiBAbW9kdWxlIEV4dGVuc2lvbnMvQXNzZXNzbWVudC90b2dnbGVUaW1lclxuICovXG5cbmNvbnN0IHN0YXRlID0ge1xuICAgIGZvcmNlUmVuZGVyVGltZXI6IGZhbHNlLFxuICAgIHJlbmRlcmVkQ3NzOiBmYWxzZSxcbn07XG5cbi8qKlxuICogV3JhcHMgY2xvY2sgYW5kIHRpbWVyIGVsZW1lbnRzIGluc2lkZSBhIGJ1dHRvbi4gQWRkcyBhXG4gKiBjbGljayBldmVudCB0byB0b2dnbGUgdGhlIHRpbWVyLlxuICpcbiAqIEJ5IHBhc3NpbmcgYHNob3dUaW1lckxpbWl0YCwgeW91IGNhbiBmb3JjZSByZW5kZXIgdGhlIHRpbWVyXG4gKiBpbiB0aGUgZmluYWwgbW9tZW50cy4gV2lsbCBmb3JjZSByZW5kZXIgb25lIHRpbWUgb25seSwgaWZcbiAqIHRoZSB1c2VyIGhpZGVzIHRoZSB0aW1lciBhZ2FpbiB3ZSBkb24ndCBmb3JjZSByZW5kZXIuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHNob3dUaW1lckxpbWl0IFRoZSBjbG9jayB2YWx1ZSB0byBmb3JjZSByZW5kZXIgdGhlIHRpbWVyIGVsZW1lbnQuXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTFQgfSBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2luZGV4JztcbiAqXG4gKiBMVC5pbml0KGl0ZW1zQXBwKTsgLy8gU2V0IHVwIExUIHdpdGggdGhlIEl0ZW1zIEFQSSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB2YXJpYWJsZVxuICogTFQuZXh0ZW5zaW9ucy50b2dnbGVUaW1lci5ydW4oKTtcbiAqIEBzaW5jZSAyLjYuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuKHNob3dUaW1lckxpbWl0ID0gNjApIHtcbiAgICBjb25zdCBlbExyblJlc3BvbnNpdmVXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxybi1zbScpO1xuICAgIGNvbnN0IGVsVGltZXJXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxybi10aW1lci13cmFwcGVyJyk7XG5cbiAgICBpZiAoZWxMcm5SZXNwb25zaXZlV3JhcHBlciAmJiBlbFRpbWVyV3JhcHBlcikge1xuICAgICAgICBpZiAoIXN0YXRlLnJlbmRlcmVkQ3NzKSBpbmplY3RDU1MoKTtcblxuICAgICAgICBjb25zdCBjaGlsZEVsZW1lbnRzID0gQXJyYXkuZnJvbShlbFRpbWVyV3JhcHBlci5jaGlsZHJlbik7XG4gICAgICAgIGNvbnN0IGVsVGltZXJCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblxuICAgICAgICBlbFRpbWVyQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2xybl9idG4nLCAnbHRfX3RpbWVyLWJ1dHRvbicpO1xuICAgICAgICBlbFRpbWVyQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcbiAgICAgICAgZWxUaW1lckJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBgJHtlbFRpbWVyV3JhcHBlci5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKX0sIGNsaWNrIHRvIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIHRoZSB0aW1lci5gKTtcblxuICAgICAgICBlbFRpbWVyV3JhcHBlci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgZWxUaW1lcldyYXBwZXIuYXBwZW5kQ2hpbGQoZWxUaW1lckJ1dHRvbik7XG4gICAgICAgIGNoaWxkRWxlbWVudHMuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICBlbFRpbWVyQnV0dG9uLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZWxUaW1lckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRvZ2dsZVRpbWVyKGVsVGltZXJXcmFwcGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwLmFwcEluc3RhbmNlKCkub24oJ3RpbWU6Y2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZVJlbWFpbmluZyA9IGFjdGl2aXR5LnRpbWVSZW1haW5pbmcoKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhc3RhdGUuZm9yY2VSZW5kZXJUaW1lciAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aW1lUmVtYWluaW5nID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgIHRpbWVSZW1haW5pbmcgPD0gTnVtYmVyKHNob3dUaW1lckxpbWl0KSAmJlxuICAgICAgICAgICAgICAgIGVsVGltZXJXcmFwcGVyLmNsYXNzTGlzdC5jb250YWlucygnbHRfX3RpbWVyLWhpZGUnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuZm9yY2VSZW5kZXJUaW1lciA9IHRydWU7XG4gICAgICAgICAgICAgICAgZWxUaW1lcldyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnbHRfX3RpbWVyLWhpZGUnKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgRm9yY2Ugc2hvdyB0aGUgdGltZXIgbGltaXQgKCR7c2hvd1RpbWVyTGltaXR9KSByZWFjaGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogQWRkcyBhIGNsYXNzbmFtZSB0byB0b2dnbGUgdmlzaWJpbGl0eSBvZiB0aGUgdGltZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gZWxUaW1lcldyYXBwZXIgRE9NIGVsZW1lbnQgb2YgdGltZXIuXG4gKiBAc2luY2UgMi42LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlVGltZXIoZWxUaW1lcldyYXBwZXIpIHtcbiAgICBlbFRpbWVyV3JhcHBlci5jbGFzc0xpc3QudG9nZ2xlKCdsdF9fdGltZXItaGlkZScpO1xufVxuXG4vKipcbiAqIEluamVjdHMgdGhlIG5lY2Vzc2FyeSBDU1MgdG8gdGhlIGhlYWRlclxuICogQHNpbmNlIDIuNi4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGluamVjdENTUygpIHtcbiAgICBjb25zdCBlbFN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBjb25zdCBjc3MgPSBgXG4vKiBMZWFybm9zaXR5IHRvZ2dsZSB0aW1lciBzdHlsZXMgKi9cbi5scm4ubHJuLWFzc2VzcyAubHJuLXJlZ2lvbjpub3QoLmxybi1pdGVtcy1yZWdpb24pIC5scm5fYnRuLmx0X190aW1lci1idXR0b24ge1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbn1cblxuLmxybi1hc3Nlc3MgLmxybl9idG4ubHRfX3RpbWVyLWJ1dHRvbiAudGltZXIge1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICBoZWlnaHQ6IDI5cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogLTRweDtcbn1cblxuLmxybi5scm4tYXNzZXNzIC5sdF9fdGltZXItd3JhcHBlci5sdF9fdGltZXItaGlkZSAubHJuX2J0bi5sdF9fdGltZXItYnV0dG9uIC50aW1lciAuY2xvY2s6YmVmb3JlIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xufVxuXG4ubHJuLXRpbWVyLXdyYXBwZXIubHRfX3RpbWVyLWhpZGUgLmx0X190aW1lci1idXR0b24gLnRpbWVyID4gKjpub3QoLmNsb2NrKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbmA7XG5cbiAgICBlbFN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGVsU3R5bGUpO1xuXG4gICAgc3RhdGUucmVuZGVyZWRDc3MgPSB0cnVlO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/toggleTimer.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/accessibility/ux/whiteNoise/index.js": -/*!************************************************************************!*\ - !*** ./src/assessment/extensions/accessibility/ux/whiteNoise/index.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ launchPlayer: () => (/* binding */ launchPlayer),\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_player__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../core/player */ \"./src/assessment/core/player.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var howler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! howler */ \"./node_modules/howler/dist/howler.js\");\n/* harmony import */ var howler__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(howler__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Renders an audio player that the end-user can use\n * to play white noise sounds. Helps for some users\n * with focus and concentration.\n *\n * By default the player renders inside a custom dialog\n * from Items API. This is the simplest set up, just call\n * `run()` and add something like the following to your\n * Items API config object (the essential piece is the\n * custom button):\n *\n * ```\n * {\n * \"config\": {\n * \"regions\": \"main\",\n * \"region_overrides\": {\n * \"right\": [\n * {\n * \"type\": \"save_button\"\n * },\n * {\n * \"type\": \"fullscreen_button\"\n * },\n * {\n * \"type\": \"reviewscreen_button\"\n * },\n * {\n * \"type\": \"accessibility_button\"\n * },\n * {\n * \"type\": \"flagitem_button\"\n * },\n * {\n * \"type\": \"custom_button\",\n * \"options\": {\n * \"name\": \"btn-whitenoise\",\n * \"label\": \"White noise player\",\n * \"icon_class\": \"lt__whitenoise-player-icon\"\n * }\n * },\n * {\n * \"type\": \"masking_button\"\n * }\n * ]\n * }\n * }\n * }\n * ```\n *\n * This will render a button in the vertical toolbar of the player with a headphones\n * icon. Click this and the player will launch (see below).\n *\n *

\"\"

\n *\n * If you want to render the player inside a custom element, pass an `id` to\n * `launchPlayer(id)` after calling `run()`. This will render the player\n * inside an element of your choice. You will be responsible for showing/hiding\n * the player, or just leave it always visible.\n *\n * ```\n *
\n *
\n *\n * \n * ```\n * @module Extensions/Assessment/whiteNoise\n */\n\nconst state = {\n player: {\n instances: {\n beach: null,\n birds: null,\n wind: null,\n thunder: null,\n campfire: null,\n rain: null,\n },\n sound: null,\n volume: null,\n },\n playlist: {\n beach: 'https://assets.learnosity.com/learnosity_toolkit/whitenoise/beach.mp3',\n birds: 'https://assets.learnosity.com/learnosity_toolkit/whitenoise/birds.mp3',\n wind: 'https://assets.learnosity.com/learnosity_toolkit/whitenoise/wind.mp3',\n thunder: 'https://assets.learnosity.com/learnosity_toolkit/whitenoise/thunder.mp3',\n campfire: 'https://assets.learnosity.com/learnosity_toolkit/whitenoise/campfire.mp3',\n rain: 'https://assets.learnosity.com/learnosity_toolkit/whitenoise/rain.mp3',\n },\n renderedCss: false,\n};\n\n/**\n * Sets up the white noise audio player.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.whiteNoise.run();\n * @since 2.7.0\n */\nfunction run() {\n if (!state.renderedCss) injectCSS();\n\n // Listener for an Items API custom button\n _core_app__WEBPACK_IMPORTED_MODULE_0__.assessApp().on('button:btn-whitenoise:clicked', () => {\n launchPlayer();\n });\n}\n\n/**\n * Launches the white noise audio player. Defaults to rendering inside an\n * Items API custom dialog, in which case you never need to call this\n * method directly.\n *\n * Call and pass an id to render the player inside a custom host page element.\n * @param {string=} id Optional id of an element to render the player into\n * @since 2.7.0\n */\nfunction launchPlayer(id) {\n const content = playerTemplate();\n\n if (id) {\n const customWrapper = document.getElementById(id);\n if (customWrapper) {\n customWrapper.innerHTML = content;\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].error(`Element id '${id}' not found, cound not render player.`);\n return;\n }\n } else {\n _core_player__WEBPACK_IMPORTED_MODULE_1__.dialog({\n header: 'White noise player',\n body: content,\n buttons: [\n {\n button_id: 'dialog_btn_whitenoise_player',\n label: 'Close',\n is_primary: false,\n },\n ],\n });\n }\n\n setTimeout(() => {\n const elSounds = document.querySelectorAll('.lt__controls-sound');\n const elVolume = document.getElementById('ld-volume');\n\n elSounds.forEach(el => {\n el.addEventListener('keydown', event => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n el.click();\n }\n });\n el.addEventListener('click', event => {\n event.preventDefault();\n actionTriggered(el);\n });\n });\n\n if (state.player.sound) setSoundsClass(state.player.sound);\n\n elVolume.value = state.player.volume || 1.0;\n volume();\n\n elVolume.addEventListener('input', () => {\n volume();\n });\n }, 500);\n\n // Setup logic to close the dialog\n _core_app__WEBPACK_IMPORTED_MODULE_0__.assessApp().on('button:dialog_btn_whitenoise_player:clicked', () => {\n _core_player__WEBPACK_IMPORTED_MODULE_1__.hideDialog();\n });\n}\n\n/**\n * Detects which sound icon was clicked and whether\n * to play or stop the audio.\n * @param {object} el\n * @since 2.7.0\n * @ignore\n */\nfunction actionTriggered(el) {\n const sound = el.getAttribute('data-lt-sound');\n const targetSound = document.querySelector(`[data-lt-sound=\"${sound}\"]`);\n\n if (state.player.sound) stop(state.player.sound);\n\n if (targetSound.classList.contains('lt__sound-active')) {\n stop(sound);\n } else {\n if (!state.player.instances[sound]) {\n initPlayer(sound);\n }\n state.player.sound = sound;\n play(sound);\n }\n\n setSoundsClass(sound);\n}\n\n/**\n * Initialises a Howl instance with the mp3 URI.\n * @param {string} sound\n * @since 2.7.0\n * @ignore\n */\nfunction initPlayer(sound) {\n state.player.instances[sound] = new howler__WEBPACK_IMPORTED_MODULE_3__.Howl({\n src: [state.playlist[sound]],\n html5: true,\n loop: true,\n });\n}\n\n/**\n * Starts to play a Howl instance.\n * @param {string} sound\n * @since 2.7.0\n * @ignore\n */\nfunction play(sound) {\n state.player.instances[sound].play();\n}\n\n/**\n * Stops playing a Howl instance.\n * @param {string} sound\n * @since 2.7.0\n * @ignore\n */\nfunction stop(sound) {\n state.player.instances[sound].stop();\n}\n\n/**\n * Adjusts the player volume.\n * @since 2.7.0\n * @ignore\n */\nfunction volume() {\n const elVolume = document.getElementById('ld-volume');\n const elVolumeValue = document.getElementById('ld-volume-value');\n const currentVolume = elVolume.value;\n\n state.player.volume = currentVolume;\n howler__WEBPACK_IMPORTED_MODULE_3__.Howler.volume(currentVolume);\n elVolumeValue.innerHTML = currentVolume * 100;\n}\n\n/**\n * Sets the active state on the current sound button.\n * @since 2.7.0\n * @ignore\n */\nfunction setSoundsClass(activeSound) {\n const elSounds = document.querySelectorAll('.lt__controls-sound');\n\n elSounds.forEach(el => {\n if (el.getAttribute('data-lt-sound') === activeSound && !el.classList.contains('lt__sound-active')) {\n el.classList.add('lt__sound-active');\n el.focus();\n el.setAttribute('aria-pressed', 'true');\n } else {\n el.classList.remove('lt__sound-active');\n el.setAttribute('aria-pressed', 'false');\n }\n });\n}\n\n/**\n * The HTML used to render the player.\n * @since 2.7.0\n * @ignore\n */\nfunction playerTemplate() {\n return `
\n
\n

Choose a sound from the list below. Click to play or pause, use the slider at the bottom to control the volume level.

\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n
\n
\n
\n \n \n \n \n
\n
\n
`;\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 2.7.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity white noise player styles */\n:root {\n --lt-border: #888888;\n --lt-border-radius: 10px;\n --lt-color: #333333;\n}\n\n.lt__player {\n background-color: #fff;\n width: 100%;\n max-width: 30rem;\n border: 1px solid #dddddd;\n border-radius: var(--lt-border-radius);\n padding: 1rem;\n filter: drop-shadow(4px 5px 7px #8d8d8d);\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: var(--lt-color);\n margin: 0 auto;\n}\n.lt__player svg {\n width: 60px;\n height: 60px;\n}\n.lt__meta ul {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n list-style: none;\n text-align: center;\n margin: 0;\n padding: 0;\n}\n.lt__meta ul li {\n box-sizing: border-box;\n border-radius: var(--lt-border-radius);\n border: 1px solid var(--lt-border);\n margin: 0.3rem;\n\n &:hover {\n background-color: #f2f4f5;\n }\n}\n.lt__meta ul li button {\n display: block;\n text-decoration: none;\n border-radius: inherit;\n width: 100%;\n border: none;\n background: none;\n\n &:hover,\n &:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n background-color: #f2f4f5;\n }\n\n &:active {\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n }\n}\n.lt__meta ul li button.lt__sound-active {\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n background: #efefef;\n}\n.lt__meta ul li svg {\n padding: 1rem 1rem 0.3rem 1rem;\n vertical-align: middle;\n}\n.lt__control-wrapper svg {\n width: 30px;\n}\n.lt__control-wrapper svg:last-child {\n position: relative;\n left: 15px;\n}\n.lt__sound-label {\n display: block;\n padding-bottom: 0.7rem;\n}\n.lt__toolbar {\n margin-top: 0.5rem;\n text-align: center;\n}\n.lt__control-wrapper label {\n text-align: center;\n padding-bottom: 0;\n margin-bottom: 0;\n display: block;\n position: relative;\n top: 10px;\n}\n.lt__control-wrapper button {\n background: none;\n border: none;\n cursor: pointer;\n}\ninput[type=\"range\"] {\n -webkit-appearance: none;\n appearance: none;\n background: transparent;\n cursor: pointer;\n width: 15rem;\n}\n/* Removes default focus */\ninput[type=\"range\"]:focus {\n outline: none;\n}\ninput[type=\"range\"]::-webkit-slider-runnable-track {\n background-color: #01243d;\n border-radius: 0.5rem;\n height: 0.5rem;\n}\ninput[type=\"range\"]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n margin-top: -12px;\n background-color: #fff;\n border: 2px solid #01243d;\n height: 2rem;\n width: 1rem;\n}\ninput[type=\"range\"]:focus::-webkit-slider-thumb {\n border: 1px solid #01243d;\n outline: 3px solid #01243d;\n outline-offset: 0.125rem;\n}\ninput[type=\"range\"]::-moz-range-track {\n background-color: #01243d;\n border-radius: 0.5rem;\n height: 0.5rem;\n}\ninput[type=\"range\"]::-moz-range-thumb {\n border: none;\n border-radius: 0;\n border: 1px solid #01243d;\n background-color: #fff;\n height: 2rem;\n width: 1rem;\n}\ninput[type=\"range\"]:focus::-moz-range-thumb {\n border: 1px solid #01243d;\n outline: 3px solid #01243d;\n outline-offset: 0.125rem;\n}\n\n@media (max-width: 400px) {\n .lt__meta ul {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n }\n input[type=\"range\"] {\n width: 10rem;\n }\n}\n\n.lt__whitenoise-player-icon::before {\n content: url('data:image/svg+xml,');\n width: 16px;\n color: var(--lt-color);\n margin-top: 0;\n font-size: 16px;\n -webkit-transition: color .2s;\n transition: color .2s;\n -webkit-font-smoothing: antialiased;\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvd2hpdGVOb2lzZS9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQTRDO0FBQ007QUFDRDtBQUNYOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDTztBQUNQOztBQUVBO0FBQ0EsSUFBSSxnREFBYTtBQUNqQjtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsWUFBWSxxREFBTSxzQkFBc0IsR0FBRztBQUMzQztBQUNBO0FBQ0EsTUFBTTtBQUNOLFFBQVEsZ0RBQWE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUzs7QUFFVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDtBQUNBLElBQUksZ0RBQWE7QUFDakIsUUFBUSxvREFBaUI7QUFDekIsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLE1BQU07O0FBRXhFOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qyx3Q0FBSTtBQUM1QztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSSwwQ0FBTTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvZXh0ZW5zaW9ucy9hY2Nlc3NpYmlsaXR5L3V4L3doaXRlTm9pc2UvaW5kZXguanM/ZWQ0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9hcHAnO1xuaW1wb3J0ICogYXMgcGxheWVyIGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcGxheWVyJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IEhvd2wsIEhvd2xlciB9IGZyb20gJ2hvd2xlcic7XG5cbi8qKlxuICogRXh0ZW5zaW9ucyBhZGQgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0byBJdGVtcyBBUEkuXG4gKiBUaGV5IHJlbHkgb24gbW9kdWxlcyB3aXRoaW4gTFQgYmVpbmcgYXZhaWxhYmxlLlxuICpcbiAqIC0tXG4gKlxuICogUmVuZGVycyBhbiBhdWRpbyBwbGF5ZXIgdGhhdCB0aGUgZW5kLXVzZXIgY2FuIHVzZVxuICogdG8gcGxheSB3aGl0ZSBub2lzZSBzb3VuZHMuIEhlbHBzIGZvciBzb21lIHVzZXJzXG4gKiB3aXRoIGZvY3VzIGFuZCBjb25jZW50cmF0aW9uLlxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIHBsYXllciByZW5kZXJzIGluc2lkZSBhIGN1c3RvbSBkaWFsb2dcbiAqIGZyb20gSXRlbXMgQVBJLiBUaGlzIGlzIHRoZSBzaW1wbGVzdCBzZXQgdXAsIGp1c3QgY2FsbFxuICogYHJ1bigpYCBhbmQgYWRkIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgdG8geW91clxuICogSXRlbXMgQVBJIGNvbmZpZyBvYmplY3QgKHRoZSBlc3NlbnRpYWwgcGllY2UgaXMgdGhlXG4gKiBjdXN0b20gYnV0dG9uKTpcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAgICBcImNvbmZpZ1wiOiB7XG4gKiAgICAgICAgIFwicmVnaW9uc1wiOiBcIm1haW5cIixcbiAqICAgICAgICAgXCJyZWdpb25fb3ZlcnJpZGVzXCI6IHtcbiAqICAgICAgICAgICAgIFwicmlnaHRcIjogW1xuICogICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2F2ZV9idXR0b25cIlxuICogICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJmdWxsc2NyZWVuX2J1dHRvblwiXG4gKiAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInJldmlld3NjcmVlbl9idXR0b25cIlxuICogICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJhY2Nlc3NpYmlsaXR5X2J1dHRvblwiXG4gKiAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImZsYWdpdGVtX2J1dHRvblwiXG4gKiAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImN1c3RvbV9idXR0b25cIixcbiAqICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25zXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImJ0bi13aGl0ZW5vaXNlXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiV2hpdGUgbm9pc2UgcGxheWVyXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcImljb25fY2xhc3NcIjogXCJsdF9fd2hpdGVub2lzZS1wbGF5ZXItaWNvblwiXG4gKiAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibWFza2luZ19idXR0b25cIlxuICogICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgIF1cbiAqICAgICAgICAgfVxuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoaXMgd2lsbCByZW5kZXIgYSBidXR0b24gaW4gdGhlIHZlcnRpY2FsIHRvb2xiYXIgb2YgdGhlIHBsYXllciB3aXRoIGEgaGVhZHBob25lc1xuICogaWNvbi4gQ2xpY2sgdGhpcyBhbmQgdGhlIHBsYXllciB3aWxsIGxhdW5jaCAoc2VlIGJlbG93KS5cbiAqXG4gKiA8cD48aW1nIHNyYz1cImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taWNoYWVsc2hhcm1hbi9MVC9tYWluL3NyYy9hc3NldHMvaW1hZ2VzL3doaXRlbm9pc2UuZ2lmXCIgYWx0PVwiXCIgd2lkdGg9XCI5MDBcIj48L3A+XG4gKlxuICogSWYgeW91IHdhbnQgdG8gcmVuZGVyIHRoZSBwbGF5ZXIgaW5zaWRlIGEgY3VzdG9tIGVsZW1lbnQsIHBhc3MgYW4gYGlkYCB0b1xuICogYGxhdW5jaFBsYXllcihpZClgIGFmdGVyIGNhbGxpbmcgYHJ1bigpYC4gVGhpcyB3aWxsIHJlbmRlciB0aGUgcGxheWVyXG4gKiBpbnNpZGUgYW4gZWxlbWVudCBvZiB5b3VyIGNob2ljZS4gWW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHNob3dpbmcvaGlkaW5nXG4gKiB0aGUgcGxheWVyLCBvciBqdXN0IGxlYXZlIGl0IGFsd2F5cyB2aXNpYmxlLlxuICpcbiAqIGBgYFxuICogPGRpdiBpZD1cInBsYXllci13cmFwcGVyXCI+PC9kaXY+XG4gKiA8ZGl2IGlkPVwibGVhcm5vc2l0eV9hc3Nlc3NcIj48L2Rpdj5cbiAqXG4gKiA8c2NyaXB0PlxuICogICBMVC5pbml0KGFwcCk7XG4gKiAgIExULmV4dGVuc2lvbnMud2hpdGVOb2lzZS5ydW4oKTtcbiAqXG4gKiAgIC8vIFRyaWdnZXIgdGhpcyBvbiBhIGNsaWNrIGV2ZW50IG9yIGFueXRoaW5nIGRlZmluaW5nIHdoZW5cbiAqICAgLy8geW91IHdhbnQgdG8gbG9hZCB0aGUgd2hpdGUgbm9pc2UgcGxheWVyXG4gKiAgIExULmV4dGVuc2lvbnMud2hpdGVOb2lzZS5sYXVuY2hQbGF5ZXIoJ3BsYXllci13cmFwcGVyJyk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICogQG1vZHVsZSBFeHRlbnNpb25zL0Fzc2Vzc21lbnQvd2hpdGVOb2lzZVxuICovXG5cbmNvbnN0IHN0YXRlID0ge1xuICAgIHBsYXllcjoge1xuICAgICAgICBpbnN0YW5jZXM6IHtcbiAgICAgICAgICAgIGJlYWNoOiBudWxsLFxuICAgICAgICAgICAgYmlyZHM6IG51bGwsXG4gICAgICAgICAgICB3aW5kOiBudWxsLFxuICAgICAgICAgICAgdGh1bmRlcjogbnVsbCxcbiAgICAgICAgICAgIGNhbXBmaXJlOiBudWxsLFxuICAgICAgICAgICAgcmFpbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgc291bmQ6IG51bGwsXG4gICAgICAgIHZvbHVtZTogbnVsbCxcbiAgICB9LFxuICAgIHBsYXlsaXN0OiB7XG4gICAgICAgIGJlYWNoOiAnaHR0cHM6Ly9hc3NldHMubGVhcm5vc2l0eS5jb20vbGVhcm5vc2l0eV90b29sa2l0L3doaXRlbm9pc2UvYmVhY2gubXAzJyxcbiAgICAgICAgYmlyZHM6ICdodHRwczovL2Fzc2V0cy5sZWFybm9zaXR5LmNvbS9sZWFybm9zaXR5X3Rvb2xraXQvd2hpdGVub2lzZS9iaXJkcy5tcDMnLFxuICAgICAgICB3aW5kOiAnaHR0cHM6Ly9hc3NldHMubGVhcm5vc2l0eS5jb20vbGVhcm5vc2l0eV90b29sa2l0L3doaXRlbm9pc2Uvd2luZC5tcDMnLFxuICAgICAgICB0aHVuZGVyOiAnaHR0cHM6Ly9hc3NldHMubGVhcm5vc2l0eS5jb20vbGVhcm5vc2l0eV90b29sa2l0L3doaXRlbm9pc2UvdGh1bmRlci5tcDMnLFxuICAgICAgICBjYW1wZmlyZTogJ2h0dHBzOi8vYXNzZXRzLmxlYXJub3NpdHkuY29tL2xlYXJub3NpdHlfdG9vbGtpdC93aGl0ZW5vaXNlL2NhbXBmaXJlLm1wMycsXG4gICAgICAgIHJhaW46ICdodHRwczovL2Fzc2V0cy5sZWFybm9zaXR5LmNvbS9sZWFybm9zaXR5X3Rvb2xraXQvd2hpdGVub2lzZS9yYWluLm1wMycsXG4gICAgfSxcbiAgICByZW5kZXJlZENzczogZmFsc2UsXG59O1xuXG4vKipcbiAqIFNldHMgdXAgdGhlIHdoaXRlIG5vaXNlIGF1ZGlvIHBsYXllci5cbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBMVCB9IGZyb20gJ0BjYXNwaW5ndXMvbHQvc3JjL2Fzc2Vzc21lbnQvaW5kZXgnO1xuICpcbiAqIExULmluaXQoaXRlbXNBcHApOyAvLyBTZXQgdXAgTFQgd2l0aCB0aGUgSXRlbXMgQVBJIGFwcGxpY2F0aW9uIGluc3RhbmNlIHZhcmlhYmxlXG4gKiBMVC5leHRlbnNpb25zLndoaXRlTm9pc2UucnVuKCk7XG4gKiBAc2luY2UgMi43LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICBpZiAoIXN0YXRlLnJlbmRlcmVkQ3NzKSBpbmplY3RDU1MoKTtcblxuICAgIC8vIExpc3RlbmVyIGZvciBhbiBJdGVtcyBBUEkgY3VzdG9tIGJ1dHRvblxuICAgIGFwcC5hc3Nlc3NBcHAoKS5vbignYnV0dG9uOmJ0bi13aGl0ZW5vaXNlOmNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICAgIGxhdW5jaFBsYXllcigpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIExhdW5jaGVzIHRoZSB3aGl0ZSBub2lzZSBhdWRpbyBwbGF5ZXIuIERlZmF1bHRzIHRvIHJlbmRlcmluZyBpbnNpZGUgYW5cbiAqIEl0ZW1zIEFQSSBjdXN0b20gZGlhbG9nLCBpbiB3aGljaCBjYXNlIHlvdSBuZXZlciBuZWVkIHRvIGNhbGwgdGhpc1xuICogbWV0aG9kIGRpcmVjdGx5LlxuICpcbiAqIENhbGwgYW5kIHBhc3MgYW4gaWQgdG8gcmVuZGVyIHRoZSBwbGF5ZXIgaW5zaWRlIGEgY3VzdG9tIGhvc3QgcGFnZSBlbGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmc9fSBpZCBPcHRpb25hbCBpZCBvZiBhbiBlbGVtZW50IHRvIHJlbmRlciB0aGUgcGxheWVyIGludG9cbiAqIEBzaW5jZSAyLjcuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF1bmNoUGxheWVyKGlkKSB7XG4gICAgY29uc3QgY29udGVudCA9IHBsYXllclRlbXBsYXRlKCk7XG5cbiAgICBpZiAoaWQpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tV3JhcHBlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgaWYgKGN1c3RvbVdyYXBwZXIpIHtcbiAgICAgICAgICAgIGN1c3RvbVdyYXBwZXIuaW5uZXJIVE1MID0gY29udGVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgRWxlbWVudCBpZCAnJHtpZH0nIG5vdCBmb3VuZCwgY291bmQgbm90IHJlbmRlciBwbGF5ZXIuYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwbGF5ZXIuZGlhbG9nKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ1doaXRlIG5vaXNlIHBsYXllcicsXG4gICAgICAgICAgICBib2R5OiBjb250ZW50LFxuICAgICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uX2lkOiAnZGlhbG9nX2J0bl93aGl0ZW5vaXNlX3BsYXllcicsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2xvc2UnLFxuICAgICAgICAgICAgICAgICAgICBpc19wcmltYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsU291bmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmx0X19jb250cm9scy1zb3VuZCcpO1xuICAgICAgICBjb25zdCBlbFZvbHVtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZC12b2x1bWUnKTtcblxuICAgICAgICBlbFNvdW5kcy5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyAnIHx8IGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBlbC5jbGljaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBhY3Rpb25UcmlnZ2VyZWQoZWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdGF0ZS5wbGF5ZXIuc291bmQpIHNldFNvdW5kc0NsYXNzKHN0YXRlLnBsYXllci5zb3VuZCk7XG5cbiAgICAgICAgZWxWb2x1bWUudmFsdWUgPSBzdGF0ZS5wbGF5ZXIudm9sdW1lIHx8IDEuMDtcbiAgICAgICAgdm9sdW1lKCk7XG5cbiAgICAgICAgZWxWb2x1bWUuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB2b2x1bWUoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgNTAwKTtcblxuICAgIC8vIFNldHVwIGxvZ2ljIHRvIGNsb3NlIHRoZSBkaWFsb2dcbiAgICBhcHAuYXNzZXNzQXBwKCkub24oJ2J1dHRvbjpkaWFsb2dfYnRuX3doaXRlbm9pc2VfcGxheWVyOmNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICAgIHBsYXllci5oaWRlRGlhbG9nKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGljaCBzb3VuZCBpY29uIHdhcyBjbGlja2VkIGFuZCB3aGV0aGVyXG4gKiB0byBwbGF5IG9yIHN0b3AgdGhlIGF1ZGlvLlxuICogQHBhcmFtIHtvYmplY3R9IGVsXG4gKiBAc2luY2UgMi43LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gYWN0aW9uVHJpZ2dlcmVkKGVsKSB7XG4gICAgY29uc3Qgc291bmQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbHQtc291bmQnKTtcbiAgICBjb25zdCB0YXJnZXRTb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWx0LXNvdW5kPVwiJHtzb3VuZH1cIl1gKTtcblxuICAgIGlmIChzdGF0ZS5wbGF5ZXIuc291bmQpIHN0b3Aoc3RhdGUucGxheWVyLnNvdW5kKTtcblxuICAgIGlmICh0YXJnZXRTb3VuZC5jbGFzc0xpc3QuY29udGFpbnMoJ2x0X19zb3VuZC1hY3RpdmUnKSkge1xuICAgICAgICBzdG9wKHNvdW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXN0YXRlLnBsYXllci5pbnN0YW5jZXNbc291bmRdKSB7XG4gICAgICAgICAgICBpbml0UGxheWVyKHNvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5wbGF5ZXIuc291bmQgPSBzb3VuZDtcbiAgICAgICAgcGxheShzb3VuZCk7XG4gICAgfVxuXG4gICAgc2V0U291bmRzQ2xhc3Moc291bmQpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpc2VzIGEgSG93bCBpbnN0YW5jZSB3aXRoIHRoZSBtcDMgVVJJLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdW5kXG4gKiBAc2luY2UgMi43LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gaW5pdFBsYXllcihzb3VuZCkge1xuICAgIHN0YXRlLnBsYXllci5pbnN0YW5jZXNbc291bmRdID0gbmV3IEhvd2woe1xuICAgICAgICBzcmM6IFtzdGF0ZS5wbGF5bGlzdFtzb3VuZF1dLFxuICAgICAgICBodG1sNTogdHJ1ZSxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydHMgdG8gcGxheSBhIEhvd2wgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291bmRcbiAqIEBzaW5jZSAyLjcuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBwbGF5KHNvdW5kKSB7XG4gICAgc3RhdGUucGxheWVyLmluc3RhbmNlc1tzb3VuZF0ucGxheSgpO1xufVxuXG4vKipcbiAqIFN0b3BzIHBsYXlpbmcgYSBIb3dsIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdW5kXG4gKiBAc2luY2UgMi43LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc3RvcChzb3VuZCkge1xuICAgIHN0YXRlLnBsYXllci5pbnN0YW5jZXNbc291bmRdLnN0b3AoKTtcbn1cblxuLyoqXG4gKiBBZGp1c3RzIHRoZSBwbGF5ZXIgdm9sdW1lLlxuICogQHNpbmNlIDIuNy4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHZvbHVtZSgpIHtcbiAgICBjb25zdCBlbFZvbHVtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZC12b2x1bWUnKTtcbiAgICBjb25zdCBlbFZvbHVtZVZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xkLXZvbHVtZS12YWx1ZScpO1xuICAgIGNvbnN0IGN1cnJlbnRWb2x1bWUgPSBlbFZvbHVtZS52YWx1ZTtcblxuICAgIHN0YXRlLnBsYXllci52b2x1bWUgPSBjdXJyZW50Vm9sdW1lO1xuICAgIEhvd2xlci52b2x1bWUoY3VycmVudFZvbHVtZSk7XG4gICAgZWxWb2x1bWVWYWx1ZS5pbm5lckhUTUwgPSBjdXJyZW50Vm9sdW1lICogMTAwO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvbiB0aGUgY3VycmVudCBzb3VuZCBidXR0b24uXG4gKiBAc2luY2UgMi43LjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0U291bmRzQ2xhc3MoYWN0aXZlU291bmQpIHtcbiAgICBjb25zdCBlbFNvdW5kcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sdF9fY29udHJvbHMtc291bmQnKTtcblxuICAgIGVsU291bmRzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWx0LXNvdW5kJykgPT09IGFjdGl2ZVNvdW5kICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2x0X19zb3VuZC1hY3RpdmUnKSkge1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnbHRfX3NvdW5kLWFjdGl2ZScpO1xuICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2x0X19zb3VuZC1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgSFRNTCB1c2VkIHRvIHJlbmRlciB0aGUgcGxheWVyLlxuICogQHNpbmNlIDIuNy4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHBsYXllclRlbXBsYXRlKCkge1xuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImx0X19wbGF5ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibHRfX21ldGFcIj5cbiAgICAgICAgPHAgaWQ9XCJsdF9fcGxheWVyLWluc3RydWN0aW9uc1wiIGNsYXNzPVwic3Itb25seVwiPkNob29zZSBhIHNvdW5kIGZyb20gdGhlIGxpc3QgYmVsb3cuIENsaWNrIHRvIHBsYXkgb3IgcGF1c2UsIHVzZSB0aGUgc2xpZGVyIGF0IHRoZSBib3R0b20gdG8gY29udHJvbCB0aGUgdm9sdW1lIGxldmVsLjwvcD5cbiAgICAgICAgPHVsIGFyaWEtbGFiZWxsZWRieT1cImx0X19wbGF5ZXItaW5zdHJ1Y3Rpb25zXCI+XG4gICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImx0X19jb250cm9scy1zb3VuZFwiIGRhdGEtbHQtc291bmQ9XCJiZWFjaFwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCIgYXJpYS1sYWJlbD1cIkNsaWNrIHRvIHBsYXkgb3IgcGF1c2UgYmVhY2ggc291bmRzXCI+PHN2ZyByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIkJlYWNoXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTc2IDUxMlwiPjxwYXRoIGQ9XCJNMzQ2LjMgMjcxLjhsLTYwLjEtMjEuOUwyMTQgNDQ4SDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMySDU0NGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkgyODIuMWw2NC4xLTE3Ni4yem0xMjEuMS0uMmwtMy4zIDkuMSA2Ny43IDI0LjZjMTguMSA2LjYgMzgtNC4yIDM5LjYtMjMuNGM2LjUtNzguNS0yMy45LTE1NS41LTgwLjgtMjA4LjVjMiA4IDMuMiAxNi4zIDMuNCAyNC44bC4yIDZjMS44IDU3LTcuMyAxMTMuOC0yNi44IDE2Ny40ek00NjIgOTkuMWMtMS4xLTM0LjQtMjIuNS02NC44LTU0LjQtNzcuNGMtLjktLjQtMS45LS43LTIuOC0xLjFjLTMzLTExLjctNjkuOC0yLjQtOTMuMSAyMy44bC00IDQuNUMyNzIuNCA4OC4zIDI0NSAxMzQuMiAyMjYuOCAxODRsLTMuMyA5LjFMNDM0IDI2OS43bDMuMy05LjFjMTguMS00OS44IDI2LjYtMTAyLjUgMjQuOS0xNTUuNWwtLjItNnpNMTA3LjIgMTEyLjljLTExLjEgMTUuNy0yLjggMzYuOCAxNS4zIDQzLjRsNzEgMjUuOCAzLjMtOS4xYzE5LjUtNTMuNiA0OS4xLTEwMyA4Ny4xLTE0NS41bDQtNC41YzYuMi02LjkgMTMuMS0xMyAyMC41LTE4LjJjLTc5LjYgMi41LTE1NC43IDQyLjItMjAxLjIgMTA4elwiIC8+PC9zdmc+PHNwYW4gY2xhc3M9XCJsdF9fc291bmQtbGFiZWxcIj5CZWFjaDwvc3Bhbj48L2J1dHRvbj48L2xpPlxuICAgICAgICAgICAgPGxpPjxidXR0b24gY2xhc3M9XCJsdF9fY29udHJvbHMtc291bmRcIiBkYXRhLWx0LXNvdW5kPVwiYmlyZHNcIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJDbGljayB0byBwbGF5IG9yIHBhdXNlIGJpcmRzIHNvdW5kc1wiPjxzdmcgcm9sZT1cImltZ1wiIGFyaWEtbGFiZWw9XCJCaXJkc1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIj48cGF0aCBkPVwiTTE2MC44IDk2LjVjMTQgMTcgMzEgMzAuOSA0OS41IDQyLjJjMjUuOSAxNS44IDUzLjcgMjUuOSA3Ny43IDMxLjZWMTM4LjhDMjY1LjggMTA4LjUgMjUwIDcxLjUgMjQ4LjYgMjhjLS40LTExLjMtNy41LTIxLjUtMTguNC0yNC40Yy03LjYtMi0xNS44LS4yLTIxIDUuOGMtMTMuMyAxNS40LTMyLjcgNDQuNi00OC40IDg3LjJ6TTMyMCAxNDR2MzAuNmwwIDB2MS4zbDAgMCAwIDMyLjFjLTYwLjgtNS4xLTE4NS00My44LTIxOS4zLTE1Ny4yQzk3LjQgNDAgODcuOSAzMiA3Ni42IDMyYy03LjkgMC0xNS4zIDMuOS0xOC44IDExQzQ2LjggNjUuOSAzMiAxMTIuMSAzMiAxNzZjMCAxMTYuOSA4MC4xIDE4MC41IDExOC40IDIwMi44TDExLjggNDE2LjZDNi43IDQxOCAyLjYgNDIxLjggLjkgNDI2LjhzLS44IDEwLjYgMi4zIDE0LjhDMjEuNyA0NjYuMiA3Ny4zIDUxMiAxNjAgNTEyYzMuNiAwIDcuMi0xLjIgMTAtMy41TDI0NS42IDQ0OEgzMjBjODguNCAwIDE2MC03MS42IDE2MC0xNjBWMTI4bDI5LjktNDQuOWMxLjMtMiAyLjEtNC40IDIuMS02LjhjMC02LjgtNS41LTEyLjMtMTIuMy0xMi4zSDQwMGMtNDQuMiAwLTgwIDM1LjgtODAgODB6bTgwLTE2YTE2IDE2IDAgMSAxIDAgMzIgMTYgMTYgMCAxIDEgMC0zMnpcIiAvPjwvc3ZnPjxzcGFuIGNsYXNzPVwibHRfX3NvdW5kLWxhYmVsXCI+QmlyZHM8L3NwYW4+PC9idXR0b24+PC9saT5cbiAgICAgICAgICAgIDxsaT48YnV0dG9uIGNsYXNzPVwibHRfX2NvbnRyb2xzLXNvdW5kXCIgZGF0YS1sdC1zb3VuZD1cImNhbXBmaXJlXCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiQ2xpY2sgdG8gcGxheSBvciBwYXVzZSBjYW1wZmlyZSBzb3VuZHNcIj48c3ZnIHJvbGU9XCJpbWdcIiBhcmlhLWxhYmVsPVwiQ2FtcGZpcmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA0NDggNTEyXCI+PHBhdGggZD1cIk0xNTkuMyA1LjRjNy44LTcuMyAxOS45LTcuMiAyNy43IC4xYzI3LjYgMjUuOSA1My41IDUzLjggNzcuNyA4NGMxMS0xNC40IDIzLjUtMzAuMSAzNy00Mi45YzcuOS03LjQgMjAuMS03LjQgMjggLjFjMzQuNiAzMyA2My45IDc2LjYgODQuNSAxMThjMjAuMyA0MC44IDMzLjggODIuNSAzMy44IDExMS45QzQ0OCA0MDQuMiAzNDguMiA1MTIgMjI0IDUxMkM5OC40IDUxMiAwIDQwNC4xIDAgMjc2LjVjMC0zOC40IDE3LjgtODUuMyA0NS40LTEzMS43QzczLjMgOTcuNyAxMTIuNyA0OC42IDE1OS4zIDUuNHpNMjI1LjcgNDE2YzI1LjMgMCA0Ny43LTcgNjguOC0yMWM0Mi4xLTI5LjQgNTMuNC04OC4yIDI4LjEtMTM0LjRjLTQuNS05LTE2LTkuNi0yMi41LTJsLTI1LjIgMjkuM2MtNi42IDcuNi0xOC41IDcuNC0yNC43LS41Yy0xNi41LTIxLTQ2LTU4LjUtNjIuOC03OS44Yy02LjMtOC0xOC4zLTguMS0yNC43LS4xYy0zMy44IDQyLjUtNTAuOCA2OS4zLTUwLjggOTkuNEMxMTIgMzc1LjQgMTYyLjYgNDE2IDIyNS43IDQxNnpcIiAvPjwvc3ZnPjxzcGFuIGNsYXNzPVwibHRfX3NvdW5kLWxhYmVsXCI+Q2FtcGZpcmU8L3NwYW4+PC9idXR0b24+PC9saT5cbiAgICAgICAgICAgIDxsaT48YnV0dG9uIGNsYXNzPVwibHRfX2NvbnRyb2xzLXNvdW5kXCIgZGF0YS1sdC1zb3VuZD1cInJhaW5cIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJDbGljayB0byBwbGF5IG9yIHBhdXNlIHJhaW4gc291bmRzXCI+PHN2ZyByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIlJhaW5cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+PHBhdGggZD1cIk05NiAzMjBjLTUzIDAtOTYtNDMtOTYtOTZjMC00Mi41IDI3LjYtNzguNiA2NS45LTkxLjJDNjQuNyAxMjYuMSA2NCAxMTkuMSA2NCAxMTJDNjQgNTAuMSAxMTQuMSAwIDE3NiAwYzQzLjEgMCA4MC41IDI0LjMgOTkuMiA2MGMxNC43LTE3LjEgMzYuNS0yOCA2MC44LTI4YzQ0LjIgMCA4MCAzNS44IDgwIDgwYzAgNS41LS42IDEwLjgtMS42IDE2Yy41IDAgMS4xIDAgMS42IDBjNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZIOTZ6bS02LjggNTJjMS4zLTIuNSAzLjktNCA2LjgtNHM1LjQgMS41IDYuOCA0bDM1LjEgNjQuNmM0LjEgNy41IDYuMiAxNS44IDYuMiAyNC4zdjNjMCAyNi41LTIxLjUgNDgtNDggNDhzLTQ4LTIxLjUtNDgtNDh2LTNjMC04LjUgMi4xLTE2LjkgNi4yLTI0LjNMODkuMiAzNzJ6bTE2MCAwYzEuMy0yLjUgMy45LTQgNi44LTRzNS40IDEuNSA2LjggNGwzNS4xIDY0LjZjNC4xIDcuNSA2LjIgMTUuOCA2LjIgMjQuM3YzYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4cy00OC0yMS41LTQ4LTQ4di0zYzAtOC41IDIuMS0xNi45IDYuMi0yNC4zTDI0OS4yIDM3MnptMTI0LjkgNjQuNkw0MDkuMiAzNzJjMS4zLTIuNSAzLjktNCA2LjgtNHM1LjQgMS41IDYuOCA0bDM1LjEgNjQuNmM0LjEgNy41IDYuMiAxNS44IDYuMiAyNC4zdjNjMCAyNi41LTIxLjUgNDgtNDggNDhzLTQ4LTIxLjUtNDgtNDh2LTNjMC04LjUgMi4xLTE2LjkgNi4yLTI0LjN6XCIgLz48L3N2Zz48c3BhbiBjbGFzcz1cImx0X19zb3VuZC1sYWJlbFwiPlJhaW48L3NwYW4+PC9idXR0b24+PC9saT5cbiAgICAgICAgICAgIDxsaT48YnV0dG9uIGNsYXNzPVwibHRfX2NvbnRyb2xzLXNvdW5kXCIgZGF0YS1sdC1zb3VuZD1cInRodW5kZXJcIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJDbGljayB0byBwbGF5IG9yIHBhdXNlIHRodW5kZXIgc291bmRzXCI+PHN2ZyByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIlRodW5kZXJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+PHBhdGggZD1cIk0wIDIyNGMwIDUzIDQzIDk2IDk2IDk2aDQ3LjJMMjkwIDIwMi41YzE3LjYtMTQuMSA0Mi42LTE0IDYwLjIgLjJzMjIuOCAzOC42IDEyLjggNTguOEwzMzMuNyAzMjBIMzUyaDY0YzUzIDAgOTYtNDMgOTYtOTZzLTQzLTk2LTk2LTk2Yy0uNSAwLTEuMSAwLTEuNiAwYzEuMS01LjIgMS42LTEwLjUgMS42LTE2YzAtNDQuMi0zNS44LTgwLTgwLTgwYy0yNC4zIDAtNDYuMSAxMC45LTYwLjggMjhDMjU2LjUgMjQuMyAyMTkuMSAwIDE3NiAwQzExNC4xIDAgNjQgNTAuMSA2NCAxMTJjMCA3LjEgLjcgMTQuMSAxLjkgMjAuOEMyNy42IDE0NS40IDAgMTgxLjUgMCAyMjR6bTMzMC4xIDMuNmMtNS44LTQuNy0xNC4yLTQuNy0yMC4xLS4xbC0xNjAgMTI4Yy01LjMgNC4yLTcuNCAxMS40LTUuMSAxNy44czguMyAxMC43IDE1LjEgMTAuN2g3MC4xTDE3Ny43IDQ4OC44Yy0zLjQgNi43LTEuNiAxNC45IDQuMyAxOS42czE0LjIgNC43IDIwLjEgLjFsMTYwLTEyOGM1LjMtNC4yIDcuNC0xMS40IDUuMS0xNy44cy04LjMtMTAuNy0xNS4xLTEwLjdIMjgxLjlsNTIuNC0xMDQuOGMzLjQtNi43IDEuNi0xNC45LTQuMi0xOS42elwiIC8+PC9zdmc+PHNwYW4gY2xhc3M9XCJsdF9fc291bmQtbGFiZWxcIj5UaHVuZGVyPC9zcGFuPjwvYnV0dG9uPjwvbGk+XG4gICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImx0X19jb250cm9scy1zb3VuZFwiIGRhdGEtbHQtc291bmQ9XCJ3aW5kXCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiQ2xpY2sgdG8gcGxheSBvciBwYXVzZSB3aW5kIHNvdW5kc1wiPjxzdmcgcm9sZT1cImltZ1wiIGFyaWEtbGFiZWw9XCJXaW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiPjxwYXRoIGQ9XCJNMjg4IDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMyaDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMySDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMySDM1MmM1MyAwIDk2LTQzIDk2LTk2cy00My05Ni05Ni05NkgzMjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem02NCAzNTJjMCAxNy43IDE0LjMgMzIgMzIgMzJoMzJjNTMgMCA5Ni00MyA5Ni05NnMtNDMtOTYtOTYtOTZIMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJINDE2YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMySDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTEyOCA1MTJoMzJjNTMgMCA5Ni00MyA5Ni05NnMtNDMtOTYtOTYtOTZIMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJIMTYwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMySDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMnpcIi8+PC9zdmc+PHNwYW4gY2xhc3M9XCJsdF9fc291bmQtbGFiZWxcIj5XaW5kPC9zcGFuPjwvYnV0dG9uPjwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImx0X190b29sYmFyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsdF9fY29udHJvbC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwibGQtdm9sdW1lXCI+XG4gICAgICAgICAgICAgICAgVm9sdW1lICg8c3BhbiBpZD1cImxkLXZvbHVtZS12YWx1ZVwiPjEwMDwvc3Bhbj4lKVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzdmcgcm9sZT1cImltZ1wiIGFyaWEtbGFiZWw9XCJNb3ZlIHRoZSBzbGlkZXIgdG8gdGhlIGxlZnQgdG8gcmVkdWNlIHZvbHVtZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDY0MCA1MTJcIj48cGF0aCBkPVwiTTMyMCA2NGMwLTEyLjYtNy40LTI0LTE4LjktMjkuMnMtMjUtMy4xLTM0LjQgNS4zTDEzMS44IDE2MEg2NGMtMzUuMyAwLTY0IDI4LjctNjQgNjR2NjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRoNjcuOEwyNjYuNyA0NzEuOWM5LjQgOC40IDIyLjkgMTAuNCAzNC40IDUuM1MzMjAgNDYwLjYgMzIwIDQ0OFY2NHpcIi8+PC9zdmc+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgaWQ9XCJsZC12b2x1bWVcIiBtaW49XCIwXCIgbWF4PVwiMS4wXCIgdmFsdWU9XCIxLjBcIiBzdGVwPVwiMC4xXCIgY2xhc3M9XCJsdF9fY29udHJvbHMtdm9sdW1lIHNsaWRlclwiPlxuICAgICAgICAgICAgPHN2ZyByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIk1vdmUgdGhlIHNsaWRlciB0byB0aGUgcmlnaHQgdG8gaW5jcmVhc2Ugdm9sdW1lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNjQwIDUxMlwiPjxwYXRoIGQ9XCJNNTMzLjYgMzIuNUM1OTguNSA4NS4yIDY0MCAxNjUuOCA2NDAgMjU2cy00MS41IDE3MC43LTEwNi40IDIyMy41Yy0xMC4zIDguNC0yNS40IDYuOC0zMy44LTMuNXMtNi44LTI1LjQgMy41LTMzLjhDNTU3LjUgMzk4LjIgNTkyIDMzMS4yIDU5MiAyNTZzLTM0LjUtMTQyLjItODguNy0xODYuM2MtMTAuMy04LjQtMTEuOC0yMy41LTMuNS0zMy44czIzLjUtMTEuOCAzMy44LTMuNXpNNDczLjEgMTA3YzQzLjIgMzUuMiA3MC45IDg4LjkgNzAuOSAxNDlzLTI3LjcgMTEzLjgtNzAuOSAxNDljLTEwLjMgOC40LTI1LjQgNi44LTMzLjgtMy41cy02LjgtMjUuNCAzLjUtMzMuOEM0NzUuMyAzNDEuMyA0OTYgMzAxLjEgNDk2IDI1NnMtMjAuNy04NS4zLTUzLjItMTExLjhjLTEwLjMtOC40LTExLjgtMjMuNS0zLjUtMzMuOHMyMy41LTExLjggMzMuOC0zLjV6bS02MC41IDc0LjVDNDM0LjEgMTk5LjEgNDQ4IDIyNS45IDQ0OCAyNTZzLTEzLjkgNTYuOS0zNS40IDc0LjVjLTEwLjMgOC40LTI1LjQgNi44LTMzLjgtMy41cy02LjgtMjUuNCAzLjUtMzMuOEMzOTMuMSAyODQuNCA0MDAgMjcxIDQwMCAyNTZzLTYuOS0yOC40LTE3LjctMzcuM2MtMTAuMy04LjQtMTEuOC0yMy41LTMuNS0zMy44czIzLjUtMTEuOCAzMy44LTMuNXpNMzAxLjEgMzQuOEMzMTIuNiA0MCAzMjAgNTEuNCAzMjAgNjRWNDQ4YzAgMTIuNi03LjQgMjQtMTguOSAyOS4ycy0yNSAzLjEtMzQuNC01LjNMMTMxLjggMzUySDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NFYyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjRoNjcuOEwyNjYuNyA0MC4xYzkuNC04LjQgMjIuOS0xMC40IDM0LjQtNS4zelwiLz48L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5gO1xufVxuXG4vKipcbiAqIEluamVjdHMgdGhlIG5lY2Vzc2FyeSBDU1MgdG8gdGhlIGhlYWRlclxuICogQHNpbmNlIDIuNy4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGluamVjdENTUygpIHtcbiAgICBjb25zdCBlbFN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBjb25zdCBjc3MgPSBgXG4vKiBMZWFybm9zaXR5IHdoaXRlIG5vaXNlIHBsYXllciBzdHlsZXMgKi9cbjpyb290IHtcbiAgICAtLWx0LWJvcmRlcjogIzg4ODg4ODtcbiAgICAtLWx0LWJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgLS1sdC1jb2xvcjogIzMzMzMzMztcbn1cblxuLmx0X19wbGF5ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiAzMHJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx0LWJvcmRlci1yYWRpdXMpO1xuICAgIHBhZGRpbmc6IDFyZW07XG4gICAgZmlsdGVyOiBkcm9wLXNoYWRvdyg0cHggNXB4IDdweCAjOGQ4ZDhkKTtcbiAgICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2EgTmV1ZVwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgIGNvbG9yOiB2YXIoLS1sdC1jb2xvcik7XG4gICAgbWFyZ2luOiAwIGF1dG87XG59XG4ubHRfX3BsYXllciBzdmcge1xuICAgIHdpZHRoOiA2MHB4O1xuICAgIGhlaWdodDogNjBweDtcbn1cbi5sdF9fbWV0YSB1bCB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuLmx0X19tZXRhIHVsIGxpIHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx0LWJvcmRlci1yYWRpdXMpO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWx0LWJvcmRlcik7XG4gICAgbWFyZ2luOiAwLjNyZW07XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjRmNTtcbiAgICB9XG59XG4ubHRfX21ldGEgdWwgbGkgYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcblxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICAgIG91dGxpbmU6IDVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtcbiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmY0ZjU7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAwLjI1cmVtIHJnYmEoNDksIDEzMiwgMjUzLCAwLjUpO1xuICAgIH1cbn1cbi5sdF9fbWV0YSB1bCBsaSBidXR0b24ubHRfX3NvdW5kLWFjdGl2ZSB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMC4yNXJlbSByZ2JhKDQ5LCAxMzIsIDI1MywgMC41KTtcbiAgICBiYWNrZ3JvdW5kOiAjZWZlZmVmO1xufVxuLmx0X19tZXRhIHVsIGxpIHN2ZyB7XG4gICAgcGFkZGluZzogMXJlbSAxcmVtIDAuM3JlbSAxcmVtO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4ubHRfX2NvbnRyb2wtd3JhcHBlciBzdmcge1xuICAgIHdpZHRoOiAzMHB4O1xufVxuLmx0X19jb250cm9sLXdyYXBwZXIgc3ZnOmxhc3QtY2hpbGQge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAxNXB4O1xufVxuLmx0X19zb3VuZC1sYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZy1ib3R0b206IDAuN3JlbTtcbn1cbi5sdF9fdG9vbGJhciB7XG4gICAgbWFyZ2luLXRvcDogMC41cmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5sdF9fY29udHJvbC13cmFwcGVyIGxhYmVsIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAxMHB4O1xufVxuLmx0X19jb250cm9sLXdyYXBwZXIgYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5pbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiAxNXJlbTtcbn1cbi8qIFJlbW92ZXMgZGVmYXVsdCBmb2N1cyAqL1xuaW5wdXRbdHlwZT1cInJhbmdlXCJdOmZvY3VzIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cbmlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sge1xuICAgYmFja2dyb3VuZC1jb2xvcjogIzAxMjQzZDtcbiAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTtcbiAgIGhlaWdodDogMC41cmVtO1xufVxuaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotd2Via2l0LXNsaWRlci10aHVtYiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICBtYXJnaW4tdG9wOiAtMTJweDtcbiAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICBib3JkZXI6IDJweCBzb2xpZCAjMDEyNDNkO1xuICAgaGVpZ2h0OiAycmVtO1xuICAgd2lkdGg6IDFyZW07XG59XG5pbnB1dFt0eXBlPVwicmFuZ2VcIl06Zm9jdXM6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHtcbiAgYm9yZGVyOiAxcHggc29saWQgIzAxMjQzZDtcbiAgb3V0bGluZTogM3B4IHNvbGlkICMwMTI0M2Q7XG4gIG91dGxpbmUtb2Zmc2V0OiAwLjEyNXJlbTtcbn1cbmlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1vei1yYW5nZS10cmFjayB7XG4gICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDEyNDNkO1xuICAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xuICAgaGVpZ2h0OiAwLjVyZW07XG59XG5pbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tb3otcmFuZ2UtdGh1bWIge1xuICAgYm9yZGVyOiBub25lO1xuICAgYm9yZGVyLXJhZGl1czogMDtcbiAgIGJvcmRlcjogMXB4IHNvbGlkICMwMTI0M2Q7XG4gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgaGVpZ2h0OiAycmVtO1xuICAgd2lkdGg6IDFyZW07XG59XG5pbnB1dFt0eXBlPVwicmFuZ2VcIl06Zm9jdXM6Oi1tb3otcmFuZ2UtdGh1bWIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjMDEyNDNkO1xuICBvdXRsaW5lOiAzcHggc29saWQgIzAxMjQzZDtcbiAgb3V0bGluZS1vZmZzZXQ6IDAuMTI1cmVtO1xufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNDAwcHgpIHtcbiAgICAubHRfX21ldGEgdWwge1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICAgICAgICB3aWR0aDogMTByZW07XG4gICAgfVxufVxuXG4ubHRfX3doaXRlbm9pc2UtcGxheWVyLWljb246OmJlZm9yZSB7XG4gICAgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+PHBhdGggZD1cIk0yNTYgODBDMTQ5LjkgODAgNjIuNCAxNTkuNCA0OS42IDI2MmM5LjQtMy44IDE5LjYtNiAzMC40LTZjMjYuNSAwIDQ4IDIxLjUgNDggNDhWNDMyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4Yy00NC4yIDAtODAtMzUuOC04MC04MFYzODQgMzM2IDI4OEMwIDE0Ni42IDExNC42IDMyIDI1NiAzMnMyNTYgMTE0LjYgMjU2IDI1NnY0OCA0OCAxNmMwIDQ0LjItMzUuOCA4MC04MCA4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhWMzA0YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4YzEwLjggMCAyMSAyLjEgMzAuNCA2QzQ0OS42IDE1OS40IDM2Mi4xIDgwIDI1NiA4MHpcIi8+PC9zdmc+Jyk7XG4gICAgd2lkdGg6IDE2cHg7XG4gICAgY29sb3I6IHZhcigtLWx0LWNvbG9yKTtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IGNvbG9yIC4ycztcbiAgICB0cmFuc2l0aW9uOiBjb2xvciAuMnM7XG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG59XG5gO1xuXG4gICAgZWxTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChlbFN0eWxlKTtcblxuICAgIHN0YXRlLnJlbmRlcmVkQ3NzID0gdHJ1ZTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/extensions/accessibility/ux/whiteNoise/index.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/ui/networkStatus/index.js": -/*!*************************************************************!*\ - !*** ./src/assessment/extensions/ui/networkStatus/index.js ***! - \*************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../utils/logger */ \"./src/utils/logger.js\");\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Checks for an active network connection. If none found, adds\n * an icon to the UI to indicate the status to the end user.\n *\n * @module Extensions/Assessment/networkStatus\n */\n\nconst LOG_LEVEL = 'ERROR';\n\nconst state = {\n options: {\n iconWrapper: 'top-right-wrapper',\n interval: 30000,\n message: 'Internet connection is currently down.',\n render: true,\n uri: 'https://questions.learnosity.com?latest-lts',\n },\n renderedCss: false,\n};\n\n/**\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/core';\n * import * as networkStatus from '@caspingus/lt/src/assessment/extensions/ui/networkStatus/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * networkStatus.run();\n * @param {object=} options - Optional configuration object includes:\n * - `iconWrapper` (string) classname of element to inject the broken connection icon. You\n * should never need this if using any of the Learnosity regions.\n * - `interval` (numeric) millisecond interval to check connection. Defaults to 30000 (30 seconds).\n * - `message` (string) message for tooltip and screen reader users.\n * - `render` (boolean) whether to render the icon or not. Defaults to `true`.\n * - `uri` (string) URI to check for network connectivity. Defaults to a Learnosity API endpoint which\n * is already whitelisted.\n * @since 2.12.0\n */\nfunction run(options) {\n if (!state.renderedCss) injectCSS();\n\n validateOptions(options);\n\n setInterval(checkOnlineStatus, state.options.interval);\n}\n\n/**\n * Sets UI message if network is down.\n * @since 2.12.0\n * @ignore\n */\nasync function checkOnlineStatus() {\n const status = await checkInternetConnectivity();\n const elIndicator = document.querySelector('.lt__networkStatus-indicator');\n\n dispatchNetworkEvent(status);\n\n if (state.options.render) {\n if (!status) {\n const elWrapper = document.querySelector(`.${state.options.iconWrapper}`);\n const template = `
\n \n \n \n \n \n ${state.options.message}\n
`;\n\n if (elWrapper && !elIndicator) {\n elWrapper.insertAdjacentHTML('afterbegin', template);\n }\n } else if (elIndicator) {\n elIndicator.remove();\n }\n }\n}\n\n/**\n * Makes a HEAD request to the specified URI to check for network connectivity.\n * @since 2.12.0\n * @ignore\n * @returns {promise}\n */\nasync function checkInternetConnectivity() {\n try {\n const response = await fetch(state.options.uri, {\n method: 'HEAD',\n mode: 'no-cors',\n cache: 'no-store',\n });\n return true;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Dispatches an event to indicate the network status.\n * Fires at the interval defined by configuration options.\n * @since 2.12.0\n * @ignore\n * @param {boolean} status\n */\nfunction dispatchNetworkEvent(status) {\n const eventStatus = status ? 'LTNetworkOnline' : 'LTNetworkOffline';\n const event = new CustomEvent(eventStatus);\n\n document.dispatchEvent(event);\n}\n\n/**\n * Validates user passed options and merges them with the default options.\n * @param {*} options\n * @since 2.12.0\n * @ignore\n */\nfunction validateOptions(options) {\n if (options && typeof options === 'object') {\n state.options = { ...state.options, ...options };\n }\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 2.12.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity render network status */\n.lt__networkStatus-indicator {\n width: 24px;\n text-align: center;\n position: relative;\n top: 9px;\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3VpL25ldHdvcmtTdGF0dXMvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBOEM7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RCwwQkFBMEI7QUFDbkY7QUFDQSwrQkFBK0Isc0JBQXNCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLHNCQUFzQjtBQUM5RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3VpL25ldHdvcmtTdGF0dXMvaW5kZXguanM/YmJiZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5cbi8qKlxuICogRXh0ZW5zaW9ucyBhZGQgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0byBJdGVtcyBBUEkuXG4gKiBUaGV5IHJlbHkgb24gbW9kdWxlcyB3aXRoaW4gTFQgYmVpbmcgYXZhaWxhYmxlLlxuICpcbiAqIC0tXG4gKlxuICogQ2hlY2tzIGZvciBhbiBhY3RpdmUgbmV0d29yayBjb25uZWN0aW9uLiBJZiBub25lIGZvdW5kLCBhZGRzXG4gKiBhbiBpY29uIHRvIHRoZSBVSSB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIHRvIHRoZSBlbmQgdXNlci5cbiAqXG4gKiBAbW9kdWxlIEV4dGVuc2lvbnMvQXNzZXNzbWVudC9uZXR3b3JrU3RhdHVzXG4gKi9cblxuY29uc3QgTE9HX0xFVkVMID0gJ0VSUk9SJztcblxuY29uc3Qgc3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBpY29uV3JhcHBlcjogJ3RvcC1yaWdodC13cmFwcGVyJyxcbiAgICAgICAgaW50ZXJ2YWw6IDMwMDAwLFxuICAgICAgICBtZXNzYWdlOiAnSW50ZXJuZXQgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgZG93bi4nLFxuICAgICAgICByZW5kZXI6IHRydWUsXG4gICAgICAgIHVyaTogJ2h0dHBzOi8vcXVlc3Rpb25zLmxlYXJub3NpdHkuY29tP2xhdGVzdC1sdHMnLFxuICAgIH0sXG4gICAgcmVuZGVyZWRDc3M6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTFQgfSBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2NvcmUnO1xuICogaW1wb3J0ICogYXMgbmV0d29ya1N0YXR1cyBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvdWkvbmV0d29ya1N0YXR1cy9pbmRleCc7XG4gKlxuICogTFQuaW5pdChpdGVtc0FwcCk7IC8vIFNldCB1cCBMVCB3aXRoIHRoZSBJdGVtcyBBUEkgYXBwbGljYXRpb24gaW5zdGFuY2UgdmFyaWFibGVcbiAqIG5ldHdvcmtTdGF0dXMucnVuKCk7XG4gKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdCBpbmNsdWRlczpcbiAqICAtIGBpY29uV3JhcHBlcmAgKHN0cmluZykgY2xhc3NuYW1lIG9mIGVsZW1lbnQgdG8gaW5qZWN0IHRoZSBicm9rZW4gY29ubmVjdGlvbiBpY29uLiBZb3VcbiAqIHNob3VsZCBuZXZlciBuZWVkIHRoaXMgaWYgdXNpbmcgYW55IG9mIHRoZSBMZWFybm9zaXR5IHJlZ2lvbnMuXG4gKiAgLSBgaW50ZXJ2YWxgIChudW1lcmljKSBtaWxsaXNlY29uZCBpbnRlcnZhbCB0byBjaGVjayBjb25uZWN0aW9uLiBEZWZhdWx0cyB0byAzMDAwMCAoMzAgc2Vjb25kcykuXG4gKiAgLSBgbWVzc2FnZWAgKHN0cmluZykgbWVzc2FnZSBmb3IgdG9vbHRpcCBhbmQgc2NyZWVuIHJlYWRlciB1c2Vycy5cbiAqICAtIGByZW5kZXJgIChib29sZWFuKSB3aGV0aGVyIHRvIHJlbmRlciB0aGUgaWNvbiBvciBub3QuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqICAtIGB1cmlgIChzdHJpbmcpIFVSSSB0byBjaGVjayBmb3IgbmV0d29yayBjb25uZWN0aXZpdHkuIERlZmF1bHRzIHRvIGEgTGVhcm5vc2l0eSBBUEkgZW5kcG9pbnQgd2hpY2hcbiAqIGlzIGFscmVhZHkgd2hpdGVsaXN0ZWQuXG4gKiBAc2luY2UgMi4xMi4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW4ob3B0aW9ucykge1xuICAgIGlmICghc3RhdGUucmVuZGVyZWRDc3MpIGluamVjdENTUygpO1xuXG4gICAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgc2V0SW50ZXJ2YWwoY2hlY2tPbmxpbmVTdGF0dXMsIHN0YXRlLm9wdGlvbnMuaW50ZXJ2YWwpO1xufVxuXG4vKipcbiAqIFNldHMgVUkgbWVzc2FnZSBpZiBuZXR3b3JrIGlzIGRvd24uXG4gKiBAc2luY2UgMi4xMi4wXG4gKiBAaWdub3JlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrT25saW5lU3RhdHVzKCkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNoZWNrSW50ZXJuZXRDb25uZWN0aXZpdHkoKTtcbiAgICBjb25zdCBlbEluZGljYXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sdF9fbmV0d29ya1N0YXR1cy1pbmRpY2F0b3InKTtcblxuICAgIGRpc3BhdGNoTmV0d29ya0V2ZW50KHN0YXR1cyk7XG5cbiAgICBpZiAoc3RhdGUub3B0aW9ucy5yZW5kZXIpIHtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke3N0YXRlLm9wdGlvbnMuaWNvbldyYXBwZXJ9YCk7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGA8ZGl2IGNsYXNzPVwibHRfX25ldHdvcmtTdGF0dXMtaW5kaWNhdG9yIHBvcy1sZWZ0XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiIGFyaWEtcmVsZXZhbnQ9XCJhbGxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT1cIiR7c3RhdGUub3B0aW9ucy5tZXNzYWdlfVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIxNnB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIxNnB4XCIgZmlsbD1cIiMzMzMzMzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNzkwLTU2IDQxNC00MzRxLTQ3IDExLTg3LjUgMzNUMjU0LTM0NmwtODQtODZxMzItMzIgNjktNTZ0NzktNDJsLTkwLTkwcS00MSAyMS03Ni41IDQ2LjVUODQtNTE2TDAtNjAycTMyLTMyIDY2LjUtNTcuNVQxNDAtNzA4bC04NC04NCA1Ni01NiA3MzYgNzM2LTU4IDU2Wm0tMzEwLTY0cS00MiAwLTcxLTI5LjVUMzgwLTIyMHEwLTQyIDI5LTcxdDcxLTI5cTQyIDAgNzEgMjl0MjkgNzFxMCA0MS0yOSA3MC41VDQ4MC0xMjBabTIzNi0yMzgtMjktMjktMjktMjktMTQ0LTE0NHE4MSA4IDE1MS41IDQxVDc5MC00MzJsLTc0IDc0Wm0xNjAtMTU4cS03Ny03Ny0xNzguNS0xMjAuNVQ0ODAtNjgwcS0yMSAwLTQwLjUgMS41VDQwMC02NzRMMjk4LTc3NnE0NC0xMiA4OS41LTE4dDkyLjUtNnExNDIgMCAyNjUgNTN0MjE1IDE0NWwtODQgODZaXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+JHtzdGF0ZS5vcHRpb25zLm1lc3NhZ2V9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+YDtcblxuICAgICAgICAgICAgaWYgKGVsV3JhcHBlciAmJiAhZWxJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgICAgICBlbFdyYXBwZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgdGVtcGxhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVsSW5kaWNhdG9yKSB7XG4gICAgICAgICAgICBlbEluZGljYXRvci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBNYWtlcyBhIEhFQUQgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIFVSSSB0byBjaGVjayBmb3IgbmV0d29yayBjb25uZWN0aXZpdHkuXG4gKiBAc2luY2UgMi4xMi4wXG4gKiBAaWdub3JlXG4gKiBAcmV0dXJucyB7cHJvbWlzZX1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tJbnRlcm5ldENvbm5lY3Rpdml0eSgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHN0YXRlLm9wdGlvbnMudXJpLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgICAgICAgIG1vZGU6ICduby1jb3JzJyxcbiAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFuIGV2ZW50IHRvIGluZGljYXRlIHRoZSBuZXR3b3JrIHN0YXR1cy5cbiAqIEZpcmVzIGF0IHRoZSBpbnRlcnZhbCBkZWZpbmVkIGJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzaW5jZSAyLjEyLjBcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RhdHVzXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoTmV0d29ya0V2ZW50KHN0YXR1cykge1xuICAgIGNvbnN0IGV2ZW50U3RhdHVzID0gc3RhdHVzID8gJ0xUTmV0d29ya09ubGluZScgOiAnTFROZXR3b3JrT2ZmbGluZSc7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRTdGF0dXMpO1xuXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHVzZXIgcGFzc2VkIG9wdGlvbnMgYW5kIG1lcmdlcyB0aGVtIHdpdGggdGhlIGRlZmF1bHQgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Kn0gb3B0aW9uc1xuICogQHNpbmNlIDIuMTIuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0geyAuLi5zdGF0ZS5vcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgfVxufVxuXG4vKipcbiAqIEluamVjdHMgdGhlIG5lY2Vzc2FyeSBDU1MgdG8gdGhlIGhlYWRlclxuICogQHNpbmNlIDIuMTIuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBpbmplY3RDU1MoKSB7XG4gICAgY29uc3QgZWxTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgY3NzID0gYFxuLyogTGVhcm5vc2l0eSByZW5kZXIgbmV0d29yayBzdGF0dXMgKi9cbi5sdF9fbmV0d29ya1N0YXR1cy1pbmRpY2F0b3Ige1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiA5cHg7XG59XG5gO1xuXG4gICAgZWxTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChlbFN0eWxlKTtcblxuICAgIHN0YXRlLnJlbmRlcmVkQ3NzID0gdHJ1ZTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/extensions/ui/networkStatus/index.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/ui/renderPDF/index.js": -/*!*********************************************************!*\ - !*** ./src/assessment/extensions/ui/renderPDF/index.js ***! - \*********************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_items__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../core/items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _vendor_pdfjs_dist_build_pdf_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../vendor/pdfjs-dist/build/pdf.mjs */ \"./src/vendor/pdfjs-4.0.379-legacy-dist/build/pdf.mjs\");\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_vendor_pdfjs_dist_build_pdf_mjs__WEBPACK_IMPORTED_MODULE_2__]);\n_vendor_pdfjs_dist_build_pdf_mjs__WEBPACK_IMPORTED_MODULE_2__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * Renders any PDF uploaded as a resource\n * to any item in the activity. Uses the pdf.js webviewer that has a\n * toolbar to zoom, view thumbnails, and download etc.\n *\n * By enabling this extension, all PDFs will be rendered in the viewer.\n *\n *

\"\"

\n * @module Extensions/Assessment/renderPDF\n */\n\nconst state = {\n renderedCss: false,\n};\n\n/**\n * Sets up an item load listener to the current item for any resources that\n * have been uploaded during authoring. We parse the DOM for resources because\n * they aren't available in the item or question JSON.\n *\n * If the resource is a PDF, render using the pdf.js viewer.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.renderPDF.run();\n * @since 2.2.0\n */\nfunction run() {\n if (!state.renderedCss) injectCSS();\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', e => {\n renderPDF();\n });\n}\n\n/**\n * Uses pdf.js webviewer to render any resource PDFs in iframes.\n * @since 2.2.0\n * @ignore\n */\nfunction renderPDF() {\n const currentItemRef = _core_items__WEBPACK_IMPORTED_MODULE_1__.itemReference();\n const elItem = document.querySelector(`.learnosity-item[data-reference=\"${currentItemRef}\"]`);\n const resources = elItem.querySelectorAll('.lrn_widget .resource');\n\n if (resources.length) {\n resources.forEach((resource, k) => {\n let url = resource.querySelector('a').getAttribute('href');\n\n // Only operate on PDFs\n if (url.substring(url.length - 3) === 'pdf') {\n // Hide the . We might want to leave it there for an option to download\n resource.classList.add('sr-only');\n createHash(url).then(hash => {\n render(hash);\n });\n\n function render(pdfId) {\n if (!document.getElementById(pdfId)) {\n const elCanvasContainer = document.createElement('div');\n const elPDFFrame = document.createElement('iframe');\n\n elCanvasContainer.setAttribute('id', pdfId);\n elCanvasContainer.setAttribute('class', 'lt__renderPDF_pdf');\n resource.before(elCanvasContainer);\n\n elPDFFrame.setAttribute('class', 'pdf-viewer');\n elPDFFrame.setAttribute('src', `${url}#sidebarViewOnLoad=0&_pagemode=none&_toolbar=0&view=FitH`);\n elCanvasContainer.appendChild(elPDFFrame);\n }\n }\n }\n });\n }\n}\n\n/**\n * Hashes an input string.\n * @param {string} input\n * @returns {string}\n * @since 2.2.0\n * @ignore\n */\nasync function createHash(input) {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('');\n return hashHex;\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 2.2.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity render PDF styles */\n.lt__renderPDF_pdf .pdf-viewer {\n border: none;\n width: 100%;\n height: 650px;\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3VpL3JlbmRlclBERi9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQXlDO0FBQ0k7QUFDd0I7O0FBRXJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ087QUFDUDs7QUFFQSxJQUFJLGtEQUFlO0FBQ25CO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixzREFBbUI7QUFDOUMsOEVBQThFLGVBQWU7QUFDN0Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMERBQTBELElBQUk7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvZXh0ZW5zaW9ucy91aS9yZW5kZXJQREYvaW5kZXguanM/ZmI0NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi4vLi4vLi4vY29yZS9hcHAnO1xuaW1wb3J0ICogYXMgaXRlbXMgZnJvbSAnLi4vLi4vLi4vY29yZS9pdGVtcyc7XG5pbXBvcnQgKiBhcyBwZGZqcyBmcm9tICcuLi8uLi8uLi8uLi92ZW5kb3IvcGRmanMtZGlzdC9idWlsZC9wZGYubWpzJztcblxuLyoqXG4gKiBFeHRlbnNpb25zIGFkZCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHRvIEl0ZW1zIEFQSS5cbiAqIFRoZXkgcmVseSBvbiBtb2R1bGVzIHdpdGhpbiBMVCBiZWluZyBhdmFpbGFibGUuXG4gKlxuICogLS1cbiAqXG4gKiBSZW5kZXJzIGFueSBQREYgdXBsb2FkZWQgYXMgYSA8YSBocmVmPVwiaHR0cHM6Ly9hdXRob3JndWlkZS5sZWFybm9zaXR5LmNvbS9oYy9lbi11cy9hcnRpY2xlcy8zNjAwMDA3NTkxMTctQWRkaW5nLVJlc291cmNlcy10by1RdWVzdGlvbnMtYW5kLUZlYXR1cmVzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+cmVzb3VyY2U8L2E+XG4gKiB0byBhbnkgaXRlbSBpbiB0aGUgYWN0aXZpdHkuIFVzZXMgdGhlIHBkZi5qcyB3ZWJ2aWV3ZXIgdGhhdCBoYXMgYVxuICogdG9vbGJhciB0byB6b29tLCB2aWV3IHRodW1ibmFpbHMsIGFuZCBkb3dubG9hZCBldGMuXG4gKlxuICogQnkgZW5hYmxpbmcgdGhpcyBleHRlbnNpb24sIGFsbCBQREZzIHdpbGwgYmUgcmVuZGVyZWQgaW4gdGhlIHZpZXdlci5cbiAqXG4gKiA8cD48aW1nIHNyYz1cImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taWNoYWVsc2hhcm1hbi9MVC9tYWluL3NyYy9hc3NldHMvaW1hZ2VzL3JlbmRlcnBkZi5wbmdcIiBhbHQ9XCJcIiB3aWR0aD1cIjcwMFwiPjwvcD5cbiAqIEBtb2R1bGUgRXh0ZW5zaW9ucy9Bc3Nlc3NtZW50L3JlbmRlclBERlxuICovXG5cbmNvbnN0IHN0YXRlID0ge1xuICAgIHJlbmRlcmVkQ3NzOiBmYWxzZSxcbn07XG5cbi8qKlxuICogU2V0cyB1cCBhbiBpdGVtIGxvYWQgbGlzdGVuZXIgdG8gdGhlIGN1cnJlbnQgaXRlbSBmb3IgYW55IHJlc291cmNlcyB0aGF0XG4gKiBoYXZlIGJlZW4gdXBsb2FkZWQgZHVyaW5nIGF1dGhvcmluZy4gV2UgcGFyc2UgdGhlIERPTSBmb3IgcmVzb3VyY2VzIGJlY2F1c2VcbiAqIHRoZXkgYXJlbid0IGF2YWlsYWJsZSBpbiB0aGUgaXRlbSBvciBxdWVzdGlvbiBKU09OLlxuICpcbiAqIElmIHRoZSByZXNvdXJjZSBpcyBhIFBERiwgcmVuZGVyIHVzaW5nIHRoZSBwZGYuanMgdmlld2VyLlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IExUIH0gZnJvbSAnQGNhc3Bpbmd1cy9sdC9zcmMvYXNzZXNzbWVudC9pbmRleCc7XG4gKlxuICogTFQuaW5pdChpdGVtc0FwcCk7IC8vIFNldCB1cCBMVCB3aXRoIHRoZSBJdGVtcyBBUEkgYXBwbGljYXRpb24gaW5zdGFuY2UgdmFyaWFibGVcbiAqIExULmV4dGVuc2lvbnMucmVuZGVyUERGLnJ1bigpO1xuICogQHNpbmNlIDIuMi4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW4oKSB7XG4gICAgaWYgKCFzdGF0ZS5yZW5kZXJlZENzcykgaW5qZWN0Q1NTKCk7XG5cbiAgICBhcHAuYXBwSW5zdGFuY2UoKS5vbignaXRlbTpsb2FkJywgZSA9PiB7XG4gICAgICAgIHJlbmRlclBERigpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFVzZXMgcGRmLmpzIHdlYnZpZXdlciB0byByZW5kZXIgYW55IHJlc291cmNlIFBERnMgaW4gaWZyYW1lcy5cbiAqIEBzaW5jZSAyLjIuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiByZW5kZXJQREYoKSB7XG4gICAgY29uc3QgY3VycmVudEl0ZW1SZWYgPSBpdGVtcy5pdGVtUmVmZXJlbmNlKCk7XG4gICAgY29uc3QgZWxJdGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmxlYXJub3NpdHktaXRlbVtkYXRhLXJlZmVyZW5jZT1cIiR7Y3VycmVudEl0ZW1SZWZ9XCJdYCk7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gZWxJdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5scm5fd2lkZ2V0IC5yZXNvdXJjZScpO1xuXG4gICAgaWYgKHJlc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb3VyY2VzLmZvckVhY2goKHJlc291cmNlLCBrKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gcmVzb3VyY2UucXVlcnlTZWxlY3RvcignYScpLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IG9wZXJhdGUgb24gUERGc1xuICAgICAgICAgICAgaWYgKHVybC5zdWJzdHJpbmcodXJsLmxlbmd0aCAtIDMpID09PSAncGRmJykge1xuICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIDxhPi4gV2UgbWlnaHQgd2FudCB0byBsZWF2ZSBpdCB0aGVyZSBmb3IgYW4gb3B0aW9uIHRvIGRvd25sb2FkXG4gICAgICAgICAgICAgICAgcmVzb3VyY2UuY2xhc3NMaXN0LmFkZCgnc3Itb25seScpO1xuICAgICAgICAgICAgICAgIGNyZWF0ZUhhc2godXJsKS50aGVuKGhhc2ggPT4ge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXIoaGFzaCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZW5kZXIocGRmSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwZGZJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsQ2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbFBERkZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsQ2FudmFzQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnaWQnLCBwZGZJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbENhbnZhc0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2x0X19yZW5kZXJQREZfcGRmJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5iZWZvcmUoZWxDYW52YXNDb250YWluZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbFBERkZyYW1lLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncGRmLXZpZXdlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxQREZGcmFtZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGAke3VybH0jc2lkZWJhclZpZXdPbkxvYWQ9MCZfcGFnZW1vZGU9bm9uZSZfdG9vbGJhcj0wJnZpZXc9Rml0SGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxDYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxQREZGcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIYXNoZXMgYW4gaW5wdXQgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogQHNpbmNlIDIuMi4wXG4gKiBAaWdub3JlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUhhc2goaW5wdXQpIHtcbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKGlucHV0KTtcbiAgICBjb25zdCBoYXNoQnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBkYXRhKTtcbiAgICBjb25zdCBoYXNoQXJyYXkgPSBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGhhc2hCdWZmZXIpKTtcbiAgICBjb25zdCBoYXNoSGV4ID0gaGFzaEFycmF5Lm1hcChieXRlID0+IGJ5dGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBoYXNoSGV4O1xufVxuXG4vKipcbiAqIEluamVjdHMgdGhlIG5lY2Vzc2FyeSBDU1MgdG8gdGhlIGhlYWRlclxuICogQHNpbmNlIDIuMi4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGluamVjdENTUygpIHtcbiAgICBjb25zdCBlbFN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBjb25zdCBjc3MgPSBgXG4vKiBMZWFybm9zaXR5IHJlbmRlciBQREYgc3R5bGVzICovXG4ubHRfX3JlbmRlclBERl9wZGYgLnBkZi12aWV3ZXIge1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDY1MHB4O1xufVxuYDtcblxuICAgIGVsU3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZWxTdHlsZSk7XG5cbiAgICBzdGF0ZS5yZW5kZXJlZENzcyA9IHRydWU7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/extensions/ui/renderPDF/index.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/ui/themes/juniorQuest/index.js": -/*!******************************************************************!*\ - !*** ./src/assessment/extensions/ui/themes/juniorQuest/index.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _sass_index_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sass/index.scss */ \"./src/assessment/extensions/ui/themes/juniorQuest/sass/index.scss\");\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * This script loads a custom UI theme for Items API.\n * @module Extensions/Assessment/themes/juniorQuest\n */\n\nconst state = {\n theme: 'juniorQuest',\n};\n\n/**\n * Loads the `Sydney` theme for Items API (the player).\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/core';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.themes.sydney.run();\n * @since 2.13.0\n */\nfunction run() {\n addThemeWrapperClass();\n}\n\n/**\n * Adds a classname to the div with `lrn-assess` for specificity.\n * @since 2.13.0\n * @ignore\n */\nfunction addThemeWrapperClass() {\n const elApiWrapper = document.querySelector('.lrn-assess');\n\n if (elApiWrapper) {\n elApiWrapper.classList.add('lt__theme', `lt__theme-${state.theme}`);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3VpL3RoZW1lcy9qdW5pb3JRdWVzdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkRBQTZELFlBQVk7QUFDekU7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3VpL3RoZW1lcy9qdW5pb3JRdWVzdC9pbmRleC5qcz8zN2E1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9zYXNzL2luZGV4LnNjc3MnO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIFRoaXMgc2NyaXB0IGxvYWRzIGEgY3VzdG9tIFVJIHRoZW1lIGZvciBJdGVtcyBBUEkuXG4gKiBAbW9kdWxlIEV4dGVuc2lvbnMvQXNzZXNzbWVudC90aGVtZXMvanVuaW9yUXVlc3RcbiAqL1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICB0aGVtZTogJ2p1bmlvclF1ZXN0Jyxcbn07XG5cbi8qKlxuICogTG9hZHMgdGhlIGBTeWRuZXlgIHRoZW1lIGZvciBJdGVtcyBBUEkgKHRoZSBwbGF5ZXIpLlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IExUIH0gZnJvbSAnQGNhc3Bpbmd1cy9sdC9zcmMvYXNzZXNzbWVudC9jb3JlJztcbiAqXG4gKiBMVC5pbml0KGl0ZW1zQXBwKTsgLy8gU2V0IHVwIExUIHdpdGggdGhlIEl0ZW1zIEFQSSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB2YXJpYWJsZVxuICogTFQuZXh0ZW5zaW9ucy50aGVtZXMuc3lkbmV5LnJ1bigpO1xuICogQHNpbmNlIDIuMTMuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuKCkge1xuICAgIGFkZFRoZW1lV3JhcHBlckNsYXNzKCk7XG59XG5cbi8qKlxuICogQWRkcyBhIGNsYXNzbmFtZSB0byB0aGUgZGl2IHdpdGggYGxybi1hc3Nlc3NgIGZvciBzcGVjaWZpY2l0eS5cbiAqIEBzaW5jZSAyLjEzLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gYWRkVGhlbWVXcmFwcGVyQ2xhc3MoKSB7XG4gICAgY29uc3QgZWxBcGlXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxybi1hc3Nlc3MnKTtcblxuICAgIGlmIChlbEFwaVdyYXBwZXIpIHtcbiAgICAgICAgZWxBcGlXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2x0X190aGVtZScsIGBsdF9fdGhlbWUtJHtzdGF0ZS50aGVtZX1gKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/extensions/ui/themes/juniorQuest/index.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/validation/blockGrammarChecks.js": -/*!********************************************************************!*\ - !*** ./src/assessment/extensions/validation/blockGrammarChecks.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/app */ \"./src/assessment/core/app.js\");\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * This script blocks the Grammarly plugin and\n * browser spellcheck, autocorrect, autocapitalize\n * and autocomplete for:\n * - Plain text and Essay question types\n * - Annotations API notepad and sticky notes\n * @module Extensions/Assessment/blockGrammarChecks\n */\n\n/**\n * Looks for relevent question types and annotations\n * to add grammar blocking attributes to.\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.blockGrammarChecks.run();\n * @since 0.3.0\n */\nfunction run() {\n // Set up a listener on item load for any Plain Text or Essay question types\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', function (el) {\n setupGrammarBlocker();\n });\n\n // Set up a listener for the Annotations API notepad\n _core_app__WEBPACK_IMPORTED_MODULE_0__.annotationsApp().on('notepad:toggleVisibility', function (ev) {\n setupGrammarBlocker();\n });\n\n // Set up a listener for any Annotations API sticky notes\n _core_app__WEBPACK_IMPORTED_MODULE_0__.annotationsApp().on('stickynote:add', function (ev) {\n setupGrammarBlocker();\n });\n}\n\n/**\n * Add HTML element attributes (to certain editable fields)\n * that will block the Grammarly extension and prevent browser\n * spellchecking/autocorrect/autocapitalize/autocomplete\n * from working.\n * @since 0.3.0\n * @ignore\n */\nfunction setupGrammarBlocker() {\n let $els = [];\n let $elTextareas = [];\n // CSS classname added to Learnosity plain text and essay question types\n let elementClassnames = ['lrn_texteditor_editable'];\n // Parent Items API element\n let $elLearnosityNode = document.getElementById('learnosity_assess');\n\n // Look for found plain text or essay question types\n for (let i = 0; i < elementClassnames.length; i++) {\n $els = $elLearnosityNode.getElementsByClassName(elementClassnames[i]);\n if ($els.length) {\n for (let j = 0; j < $els.length; j++) {\n addBlockingAttributes($els[j]);\n }\n }\n }\n\n // Look for any textareas inside the Learnosity Items API\n $elTextareas = $elLearnosityNode.getElementsByTagName('textarea');\n for (let l = 0; l < $elTextareas.length; l++) {\n addBlockingAttributes($elTextareas[l]);\n }\n}\n\n/**\n * Add custom (grammar blocking) attributes to the passed\n * HTML DOM element.\n * @param {object} $el HTML element to add attributes to.\n * @since 0.3.0\n * @ignore\n */\nfunction addBlockingAttributes($el) {\n $el.setAttribute('data-gramm', 'false');\n $el.setAttribute('data-gramm_editor', 'false');\n $el.setAttribute('data-enable-grammarly', 'false');\n $el.setAttribute('spellcheck', 'false');\n $el.setAttribute('autocorrect', 'false');\n $el.setAttribute('autocomplete', 'false');\n $el.setAttribute('autocapitalize', 'false');\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3ZhbGlkYXRpb24vYmxvY2tHcmFtbWFyQ2hlY2tzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsSUFBSSxrREFBZTtBQUNuQjtBQUNBLEtBQUs7O0FBRUw7QUFDQSxJQUFJLHFEQUFrQjtBQUN0QjtBQUNBLEtBQUs7O0FBRUw7QUFDQSxJQUFJLHFEQUFrQjtBQUN0QjtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsOEJBQThCO0FBQ2xEO0FBQ0E7QUFDQSw0QkFBNEIsaUJBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvdmFsaWRhdGlvbi9ibG9ja0dyYW1tYXJDaGVja3MuanM/YjMyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi4vLi4vY29yZS9hcHAnO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIFRoaXMgc2NyaXB0IGJsb2NrcyB0aGUgR3JhbW1hcmx5IHBsdWdpbiBhbmRcbiAqIGJyb3dzZXIgc3BlbGxjaGVjaywgYXV0b2NvcnJlY3QsIGF1dG9jYXBpdGFsaXplXG4gKiBhbmQgYXV0b2NvbXBsZXRlIGZvcjpcbiAqICAtIFBsYWluIHRleHQgYW5kIEVzc2F5IHF1ZXN0aW9uIHR5cGVzXG4gKiAgLSBBbm5vdGF0aW9ucyBBUEkgbm90ZXBhZCBhbmQgc3RpY2t5IG5vdGVzXG4gKiBAbW9kdWxlIEV4dGVuc2lvbnMvQXNzZXNzbWVudC9ibG9ja0dyYW1tYXJDaGVja3NcbiAqL1xuXG4vKipcbiAqIExvb2tzIGZvciByZWxldmVudCBxdWVzdGlvbiB0eXBlcyBhbmQgYW5ub3RhdGlvbnNcbiAqIHRvIGFkZCBncmFtbWFyIGJsb2NraW5nIGF0dHJpYnV0ZXMgdG8uXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTFQgfSBmcm9tICdAY2FzcGluZ3VzL2x0L3NyYy9hc3Nlc3NtZW50L2luZGV4JztcbiAqXG4gKiBMVC5pbml0KGl0ZW1zQXBwKTsgLy8gU2V0IHVwIExUIHdpdGggdGhlIEl0ZW1zIEFQSSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB2YXJpYWJsZVxuICogTFQuZXh0ZW5zaW9ucy5ibG9ja0dyYW1tYXJDaGVja3MucnVuKCk7XG4gKiBAc2luY2UgMC4zLjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAvLyBTZXQgdXAgYSBsaXN0ZW5lciBvbiBpdGVtIGxvYWQgZm9yIGFueSBQbGFpbiBUZXh0IG9yIEVzc2F5IHF1ZXN0aW9uIHR5cGVzXG4gICAgYXBwLmFwcEluc3RhbmNlKCkub24oJ2l0ZW06bG9hZCcsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBzZXR1cEdyYW1tYXJCbG9ja2VyKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgdXAgYSBsaXN0ZW5lciBmb3IgdGhlIEFubm90YXRpb25zIEFQSSBub3RlcGFkXG4gICAgYXBwLmFubm90YXRpb25zQXBwKCkub24oJ25vdGVwYWQ6dG9nZ2xlVmlzaWJpbGl0eScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBzZXR1cEdyYW1tYXJCbG9ja2VyKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgdXAgYSBsaXN0ZW5lciBmb3IgYW55IEFubm90YXRpb25zIEFQSSBzdGlja3kgbm90ZXNcbiAgICBhcHAuYW5ub3RhdGlvbnNBcHAoKS5vbignc3RpY2t5bm90ZTphZGQnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgc2V0dXBHcmFtbWFyQmxvY2tlcigpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEFkZCBIVE1MIGVsZW1lbnQgYXR0cmlidXRlcyAodG8gY2VydGFpbiBlZGl0YWJsZSBmaWVsZHMpXG4gKiB0aGF0IHdpbGwgYmxvY2sgdGhlIEdyYW1tYXJseSBleHRlbnNpb24gYW5kIHByZXZlbnQgYnJvd3NlclxuICogc3BlbGxjaGVja2luZy9hdXRvY29ycmVjdC9hdXRvY2FwaXRhbGl6ZS9hdXRvY29tcGxldGVcbiAqIGZyb20gd29ya2luZy5cbiAqIEBzaW5jZSAwLjMuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBzZXR1cEdyYW1tYXJCbG9ja2VyKCkge1xuICAgIGxldCAkZWxzID0gW107XG4gICAgbGV0ICRlbFRleHRhcmVhcyA9IFtdO1xuICAgIC8vIENTUyBjbGFzc25hbWUgYWRkZWQgdG8gTGVhcm5vc2l0eSBwbGFpbiB0ZXh0IGFuZCBlc3NheSBxdWVzdGlvbiB0eXBlc1xuICAgIGxldCBlbGVtZW50Q2xhc3NuYW1lcyA9IFsnbHJuX3RleHRlZGl0b3JfZWRpdGFibGUnXTtcbiAgICAvLyBQYXJlbnQgSXRlbXMgQVBJIGVsZW1lbnRcbiAgICBsZXQgJGVsTGVhcm5vc2l0eU5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVhcm5vc2l0eV9hc3Nlc3MnKTtcblxuICAgIC8vIExvb2sgZm9yIGZvdW5kIHBsYWluIHRleHQgb3IgZXNzYXkgcXVlc3Rpb24gdHlwZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRDbGFzc25hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICRlbHMgPSAkZWxMZWFybm9zaXR5Tm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGVsZW1lbnRDbGFzc25hbWVzW2ldKTtcbiAgICAgICAgaWYgKCRlbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8ICRlbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBhZGRCbG9ja2luZ0F0dHJpYnV0ZXMoJGVsc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb29rIGZvciBhbnkgdGV4dGFyZWFzIGluc2lkZSB0aGUgTGVhcm5vc2l0eSBJdGVtcyBBUElcbiAgICAkZWxUZXh0YXJlYXMgPSAkZWxMZWFybm9zaXR5Tm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGV4dGFyZWEnKTtcbiAgICBmb3IgKGxldCBsID0gMDsgbCA8ICRlbFRleHRhcmVhcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBhZGRCbG9ja2luZ0F0dHJpYnV0ZXMoJGVsVGV4dGFyZWFzW2xdKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWRkIGN1c3RvbSAoZ3JhbW1hciBibG9ja2luZykgYXR0cmlidXRlcyB0byB0aGUgcGFzc2VkXG4gKiBIVE1MIERPTSBlbGVtZW50LlxuICogQHBhcmFtIHtvYmplY3R9ICRlbCBIVE1MIGVsZW1lbnQgdG8gYWRkIGF0dHJpYnV0ZXMgdG8uXG4gKiBAc2luY2UgMC4zLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gYWRkQmxvY2tpbmdBdHRyaWJ1dGVzKCRlbCkge1xuICAgICRlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZ3JhbW0nLCAnZmFsc2UnKTtcbiAgICAkZWwuc2V0QXR0cmlidXRlKCdkYXRhLWdyYW1tX2VkaXRvcicsICdmYWxzZScpO1xuICAgICRlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZW5hYmxlLWdyYW1tYXJseScsICdmYWxzZScpO1xuICAgICRlbC5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAnZmFsc2UnKTtcbiAgICAkZWwuc2V0QXR0cmlidXRlKCdhdXRvY29ycmVjdCcsICdmYWxzZScpO1xuICAgICRlbC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdmYWxzZScpO1xuICAgICRlbC5zZXRBdHRyaWJ1dGUoJ2F1dG9jYXBpdGFsaXplJywgJ2ZhbHNlJyk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/extensions/validation/blockGrammarChecks.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/validation/checkAnswerValidation.js": -/*!***********************************************************************!*\ - !*** ./src/assessment/extensions/validation/checkAnswerValidation.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _core_player__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/player */ \"./src/assessment/core/player.js\");\n\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * This extension is used in scenarios where you want the\n * user to attempt all questions, and check the answer,\n * prior to navigating to the next question.\n *\n * Autoscorable questions that have disabled auto scoring\n * will be ignored.\n *\n * Items API configuration overrides take precedence:\n * ```\n * {\n * \"config\": {\n * \"questions_api_init_options\": {\n * \"attribute_overrides\": {\n * \"instant_feedback\": false\n * }\n * }\n * }\n * }\n * ```\n * @module Extensions/Assessment/checkAnswerValidation\n */\n\nconst LOG_LEVEL = 'ERROR';\nconst state = {\n message: {\n header: 'Please check your answers',\n body: `

Before moving on, attempt all questions and click the \"Check Answer\" button.

\n

Note: the \"Check Answer\" button may not appear on every question.

`,\n },\n};\n\n/**\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/core';\n * import * as checkAnswerValidation from '@caspingus/lt/src/assessment/extensions/validation/checkAnswerValidation\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n *\n * // These are the default values. Override as needed.\n * const config = {\n * message: {\n * header: 'Please check your answers',\n * body: '

Before moving on, attempt all questions and click the \"Check Answer\" button.

Note: the \"Check Answer\" button may not appear on every question.

'\n * }\n * }\n * checkAnswerValidation.run(config);\n * @param {object=} config Object of configuration options. Currently only supports a message object with\n * 2 keys, `header` and `body`.\n * @since 2.11.0\n */\nfunction run(config) {\n if (config && config?.message) {\n if (state.message?.header.length) {\n state.message.header = config.message.header;\n }\n if (state.message?.body.length) {\n state.message.body = config.message.body;\n }\n }\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:beforeunload', e => {\n setup(e);\n });\n}\n\n/**\n * Runs the setup logic for the check answer extension every time\n * a user tries to navigate away from the current item.\n * @param {object} e Item event object\n * @since 2.11.0\n * @ignore\n */\nfunction setup(e) {\n const itemHasCheckAnswer = hasCheckAnswer();\n\n if (itemHasCheckAnswer) {\n if (!hasUsedCheckAnswer()) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_2__[\"default\"].debug('Disabling navigation.', LOG_LEVEL);\n e.preventDefault();\n launchMessage();\n }\n }\n}\n\n/**\n * Sets up the logic for whether to disable navigation and wait\n * for the user to check the answer.\n *\n * If we don't find a check answer button, do nothing (check on question JSON and activity override)\n * If we don't find a scorable question, do nothing\n * We don't consider fully attempted. Simply checking answer is sufficient\n * @since 2.11.0\n * @ignore\n * @returns {boolean}\n */\nfunction hasCheckAnswer() {\n const itemQuestions = _core_questions__WEBPACK_IMPORTED_MODULE_1__.questions();\n let hasCheckAnswer = false;\n\n for (let q of itemQuestions) {\n let response_id = q.response_id;\n\n if (_core_questions__WEBPACK_IMPORTED_MODULE_1__.hasCheckAnswer(response_id)) {\n hasCheckAnswer = true;\n break;\n }\n }\n\n return hasCheckAnswer;\n}\n\n/**\n * Determines whether the user has used the \"Check Answer\" button\n * on all valid questions on the current item. If there is no\n * check answer button (or we're on a feature-only item), we\n * return true.\n * @since 2.11.0\n * @ignore\n * @returns {boolean}\n */\nfunction hasUsedCheckAnswer() {\n const itemQuestions = _core_questions__WEBPACK_IMPORTED_MODULE_1__.questions();\n\n for (let q of itemQuestions) {\n let response_id = q.response_id;\n\n if (\n _core_questions__WEBPACK_IMPORTED_MODULE_1__.hasCheckAnswer(response_id) &&\n (!_core_questions__WEBPACK_IMPORTED_MODULE_1__.questionResponse(response_id) || !_core_questions__WEBPACK_IMPORTED_MODULE_1__.questionResponse(response_id).hasOwnProperty('feedbackAttemptsCount'))\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Launches a message to the user to check their answer before\n * navigating to the next question.\n * @since 2.11.0\n * @ignore\n */\nfunction launchMessage() {\n (0,_core_player__WEBPACK_IMPORTED_MODULE_3__.dialog)({\n header: state.message.header,\n body: state.message.body,\n buttons: [\n {\n button_id: 'lt__check_answer_validation',\n label: 'Close',\n is_primary: false,\n },\n ],\n });\n _core_app__WEBPACK_IMPORTED_MODULE_0__.assessApp().on('button:lt__check_answer_validation:clicked', () => {\n (0,_core_player__WEBPACK_IMPORTED_MODULE_3__.hideDialog)();\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3ZhbGlkYXRpb24vY2hlY2tBbnN3ZXJWYWxpZGF0aW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQXNDO0FBQ1k7QUFDUDtBQUNZOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksa0RBQWU7QUFDbkI7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVkscURBQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLDBCQUEwQixzREFBbUI7QUFDN0M7O0FBRUE7QUFDQTs7QUFFQSxZQUFZLDJEQUF3QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSwwQkFBMEIsc0RBQW1COztBQUU3QztBQUNBOztBQUVBO0FBQ0EsWUFBWSwyREFBd0I7QUFDcEMsY0FBYyw2REFBMEIsa0JBQWtCLDZEQUEwQjtBQUNwRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxvREFBTTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsS0FBSztBQUNMLElBQUksZ0RBQWE7QUFDakIsUUFBUSx3REFBVTtBQUNsQixLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vc3JjL2Fzc2Vzc21lbnQvZXh0ZW5zaW9ucy92YWxpZGF0aW9uL2NoZWNrQW5zd2VyVmFsaWRhdGlvbi5qcz9iNGY1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFwcCBmcm9tICcuLi8uLi9jb3JlL2FwcCc7XG5pbXBvcnQgKiBhcyBxdWVzdGlvbnMgZnJvbSAnLi4vLi4vY29yZS9xdWVzdGlvbnMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgZGlhbG9nLCBoaWRlRGlhbG9nIH0gZnJvbSAnLi4vLi4vY29yZS9wbGF5ZXInO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIFRoaXMgZXh0ZW5zaW9uIGlzIHVzZWQgaW4gc2NlbmFyaW9zIHdoZXJlIHlvdSB3YW50IHRoZVxuICogdXNlciB0byBhdHRlbXB0IGFsbCBxdWVzdGlvbnMsIGFuZCBjaGVjayB0aGUgYW5zd2VyLFxuICogcHJpb3IgdG8gbmF2aWdhdGluZyB0byB0aGUgbmV4dCBxdWVzdGlvbi5cbiAqXG4gKiBBdXRvc2NvcmFibGUgcXVlc3Rpb25zIHRoYXQgaGF2ZSBkaXNhYmxlZCBhdXRvIHNjb3JpbmdcbiAqIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBJdGVtcyBBUEkgY29uZmlndXJhdGlvbiBvdmVycmlkZXMgdGFrZSBwcmVjZWRlbmNlOlxuICogYGBgXG4gKiB7XG4gKiAgICAgXCJjb25maWdcIjoge1xuICogICAgICAgICBcInF1ZXN0aW9uc19hcGlfaW5pdF9vcHRpb25zXCI6IHtcbiAqICAgICAgICAgICAgIFwiYXR0cmlidXRlX292ZXJyaWRlc1wiOiB7XG4gKiAgICAgICAgICAgICAgICAgXCJpbnN0YW50X2ZlZWRiYWNrXCI6IGZhbHNlXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBtb2R1bGUgRXh0ZW5zaW9ucy9Bc3Nlc3NtZW50L2NoZWNrQW5zd2VyVmFsaWRhdGlvblxuICovXG5cbmNvbnN0IExPR19MRVZFTCA9ICdFUlJPUic7XG5jb25zdCBzdGF0ZSA9IHtcbiAgICBtZXNzYWdlOiB7XG4gICAgICAgIGhlYWRlcjogJ1BsZWFzZSBjaGVjayB5b3VyIGFuc3dlcnMnLFxuICAgICAgICBib2R5OiBgPHA+QmVmb3JlIG1vdmluZyBvbiwgYXR0ZW1wdCBhbGwgcXVlc3Rpb25zIGFuZCBjbGljayB0aGUgXCJDaGVjayBBbnN3ZXJcIiBidXR0b24uPC9wPlxuICAgICAgICAgICAgPHA+Tm90ZTogdGhlIFwiQ2hlY2sgQW5zd2VyXCIgYnV0dG9uIG1heSBub3QgYXBwZWFyIG9uIGV2ZXJ5IHF1ZXN0aW9uLjwvcD5gLFxuICAgIH0sXG59O1xuXG4vKipcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBMVCB9IGZyb20gJ0BjYXNwaW5ndXMvbHQvc3JjL2Fzc2Vzc21lbnQvY29yZSc7XG4gKiBpbXBvcnQgKiBhcyBjaGVja0Fuc3dlclZhbGlkYXRpb24gZnJvbSAnQGNhc3Bpbmd1cy9sdC9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3ZhbGlkYXRpb24vY2hlY2tBbnN3ZXJWYWxpZGF0aW9uXG4gKlxuICogTFQuaW5pdChpdGVtc0FwcCk7IC8vIFNldCB1cCBMVCB3aXRoIHRoZSBJdGVtcyBBUEkgYXBwbGljYXRpb24gaW5zdGFuY2UgdmFyaWFibGVcbiAqXG4gKiAvLyBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgdmFsdWVzLiBPdmVycmlkZSBhcyBuZWVkZWQuXG4gKiBjb25zdCBjb25maWcgPSB7XG4gKiAgICAgbWVzc2FnZToge1xuICogICAgICAgICBoZWFkZXI6ICdQbGVhc2UgY2hlY2sgeW91ciBhbnN3ZXJzJyxcbiAqICAgICAgICAgYm9keTogJzxwPkJlZm9yZSBtb3Zpbmcgb24sIGF0dGVtcHQgYWxsIHF1ZXN0aW9ucyBhbmQgY2xpY2sgdGhlIFwiQ2hlY2sgQW5zd2VyXCIgYnV0dG9uLjwvcD48cD5Ob3RlOiB0aGUgXCJDaGVjayBBbnN3ZXJcIiBidXR0b24gbWF5IG5vdCBhcHBlYXIgb24gZXZlcnkgcXVlc3Rpb24uPC9wPidcbiAqICAgICB9XG4gKiB9XG4gKiBjaGVja0Fuc3dlclZhbGlkYXRpb24ucnVuKGNvbmZpZyk7XG4gKiBAcGFyYW0ge29iamVjdD19IGNvbmZpZyBPYmplY3Qgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zLiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGhcbiAqICAyIGtleXMsIGBoZWFkZXJgIGFuZCBgYm9keWAuXG4gKiBAc2luY2UgMi4xMS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW4oY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWc/Lm1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHN0YXRlLm1lc3NhZ2U/LmhlYWRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0YXRlLm1lc3NhZ2UuaGVhZGVyID0gY29uZmlnLm1lc3NhZ2UuaGVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5tZXNzYWdlPy5ib2R5Lmxlbmd0aCkge1xuICAgICAgICAgICAgc3RhdGUubWVzc2FnZS5ib2R5ID0gY29uZmlnLm1lc3NhZ2UuYm9keTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFwcC5hcHBJbnN0YW5jZSgpLm9uKCdpdGVtOmJlZm9yZXVubG9hZCcsIGUgPT4ge1xuICAgICAgICBzZXR1cChlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBzZXR1cCBsb2dpYyBmb3IgdGhlIGNoZWNrIGFuc3dlciBleHRlbnNpb24gZXZlcnkgdGltZVxuICogYSB1c2VyIHRyaWVzIHRvIG5hdmlnYXRlIGF3YXkgZnJvbSB0aGUgY3VycmVudCBpdGVtLlxuICogQHBhcmFtIHtvYmplY3R9IGUgSXRlbSBldmVudCBvYmplY3RcbiAqIEBzaW5jZSAyLjExLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0dXAoZSkge1xuICAgIGNvbnN0IGl0ZW1IYXNDaGVja0Fuc3dlciA9IGhhc0NoZWNrQW5zd2VyKCk7XG5cbiAgICBpZiAoaXRlbUhhc0NoZWNrQW5zd2VyKSB7XG4gICAgICAgIGlmICghaGFzVXNlZENoZWNrQW5zd2VyKCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGlzYWJsaW5nIG5hdmlnYXRpb24uJywgTE9HX0xFVkVMKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGxhdW5jaE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTZXRzIHVwIHRoZSBsb2dpYyBmb3Igd2hldGhlciB0byBkaXNhYmxlIG5hdmlnYXRpb24gYW5kIHdhaXRcbiAqIGZvciB0aGUgdXNlciB0byBjaGVjayB0aGUgYW5zd2VyLlxuICpcbiAqIElmIHdlIGRvbid0IGZpbmQgYSBjaGVjayBhbnN3ZXIgYnV0dG9uLCBkbyBub3RoaW5nIChjaGVjayBvbiBxdWVzdGlvbiBKU09OIGFuZCBhY3Rpdml0eSBvdmVycmlkZSlcbiAqIElmIHdlIGRvbid0IGZpbmQgYSBzY29yYWJsZSBxdWVzdGlvbiwgZG8gbm90aGluZ1xuICogV2UgZG9uJ3QgY29uc2lkZXIgZnVsbHkgYXR0ZW1wdGVkLiBTaW1wbHkgY2hlY2tpbmcgYW5zd2VyIGlzIHN1ZmZpY2llbnRcbiAqIEBzaW5jZSAyLjExLjBcbiAqIEBpZ25vcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBoYXNDaGVja0Fuc3dlcigpIHtcbiAgICBjb25zdCBpdGVtUXVlc3Rpb25zID0gcXVlc3Rpb25zLnF1ZXN0aW9ucygpO1xuICAgIGxldCBoYXNDaGVja0Fuc3dlciA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgcSBvZiBpdGVtUXVlc3Rpb25zKSB7XG4gICAgICAgIGxldCByZXNwb25zZV9pZCA9IHEucmVzcG9uc2VfaWQ7XG5cbiAgICAgICAgaWYgKHF1ZXN0aW9ucy5oYXNDaGVja0Fuc3dlcihyZXNwb25zZV9pZCkpIHtcbiAgICAgICAgICAgIGhhc0NoZWNrQW5zd2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0NoZWNrQW5zd2VyO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgdXNlciBoYXMgdXNlZCB0aGUgXCJDaGVjayBBbnN3ZXJcIiBidXR0b25cbiAqIG9uIGFsbCB2YWxpZCBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgaXRlbS4gSWYgdGhlcmUgaXMgbm9cbiAqIGNoZWNrIGFuc3dlciBidXR0b24gKG9yIHdlJ3JlIG9uIGEgZmVhdHVyZS1vbmx5IGl0ZW0pLCB3ZVxuICogcmV0dXJuIHRydWUuXG4gKiBAc2luY2UgMi4xMS4wXG4gKiBAaWdub3JlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaGFzVXNlZENoZWNrQW5zd2VyKCkge1xuICAgIGNvbnN0IGl0ZW1RdWVzdGlvbnMgPSBxdWVzdGlvbnMucXVlc3Rpb25zKCk7XG5cbiAgICBmb3IgKGxldCBxIG9mIGl0ZW1RdWVzdGlvbnMpIHtcbiAgICAgICAgbGV0IHJlc3BvbnNlX2lkID0gcS5yZXNwb25zZV9pZDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBxdWVzdGlvbnMuaGFzQ2hlY2tBbnN3ZXIocmVzcG9uc2VfaWQpICYmXG4gICAgICAgICAgICAoIXF1ZXN0aW9ucy5xdWVzdGlvblJlc3BvbnNlKHJlc3BvbnNlX2lkKSB8fCAhcXVlc3Rpb25zLnF1ZXN0aW9uUmVzcG9uc2UocmVzcG9uc2VfaWQpLmhhc093blByb3BlcnR5KCdmZWVkYmFja0F0dGVtcHRzQ291bnQnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMYXVuY2hlcyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgdG8gY2hlY2sgdGhlaXIgYW5zd2VyIGJlZm9yZVxuICogbmF2aWdhdGluZyB0byB0aGUgbmV4dCBxdWVzdGlvbi5cbiAqIEBzaW5jZSAyLjExLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gbGF1bmNoTWVzc2FnZSgpIHtcbiAgICBkaWFsb2coe1xuICAgICAgICBoZWFkZXI6IHN0YXRlLm1lc3NhZ2UuaGVhZGVyLFxuICAgICAgICBib2R5OiBzdGF0ZS5tZXNzYWdlLmJvZHksXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBidXR0b25faWQ6ICdsdF9fY2hlY2tfYW5zd2VyX3ZhbGlkYXRpb24nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2xvc2UnLFxuICAgICAgICAgICAgICAgIGlzX3ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9KTtcbiAgICBhcHAuYXNzZXNzQXBwKCkub24oJ2J1dHRvbjpsdF9fY2hlY2tfYW5zd2VyX3ZhbGlkYXRpb246Y2xpY2tlZCcsICgpID0+IHtcbiAgICAgICAgaGlkZURpYWxvZygpO1xuICAgIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/assessment/extensions/validation/checkAnswerValidation.js\n"); - -/***/ }), - -/***/ "./src/assessment/extensions/validation/essayLimitByCharacter.js": -/*!***********************************************************************!*\ - !*** ./src/assessment/extensions/validation/essayLimitByCharacter.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ run: () => (/* binding */ run)\n/* harmony export */ });\n/* harmony import */ var _core_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../core/app */ \"./src/assessment/core/app.js\");\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/logger */ \"./src/utils/logger.js\");\n/* harmony import */ var _core_activity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/activity */ \"./src/assessment/core/activity.js\");\n/* harmony import */ var _core_player__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/player */ \"./src/assessment/core/player.js\");\n/* harmony import */ var _core_items__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/items */ \"./src/assessment/core/items.js\");\n/* harmony import */ var _core_questions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../core/questions */ \"./src/assessment/core/questions.js\");\n/* harmony import */ var entities__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! entities */ \"./node_modules/entities/lib/esm/index.js\");\n\n\n\n\n\n\n\n\n/**\n * Extensions add specific functionality to Items API.\n * They rely on modules within LT being available.\n *\n * --\n *\n * This script changes the essay validation check on\n * string length to be character based, instead of\n * the default word based.\n *\n * It ignores spaces by default, so they are not\n * treated as characters to validate length.\n *\n * Works with `longtextV2` and `plaintext` question types.\n * @module Extensions/Assessment/essayLimitByCharacter\n */\n\nconst state = {\n includeSpaces: false,\n renderedCss: false,\n validTypes: ['longtextV2', 'plaintext'],\n};\n\n/**\n * Looks for relevent question types and overrides validation\n * to be on character length. Uses the `max_length` (Word limit)\n * that was set up in authoring, treating the value as a character\n * length instead of word length.\n *\n * **Known limitations**\n *\n * If the assessment player is in responsive mode (< 800px) and\n * you *don't* have the review screen enabled (which it is by default)\n * then we can't inject a custom button. This means we render the\n * default Finish button, and no prevent submission will occur.\n * The solution is to use any of the valid regions (`main`,\n * `horizontal`, or `horizontal-fixed`) and don't decouple the\n * submit button from the review button in Items API configuration.\n *\n * Essentially, if you're using default options, you'll be fine.\n *\n * If submitting via the JavaScript `submit()` method, this will\n * skip the validation check.\n *\n * **Preventing submission**\n *\n * By default, questions are authored to prevent the user from\n * submitting their session in the event of word limit violations.\n * The same behaviour is inherited in this extension. If you don't\n * want to prevent submission, you can check the `Submit over limit`\n * option in the question authoring area.\n *\n * To prevent submission, we need to add a custom button to Items\n * API becuase we can't easily inject a validation check when the\n * default submit button is clicked, so we need to replace it with\n * a custom one.\n *\n * Adding a custom button is a capability in Items API. Below is a code\n * snippet of an Items API configuration object. Note the custom button\n * is added in `region_overrides`.\n *\n * You MUST use the `icon_class` and `name` as defined in the custom\n * button `options` object below.\n *\n * **`main` region**\n * ```\n * {\n * \"config\": {\n * \"regions\": \"main\",\n * \"region_overrides\": {\n * \"bottom-right\": [\n * {\n * \"type\": \"custom_button\",\n * \"options\": {\n * \"name\": \"btn-essay-character-limit-submit\",\n * \"label\": \"Finish\",\n * \"icon_class\": \"item-next hidden\"\n * },\n * \"position\": \"right\"\n * },\n * {\n * \"type\": \"next_button\",\n * \"position\": \"right\"\n * },\n * {\n * \"type\": \"previous_button\",\n * \"position\": \"right\"\n * }\n * ]\n * }\n * }\n * }\n * ```\n *\n * **`horizontal` or `horizontal-fixed` regions**\n * ```\n * {\n * \"config\": {\n * \"regions\": \"horizontal\",\n * \"region_overrides\": {\n * \"bottom\": [\n * {\n * \"type\": \"custom_button\",\n * \"options\": {\n * \"name\": \"btn-essay-character-limit-submit\",\n * \"label\": \"Finish\",\n * \"icon_class\": \"item-next hidden\"\n * },\n * \"position\": \"right\"\n * },\n * {\n * \"type\": \"next_button\",\n * \"position\": \"right\"\n * },\n * {\n * \"type\": \"horizontaltoc_element\",\n * \"position\": \"right\"\n * },\n * {\n * \"type\": \"previous_button\",\n * \"position\": \"right\"\n * }\n * ]\n * }\n * }\n * }\n * ```\n *\n * **Changing labels**\n *\n * This extension will automatically change `Word Limit` to `Character Limit` in the\n * footer of the essay question types. However, for full coverage in review mode, or\n * in authoring and reporting, you should use label bundles. Eg:\n *\n * **Assessment label bundle**\n *\n * Use this in Items and Reports APIs.\n *\n * Caveat: this will update Math Essay and Chemistry Essay footers as well.\n * ```\n * {\n * \"config\": {\n * \"questions_api_init_options\": {\n * \"labelBundle\": {\n * \"wordLength\": \"Character Limit\"\n * }\n * }\n * }\n * }\n * ```\n *\n * **Authoring label bundle**\n *\n * Use this in Author API.\n * ```\n * {\n * \"config\": {\n * \"dependencies\": {\n * \"question_editor_api\": {\n * \"init_options\": {\n * \"label_bundle\": {\n * \"help.longtextV2.name:max_length\": \"Character limit\",\n * \"help.longtextV2.name:show_word_limit\": \"Character limit\",\n * \"help.longtextV2.description:max_length\": \"Maximum number of characters that can be entered in the text entry area (max 10,000 characters).\",\n * \"help.longtextV2.description:show_word_limit\": \"Defines whether the character limit should be displayed in the toolbar or not. The options are:
  • Always On - Character Limit is always displayed.
  • On Limit - Character Limit will only be displayed when the limit is reached.
  • Off - Character Limit will not be displayed.
\",\n * \"help.longtextV2.description:submit_over_limit\": \"Determines if the user can save/submit text when the character limit has been exceeded.\",\n * \"longtextV2:max_length\": \"Character limit\",\n * \"longtextV2:show_word_count\": \"Show character count\",\n * \"longtextV2:show_word_limit\": \"Character limit\",\n * \"help.plaintext.name:max_length\": \"Character limit\",\n * \"help.plaintext.name:show_word_limit\": \"Character limit\",\n * \"help.plaintext.description:max_length\": \"Maximum number of characters that can be entered in the text entry area (max 10,000 characters).\",\n * \"help.plaintext.description:show_word_limit\": \"Defines whether the character limit should be displayed in the toolbar or not. The options are:
  • Always On - Character Limit is always displayed.
  • On Limit - Character Limit will only be displayed when the limit is reached.
  • Off - Character Limit will not be displayed.
\",\n * \t \"plaintext:max_length\": \"Character limit\",\n * \"plaintext:show_word_limit\": \"Character limit\"\n * }\n * }\n * },\n * \"questions_api\": {\n * \"init_options\": {\n * \"labelBundle\": {\n * \"wordLength\": \"Character Limit\"\n * }\n * }\n * }\n * }\n * }\n * }\n * ```\n *\n * @example\n * import { LT } from '@caspingus/lt/src/assessment/index';\n *\n * LT.init(itemsApp); // Set up LT with the Items API application instance variable\n * LT.extensions.essayLimitByCharacter.run();\n * @param {boolean} includeSpaces Whether to include spaces in the character count\n * Default is `false`.\n * @since 0.10.0\n */\nfunction run(includeSpaces = false) {\n state.includeSpaces = Boolean(includeSpaces);\n\n if (!state.renderedCss) injectCSS();\n\n setQuestionListeners();\n\n // Set up a listener on item load to check Finish button state\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('item:load', function (el) {\n setSubmitButtonState();\n });\n\n const elCustomSubmit = document.querySelector('.custom_btn.item-next');\n if (elCustomSubmit) {\n elCustomSubmit.classList.add('lrn_btn_blue');\n setupSubmitPrevention();\n } else {\n _utils_logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].error('No custom submit button found. Character length validation will occur, but no submission prevention.');\n }\n}\n\n/**\n * Checks resume mode, on load of the API to see whether we have\n * existing responses to load an accurate character count for.\n * Also sets a change listener on all valid types to check limit.\n * @since 1.3.0\n * @ignore\n */\nfunction setQuestionListeners() {\n const questions = _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getQuestions();\n\n for (const [key, value] of Object.entries(questions)) {\n if (state.validTypes.indexOf(value.type) >= 0) {\n let questionInstance = _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().question(value.response_id);\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance()\n .question(value.response_id)\n .on('rendered', () => {\n setupEssayValidationUI(questionInstance);\n\n // Check on load for existing responses\n if (_core_activity__WEBPACK_IMPORTED_MODULE_2__.isResuming()) {\n checkLimit(questionInstance);\n }\n });\n\n questionInstance.on('changed', () => {\n checkLimit(questionInstance);\n });\n }\n }\n}\n\n/**\n * Checks the user response to see if they are\n * over the validation limit.\n * @param {object} questionInstance\n * @param {boolean} setUI Whether to add UI validation.\n * @returns {boolean}\n * @since 0.10.0\n * @ignore\n */\nfunction checkLimit(questionInstance, setUI = true) {\n const type = questionInstance.getQuestion().type;\n const maxLength = questionInstance.getQuestion().max_length;\n const rawResponse = questionInstance.getResponse()?.value ? questionInstance.getResponse()?.value : '';\n let validLength = true;\n let response;\n let strLength;\n\n if (type === 'plaintext') {\n response = state.includeSpaces ? rawResponse : stripSpaces(rawResponse);\n strLength = response.length;\n } else {\n response = state.includeSpaces ? stripHtml(rawResponse) : stripSpaces(stripHtml(rawResponse));\n strLength = entities__WEBPACK_IMPORTED_MODULE_6__.decodeHTML(response).length;\n }\n\n if (maxLength) {\n if (strLength > maxLength) {\n validLength = false;\n }\n }\n\n if (setUI) {\n setValidationUI(questionInstance, validLength, strLength);\n }\n\n return validLength;\n}\n\n/**\n * Updates the character count in the UI and, if\n * necessary, sets validation classes.\n * @param {object} questionInstance\n * @param {boolean} isValid\n * @param {number} strLength\n * @since 0.10.0\n * @ignore\n */\nfunction setValidationUI(questionInstance, isValid, strLength) {\n const id = questionInstance.getQuestion().response_id;\n const elContainer = document.getElementById(id);\n const elEditor = elContainer.querySelector('.lrn_texteditor_editable');\n const elWordCount = elContainer.querySelector('.lrn_word_count');\n const elLengthIndicator = elContainer.querySelector('.lrn_length_indicator');\n const warningClassIndicator = 'lrn_wordcount_warning_label';\n const warningClassEditor = 'lrn_wordcount_warning';\n let characterCount = strLength;\n\n if (questionInstance.getQuestion().type === 'plaintext') {\n characterCount = strLength + ' /';\n setTimeout(() => {\n setUI();\n }, 10);\n } else {\n setUI();\n }\n\n function setUI() {\n elWordCount.textContent = characterCount;\n if (!isValid) {\n elEditor.classList.add(warningClassEditor);\n elLengthIndicator.classList.add(warningClassIndicator);\n } else {\n elEditor.classList.remove(warningClassEditor);\n elLengthIndicator.classList.remove(warningClassIndicator);\n }\n }\n}\n\n/**\n * Replaces `Word` with `Character` in the default UI if a\n * label bundle hasn't been set in Items API config.\n * @param {object} questionInstance\n * @since 0.10.0\n * @ignore\n */\nfunction setupEssayValidationUI(questionInstance) {\n const hasLabelBundle = _core_activity__WEBPACK_IMPORTED_MODULE_2__.activity()?.config?.questions_api_init_options?.labelBundle?.wordLength;\n\n if (!hasLabelBundle) {\n const id = questionInstance.getQuestion().response_id;\n const elContainer = document.getElementById(id);\n const elWordLimit = elContainer.querySelector('.lrn_word_limit');\n const wordLimitText = elWordLimit.textContent;\n const newWordLimitText = wordLimitText.replace('Word', 'Character');\n\n elWordLimit.textContent = newWordLimitText;\n }\n}\n\n/**\n * Sets up click events on the possible submit buttons, then\n * calls checkValidResponses() when clicked.\n * Possible submit buttons are \"Finish\" inside the review screen,\n * or the custom button declared in Items API configuration.\n * @since 1.1.0\n * @ignore\n */\nfunction setupSubmitPrevention() {\n const elCustomSubmit = document.querySelector('.custom_btn.item-next');\n\n if (elCustomSubmit) {\n elCustomSubmit.addEventListener('click', checkValidResponses);\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('test:panel:shown', e => {\n let elReviewSubmit = document.querySelector('.panel-footer .test-submit');\n if (elReviewSubmit) {\n elReviewSubmit.addEventListener('click', checkValidResponses);\n }\n });\n }\n}\n\n/**\n * Checks any essays on the session and their character length.\n * If the length on any is invalid, and the `submit_over_limit`\n * flag isn't set, we prevent submission.\n * Works when the custom submit button is clicked, or when we\n * override the \"Finish\" button in the review screen. We only\n * do the latter when a custom submit button also exists.\n * @param {object} e Click event object.\n * @since 1.1.0\n * @ignore\n */\nfunction checkValidResponses(e) {\n const sessionQuestions = _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().getQuestions();\n let invalidResponseIds = [];\n\n for (const q in sessionQuestions) {\n if (state.validTypes.includes(sessionQuestions[q].type)) {\n if (!sessionQuestions[q]?.submit_over_limit && !checkLimit(_core_questions__WEBPACK_IMPORTED_MODULE_5__.questionInstance(q), false)) {\n invalidResponseIds.push(q);\n }\n }\n }\n\n if (invalidResponseIds.length) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].warn('Invalid essay response length found.');\n e.preventDefault();\n e.stopPropagation();\n\n let itemReferences = [];\n for (let i = 0; i < invalidResponseIds.length; i++) {\n let temp = _core_items__WEBPACK_IMPORTED_MODULE_4__.itemByResponseId(invalidResponseIds[i]);\n if (temp) {\n itemReferences.push(temp.source.reference);\n }\n }\n\n loadErrorDialog(itemReferences);\n } else {\n submit();\n }\n}\n\n/**\n * Handles showing/hiding the default \"Finish\" button with a\n * custom button as declared in Items API configuration. We\n * need to do this because we can't preventDefault on the default\n * submit (Finish) button.\n * Executes on every item:load event.\n * @since 1.1.0\n * @ignore\n */\nfunction setSubmitButtonState() {\n const elDefaultSubmit = document.querySelector('.test-submit.item-next');\n const elCustomSubmit = document.querySelector('.custom_btn.item-next');\n\n if (elCustomSubmit && !_core_player__WEBPACK_IMPORTED_MODULE_3__.isResponsiveMode()) {\n if (!_core_items__WEBPACK_IMPORTED_MODULE_4__.isLastItem()) {\n elCustomSubmit.classList.add('hidden');\n } else {\n if (hasReviewScreenOnFinish() && _core_activity__WEBPACK_IMPORTED_MODULE_2__.region()) {\n elCustomSubmit.classList.add('hidden');\n } else {\n elDefaultSubmit.classList.add('hidden');\n elCustomSubmit.classList.remove('hidden');\n }\n }\n }\n}\n\n/**\n * Checks to see if the session was set up with a review\n * screen as the last step prior to submission. We need\n * to know this because in that scenario, there is a \"Review\"\n * button ono the last item instead of \"Finish\".\n * @returns {boolean}\n * @since 1.1.0\n * @ignore\n */\nfunction hasReviewScreenOnFinish() {\n const hasReviewElement = document.querySelector('.review-screen');\n const isDecoupled = _core_activity__WEBPACK_IMPORTED_MODULE_2__.activity()?.config?.configuration?.decouple_submit_from_review;\n\n if (!hasReviewElement || isDecoupled) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Loads a custom Items API dialog to alert the user they\n * have invalid response. This is the same as the default\n * modal we have for word count violations.\n * We check for labels from the Items API config object\n * first, otherwise we use the default (english) labels.\n * @param {array} itemReferences\n * @since 1.1.0\n * @ignore\n */\nfunction loadErrorDialog(itemReferences) {\n const labels = {\n question: _core_activity__WEBPACK_IMPORTED_MODULE_2__.activity()?.config?.labelBundle?.question || 'Question',\n submitTest: _core_activity__WEBPACK_IMPORTED_MODULE_2__.activity()?.config?.labelBundle?.submitTest || 'Submit activity',\n decline: _core_activity__WEBPACK_IMPORTED_MODULE_2__.activity()?.config?.labelBundle?.decline || 'Cancel',\n invalidQuestionsMessage:\n _core_activity__WEBPACK_IMPORTED_MODULE_2__.activity()?.config?.labelBundle?.invalidQuestionsMessage ||\n 'The following questions are not currently valid. Please follow the links to review',\n };\n let template = `\n

${labels.invalidQuestionsMessage}

\n
    \n `;\n\n for (let i = 0; i < itemReferences.length; i++) {\n template += ``;\n }\n\n template += '
';\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.assessApp().on('button:btn_essay_character_limit_cancel:clicked', () => {\n _core_player__WEBPACK_IMPORTED_MODULE_3__.hideDialog();\n });\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().on('test:panel:show', () => {\n setTimeout(() => {\n const elLinks = document.querySelectorAll('.essay-limit-character-item');\n if (elLinks) {\n elLinks.forEach(el => {\n let itemReference = el.getAttribute('data-item-reference');\n el.addEventListener('click', () => {\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().items().goto(itemReference);\n _core_player__WEBPACK_IMPORTED_MODULE_3__.hideDialog();\n });\n });\n }\n }, 500);\n });\n\n _core_player__WEBPACK_IMPORTED_MODULE_3__.dialog({\n header: labels.submitTest,\n body: template,\n buttons: [\n {\n button_id: 'btn_essay_character_limit_cancel',\n label: labels.decline,\n is_primary: true,\n },\n ],\n });\n}\n\n/**\n * Because we are using a custom submit button, we need\n * to submit manually when the button is clicked. However,\n * we do this by sending a click through the (hidden)\n * default submit button. This way we get the player behaviour\n * for submission that isn't available using the submit() method.\n * If for some reason there is no default submit button, we\n * submit using the method, with no default checks.\n * @since 1.1.0\n * @ignore\n */\nfunction submit() {\n const elDefaultSubmit = document.getElementById('lrn_assess_next_btn');\n\n if (elDefaultSubmit) {\n elDefaultSubmit.click();\n } else {\n const settings = {\n show_submit_confirmation: true,\n show_submit_ui: true,\n\n success: function (response_ids) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].info('Submit was successful', response_ids);\n },\n\n error: function (event) {\n _utils_logger__WEBPACK_IMPORTED_MODULE_1__[\"default\"].error('Submit has failed', event);\n },\n };\n\n _core_app__WEBPACK_IMPORTED_MODULE_0__.appInstance().submit(settings);\n }\n}\n\n/**\n * Strips HTML from a string.\n * @param {string} s\n * @returns {string}\n * @since 0.10.0\n * @ignore\n */\nfunction stripHtml(s) {\n return s.replace(/<[^>]*>/g, '').trim();\n}\n\n/**\n * Strips spaces from a string.\n * @param {string} s\n * @returns {string}\n * @since 0.10.0\n * @ignore\n */\nfunction stripSpaces(s) {\n return s.replace(/\\s+/g, '');\n}\n\n/**\n * Injects the necessary CSS to the header\n * @since 0.10.0\n * @ignore\n */\nfunction injectCSS() {\n const elStyle = document.createElement('style');\n const css = `\n/* Learnosity essay limit by character styles */\n.lrn_widget .lrn_word_count,\n.lrn_widget .lrn_character_count {\n margin-right: 0px;\n}\n`;\n\n elStyle.textContent = css;\n document.head.append(elStyle);\n\n state.renderedCss = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9leHRlbnNpb25zL3ZhbGlkYXRpb24vZXNzYXlMaW1pdEJ5Q2hhcmFjdGVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQXNDO0FBQ0s7QUFDSztBQUNKO0FBQ0Y7QUFDUTtBQUNiOztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ087QUFDUDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLElBQUksa0RBQWU7QUFDbkI7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLFFBQVEscURBQU07QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0RBQWU7O0FBRXJDO0FBQ0E7QUFDQSxtQ0FBbUMsa0RBQWU7O0FBRWxELFlBQVksa0RBQWU7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHNEQUFtQjtBQUMzQztBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxvQkFBb0IsZ0RBQW1CO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsb0RBQWlCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsUUFBUSxrREFBZTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGtEQUFlO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSx1RUFBdUUsNkRBQTBCO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxxREFBTTtBQUNkO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsK0JBQStCO0FBQ3ZELHVCQUF1Qix5REFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsMERBQXVCO0FBQ2xELGFBQWEsbURBQWdCO0FBQzdCO0FBQ0EsVUFBVTtBQUNWLDZDQUE2QyxrREFBZTtBQUM1RDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9EQUFpQjs7QUFFekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0RBQWlCO0FBQ25DLG9CQUFvQixvREFBaUI7QUFDckMsaUJBQWlCLG9EQUFpQjtBQUNsQztBQUNBLFlBQVksb0RBQWlCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGFBQWEsK0JBQStCO0FBQzVDO0FBQ0E7O0FBRUEsb0JBQW9CLDJCQUEyQjtBQUMvQyx3RkFBd0Ysa0JBQWtCLElBQUksZ0JBQWdCO0FBQzlIOztBQUVBOztBQUVBLElBQUksZ0RBQWE7QUFDakIsUUFBUSxvREFBaUI7QUFDekIsS0FBSzs7QUFFTCxJQUFJLGtEQUFlO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrREFBZTtBQUN2Qyx3QkFBd0Isb0RBQWlCO0FBQ3pDLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTCxJQUFJLGdEQUFhO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLHFEQUFNO0FBQ3RCLGFBQWE7O0FBRWI7QUFDQSxnQkFBZ0IscURBQU07QUFDdEIsYUFBYTtBQUNiOztBQUVBLFFBQVEsa0RBQWU7QUFDdkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2V4dGVuc2lvbnMvdmFsaWRhdGlvbi9lc3NheUxpbWl0QnlDaGFyYWN0ZXIuanM/MWFiMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhcHAgZnJvbSAnLi4vLi4vY29yZS9hcHAnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0ICogYXMgYWN0aXZpdHkgZnJvbSAnLi4vLi4vY29yZS9hY3Rpdml0eSc7XG5pbXBvcnQgKiBhcyBwbGF5ZXIgZnJvbSAnLi4vLi4vY29yZS9wbGF5ZXInO1xuaW1wb3J0ICogYXMgaXRlbXMgZnJvbSAnLi4vLi4vY29yZS9pdGVtcyc7XG5pbXBvcnQgKiBhcyBxdWVzdGlvbnMgZnJvbSAnLi4vLi4vY29yZS9xdWVzdGlvbnMnO1xuaW1wb3J0ICogYXMgZW50aXRpZXMgZnJvbSAnZW50aXRpZXMnO1xuXG4vKipcbiAqIEV4dGVuc2lvbnMgYWRkIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gSXRlbXMgQVBJLlxuICogVGhleSByZWx5IG9uIG1vZHVsZXMgd2l0aGluIExUIGJlaW5nIGF2YWlsYWJsZS5cbiAqXG4gKiAtLVxuICpcbiAqIFRoaXMgc2NyaXB0IGNoYW5nZXMgdGhlIGVzc2F5IHZhbGlkYXRpb24gY2hlY2sgb25cbiAqIHN0cmluZyBsZW5ndGggdG8gYmUgY2hhcmFjdGVyIGJhc2VkLCBpbnN0ZWFkIG9mXG4gKiB0aGUgZGVmYXVsdCB3b3JkIGJhc2VkLlxuICpcbiAqIEl0IGlnbm9yZXMgc3BhY2VzIGJ5IGRlZmF1bHQsIHNvIHRoZXkgYXJlIG5vdFxuICogdHJlYXRlZCBhcyBjaGFyYWN0ZXJzIHRvIHZhbGlkYXRlIGxlbmd0aC5cbiAqXG4gKiBXb3JrcyB3aXRoIGBsb25ndGV4dFYyYCBhbmQgYHBsYWludGV4dGAgcXVlc3Rpb24gdHlwZXMuXG4gKiBAbW9kdWxlIEV4dGVuc2lvbnMvQXNzZXNzbWVudC9lc3NheUxpbWl0QnlDaGFyYWN0ZXJcbiAqL1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICBpbmNsdWRlU3BhY2VzOiBmYWxzZSxcbiAgICByZW5kZXJlZENzczogZmFsc2UsXG4gICAgdmFsaWRUeXBlczogWydsb25ndGV4dFYyJywgJ3BsYWludGV4dCddLFxufTtcblxuLyoqXG4gKiBMb29rcyBmb3IgcmVsZXZlbnQgcXVlc3Rpb24gdHlwZXMgYW5kIG92ZXJyaWRlcyB2YWxpZGF0aW9uXG4gKiB0byBiZSBvbiBjaGFyYWN0ZXIgbGVuZ3RoLiBVc2VzIHRoZSBgbWF4X2xlbmd0aGAgKFdvcmQgbGltaXQpXG4gKiB0aGF0IHdhcyBzZXQgdXAgaW4gYXV0aG9yaW5nLCB0cmVhdGluZyB0aGUgdmFsdWUgYXMgYSBjaGFyYWN0ZXJcbiAqIGxlbmd0aCBpbnN0ZWFkIG9mIHdvcmQgbGVuZ3RoLlxuICpcbiAqICoqS25vd24gbGltaXRhdGlvbnMqKlxuICpcbiAqIElmIHRoZSBhc3Nlc3NtZW50IHBsYXllciBpcyBpbiByZXNwb25zaXZlIG1vZGUgKDwgODAwcHgpIGFuZFxuICogeW91ICpkb24ndCogaGF2ZSB0aGUgcmV2aWV3IHNjcmVlbiBlbmFibGVkICh3aGljaCBpdCBpcyBieSBkZWZhdWx0KVxuICogdGhlbiB3ZSBjYW4ndCBpbmplY3QgYSBjdXN0b20gYnV0dG9uLiBUaGlzIG1lYW5zIHdlIHJlbmRlciB0aGVcbiAqIGRlZmF1bHQgRmluaXNoIGJ1dHRvbiwgYW5kIG5vIHByZXZlbnQgc3VibWlzc2lvbiB3aWxsIG9jY3VyLlxuICogVGhlIHNvbHV0aW9uIGlzIHRvIHVzZSBhbnkgb2YgdGhlIHZhbGlkIHJlZ2lvbnMgKGBtYWluYCxcbiAqIGBob3Jpem9udGFsYCwgb3IgYGhvcml6b250YWwtZml4ZWRgKSBhbmQgZG9uJ3QgZGVjb3VwbGUgdGhlXG4gKiBzdWJtaXQgYnV0dG9uIGZyb20gdGhlIHJldmlldyBidXR0b24gaW4gSXRlbXMgQVBJIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRXNzZW50aWFsbHksIGlmIHlvdSdyZSB1c2luZyBkZWZhdWx0IG9wdGlvbnMsIHlvdSdsbCBiZSBmaW5lLlxuICpcbiAqIElmIHN1Ym1pdHRpbmcgdmlhIHRoZSBKYXZhU2NyaXB0IGBzdWJtaXQoKWAgbWV0aG9kLCB0aGlzIHdpbGxcbiAqIHNraXAgdGhlIHZhbGlkYXRpb24gY2hlY2suXG4gKlxuICogKipQcmV2ZW50aW5nIHN1Ym1pc3Npb24qKlxuICpcbiAqIEJ5IGRlZmF1bHQsIHF1ZXN0aW9ucyBhcmUgYXV0aG9yZWQgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tXG4gKiBzdWJtaXR0aW5nIHRoZWlyIHNlc3Npb24gaW4gdGhlIGV2ZW50IG9mIHdvcmQgbGltaXQgdmlvbGF0aW9ucy5cbiAqIFRoZSBzYW1lIGJlaGF2aW91ciBpcyBpbmhlcml0ZWQgaW4gdGhpcyBleHRlbnNpb24uIElmIHlvdSBkb24ndFxuICogd2FudCB0byBwcmV2ZW50IHN1Ym1pc3Npb24sIHlvdSBjYW4gY2hlY2sgdGhlIGBTdWJtaXQgb3ZlciBsaW1pdGBcbiAqIG9wdGlvbiBpbiB0aGUgcXVlc3Rpb24gYXV0aG9yaW5nIGFyZWEuXG4gKlxuICogVG8gcHJldmVudCBzdWJtaXNzaW9uLCB3ZSBuZWVkIHRvIGFkZCBhIGN1c3RvbSBidXR0b24gdG8gSXRlbXNcbiAqIEFQSSBiZWN1YXNlIHdlIGNhbid0IGVhc2lseSBpbmplY3QgYSB2YWxpZGF0aW9uIGNoZWNrIHdoZW4gdGhlXG4gKiBkZWZhdWx0IHN1Ym1pdCBidXR0b24gaXMgY2xpY2tlZCwgc28gd2UgbmVlZCB0byByZXBsYWNlIGl0IHdpdGhcbiAqIGEgY3VzdG9tIG9uZS5cbiAqXG4gKiBBZGRpbmcgYSBjdXN0b20gYnV0dG9uIGlzIGEgY2FwYWJpbGl0eSBpbiBJdGVtcyBBUEkuIEJlbG93IGlzIGEgY29kZVxuICogc25pcHBldCBvZiBhbiBJdGVtcyBBUEkgY29uZmlndXJhdGlvbiBvYmplY3QuIE5vdGUgdGhlIGN1c3RvbSBidXR0b25cbiAqIGlzIGFkZGVkIGluIGByZWdpb25fb3ZlcnJpZGVzYC5cbiAqXG4gKiBZb3UgTVVTVCB1c2UgdGhlIGBpY29uX2NsYXNzYCBhbmQgYG5hbWVgIGFzIGRlZmluZWQgaW4gdGhlIGN1c3RvbVxuICogYnV0dG9uIGBvcHRpb25zYCBvYmplY3QgYmVsb3cuXG4gKlxuICogKipgbWFpbmAgcmVnaW9uKipcbiAqIGBgYFxuICoge1xuICogICAgIFwiY29uZmlnXCI6IHtcbiAqICAgICAgICAgXCJyZWdpb25zXCI6IFwibWFpblwiLFxuICogICAgICAgICBcInJlZ2lvbl9vdmVycmlkZXNcIjoge1xuICogICAgICAgICAgICAgXCJib3R0b20tcmlnaHRcIjogW1xuICogICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY3VzdG9tX2J1dHRvblwiLFxuICogICAgICAgICAgICAgICAgICAgICBcIm9wdGlvbnNcIjoge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiYnRuLWVzc2F5LWNoYXJhY3Rlci1saW1pdC1zdWJtaXRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJGaW5pc2hcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwiaWNvbl9jbGFzc1wiOiBcIml0ZW0tbmV4dCBoaWRkZW5cIlxuICogICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICBcInBvc2l0aW9uXCI6IFwicmlnaHRcIlxuICogICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJuZXh0X2J1dHRvblwiLFxuICogICAgICAgICAgICAgICAgICAgICBcInBvc2l0aW9uXCI6IFwicmlnaHRcIlxuICogICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJwcmV2aW91c19idXR0b25cIixcbiAqICAgICAgICAgICAgICAgICAgICAgXCJwb3NpdGlvblwiOiBcInJpZ2h0XCJcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICBdXG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAqKmBob3Jpem9udGFsYCBvciBgaG9yaXpvbnRhbC1maXhlZGAgcmVnaW9ucyoqXG4gKiBgYGBcbiAqIHtcbiAqICAgICBcImNvbmZpZ1wiOiB7XG4gKiAgICAgICAgIFwicmVnaW9uc1wiOiBcImhvcml6b250YWxcIixcbiAqICAgICAgICAgXCJyZWdpb25fb3ZlcnJpZGVzXCI6IHtcbiAqICAgICAgICAgICAgIFwiYm90dG9tXCI6IFtcbiAqICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImN1c3RvbV9idXR0b25cIixcbiAqICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25zXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImJ0bi1lc3NheS1jaGFyYWN0ZXItbGltaXQtc3VibWl0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiRmluaXNoXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcImljb25fY2xhc3NcIjogXCJpdGVtLW5leHQgaGlkZGVuXCJcbiAqICAgICAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICAgICAgXCJwb3NpdGlvblwiOiBcInJpZ2h0XCJcbiAqICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibmV4dF9idXR0b25cIixcbiAqICAgICAgICAgICAgICAgICAgICAgXCJwb3NpdGlvblwiOiBcInJpZ2h0XCJcbiAqICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaG9yaXpvbnRhbHRvY19lbGVtZW50XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgIFwicG9zaXRpb25cIjogXCJyaWdodFwiXG4gKiAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInByZXZpb3VzX2J1dHRvblwiLFxuICogICAgICAgICAgICAgICAgICAgICBcInBvc2l0aW9uXCI6IFwicmlnaHRcIlxuICogICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgIF1cbiAqICAgICAgICAgfVxuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICoqQ2hhbmdpbmcgbGFiZWxzKipcbiAqXG4gKiBUaGlzIGV4dGVuc2lvbiB3aWxsIGF1dG9tYXRpY2FsbHkgY2hhbmdlIGBXb3JkIExpbWl0YCB0byBgQ2hhcmFjdGVyIExpbWl0YCBpbiB0aGVcbiAqIGZvb3RlciBvZiB0aGUgZXNzYXkgcXVlc3Rpb24gdHlwZXMuIEhvd2V2ZXIsIGZvciBmdWxsIGNvdmVyYWdlIGluIHJldmlldyBtb2RlLCBvclxuICogaW4gYXV0aG9yaW5nIGFuZCByZXBvcnRpbmcsIHlvdSBzaG91bGQgdXNlIGxhYmVsIGJ1bmRsZXMuIEVnOlxuICpcbiAqICoqQXNzZXNzbWVudCBsYWJlbCBidW5kbGUqKlxuICpcbiAqIFVzZSB0aGlzIGluIEl0ZW1zIGFuZCBSZXBvcnRzIEFQSXMuXG4gKlxuICogQ2F2ZWF0OiB0aGlzIHdpbGwgdXBkYXRlIE1hdGggRXNzYXkgYW5kIENoZW1pc3RyeSBFc3NheSBmb290ZXJzIGFzIHdlbGwuXG4gKiBgYGBcbiAqIHtcbiAqICAgICBcImNvbmZpZ1wiOiB7XG4gKiAgICAgICAgIFwicXVlc3Rpb25zX2FwaV9pbml0X29wdGlvbnNcIjoge1xuICogICAgICAgICAgICAgXCJsYWJlbEJ1bmRsZVwiOiB7XG4gKiAgICAgICAgICAgICAgICAgXCJ3b3JkTGVuZ3RoXCI6IFwiQ2hhcmFjdGVyIExpbWl0XCJcbiAqICAgICAgICAgICAgIH1cbiAqICAgICAgICAgfVxuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICoqQXV0aG9yaW5nIGxhYmVsIGJ1bmRsZSoqXG4gKlxuICogVXNlIHRoaXMgaW4gQXV0aG9yIEFQSS5cbiAqIGBgYFxuICoge1xuICogICAgIFwiY29uZmlnXCI6IHtcbiAqICAgICAgICAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICogICAgICAgICAgICAgXCJxdWVzdGlvbl9lZGl0b3JfYXBpXCI6IHtcbiAqICAgICAgICAgICAgICAgICBcImluaXRfb3B0aW9uc1wiOiB7XG4gKiAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxfYnVuZGxlXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwiaGVscC5sb25ndGV4dFYyLm5hbWU6bWF4X2xlbmd0aFwiOiBcIkNoYXJhY3RlciBsaW1pdFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgXCJoZWxwLmxvbmd0ZXh0VjIubmFtZTpzaG93X3dvcmRfbGltaXRcIjogXCJDaGFyYWN0ZXIgbGltaXRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwiaGVscC5sb25ndGV4dFYyLmRlc2NyaXB0aW9uOm1heF9sZW5ndGhcIjogXCJNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGVudGVyZWQgaW4gdGhlIHRleHQgZW50cnkgYXJlYSAobWF4IDEwLDAwMCBjaGFyYWN0ZXJzKS5cIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwiaGVscC5sb25ndGV4dFYyLmRlc2NyaXB0aW9uOnNob3dfd29yZF9saW1pdFwiOiBcIkRlZmluZXMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGxpbWl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRvb2xiYXIgb3Igbm90LiBUaGUgb3B0aW9ucyBhcmU6IDx1bD48bGk+PHN0cm9uZz5BbHdheXMgT248L3N0cm9uZz4gLSBDaGFyYWN0ZXIgTGltaXQgaXMgYWx3YXlzIGRpc3BsYXllZC48L2xpPjxsaT48c3Ryb25nPk9uIExpbWl0PC9zdHJvbmc+IC0gQ2hhcmFjdGVyIExpbWl0IHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUgbGltaXQgaXMgcmVhY2hlZC48L2xpPjxsaT48c3Ryb25nPk9mZjwvc3Ryb25nPiAtIENoYXJhY3RlciBMaW1pdCB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQuPC9saT48L3VsPlwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgXCJoZWxwLmxvbmd0ZXh0VjIuZGVzY3JpcHRpb246c3VibWl0X292ZXJfbGltaXRcIjogXCJEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIGNhbiBzYXZlL3N1Ym1pdCB0ZXh0IHdoZW4gdGhlIGNoYXJhY3RlciBsaW1pdCBoYXMgYmVlbiBleGNlZWRlZC5cIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwibG9uZ3RleHRWMjptYXhfbGVuZ3RoXCI6IFwiQ2hhcmFjdGVyIGxpbWl0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcImxvbmd0ZXh0VjI6c2hvd193b3JkX2NvdW50XCI6IFwiU2hvdyBjaGFyYWN0ZXIgY291bnRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwibG9uZ3RleHRWMjpzaG93X3dvcmRfbGltaXRcIjogXCJDaGFyYWN0ZXIgbGltaXRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwiaGVscC5wbGFpbnRleHQubmFtZTptYXhfbGVuZ3RoXCI6IFwiQ2hhcmFjdGVyIGxpbWl0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcImhlbHAucGxhaW50ZXh0Lm5hbWU6c2hvd193b3JkX2xpbWl0XCI6IFwiQ2hhcmFjdGVyIGxpbWl0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcImhlbHAucGxhaW50ZXh0LmRlc2NyaXB0aW9uOm1heF9sZW5ndGhcIjogXCJNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGVudGVyZWQgaW4gdGhlIHRleHQgZW50cnkgYXJlYSAobWF4IDEwLDAwMCBjaGFyYWN0ZXJzKS5cIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFwiaGVscC5wbGFpbnRleHQuZGVzY3JpcHRpb246c2hvd193b3JkX2xpbWl0XCI6IFwiRGVmaW5lcyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgbGltaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9vbGJhciBvciBub3QuIFRoZSBvcHRpb25zIGFyZTogPHVsPjxsaT48c3Ryb25nPkFsd2F5cyBPbjwvc3Ryb25nPiAtIENoYXJhY3RlciBMaW1pdCBpcyBhbHdheXMgZGlzcGxheWVkLjwvbGk+PGxpPjxzdHJvbmc+T24gTGltaXQ8L3N0cm9uZz4gLSBDaGFyYWN0ZXIgTGltaXQgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCB3aGVuIHRoZSBsaW1pdCBpcyByZWFjaGVkLjwvbGk+PGxpPjxzdHJvbmc+T2ZmPC9zdHJvbmc+IC0gQ2hhcmFjdGVyIExpbWl0IHdpbGwgbm90IGJlIGRpc3BsYXllZC48L2xpPjwvdWw+XCIsXG4gKiBcdCAgICAgICAgICAgICAgICAgICAgXCJwbGFpbnRleHQ6bWF4X2xlbmd0aFwiOiBcIkNoYXJhY3RlciBsaW1pdFwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgXCJwbGFpbnRleHQ6c2hvd193b3JkX2xpbWl0XCI6IFwiQ2hhcmFjdGVyIGxpbWl0XCJcbiAqICAgICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICBcInF1ZXN0aW9uc19hcGlcIjoge1xuICogICAgICAgICAgICAgICAgIFwiaW5pdF9vcHRpb25zXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbEJ1bmRsZVwiOiB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBcIndvcmRMZW5ndGhcIjogXCJDaGFyYWN0ZXIgTGltaXRcIlxuICogICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgfVxuICogICAgICAgICB9XG4gKiAgICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IExUIH0gZnJvbSAnQGNhc3Bpbmd1cy9sdC9zcmMvYXNzZXNzbWVudC9pbmRleCc7XG4gKlxuICogTFQuaW5pdChpdGVtc0FwcCk7IC8vIFNldCB1cCBMVCB3aXRoIHRoZSBJdGVtcyBBUEkgYXBwbGljYXRpb24gaW5zdGFuY2UgdmFyaWFibGVcbiAqIExULmV4dGVuc2lvbnMuZXNzYXlMaW1pdEJ5Q2hhcmFjdGVyLnJ1bigpO1xuICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlU3BhY2VzIFdoZXRoZXIgdG8gaW5jbHVkZSBzcGFjZXMgaW4gdGhlIGNoYXJhY3RlciBjb3VudFxuICogRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHNpbmNlIDAuMTAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuKGluY2x1ZGVTcGFjZXMgPSBmYWxzZSkge1xuICAgIHN0YXRlLmluY2x1ZGVTcGFjZXMgPSBCb29sZWFuKGluY2x1ZGVTcGFjZXMpO1xuXG4gICAgaWYgKCFzdGF0ZS5yZW5kZXJlZENzcykgaW5qZWN0Q1NTKCk7XG5cbiAgICBzZXRRdWVzdGlvbkxpc3RlbmVycygpO1xuXG4gICAgLy8gU2V0IHVwIGEgbGlzdGVuZXIgb24gaXRlbSBsb2FkIHRvIGNoZWNrIEZpbmlzaCBidXR0b24gc3RhdGVcbiAgICBhcHAuYXBwSW5zdGFuY2UoKS5vbignaXRlbTpsb2FkJywgZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHNldFN1Ym1pdEJ1dHRvblN0YXRlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBlbEN1c3RvbVN1Ym1pdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jdXN0b21fYnRuLml0ZW0tbmV4dCcpO1xuICAgIGlmIChlbEN1c3RvbVN1Ym1pdCkge1xuICAgICAgICBlbEN1c3RvbVN1Ym1pdC5jbGFzc0xpc3QuYWRkKCdscm5fYnRuX2JsdWUnKTtcbiAgICAgICAgc2V0dXBTdWJtaXRQcmV2ZW50aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdObyBjdXN0b20gc3VibWl0IGJ1dHRvbiBmb3VuZC4gQ2hhcmFjdGVyIGxlbmd0aCB2YWxpZGF0aW9uIHdpbGwgb2NjdXIsIGJ1dCBubyBzdWJtaXNzaW9uIHByZXZlbnRpb24uJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIENoZWNrcyByZXN1bWUgbW9kZSwgb24gbG9hZCBvZiB0aGUgQVBJIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmVcbiAqIGV4aXN0aW5nIHJlc3BvbnNlcyB0byBsb2FkIGFuIGFjY3VyYXRlIGNoYXJhY3RlciBjb3VudCBmb3IuXG4gKiBBbHNvIHNldHMgYSBjaGFuZ2UgbGlzdGVuZXIgb24gYWxsIHZhbGlkIHR5cGVzIHRvIGNoZWNrIGxpbWl0LlxuICogQHNpbmNlIDEuMy4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHNldFF1ZXN0aW9uTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHF1ZXN0aW9ucyA9IGFwcC5hcHBJbnN0YW5jZSgpLmdldFF1ZXN0aW9ucygpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocXVlc3Rpb25zKSkge1xuICAgICAgICBpZiAoc3RhdGUudmFsaWRUeXBlcy5pbmRleE9mKHZhbHVlLnR5cGUpID49IDApIHtcbiAgICAgICAgICAgIGxldCBxdWVzdGlvbkluc3RhbmNlID0gYXBwLmFwcEluc3RhbmNlKCkucXVlc3Rpb24odmFsdWUucmVzcG9uc2VfaWQpO1xuXG4gICAgICAgICAgICBhcHAuYXBwSW5zdGFuY2UoKVxuICAgICAgICAgICAgICAgIC5xdWVzdGlvbih2YWx1ZS5yZXNwb25zZV9pZClcbiAgICAgICAgICAgICAgICAub24oJ3JlbmRlcmVkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXR1cEVzc2F5VmFsaWRhdGlvblVJKHF1ZXN0aW9uSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIG9uIGxvYWQgZm9yIGV4aXN0aW5nIHJlc3BvbnNlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHkuaXNSZXN1bWluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xpbWl0KHF1ZXN0aW9uSW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHF1ZXN0aW9uSW5zdGFuY2Uub24oJ2NoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2hlY2tMaW1pdChxdWVzdGlvbkluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgdXNlciByZXNwb25zZSB0byBzZWUgaWYgdGhleSBhcmVcbiAqIG92ZXIgdGhlIHZhbGlkYXRpb24gbGltaXQuXG4gKiBAcGFyYW0ge29iamVjdH0gcXVlc3Rpb25JbnN0YW5jZVxuICogQHBhcmFtIHtib29sZWFufSBzZXRVSSBXaGV0aGVyIHRvIGFkZCBVSSB2YWxpZGF0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAc2luY2UgMC4xMC4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTGltaXQocXVlc3Rpb25JbnN0YW5jZSwgc2V0VUkgPSB0cnVlKSB7XG4gICAgY29uc3QgdHlwZSA9IHF1ZXN0aW9uSW5zdGFuY2UuZ2V0UXVlc3Rpb24oKS50eXBlO1xuICAgIGNvbnN0IG1heExlbmd0aCA9IHF1ZXN0aW9uSW5zdGFuY2UuZ2V0UXVlc3Rpb24oKS5tYXhfbGVuZ3RoO1xuICAgIGNvbnN0IHJhd1Jlc3BvbnNlID0gcXVlc3Rpb25JbnN0YW5jZS5nZXRSZXNwb25zZSgpPy52YWx1ZSA/IHF1ZXN0aW9uSW5zdGFuY2UuZ2V0UmVzcG9uc2UoKT8udmFsdWUgOiAnJztcbiAgICBsZXQgdmFsaWRMZW5ndGggPSB0cnVlO1xuICAgIGxldCByZXNwb25zZTtcbiAgICBsZXQgc3RyTGVuZ3RoO1xuXG4gICAgaWYgKHR5cGUgPT09ICdwbGFpbnRleHQnKSB7XG4gICAgICAgIHJlc3BvbnNlID0gc3RhdGUuaW5jbHVkZVNwYWNlcyA/IHJhd1Jlc3BvbnNlIDogc3RyaXBTcGFjZXMocmF3UmVzcG9uc2UpO1xuICAgICAgICBzdHJMZW5ndGggPSByZXNwb25zZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2UgPSBzdGF0ZS5pbmNsdWRlU3BhY2VzID8gc3RyaXBIdG1sKHJhd1Jlc3BvbnNlKSA6IHN0cmlwU3BhY2VzKHN0cmlwSHRtbChyYXdSZXNwb25zZSkpO1xuICAgICAgICBzdHJMZW5ndGggPSBlbnRpdGllcy5kZWNvZGVIVE1MKHJlc3BvbnNlKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKG1heExlbmd0aCkge1xuICAgICAgICBpZiAoc3RyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICB2YWxpZExlbmd0aCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNldFVJKSB7XG4gICAgICAgIHNldFZhbGlkYXRpb25VSShxdWVzdGlvbkluc3RhbmNlLCB2YWxpZExlbmd0aCwgc3RyTGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRMZW5ndGg7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgY2hhcmFjdGVyIGNvdW50IGluIHRoZSBVSSBhbmQsIGlmXG4gKiBuZWNlc3NhcnksIHNldHMgdmFsaWRhdGlvbiBjbGFzc2VzLlxuICogQHBhcmFtIHtvYmplY3R9IHF1ZXN0aW9uSW5zdGFuY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNWYWxpZFxuICogQHBhcmFtIHtudW1iZXJ9IHN0ckxlbmd0aFxuICogQHNpbmNlIDAuMTAuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBzZXRWYWxpZGF0aW9uVUkocXVlc3Rpb25JbnN0YW5jZSwgaXNWYWxpZCwgc3RyTGVuZ3RoKSB7XG4gICAgY29uc3QgaWQgPSBxdWVzdGlvbkluc3RhbmNlLmdldFF1ZXN0aW9uKCkucmVzcG9uc2VfaWQ7XG4gICAgY29uc3QgZWxDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgY29uc3QgZWxFZGl0b3IgPSBlbENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcubHJuX3RleHRlZGl0b3JfZWRpdGFibGUnKTtcbiAgICBjb25zdCBlbFdvcmRDb3VudCA9IGVsQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5scm5fd29yZF9jb3VudCcpO1xuICAgIGNvbnN0IGVsTGVuZ3RoSW5kaWNhdG9yID0gZWxDb250YWluZXIucXVlcnlTZWxlY3RvcignLmxybl9sZW5ndGhfaW5kaWNhdG9yJyk7XG4gICAgY29uc3Qgd2FybmluZ0NsYXNzSW5kaWNhdG9yID0gJ2xybl93b3JkY291bnRfd2FybmluZ19sYWJlbCc7XG4gICAgY29uc3Qgd2FybmluZ0NsYXNzRWRpdG9yID0gJ2xybl93b3JkY291bnRfd2FybmluZyc7XG4gICAgbGV0IGNoYXJhY3RlckNvdW50ID0gc3RyTGVuZ3RoO1xuXG4gICAgaWYgKHF1ZXN0aW9uSW5zdGFuY2UuZ2V0UXVlc3Rpb24oKS50eXBlID09PSAncGxhaW50ZXh0Jykge1xuICAgICAgICBjaGFyYWN0ZXJDb3VudCA9IHN0ckxlbmd0aCArICcgLyc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgc2V0VUkoKTtcbiAgICAgICAgfSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFVJKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0VUkoKSB7XG4gICAgICAgIGVsV29yZENvdW50LnRleHRDb250ZW50ID0gY2hhcmFjdGVyQ291bnQ7XG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgICAgZWxFZGl0b3IuY2xhc3NMaXN0LmFkZCh3YXJuaW5nQ2xhc3NFZGl0b3IpO1xuICAgICAgICAgICAgZWxMZW5ndGhJbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCh3YXJuaW5nQ2xhc3NJbmRpY2F0b3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxFZGl0b3IuY2xhc3NMaXN0LnJlbW92ZSh3YXJuaW5nQ2xhc3NFZGl0b3IpO1xuICAgICAgICAgICAgZWxMZW5ndGhJbmRpY2F0b3IuY2xhc3NMaXN0LnJlbW92ZSh3YXJuaW5nQ2xhc3NJbmRpY2F0b3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFJlcGxhY2VzIGBXb3JkYCB3aXRoIGBDaGFyYWN0ZXJgIGluIHRoZSBkZWZhdWx0IFVJIGlmIGFcbiAqIGxhYmVsIGJ1bmRsZSBoYXNuJ3QgYmVlbiBzZXQgaW4gSXRlbXMgQVBJIGNvbmZpZy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBxdWVzdGlvbkluc3RhbmNlXG4gKiBAc2luY2UgMC4xMC4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXNzYXlWYWxpZGF0aW9uVUkocXVlc3Rpb25JbnN0YW5jZSkge1xuICAgIGNvbnN0IGhhc0xhYmVsQnVuZGxlID0gYWN0aXZpdHkuYWN0aXZpdHkoKT8uY29uZmlnPy5xdWVzdGlvbnNfYXBpX2luaXRfb3B0aW9ucz8ubGFiZWxCdW5kbGU/LndvcmRMZW5ndGg7XG5cbiAgICBpZiAoIWhhc0xhYmVsQnVuZGxlKSB7XG4gICAgICAgIGNvbnN0IGlkID0gcXVlc3Rpb25JbnN0YW5jZS5nZXRRdWVzdGlvbigpLnJlc3BvbnNlX2lkO1xuICAgICAgICBjb25zdCBlbENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgY29uc3QgZWxXb3JkTGltaXQgPSBlbENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcubHJuX3dvcmRfbGltaXQnKTtcbiAgICAgICAgY29uc3Qgd29yZExpbWl0VGV4dCA9IGVsV29yZExpbWl0LnRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBuZXdXb3JkTGltaXRUZXh0ID0gd29yZExpbWl0VGV4dC5yZXBsYWNlKCdXb3JkJywgJ0NoYXJhY3RlcicpO1xuXG4gICAgICAgIGVsV29yZExpbWl0LnRleHRDb250ZW50ID0gbmV3V29yZExpbWl0VGV4dDtcbiAgICB9XG59XG5cbi8qKlxuICogU2V0cyB1cCBjbGljayBldmVudHMgb24gdGhlIHBvc3NpYmxlIHN1Ym1pdCBidXR0b25zLCB0aGVuXG4gKiBjYWxscyBjaGVja1ZhbGlkUmVzcG9uc2VzKCkgd2hlbiBjbGlja2VkLlxuICogUG9zc2libGUgc3VibWl0IGJ1dHRvbnMgYXJlIFwiRmluaXNoXCIgaW5zaWRlIHRoZSByZXZpZXcgc2NyZWVuLFxuICogb3IgdGhlIGN1c3RvbSBidXR0b24gZGVjbGFyZWQgaW4gSXRlbXMgQVBJIGNvbmZpZ3VyYXRpb24uXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0dXBTdWJtaXRQcmV2ZW50aW9uKCkge1xuICAgIGNvbnN0IGVsQ3VzdG9tU3VibWl0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmN1c3RvbV9idG4uaXRlbS1uZXh0Jyk7XG5cbiAgICBpZiAoZWxDdXN0b21TdWJtaXQpIHtcbiAgICAgICAgZWxDdXN0b21TdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGVja1ZhbGlkUmVzcG9uc2VzKTtcblxuICAgICAgICBhcHAuYXBwSW5zdGFuY2UoKS5vbigndGVzdDpwYW5lbDpzaG93bicsIGUgPT4ge1xuICAgICAgICAgICAgbGV0IGVsUmV2aWV3U3VibWl0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhbmVsLWZvb3RlciAudGVzdC1zdWJtaXQnKTtcbiAgICAgICAgICAgIGlmIChlbFJldmlld1N1Ym1pdCkge1xuICAgICAgICAgICAgICAgIGVsUmV2aWV3U3VibWl0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hlY2tWYWxpZFJlc3BvbnNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgYW55IGVzc2F5cyBvbiB0aGUgc2Vzc2lvbiBhbmQgdGhlaXIgY2hhcmFjdGVyIGxlbmd0aC5cbiAqIElmIHRoZSBsZW5ndGggb24gYW55IGlzIGludmFsaWQsIGFuZCB0aGUgYHN1Ym1pdF9vdmVyX2xpbWl0YFxuICogZmxhZyBpc24ndCBzZXQsIHdlIHByZXZlbnQgc3VibWlzc2lvbi5cbiAqIFdvcmtzIHdoZW4gdGhlIGN1c3RvbSBzdWJtaXQgYnV0dG9uIGlzIGNsaWNrZWQsIG9yIHdoZW4gd2VcbiAqIG92ZXJyaWRlIHRoZSBcIkZpbmlzaFwiIGJ1dHRvbiBpbiB0aGUgcmV2aWV3IHNjcmVlbi4gV2Ugb25seVxuICogZG8gdGhlIGxhdHRlciB3aGVuIGEgY3VzdG9tIHN1Ym1pdCBidXR0b24gYWxzbyBleGlzdHMuXG4gKiBAcGFyYW0ge29iamVjdH0gZSBDbGljayBldmVudCBvYmplY3QuXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gY2hlY2tWYWxpZFJlc3BvbnNlcyhlKSB7XG4gICAgY29uc3Qgc2Vzc2lvblF1ZXN0aW9ucyA9IGFwcC5hcHBJbnN0YW5jZSgpLmdldFF1ZXN0aW9ucygpO1xuICAgIGxldCBpbnZhbGlkUmVzcG9uc2VJZHMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgcSBpbiBzZXNzaW9uUXVlc3Rpb25zKSB7XG4gICAgICAgIGlmIChzdGF0ZS52YWxpZFR5cGVzLmluY2x1ZGVzKHNlc3Npb25RdWVzdGlvbnNbcV0udHlwZSkpIHtcbiAgICAgICAgICAgIGlmICghc2Vzc2lvblF1ZXN0aW9uc1txXT8uc3VibWl0X292ZXJfbGltaXQgJiYgIWNoZWNrTGltaXQocXVlc3Rpb25zLnF1ZXN0aW9uSW5zdGFuY2UocSksIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGludmFsaWRSZXNwb25zZUlkcy5wdXNoKHEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRSZXNwb25zZUlkcy5sZW5ndGgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgZXNzYXkgcmVzcG9uc2UgbGVuZ3RoIGZvdW5kLicpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IGl0ZW1SZWZlcmVuY2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW52YWxpZFJlc3BvbnNlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IGl0ZW1zLml0ZW1CeVJlc3BvbnNlSWQoaW52YWxpZFJlc3BvbnNlSWRzW2ldKTtcbiAgICAgICAgICAgIGlmICh0ZW1wKSB7XG4gICAgICAgICAgICAgICAgaXRlbVJlZmVyZW5jZXMucHVzaCh0ZW1wLnNvdXJjZS5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9hZEVycm9yRGlhbG9nKGl0ZW1SZWZlcmVuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzdWJtaXQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBzaG93aW5nL2hpZGluZyB0aGUgZGVmYXVsdCBcIkZpbmlzaFwiIGJ1dHRvbiB3aXRoIGFcbiAqIGN1c3RvbSBidXR0b24gYXMgZGVjbGFyZWQgaW4gSXRlbXMgQVBJIGNvbmZpZ3VyYXRpb24uIFdlXG4gKiBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndCBwcmV2ZW50RGVmYXVsdCBvbiB0aGUgZGVmYXVsdFxuICogc3VibWl0IChGaW5pc2gpIGJ1dHRvbi5cbiAqIEV4ZWN1dGVzIG9uIGV2ZXJ5IGl0ZW06bG9hZCBldmVudC5cbiAqIEBzaW5jZSAxLjEuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBzZXRTdWJtaXRCdXR0b25TdGF0ZSgpIHtcbiAgICBjb25zdCBlbERlZmF1bHRTdWJtaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGVzdC1zdWJtaXQuaXRlbS1uZXh0Jyk7XG4gICAgY29uc3QgZWxDdXN0b21TdWJtaXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY3VzdG9tX2J0bi5pdGVtLW5leHQnKTtcblxuICAgIGlmIChlbEN1c3RvbVN1Ym1pdCAmJiAhcGxheWVyLmlzUmVzcG9uc2l2ZU1vZGUoKSkge1xuICAgICAgICBpZiAoIWl0ZW1zLmlzTGFzdEl0ZW0oKSkge1xuICAgICAgICAgICAgZWxDdXN0b21TdWJtaXQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGFzUmV2aWV3U2NyZWVuT25GaW5pc2goKSAmJiBhY3Rpdml0eS5yZWdpb24oKSkge1xuICAgICAgICAgICAgICAgIGVsQ3VzdG9tU3VibWl0LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbERlZmF1bHRTdWJtaXQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgZWxDdXN0b21TdWJtaXQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgc2Vzc2lvbiB3YXMgc2V0IHVwIHdpdGggYSByZXZpZXdcbiAqIHNjcmVlbiBhcyB0aGUgbGFzdCBzdGVwIHByaW9yIHRvIHN1Ym1pc3Npb24uIFdlIG5lZWRcbiAqIHRvIGtub3cgdGhpcyBiZWNhdXNlIGluIHRoYXQgc2NlbmFyaW8sIHRoZXJlIGlzIGEgXCJSZXZpZXdcIlxuICogYnV0dG9uIG9ubyB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgXCJGaW5pc2hcIi5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHNpbmNlIDEuMS4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIGhhc1Jldmlld1NjcmVlbk9uRmluaXNoKCkge1xuICAgIGNvbnN0IGhhc1Jldmlld0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucmV2aWV3LXNjcmVlbicpO1xuICAgIGNvbnN0IGlzRGVjb3VwbGVkID0gYWN0aXZpdHkuYWN0aXZpdHkoKT8uY29uZmlnPy5jb25maWd1cmF0aW9uPy5kZWNvdXBsZV9zdWJtaXRfZnJvbV9yZXZpZXc7XG5cbiAgICBpZiAoIWhhc1Jldmlld0VsZW1lbnQgfHwgaXNEZWNvdXBsZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIExvYWRzIGEgY3VzdG9tIEl0ZW1zIEFQSSBkaWFsb2cgdG8gYWxlcnQgdGhlIHVzZXIgdGhleVxuICogaGF2ZSBpbnZhbGlkIHJlc3BvbnNlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0XG4gKiBtb2RhbCB3ZSBoYXZlIGZvciB3b3JkIGNvdW50IHZpb2xhdGlvbnMuXG4gKiBXZSBjaGVjayBmb3IgbGFiZWxzIGZyb20gdGhlIEl0ZW1zIEFQSSBjb25maWcgb2JqZWN0XG4gKiBmaXJzdCwgb3RoZXJ3aXNlIHdlIHVzZSB0aGUgZGVmYXVsdCAoZW5nbGlzaCkgbGFiZWxzLlxuICogQHBhcmFtIHthcnJheX0gaXRlbVJlZmVyZW5jZXNcbiAqIEBzaW5jZSAxLjEuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBsb2FkRXJyb3JEaWFsb2coaXRlbVJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIHF1ZXN0aW9uOiBhY3Rpdml0eS5hY3Rpdml0eSgpPy5jb25maWc/LmxhYmVsQnVuZGxlPy5xdWVzdGlvbiB8fCAnUXVlc3Rpb24nLFxuICAgICAgICBzdWJtaXRUZXN0OiBhY3Rpdml0eS5hY3Rpdml0eSgpPy5jb25maWc/LmxhYmVsQnVuZGxlPy5zdWJtaXRUZXN0IHx8ICdTdWJtaXQgYWN0aXZpdHknLFxuICAgICAgICBkZWNsaW5lOiBhY3Rpdml0eS5hY3Rpdml0eSgpPy5jb25maWc/LmxhYmVsQnVuZGxlPy5kZWNsaW5lIHx8ICdDYW5jZWwnLFxuICAgICAgICBpbnZhbGlkUXVlc3Rpb25zTWVzc2FnZTpcbiAgICAgICAgICAgIGFjdGl2aXR5LmFjdGl2aXR5KCk/LmNvbmZpZz8ubGFiZWxCdW5kbGU/LmludmFsaWRRdWVzdGlvbnNNZXNzYWdlIHx8XG4gICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgYXJlIG5vdCBjdXJyZW50bHkgdmFsaWQuIFBsZWFzZSBmb2xsb3cgdGhlIGxpbmtzIHRvIHJldmlldycsXG4gICAgfTtcbiAgICBsZXQgdGVtcGxhdGUgPSBgXG4gICAgICAgIDxwPiR7bGFiZWxzLmludmFsaWRRdWVzdGlvbnNNZXNzYWdlfTwvcD5cbiAgICAgICAgPHVsPlxuICAgIGA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1SZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRlbXBsYXRlICs9IGA8bGkgY2xhc3M9XCJsaW5rIGVzc2F5LWxpbWl0LWNoYXJhY3Rlci1pdGVtXCIgZGF0YS1pdGVtLXJlZmVyZW5jZT1cIiR7aXRlbVJlZmVyZW5jZXNbaV19XCI+JHtsYWJlbHMucXVlc3Rpb259PC9saT5gO1xuICAgIH1cblxuICAgIHRlbXBsYXRlICs9ICc8L3VsPic7XG5cbiAgICBhcHAuYXNzZXNzQXBwKCkub24oJ2J1dHRvbjpidG5fZXNzYXlfY2hhcmFjdGVyX2xpbWl0X2NhbmNlbDpjbGlja2VkJywgKCkgPT4ge1xuICAgICAgICBwbGF5ZXIuaGlkZURpYWxvZygpO1xuICAgIH0pO1xuXG4gICAgYXBwLmFwcEluc3RhbmNlKCkub24oJ3Rlc3Q6cGFuZWw6c2hvdycsICgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbExpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVzc2F5LWxpbWl0LWNoYXJhY3Rlci1pdGVtJyk7XG4gICAgICAgICAgICBpZiAoZWxMaW5rcykge1xuICAgICAgICAgICAgICAgIGVsTGlua3MuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtUmVmZXJlbmNlID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWl0ZW0tcmVmZXJlbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwLmFwcEluc3RhbmNlKCkuaXRlbXMoKS5nb3RvKGl0ZW1SZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfSk7XG5cbiAgICBwbGF5ZXIuZGlhbG9nKHtcbiAgICAgICAgaGVhZGVyOiBsYWJlbHMuc3VibWl0VGVzdCxcbiAgICAgICAgYm9keTogdGVtcGxhdGUsXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBidXR0b25faWQ6ICdidG5fZXNzYXlfY2hhcmFjdGVyX2xpbWl0X2NhbmNlbCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGxhYmVscy5kZWNsaW5lLFxuICAgICAgICAgICAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEJlY2F1c2Ugd2UgYXJlIHVzaW5nIGEgY3VzdG9tIHN1Ym1pdCBidXR0b24sIHdlIG5lZWRcbiAqIHRvIHN1Ym1pdCBtYW51YWxseSB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC4gSG93ZXZlcixcbiAqIHdlIGRvIHRoaXMgYnkgc2VuZGluZyBhIGNsaWNrIHRocm91Z2ggdGhlIChoaWRkZW4pXG4gKiBkZWZhdWx0IHN1Ym1pdCBidXR0b24uIFRoaXMgd2F5IHdlIGdldCB0aGUgcGxheWVyIGJlaGF2aW91clxuICogZm9yIHN1Ym1pc3Npb24gdGhhdCBpc24ndCBhdmFpbGFibGUgdXNpbmcgdGhlIHN1Ym1pdCgpIG1ldGhvZC5cbiAqIElmIGZvciBzb21lIHJlYXNvbiB0aGVyZSBpcyBubyBkZWZhdWx0IHN1Ym1pdCBidXR0b24sIHdlXG4gKiBzdWJtaXQgdXNpbmcgdGhlIG1ldGhvZCwgd2l0aCBubyBkZWZhdWx0IGNoZWNrcy5cbiAqIEBzaW5jZSAxLjEuMFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBzdWJtaXQoKSB7XG4gICAgY29uc3QgZWxEZWZhdWx0U3VibWl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xybl9hc3Nlc3NfbmV4dF9idG4nKTtcblxuICAgIGlmIChlbERlZmF1bHRTdWJtaXQpIHtcbiAgICAgICAgZWxEZWZhdWx0U3VibWl0LmNsaWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICBzaG93X3N1Ym1pdF9jb25maXJtYXRpb246IHRydWUsXG4gICAgICAgICAgICBzaG93X3N1Ym1pdF91aTogdHJ1ZSxcblxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlX2lkcykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdTdWJtaXQgd2FzIHN1Y2Nlc3NmdWwnLCByZXNwb25zZV9pZHMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignU3VibWl0IGhhcyBmYWlsZWQnLCBldmVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGFwcC5hcHBJbnN0YW5jZSgpLnN1Ym1pdChzZXR0aW5ncyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFN0cmlwcyBIVE1MIGZyb20gYSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBzaW5jZSAwLjEwLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc3RyaXBIdG1sKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC88W14+XSo+L2csICcnKS50cmltKCk7XG59XG5cbi8qKlxuICogU3RyaXBzIHNwYWNlcyBmcm9tIGEgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAc2luY2UgMC4xMC4wXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHN0cmlwU3BhY2VzKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9cXHMrL2csICcnKTtcbn1cblxuLyoqXG4gKiBJbmplY3RzIHRoZSBuZWNlc3NhcnkgQ1NTIHRvIHRoZSBoZWFkZXJcbiAqIEBzaW5jZSAwLjEwLjBcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gaW5qZWN0Q1NTKCkge1xuICAgIGNvbnN0IGVsU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNvbnN0IGNzcyA9IGBcbi8qIExlYXJub3NpdHkgZXNzYXkgbGltaXQgYnkgY2hhcmFjdGVyIHN0eWxlcyAqL1xuLmxybl93aWRnZXQgLmxybl93b3JkX2NvdW50LFxuLmxybl93aWRnZXQgLmxybl9jaGFyYWN0ZXJfY291bnQge1xuICAgIG1hcmdpbi1yaWdodDogMHB4O1xufVxuYDtcblxuICAgIGVsU3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZWxTdHlsZSk7XG5cbiAgICBzdGF0ZS5yZW5kZXJlZENzcyA9IHRydWU7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/assessment/extensions/validation/essayLimitByCharacter.js\n"); - -/***/ }), - -/***/ "./src/assessment/index.js": -/*!*********************************!*\ - !*** ./src/assessment/index.js ***! - \*********************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LT: () => (/* binding */ LT)\n/* harmony export */ });\n/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core */ \"./src/assessment/core.js\");\n/* harmony import */ var _extensions_accessibility_aria_ariaCountOnNav__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./extensions/accessibility/aria/ariaCountOnNav */ \"./src/assessment/extensions/accessibility/aria/ariaCountOnNav.js\");\n/* harmony import */ var _extensions_validation_blockGrammarChecks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./extensions/validation/blockGrammarChecks */ \"./src/assessment/extensions/validation/blockGrammarChecks.js\");\n/* harmony import */ var _extensions_validation_checkAnswerValidation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./extensions/validation/checkAnswerValidation */ \"./src/assessment/extensions/validation/checkAnswerValidation.js\");\n/* harmony import */ var _extensions_accessibility_ux_columnResizer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./extensions/accessibility/ux/columnResizer */ \"./src/assessment/extensions/accessibility/ux/columnResizer.js\");\n/* harmony import */ var _extensions_validation_essayLimitByCharacter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./extensions/validation/essayLimitByCharacter */ \"./src/assessment/extensions/validation/essayLimitByCharacter.js\");\n/* harmony import */ var _extensions_accessibility_ux_hideAlternatives__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./extensions/accessibility/ux/hideAlternatives */ \"./src/assessment/extensions/accessibility/ux/hideAlternatives.js\");\n/* harmony import */ var _extensions_accessibility_ux_keyboardShortcuts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./extensions/accessibility/ux/keyboardShortcuts */ \"./src/assessment/extensions/accessibility/ux/keyboardShortcuts.js\");\n/* harmony import */ var _extensions_accessibility_ux_magnifier__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./extensions/accessibility/ux/magnifier */ \"./src/assessment/extensions/accessibility/ux/magnifier.js\");\n/* harmony import */ var _extensions_accessibility_ux_mcqLabelPrefix__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./extensions/accessibility/ux/mcqLabelPrefix */ \"./src/assessment/extensions/accessibility/ux/mcqLabelPrefix.js\");\n/* harmony import */ var _extensions_ui_networkStatus_index__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./extensions/ui/networkStatus/index */ \"./src/assessment/extensions/ui/networkStatus/index.js\");\n/* harmony import */ var _extensions_accessibility_ux_pageOverlay__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./extensions/accessibility/ux/pageOverlay */ \"./src/assessment/extensions/accessibility/ux/pageOverlay.js\");\n/* harmony import */ var _extensions_ui_renderPDF_index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./extensions/ui/renderPDF/index */ \"./src/assessment/extensions/ui/renderPDF/index.js\");\n/* harmony import */ var _extensions_accessibility_ux_resetResponse__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./extensions/accessibility/ux/resetResponse */ \"./src/assessment/extensions/accessibility/ux/resetResponse.js\");\n/* harmony import */ var _extensions_ui_themes_juniorQuest_index__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./extensions/ui/themes/juniorQuest/index */ \"./src/assessment/extensions/ui/themes/juniorQuest/index.js\");\n/* harmony import */ var _extensions_accessibility_ux_toggleTimer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./extensions/accessibility/ux/toggleTimer */ \"./src/assessment/extensions/accessibility/ux/toggleTimer.js\");\n/* harmony import */ var _extensions_accessibility_ux_whiteNoise_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./extensions/accessibility/ux/whiteNoise/index */ \"./src/assessment/extensions/accessibility/ux/whiteNoise/index.js\");\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_extensions_ui_renderPDF_index__WEBPACK_IMPORTED_MODULE_12__]);\n_extensions_ui_renderPDF_index__WEBPACK_IMPORTED_MODULE_12__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];\n/**\n * index.js is a \"kitchen sink\" file that will load everything when imported. The\n * core LT library, plus all extensions. Probably only use this for development\n * because of the size. In production, try importing core.js and any extensions\n * you might want separately.\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst extensions = {\n extensions: {\n ariaCountOnNav: { ..._extensions_accessibility_aria_ariaCountOnNav__WEBPACK_IMPORTED_MODULE_1__ },\n blockGrammarChecks: { ..._extensions_validation_blockGrammarChecks__WEBPACK_IMPORTED_MODULE_2__ },\n checkAnswerValidation: { ..._extensions_validation_checkAnswerValidation__WEBPACK_IMPORTED_MODULE_3__ },\n columnResizer: { ..._extensions_accessibility_ux_columnResizer__WEBPACK_IMPORTED_MODULE_4__ },\n essayLimitByCharacter: { ..._extensions_validation_essayLimitByCharacter__WEBPACK_IMPORTED_MODULE_5__ },\n hideAlternatives: { ..._extensions_accessibility_ux_hideAlternatives__WEBPACK_IMPORTED_MODULE_6__ },\n keyboardShortcuts: { ..._extensions_accessibility_ux_keyboardShortcuts__WEBPACK_IMPORTED_MODULE_7__ },\n magnifier: { ..._extensions_accessibility_ux_magnifier__WEBPACK_IMPORTED_MODULE_8__ },\n mcqLabelPrefix: { ..._extensions_accessibility_ux_mcqLabelPrefix__WEBPACK_IMPORTED_MODULE_9__ },\n networkStatus: { ..._extensions_ui_networkStatus_index__WEBPACK_IMPORTED_MODULE_10__ },\n pageOverlay: { ..._extensions_accessibility_ux_pageOverlay__WEBPACK_IMPORTED_MODULE_11__ },\n renderPDF: { ..._extensions_ui_renderPDF_index__WEBPACK_IMPORTED_MODULE_12__ },\n resetResponse: { ..._extensions_accessibility_ux_resetResponse__WEBPACK_IMPORTED_MODULE_13__ },\n themes: { ..._extensions_ui_themes_juniorQuest_index__WEBPACK_IMPORTED_MODULE_14__ },\n toggleTimer: { ..._extensions_accessibility_ux_toggleTimer__WEBPACK_IMPORTED_MODULE_15__ },\n whiteNoise: { ..._extensions_accessibility_ux_whiteNoise_index__WEBPACK_IMPORTED_MODULE_16__ },\n },\n};\n\nconst LT = { ..._core__WEBPACK_IMPORTED_MODULE_0__.LT, ...extensions };\n\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXNzZXNzbWVudC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRW9DOztBQUU2QztBQUNBO0FBQ007QUFDVjtBQUNVO0FBQ0o7QUFDRTtBQUNoQjtBQUNVO0FBQ1Y7QUFDSTtBQUNaO0FBQ2dCO0FBQ0E7QUFDSjtBQUNJOztBQUU3RTtBQUNBO0FBQ0EsMEJBQTBCLEdBQUcsMEVBQWMsRUFBRTtBQUM3Qyw4QkFBOEIsR0FBRyxzRUFBa0IsRUFBRTtBQUNyRCxpQ0FBaUMsR0FBRyx5RUFBcUIsRUFBRTtBQUMzRCx5QkFBeUIsR0FBRyx1RUFBYSxFQUFFO0FBQzNDLGlDQUFpQyxHQUFHLHlFQUFxQixFQUFFO0FBQzNELDRCQUE0QixHQUFHLDBFQUFnQixFQUFFO0FBQ2pELDZCQUE2QixHQUFHLDJFQUFpQixFQUFFO0FBQ25ELHFCQUFxQixHQUFHLG1FQUFTLEVBQUU7QUFDbkMsMEJBQTBCLEdBQUcsd0VBQWMsRUFBRTtBQUM3Qyx5QkFBeUIsR0FBRyxnRUFBYSxFQUFFO0FBQzNDLHVCQUF1QixHQUFHLHNFQUFXLEVBQUU7QUFDdkMscUJBQXFCLEdBQUcsNERBQVMsRUFBRTtBQUNuQyx5QkFBeUIsR0FBRyx3RUFBYSxFQUFFO0FBQzNDLGtCQUFrQixHQUFHLHFFQUFnQixFQUFFO0FBQ3ZDLHVCQUF1QixHQUFHLHNFQUFXLEVBQUU7QUFDdkMsc0JBQXNCLEdBQUcsMkVBQVUsRUFBRTtBQUNyQyxLQUFLO0FBQ0w7O0FBRU8sYUFBYSxHQUFHLHFDQUFJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy9hc3Nlc3NtZW50L2luZGV4LmpzPzA3MmUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBpbmRleC5qcyBpcyBhIFwia2l0Y2hlbiBzaW5rXCIgZmlsZSB0aGF0IHdpbGwgbG9hZCBldmVyeXRoaW5nIHdoZW4gaW1wb3J0ZWQuIFRoZVxuICogY29yZSBMVCBsaWJyYXJ5LCBwbHVzIGFsbCBleHRlbnNpb25zLiBQcm9iYWJseSBvbmx5IHVzZSB0aGlzIGZvciBkZXZlbG9wbWVudFxuICogYmVjYXVzZSBvZiB0aGUgc2l6ZS4gSW4gcHJvZHVjdGlvbiwgdHJ5IGltcG9ydGluZyBjb3JlLmpzIGFuZCBhbnkgZXh0ZW5zaW9uc1xuICogeW91IG1pZ2h0IHdhbnQgc2VwYXJhdGVseS5cbiAqL1xuXG5pbXBvcnQgeyBMVCBhcyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcblxuaW1wb3J0ICogYXMgYXJpYUNvdW50T25OYXYgZnJvbSAnLi9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvYXJpYS9hcmlhQ291bnRPbk5hdic7XG5pbXBvcnQgKiBhcyBibG9ja0dyYW1tYXJDaGVja3MgZnJvbSAnLi9leHRlbnNpb25zL3ZhbGlkYXRpb24vYmxvY2tHcmFtbWFyQ2hlY2tzJztcbmltcG9ydCAqIGFzIGNoZWNrQW5zd2VyVmFsaWRhdGlvbiBmcm9tICcuL2V4dGVuc2lvbnMvdmFsaWRhdGlvbi9jaGVja0Fuc3dlclZhbGlkYXRpb24nO1xuaW1wb3J0ICogYXMgY29sdW1uUmVzaXplciBmcm9tICcuL2V4dGVuc2lvbnMvYWNjZXNzaWJpbGl0eS91eC9jb2x1bW5SZXNpemVyJztcbmltcG9ydCAqIGFzIGVzc2F5TGltaXRCeUNoYXJhY3RlciBmcm9tICcuL2V4dGVuc2lvbnMvdmFsaWRhdGlvbi9lc3NheUxpbWl0QnlDaGFyYWN0ZXInO1xuaW1wb3J0ICogYXMgaGlkZUFsdGVybmF0aXZlcyBmcm9tICcuL2V4dGVuc2lvbnMvYWNjZXNzaWJpbGl0eS91eC9oaWRlQWx0ZXJuYXRpdmVzJztcbmltcG9ydCAqIGFzIGtleWJvYXJkU2hvcnRjdXRzIGZyb20gJy4vZXh0ZW5zaW9ucy9hY2Nlc3NpYmlsaXR5L3V4L2tleWJvYXJkU2hvcnRjdXRzJztcbmltcG9ydCAqIGFzIG1hZ25pZmllciBmcm9tICcuL2V4dGVuc2lvbnMvYWNjZXNzaWJpbGl0eS91eC9tYWduaWZpZXInO1xuaW1wb3J0ICogYXMgbWNxTGFiZWxQcmVmaXggZnJvbSAnLi9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvbWNxTGFiZWxQcmVmaXgnO1xuaW1wb3J0ICogYXMgbmV0d29ya1N0YXR1cyBmcm9tICcuL2V4dGVuc2lvbnMvdWkvbmV0d29ya1N0YXR1cy9pbmRleCc7XG5pbXBvcnQgKiBhcyBwYWdlT3ZlcmxheSBmcm9tICcuL2V4dGVuc2lvbnMvYWNjZXNzaWJpbGl0eS91eC9wYWdlT3ZlcmxheSc7XG5pbXBvcnQgKiBhcyByZW5kZXJQREYgZnJvbSAnLi9leHRlbnNpb25zL3VpL3JlbmRlclBERi9pbmRleCc7XG5pbXBvcnQgKiBhcyByZXNldFJlc3BvbnNlIGZyb20gJy4vZXh0ZW5zaW9ucy9hY2Nlc3NpYmlsaXR5L3V4L3Jlc2V0UmVzcG9uc2UnO1xuaW1wb3J0ICogYXMgdGhlbWVKdW5pb3JRdWVzdCBmcm9tICcuL2V4dGVuc2lvbnMvdWkvdGhlbWVzL2p1bmlvclF1ZXN0L2luZGV4JztcbmltcG9ydCAqIGFzIHRvZ2dsZVRpbWVyIGZyb20gJy4vZXh0ZW5zaW9ucy9hY2Nlc3NpYmlsaXR5L3V4L3RvZ2dsZVRpbWVyJztcbmltcG9ydCAqIGFzIHdoaXRlTm9pc2UgZnJvbSAnLi9leHRlbnNpb25zL2FjY2Vzc2liaWxpdHkvdXgvd2hpdGVOb2lzZS9pbmRleCc7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gICAgZXh0ZW5zaW9uczoge1xuICAgICAgICBhcmlhQ291bnRPbk5hdjogeyAuLi5hcmlhQ291bnRPbk5hdiB9LFxuICAgICAgICBibG9ja0dyYW1tYXJDaGVja3M6IHsgLi4uYmxvY2tHcmFtbWFyQ2hlY2tzIH0sXG4gICAgICAgIGNoZWNrQW5zd2VyVmFsaWRhdGlvbjogeyAuLi5jaGVja0Fuc3dlclZhbGlkYXRpb24gfSxcbiAgICAgICAgY29sdW1uUmVzaXplcjogeyAuLi5jb2x1bW5SZXNpemVyIH0sXG4gICAgICAgIGVzc2F5TGltaXRCeUNoYXJhY3RlcjogeyAuLi5lc3NheUxpbWl0QnlDaGFyYWN0ZXIgfSxcbiAgICAgICAgaGlkZUFsdGVybmF0aXZlczogeyAuLi5oaWRlQWx0ZXJuYXRpdmVzIH0sXG4gICAgICAgIGtleWJvYXJkU2hvcnRjdXRzOiB7IC4uLmtleWJvYXJkU2hvcnRjdXRzIH0sXG4gICAgICAgIG1hZ25pZmllcjogeyAuLi5tYWduaWZpZXIgfSxcbiAgICAgICAgbWNxTGFiZWxQcmVmaXg6IHsgLi4ubWNxTGFiZWxQcmVmaXggfSxcbiAgICAgICAgbmV0d29ya1N0YXR1czogeyAuLi5uZXR3b3JrU3RhdHVzIH0sXG4gICAgICAgIHBhZ2VPdmVybGF5OiB7IC4uLnBhZ2VPdmVybGF5IH0sXG4gICAgICAgIHJlbmRlclBERjogeyAuLi5yZW5kZXJQREYgfSxcbiAgICAgICAgcmVzZXRSZXNwb25zZTogeyAuLi5yZXNldFJlc3BvbnNlIH0sXG4gICAgICAgIHRoZW1lczogeyAuLi50aGVtZUp1bmlvclF1ZXN0IH0sXG4gICAgICAgIHRvZ2dsZVRpbWVyOiB7IC4uLnRvZ2dsZVRpbWVyIH0sXG4gICAgICAgIHdoaXRlTm9pc2U6IHsgLi4ud2hpdGVOb2lzZSB9LFxuICAgIH0sXG59O1xuXG5leHBvcnQgY29uc3QgTFQgPSB7IC4uLmNvcmUsIC4uLmV4dGVuc2lvbnMgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/assessment/index.js\n"); - -/***/ }), - -/***/ "./src/utils/logger.js": -/*!*****************************!*\ - !*** ./src/utils/logger.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * A utility logger that generates styled log outputs.\n * @module Utils/Logger\n */\n\n/**\n * Debug only logs to the console\n * @static\n * @since 2.10.0\n * @param {*} msg\n */\nfunction debug(msg, mode) {\n if (mode === 'DEBUG') console.log(msg);\n}\n\n/**\n * Formatted error logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction error(msg) {\n let style = 'display:inline-block;background-color:#e0005a;color:#fff;font-weight:bold;padding:3px 7px;border-radius:3px';\n console.error('%cError:%c ' + msg, style, '');\n}\n\n/**\n * Formatted info logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction info(msg) {\n let style = 'display:inline-block;background-color:#46C0FF;color:#000;font-weight:bold;padding:3px 7px;border-radius:3px';\n console.info('%cInfo:%c ' + msg, style, '');\n}\n\n/**\n * Generic logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction log(msg) {\n console.log(msg);\n}\n\n/**\n * Formatted warning logger to the console\n * @static\n * @since 0.1.0\n * @param {*} msg\n */\nfunction warn(msg, type = 'log') {\n let style = 'display:inline-block;background-color:gold;color:#000;font-weight:bold;padding:3px 7px;border-radius:3px';\n console.warn('%cWarning:%c ' + msg, style, '');\n}\n\nconst logger = {\n debug,\n error,\n info,\n log,\n warn,\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (logger);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvbG9nZ2VyLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBLHNDQUFzQyx5QkFBeUIsV0FBVyxpQkFBaUIsZ0JBQWdCO0FBQzNHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0Esc0NBQXNDLHlCQUF5QixXQUFXLGlCQUFpQixnQkFBZ0I7QUFDM0c7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBLHNDQUFzQyxzQkFBc0IsV0FBVyxpQkFBaUIsZ0JBQWdCO0FBQ3hHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsTUFBTSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL3NyYy91dGlscy9sb2dnZXIuanM/ODIzYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgdXRpbGl0eSBsb2dnZXIgdGhhdCBnZW5lcmF0ZXMgc3R5bGVkIGxvZyBvdXRwdXRzLlxuICogQG1vZHVsZSBVdGlscy9Mb2dnZXJcbiAqL1xuXG4vKipcbiAqIERlYnVnIG9ubHkgbG9ncyB0byB0aGUgY29uc29sZVxuICogQHN0YXRpY1xuICogQHNpbmNlIDIuMTAuMFxuICogQHBhcmFtIHsqfSBtc2dcbiAqL1xuZnVuY3Rpb24gZGVidWcobXNnLCBtb2RlKSB7XG4gICAgaWYgKG1vZGUgPT09ICdERUJVRycpIGNvbnNvbGUubG9nKG1zZyk7XG59XG5cbi8qKlxuICogRm9ybWF0dGVkIGVycm9yIGxvZ2dlciB0byB0aGUgY29uc29sZVxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAcGFyYW0geyp9IG1zZ1xuICovXG5mdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgICBsZXQgc3R5bGUgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjojZTAwMDVhO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZDtwYWRkaW5nOjNweCA3cHg7Ym9yZGVyLXJhZGl1czozcHgnO1xuICAgIGNvbnNvbGUuZXJyb3IoJyVjRXJyb3I6JWMgJyArIG1zZywgc3R5bGUsICcnKTtcbn1cblxuLyoqXG4gKiBGb3JtYXR0ZWQgaW5mbyBsb2dnZXIgdG8gdGhlIGNvbnNvbGVcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHsqfSBtc2dcbiAqL1xuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgICBsZXQgc3R5bGUgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjojNDZDMEZGO2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6Ym9sZDtwYWRkaW5nOjNweCA3cHg7Ym9yZGVyLXJhZGl1czozcHgnO1xuICAgIGNvbnNvbGUuaW5mbygnJWNJbmZvOiVjICcgKyBtc2csIHN0eWxlLCAnJyk7XG59XG5cbi8qKlxuICogR2VuZXJpYyBsb2dnZXIgdG8gdGhlIGNvbnNvbGVcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQHBhcmFtIHsqfSBtc2dcbiAqL1xuZnVuY3Rpb24gbG9nKG1zZykge1xuICAgIGNvbnNvbGUubG9nKG1zZyk7XG59XG5cbi8qKlxuICogRm9ybWF0dGVkIHdhcm5pbmcgbG9nZ2VyIHRvIHRoZSBjb25zb2xlXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBwYXJhbSB7Kn0gbXNnXG4gKi9cbmZ1bmN0aW9uIHdhcm4obXNnLCB0eXBlID0gJ2xvZycpIHtcbiAgICBsZXQgc3R5bGUgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZC1jb2xvcjpnb2xkO2NvbG9yOiMwMDA7Zm9udC13ZWlnaHQ6Ym9sZDtwYWRkaW5nOjNweCA3cHg7Ym9yZGVyLXJhZGl1czozcHgnO1xuICAgIGNvbnNvbGUud2FybignJWNXYXJuaW5nOiVjICcgKyBtc2csIHN0eWxlLCAnJyk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IHtcbiAgICBkZWJ1ZyxcbiAgICBlcnJvcixcbiAgICBpbmZvLFxuICAgIGxvZyxcbiAgICB3YXJuLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/utils/logger.js\n"); - -/***/ }), - -/***/ "./src/utils/validation.js": -/*!*********************************!*\ - !*** ./src/utils/validation.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ hasValue: () => (/* binding */ hasValue)\n/* harmony export */ });\n/**\n * A utility validation object.\n * @module Utils/Validation\n */\n\n/**\n * Checks value for existence. The following are\n * falsy:\n * - null\n * - undefined\n * - ''\n * - []\n * - {}\n * @since 2.11.0\n * @param {any} value\n * @returns {boolean}\n */\nfunction hasValue(value) {\n if (value === null || value === undefined) {\n return false;\n }\n\n const type = typeof value;\n switch (type) {\n case 'string':\n return value.trim() !== '';\n case 'object':\n if (Array.isArray(value)) {\n return value.length > 0;\n } else {\n return Object.keys(value).length > 0;\n }\n default:\n return true;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbHMvdmFsaWRhdGlvbi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvdXRpbHMvdmFsaWRhdGlvbi5qcz81NDY0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB1dGlsaXR5IHZhbGlkYXRpb24gb2JqZWN0LlxuICogQG1vZHVsZSBVdGlscy9WYWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBDaGVja3MgdmFsdWUgZm9yIGV4aXN0ZW5jZS4gVGhlIGZvbGxvd2luZyBhcmVcbiAqIGZhbHN5OlxuICogLSBudWxsXG4gKiAtIHVuZGVmaW5lZFxuICogLSAnJ1xuICogLSBbXVxuICogLSB7fVxuICogQHNpbmNlIDIuMTEuMFxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSAnJztcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/utils/validation.js\n"); - -/***/ }), - -/***/ "?d4c0": -/*!************************!*\ - !*** crypto (ignored) ***! - \************************/ -/***/ (() => { - -/* (ignored) */ - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/decode.js": -/*!*************************************************!*\ - !*** ./node_modules/entities/lib/esm/decode.js ***! - \*************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BinTrieFlags: () => (/* binding */ BinTrieFlags),\n/* harmony export */ DecodingMode: () => (/* binding */ DecodingMode),\n/* harmony export */ EntityDecoder: () => (/* binding */ EntityDecoder),\n/* harmony export */ decodeCodePoint: () => (/* reexport safe */ _decode_codepoint_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ decodeHTML: () => (/* binding */ decodeHTML),\n/* harmony export */ decodeHTMLAttribute: () => (/* binding */ decodeHTMLAttribute),\n/* harmony export */ decodeHTMLStrict: () => (/* binding */ decodeHTMLStrict),\n/* harmony export */ decodeXML: () => (/* binding */ decodeXML),\n/* harmony export */ determineBranch: () => (/* binding */ determineBranch),\n/* harmony export */ fromCodePoint: () => (/* reexport safe */ _decode_codepoint_js__WEBPACK_IMPORTED_MODULE_2__.fromCodePoint),\n/* harmony export */ htmlDecodeTree: () => (/* reexport safe */ _generated_decode_data_html_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ replaceCodePoint: () => (/* reexport safe */ _decode_codepoint_js__WEBPACK_IMPORTED_MODULE_2__.replaceCodePoint),\n/* harmony export */ xmlDecodeTree: () => (/* reexport safe */ _generated_decode_data_xml_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _generated_decode_data_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./generated/decode-data-html.js */ \"./node_modules/entities/lib/esm/generated/decode-data-html.js\");\n/* harmony import */ var _generated_decode_data_xml_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./generated/decode-data-xml.js */ \"./node_modules/entities/lib/esm/generated/decode-data-xml.js\");\n/* harmony import */ var _decode_codepoint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./decode_codepoint.js */ \"./node_modules/entities/lib/esm/decode_codepoint.js\");\n\n\n\n// Re-export for use by eg. htmlparser2\n\n\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"NUM\"] = 35] = \"NUM\";\n CharCodes[CharCodes[\"SEMI\"] = 59] = \"SEMI\";\n CharCodes[CharCodes[\"EQUALS\"] = 61] = \"EQUALS\";\n CharCodes[CharCodes[\"ZERO\"] = 48] = \"ZERO\";\n CharCodes[CharCodes[\"NINE\"] = 57] = \"NINE\";\n CharCodes[CharCodes[\"LOWER_A\"] = 97] = \"LOWER_A\";\n CharCodes[CharCodes[\"LOWER_F\"] = 102] = \"LOWER_F\";\n CharCodes[CharCodes[\"LOWER_X\"] = 120] = \"LOWER_X\";\n CharCodes[CharCodes[\"LOWER_Z\"] = 122] = \"LOWER_Z\";\n CharCodes[CharCodes[\"UPPER_A\"] = 65] = \"UPPER_A\";\n CharCodes[CharCodes[\"UPPER_F\"] = 70] = \"UPPER_F\";\n CharCodes[CharCodes[\"UPPER_Z\"] = 90] = \"UPPER_Z\";\n})(CharCodes || (CharCodes = {}));\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b100000;\nvar BinTrieFlags;\n(function (BinTrieFlags) {\n BinTrieFlags[BinTrieFlags[\"VALUE_LENGTH\"] = 49152] = \"VALUE_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 16256] = \"BRANCH_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags || (BinTrieFlags = {}));\nfunction isNumber(code) {\n return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\nfunction isHexadecimalCharacter(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F));\n}\nfunction isAsciiAlphaNumeric(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n isNumber(code));\n}\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n */\nfunction isEntityInAttributeInvalidEnd(code) {\n return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\nvar EntityDecoderState;\n(function (EntityDecoderState) {\n EntityDecoderState[EntityDecoderState[\"EntityStart\"] = 0] = \"EntityStart\";\n EntityDecoderState[EntityDecoderState[\"NumericStart\"] = 1] = \"NumericStart\";\n EntityDecoderState[EntityDecoderState[\"NumericDecimal\"] = 2] = \"NumericDecimal\";\n EntityDecoderState[EntityDecoderState[\"NumericHex\"] = 3] = \"NumericHex\";\n EntityDecoderState[EntityDecoderState[\"NamedEntity\"] = 4] = \"NamedEntity\";\n})(EntityDecoderState || (EntityDecoderState = {}));\nvar DecodingMode;\n(function (DecodingMode) {\n /** Entities in text nodes that can end with any character. */\n DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n /** Only allow entities terminated with a semicolon. */\n DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n /** Entities in attributes have limitations on ending characters. */\n DecodingMode[DecodingMode[\"Attribute\"] = 2] = \"Attribute\";\n})(DecodingMode || (DecodingMode = {}));\n/**\n * Token decoder with support of writing partial entities.\n */\nclass EntityDecoder {\n constructor(\n /** The tree used to decode entities. */\n decodeTree, \n /**\n * The function that is called when a codepoint is decoded.\n *\n * For multi-byte named entities, this will be called multiple times,\n * with the second codepoint, and the same `consumed` value.\n *\n * @param codepoint The decoded codepoint.\n * @param consumed The number of bytes consumed by the decoder.\n */\n emitCodePoint, \n /** An object that is used to produce errors. */\n errors) {\n this.decodeTree = decodeTree;\n this.emitCodePoint = emitCodePoint;\n this.errors = errors;\n /** The current state of the decoder. */\n this.state = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n this.consumed = 1;\n /**\n * The result of the entity.\n *\n * Either the result index of a numeric entity, or the codepoint of a\n * numeric entity.\n */\n this.result = 0;\n /** The current index in the decode tree. */\n this.treeIndex = 0;\n /** The number of characters that were consumed in excess. */\n this.excess = 1;\n /** The mode in which the decoder is operating. */\n this.decodeMode = DecodingMode.Strict;\n }\n /** Resets the instance to make it reusable. */\n startEntity(decodeMode) {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n }\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n *\n * @param string The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(str, offset) {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (str.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(str, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(str, offset);\n }\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(str, offset);\n }\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(str, offset);\n }\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(str, offset);\n }\n case EntityDecoderState.NamedEntity: {\n return this.stateNamedEntity(str, offset);\n }\n }\n }\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n *\n * @param str The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericStart(str, offset) {\n if (offset >= str.length) {\n return -1;\n }\n if ((str.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(str, offset + 1);\n }\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(str, offset);\n }\n addToNumericResult(str, start, end, base) {\n if (start !== end) {\n const digitCount = end - start;\n this.result =\n this.result * Math.pow(base, digitCount) +\n parseInt(str.substr(start, digitCount), base);\n this.consumed += digitCount;\n }\n }\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML spec.\n *\n * @param str The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericHex(str, offset) {\n const startIdx = offset;\n while (offset < str.length) {\n const char = str.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n offset += 1;\n }\n else {\n this.addToNumericResult(str, startIdx, offset, 16);\n return this.emitNumericEntity(char, 3);\n }\n }\n this.addToNumericResult(str, startIdx, offset, 16);\n return -1;\n }\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML spec.\n *\n * @param str The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericDecimal(str, offset) {\n const startIdx = offset;\n while (offset < str.length) {\n const char = str.charCodeAt(offset);\n if (isNumber(char)) {\n offset += 1;\n }\n else {\n this.addToNumericResult(str, startIdx, offset, 10);\n return this.emitNumericEntity(char, 2);\n }\n }\n this.addToNumericResult(str, startIdx, offset, 10);\n return -1;\n }\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n *\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n emitNumericEntity(lastCp, expectedLength) {\n var _a;\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n }\n else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n this.emitCodePoint((0,_decode_codepoint_js__WEBPACK_IMPORTED_MODULE_2__.replaceCodePoint)(this.result), this.consumed);\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n this.errors.validateNumericCharacterReference(this.result);\n }\n return this.consumed;\n }\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n *\n * @param str The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNamedEntity(str, offset) {\n const { decodeTree } = this;\n let current = decodeTree[this.treeIndex];\n // The mask is the number of bytes of the value, including the current byte.\n let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n for (; offset < str.length; offset++, this.excess++) {\n const char = str.charCodeAt(offset);\n this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);\n if (this.treeIndex < 0) {\n return this.result === 0 ||\n // If we are parsing an attribute\n (this.decodeMode === DecodingMode.Attribute &&\n // We shouldn't have consumed any characters after the entity,\n (valueLength === 0 ||\n // And there should be no invalid characters.\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n // If the branch is a value, store it and continue\n if (valueLength !== 0) {\n // If the entity is terminated by a semicolon, we are done.\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n if (this.decodeMode !== DecodingMode.Strict) {\n this.result = this.treeIndex;\n this.consumed += this.excess;\n this.excess = 0;\n }\n }\n }\n return -1;\n }\n /**\n * Emit a named entity that was not terminated with a semicolon.\n *\n * @returns The number of characters consumed.\n */\n emitNotTerminatedNamedEntity() {\n var _a;\n const { result, decodeTree } = this;\n const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n this.emitNamedEntityData(result, valueLength, this.consumed);\n (_a = this.errors) === null || _a === void 0 ? void 0 : _a.missingSemicolonAfterCharacterReference();\n return this.consumed;\n }\n /**\n * Emit a named entity.\n *\n * @param result The index of the entity in the decode tree.\n * @param valueLength The number of bytes in the entity.\n * @param consumed The number of characters consumed.\n *\n * @returns The number of characters consumed.\n */\n emitNamedEntityData(result, valueLength, consumed) {\n const { decodeTree } = this;\n this.emitCodePoint(valueLength === 1\n ? decodeTree[result] & ~BinTrieFlags.VALUE_LENGTH\n : decodeTree[result + 1], consumed);\n if (valueLength === 3) {\n // For multi-byte values, we need to emit the second byte.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n return consumed;\n }\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n *\n * @returns The number of characters consumed.\n */\n end() {\n var _a;\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n (_a = this.errors) === null || _a === void 0 ? void 0 : _a.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n case EntityDecoderState.EntityStart: {\n // Return 0 if we have no entity.\n return 0;\n }\n }\n }\n}\n/**\n * Creates a function that decodes entities in a string.\n *\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree) {\n let ret = \"\";\n const decoder = new EntityDecoder(decodeTree, (str) => (ret += (0,_decode_codepoint_js__WEBPACK_IMPORTED_MODULE_2__.fromCodePoint)(str)));\n return function decodeWithTrie(str, decodeMode) {\n let lastIndex = 0;\n let offset = 0;\n while ((offset = str.indexOf(\"&\", offset)) >= 0) {\n ret += str.slice(lastIndex, offset);\n decoder.startEntity(decodeMode);\n const len = decoder.write(str, \n // Skip the \"&\"\n offset + 1);\n if (len < 0) {\n lastIndex = offset + decoder.end();\n break;\n }\n lastIndex = offset + len;\n // If `len` is 0, skip the current `&` and continue.\n offset = len === 0 ? lastIndex + 1 : lastIndex;\n }\n const result = ret + str.slice(lastIndex);\n // Make sure we don't keep a reference to the final string.\n ret = \"\";\n return result;\n };\n}\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n *\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIdx The index right after the current node and its value.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nfunction determineBranch(decodeTree, current, nodeIdx, char) {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n // Case 1: Single branch encoded in jump offset\n if (branchCount === 0) {\n return jumpOffset !== 0 && char === jumpOffset ? nodeIdx : -1;\n }\n // Case 2: Multiple branches encoded in jump table\n if (jumpOffset) {\n const value = char - jumpOffset;\n return value < 0 || value >= branchCount\n ? -1\n : decodeTree[nodeIdx + value] - 1;\n }\n // Case 3: Multiple branches encoded in dictionary\n // Binary search for the character.\n let lo = nodeIdx;\n let hi = lo + branchCount - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const midVal = decodeTree[mid];\n if (midVal < char) {\n lo = mid + 1;\n }\n else if (midVal > char) {\n hi = mid - 1;\n }\n else {\n return decodeTree[mid + branchCount];\n }\n }\n return -1;\n}\nconst htmlDecoder = getDecoder(_generated_decode_data_html_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\nconst xmlDecoder = getDecoder(_generated_decode_data_xml_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/**\n * Decodes an HTML string.\n *\n * @param str The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nfunction decodeHTML(str, mode = DecodingMode.Legacy) {\n return htmlDecoder(str, mode);\n}\n/**\n * Decodes an HTML string in an attribute.\n *\n * @param str The string to decode.\n * @returns The decoded string.\n */\nfunction decodeHTMLAttribute(str) {\n return htmlDecoder(str, DecodingMode.Attribute);\n}\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n *\n * @param str The string to decode.\n * @returns The decoded string.\n */\nfunction decodeHTMLStrict(str) {\n return htmlDecoder(str, DecodingMode.Strict);\n}\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n *\n * @param str The string to decode.\n * @returns The decoded string.\n */\nfunction decodeXML(str) {\n return xmlDecoder(str, DecodingMode.Strict);\n}\n//# sourceMappingURL=decode.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9kZWNvZGUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUE2RDtBQUNGO0FBQytCO0FBQzFGO0FBQzBEO0FBQ2M7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvQ0FBb0M7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdEQUFnRDtBQUMxQztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvQ0FBb0M7QUFDckM7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0VBQWdCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGVBQWUscUJBQXFCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsbUVBQWE7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHNFQUFjO0FBQzdDLDhCQUE4QixxRUFBYTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL25vZGVfbW9kdWxlcy9lbnRpdGllcy9saWIvZXNtL2RlY29kZS5qcz9jZTZkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBodG1sRGVjb2RlVHJlZSBmcm9tIFwiLi9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEtaHRtbC5qc1wiO1xuaW1wb3J0IHhtbERlY29kZVRyZWUgZnJvbSBcIi4vZ2VuZXJhdGVkL2RlY29kZS1kYXRhLXhtbC5qc1wiO1xuaW1wb3J0IGRlY29kZUNvZGVQb2ludCwgeyByZXBsYWNlQ29kZVBvaW50LCBmcm9tQ29kZVBvaW50LCB9IGZyb20gXCIuL2RlY29kZV9jb2RlcG9pbnQuanNcIjtcbi8vIFJlLWV4cG9ydCBmb3IgdXNlIGJ5IGVnLiBodG1scGFyc2VyMlxuZXhwb3J0IHsgaHRtbERlY29kZVRyZWUsIHhtbERlY29kZVRyZWUsIGRlY29kZUNvZGVQb2ludCB9O1xuZXhwb3J0IHsgcmVwbGFjZUNvZGVQb2ludCwgZnJvbUNvZGVQb2ludCB9IGZyb20gXCIuL2RlY29kZV9jb2RlcG9pbnQuanNcIjtcbnZhciBDaGFyQ29kZXM7XG4oZnVuY3Rpb24gKENoYXJDb2Rlcykge1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOVU1cIl0gPSAzNV0gPSBcIk5VTVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTRU1JXCJdID0gNTldID0gXCJTRU1JXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkVRVUFMU1wiXSA9IDYxXSA9IFwiRVFVQUxTXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlpFUk9cIl0gPSA0OF0gPSBcIlpFUk9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTklORVwiXSA9IDU3XSA9IFwiTklORVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJMT1dFUl9BXCJdID0gOTddID0gXCJMT1dFUl9BXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxPV0VSX0ZcIl0gPSAxMDJdID0gXCJMT1dFUl9GXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxPV0VSX1hcIl0gPSAxMjBdID0gXCJMT1dFUl9YXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxPV0VSX1pcIl0gPSAxMjJdID0gXCJMT1dFUl9aXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlVQUEVSX0FcIl0gPSA2NV0gPSBcIlVQUEVSX0FcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVVBQRVJfRlwiXSA9IDcwXSA9IFwiVVBQRVJfRlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJVUFBFUl9aXCJdID0gOTBdID0gXCJVUFBFUl9aXCI7XG59KShDaGFyQ29kZXMgfHwgKENoYXJDb2RlcyA9IHt9KSk7XG4vKiogQml0IHRoYXQgbmVlZHMgdG8gYmUgc2V0IHRvIGNvbnZlcnQgYW4gdXBwZXIgY2FzZSBBU0NJSSBjaGFyYWN0ZXIgdG8gbG93ZXIgY2FzZSAqL1xuY29uc3QgVE9fTE9XRVJfQklUID0gMGIxMDAwMDA7XG5leHBvcnQgdmFyIEJpblRyaWVGbGFncztcbihmdW5jdGlvbiAoQmluVHJpZUZsYWdzKSB7XG4gICAgQmluVHJpZUZsYWdzW0JpblRyaWVGbGFnc1tcIlZBTFVFX0xFTkdUSFwiXSA9IDQ5MTUyXSA9IFwiVkFMVUVfTEVOR1RIXCI7XG4gICAgQmluVHJpZUZsYWdzW0JpblRyaWVGbGFnc1tcIkJSQU5DSF9MRU5HVEhcIl0gPSAxNjI1Nl0gPSBcIkJSQU5DSF9MRU5HVEhcIjtcbiAgICBCaW5UcmllRmxhZ3NbQmluVHJpZUZsYWdzW1wiSlVNUF9UQUJMRVwiXSA9IDEyN10gPSBcIkpVTVBfVEFCTEVcIjtcbn0pKEJpblRyaWVGbGFncyB8fCAoQmluVHJpZUZsYWdzID0ge30pKTtcbmZ1bmN0aW9uIGlzTnVtYmVyKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA+PSBDaGFyQ29kZXMuWkVSTyAmJiBjb2RlIDw9IENoYXJDb2Rlcy5OSU5FO1xufVxuZnVuY3Rpb24gaXNIZXhhZGVjaW1hbENoYXJhY3Rlcihjb2RlKSB7XG4gICAgcmV0dXJuICgoY29kZSA+PSBDaGFyQ29kZXMuVVBQRVJfQSAmJiBjb2RlIDw9IENoYXJDb2Rlcy5VUFBFUl9GKSB8fFxuICAgICAgICAoY29kZSA+PSBDaGFyQ29kZXMuTE9XRVJfQSAmJiBjb2RlIDw9IENoYXJDb2Rlcy5MT1dFUl9GKSk7XG59XG5mdW5jdGlvbiBpc0FzY2lpQWxwaGFOdW1lcmljKGNvZGUpIHtcbiAgICByZXR1cm4gKChjb2RlID49IENoYXJDb2Rlcy5VUFBFUl9BICYmIGNvZGUgPD0gQ2hhckNvZGVzLlVQUEVSX1opIHx8XG4gICAgICAgIChjb2RlID49IENoYXJDb2Rlcy5MT1dFUl9BICYmIGNvZGUgPD0gQ2hhckNvZGVzLkxPV0VSX1opIHx8XG4gICAgICAgIGlzTnVtYmVyKGNvZGUpKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBlbmQgY2hhcmFjdGVyIGZvciBhbiBlbnRpdHkgaW4gYW4gYXR0cmlidXRlLlxuICpcbiAqIEF0dHJpYnV0ZSB2YWx1ZXMgdGhhdCBhcmVuJ3QgdGVybWluYXRlZCBwcm9wZXJseSBhcmVuJ3QgcGFyc2VkLCBhbmQgc2hvdWxkbid0IGxlYWQgdG8gYSBwYXJzZXIgZXJyb3IuXG4gKiBTZWUgdGhlIGV4YW1wbGUgaW4gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvcGFyc2luZy5odG1sI25hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2Utc3RhdGVcbiAqL1xuZnVuY3Rpb24gaXNFbnRpdHlJbkF0dHJpYnV0ZUludmFsaWRFbmQoY29kZSkge1xuICAgIHJldHVybiBjb2RlID09PSBDaGFyQ29kZXMuRVFVQUxTIHx8IGlzQXNjaWlBbHBoYU51bWVyaWMoY29kZSk7XG59XG52YXIgRW50aXR5RGVjb2RlclN0YXRlO1xuKGZ1bmN0aW9uIChFbnRpdHlEZWNvZGVyU3RhdGUpIHtcbiAgICBFbnRpdHlEZWNvZGVyU3RhdGVbRW50aXR5RGVjb2RlclN0YXRlW1wiRW50aXR5U3RhcnRcIl0gPSAwXSA9IFwiRW50aXR5U3RhcnRcIjtcbiAgICBFbnRpdHlEZWNvZGVyU3RhdGVbRW50aXR5RGVjb2RlclN0YXRlW1wiTnVtZXJpY1N0YXJ0XCJdID0gMV0gPSBcIk51bWVyaWNTdGFydFwiO1xuICAgIEVudGl0eURlY29kZXJTdGF0ZVtFbnRpdHlEZWNvZGVyU3RhdGVbXCJOdW1lcmljRGVjaW1hbFwiXSA9IDJdID0gXCJOdW1lcmljRGVjaW1hbFwiO1xuICAgIEVudGl0eURlY29kZXJTdGF0ZVtFbnRpdHlEZWNvZGVyU3RhdGVbXCJOdW1lcmljSGV4XCJdID0gM10gPSBcIk51bWVyaWNIZXhcIjtcbiAgICBFbnRpdHlEZWNvZGVyU3RhdGVbRW50aXR5RGVjb2RlclN0YXRlW1wiTmFtZWRFbnRpdHlcIl0gPSA0XSA9IFwiTmFtZWRFbnRpdHlcIjtcbn0pKEVudGl0eURlY29kZXJTdGF0ZSB8fCAoRW50aXR5RGVjb2RlclN0YXRlID0ge30pKTtcbmV4cG9ydCB2YXIgRGVjb2RpbmdNb2RlO1xuKGZ1bmN0aW9uIChEZWNvZGluZ01vZGUpIHtcbiAgICAvKiogRW50aXRpZXMgaW4gdGV4dCBub2RlcyB0aGF0IGNhbiBlbmQgd2l0aCBhbnkgY2hhcmFjdGVyLiAqL1xuICAgIERlY29kaW5nTW9kZVtEZWNvZGluZ01vZGVbXCJMZWdhY3lcIl0gPSAwXSA9IFwiTGVnYWN5XCI7XG4gICAgLyoqIE9ubHkgYWxsb3cgZW50aXRpZXMgdGVybWluYXRlZCB3aXRoIGEgc2VtaWNvbG9uLiAqL1xuICAgIERlY29kaW5nTW9kZVtEZWNvZGluZ01vZGVbXCJTdHJpY3RcIl0gPSAxXSA9IFwiU3RyaWN0XCI7XG4gICAgLyoqIEVudGl0aWVzIGluIGF0dHJpYnV0ZXMgaGF2ZSBsaW1pdGF0aW9ucyBvbiBlbmRpbmcgY2hhcmFjdGVycy4gKi9cbiAgICBEZWNvZGluZ01vZGVbRGVjb2RpbmdNb2RlW1wiQXR0cmlidXRlXCJdID0gMl0gPSBcIkF0dHJpYnV0ZVwiO1xufSkoRGVjb2RpbmdNb2RlIHx8IChEZWNvZGluZ01vZGUgPSB7fSkpO1xuLyoqXG4gKiBUb2tlbiBkZWNvZGVyIHdpdGggc3VwcG9ydCBvZiB3cml0aW5nIHBhcnRpYWwgZW50aXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnRpdHlEZWNvZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHRyZWUgdXNlZCB0byBkZWNvZGUgZW50aXRpZXMuICovXG4gICAgZGVjb2RlVHJlZSwgXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBjb2RlcG9pbnQgaXMgZGVjb2RlZC5cbiAgICAgKlxuICAgICAqIEZvciBtdWx0aS1ieXRlIG5hbWVkIGVudGl0aWVzLCB0aGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLFxuICAgICAqIHdpdGggdGhlIHNlY29uZCBjb2RlcG9pbnQsIGFuZCB0aGUgc2FtZSBgY29uc3VtZWRgIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGVwb2ludCBUaGUgZGVjb2RlZCBjb2RlcG9pbnQuXG4gICAgICogQHBhcmFtIGNvbnN1bWVkIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYnkgdGhlIGRlY29kZXIuXG4gICAgICovXG4gICAgZW1pdENvZGVQb2ludCwgXG4gICAgLyoqIEFuIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gcHJvZHVjZSBlcnJvcnMuICovXG4gICAgZXJyb3JzKSB7XG4gICAgICAgIHRoaXMuZGVjb2RlVHJlZSA9IGRlY29kZVRyZWU7XG4gICAgICAgIHRoaXMuZW1pdENvZGVQb2ludCA9IGVtaXRDb2RlUG9pbnQ7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICAvKiogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRlY29kZXIuICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBFbnRpdHlEZWNvZGVyU3RhdGUuRW50aXR5U3RhcnQ7XG4gICAgICAgIC8qKiBDaGFyYWN0ZXJzIHRoYXQgd2VyZSBjb25zdW1lZCB3aGlsZSBwYXJzaW5nIGFuIGVudGl0eS4gKi9cbiAgICAgICAgdGhpcy5jb25zdW1lZCA9IDE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBlbnRpdHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEVpdGhlciB0aGUgcmVzdWx0IGluZGV4IG9mIGEgbnVtZXJpYyBlbnRpdHksIG9yIHRoZSBjb2RlcG9pbnQgb2YgYVxuICAgICAgICAgKiBudW1lcmljIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVzdWx0ID0gMDtcbiAgICAgICAgLyoqIFRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBkZWNvZGUgdHJlZS4gKi9cbiAgICAgICAgdGhpcy50cmVlSW5kZXggPSAwO1xuICAgICAgICAvKiogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBjb25zdW1lZCBpbiBleGNlc3MuICovXG4gICAgICAgIHRoaXMuZXhjZXNzID0gMTtcbiAgICAgICAgLyoqIFRoZSBtb2RlIGluIHdoaWNoIHRoZSBkZWNvZGVyIGlzIG9wZXJhdGluZy4gKi9cbiAgICAgICAgdGhpcy5kZWNvZGVNb2RlID0gRGVjb2RpbmdNb2RlLlN0cmljdDtcbiAgICB9XG4gICAgLyoqIFJlc2V0cyB0aGUgaW5zdGFuY2UgdG8gbWFrZSBpdCByZXVzYWJsZS4gKi9cbiAgICBzdGFydEVudGl0eShkZWNvZGVNb2RlKSB7XG4gICAgICAgIHRoaXMuZGVjb2RlTW9kZSA9IGRlY29kZU1vZGU7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBFbnRpdHlEZWNvZGVyU3RhdGUuRW50aXR5U3RhcnQ7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gMDtcbiAgICAgICAgdGhpcy50cmVlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmV4Y2VzcyA9IDE7XG4gICAgICAgIHRoaXMuY29uc3VtZWQgPSAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhbiBlbnRpdHkgdG8gdGhlIGRlY29kZXIuIFRoaXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIHBhcnRpYWwgZW50aXRpZXMuXG4gICAgICogSWYgdGhlIGVudGl0eSBpcyBpbmNvbXBsZXRlLCB0aGUgZGVjb2RlciB3aWxsIHJldHVybiAtMS5cbiAgICAgKlxuICAgICAqIE1pcnJvcnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBnZXREZWNvZGVyYCwgYnV0IHdpdGggdGhlIGFiaWxpdHkgdG8gc3RvcCBkZWNvZGluZyBpZiB0aGVcbiAgICAgKiBlbnRpdHkgaXMgaW5jb21wbGV0ZSwgYW5kIHJlc3VtZSB3aGVuIHRoZSBuZXh0IHN0cmluZyBpcyB3cml0dGVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGl0eSAob3IgYSBjb250aW51YXRpb24gb2YgdGhlIGVudGl0eSkuXG4gICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBlbnRpdHkgYmVnaW5zLiBTaG91bGQgYmUgMCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgY2FsbC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3ZXJlIGNvbnN1bWVkLCBvciAtMSBpZiB0aGUgZW50aXR5IGlzIGluY29tcGxldGUuXG4gICAgICovXG4gICAgd3JpdGUoc3RyLCBvZmZzZXQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIEVudGl0eURlY29kZXJTdGF0ZS5FbnRpdHlTdGFydDoge1xuICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckNvZGVBdChvZmZzZXQpID09PSBDaGFyQ29kZXMuTlVNKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBFbnRpdHlEZWNvZGVyU3RhdGUuTnVtZXJpY1N0YXJ0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlTnVtZXJpY1N0YXJ0KHN0ciwgb2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBFbnRpdHlEZWNvZGVyU3RhdGUuTmFtZWRFbnRpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVOYW1lZEVudGl0eShzdHIsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVudGl0eURlY29kZXJTdGF0ZS5OdW1lcmljU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZU51bWVyaWNTdGFydChzdHIsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVudGl0eURlY29kZXJTdGF0ZS5OdW1lcmljRGVjaW1hbDoge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlTnVtZXJpY0RlY2ltYWwoc3RyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBFbnRpdHlEZWNvZGVyU3RhdGUuTnVtZXJpY0hleDoge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlTnVtZXJpY0hleChzdHIsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVudGl0eURlY29kZXJTdGF0ZS5OYW1lZEVudGl0eToge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlTmFtZWRFbnRpdHkoc3RyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN3aXRjaGVzIGJldHdlZW4gdGhlIG51bWVyaWMgZGVjaW1hbCBhbmQgaGV4YWRlY2ltYWwgc3RhdGVzLlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudCB0byB0aGUgYE51bWVyaWMgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGF0ZWAgaW4gdGhlIEhUTUwgc3BlYy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBlbnRpdHkgKG9yIGEgY29udGludWF0aW9uIG9mIHRoZSBlbnRpdHkpLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGN1cnJlbnQgb2Zmc2V0LlxuICAgICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdlcmUgY29uc3VtZWQsIG9yIC0xIGlmIHRoZSBlbnRpdHkgaXMgaW5jb21wbGV0ZS5cbiAgICAgKi9cbiAgICBzdGF0ZU51bWVyaWNTdGFydChzdHIsIG9mZnNldCkge1xuICAgICAgICBpZiAob2Zmc2V0ID49IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHN0ci5jaGFyQ29kZUF0KG9mZnNldCkgfCBUT19MT1dFUl9CSVQpID09PSBDaGFyQ29kZXMuTE9XRVJfWCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEVudGl0eURlY29kZXJTdGF0ZS5OdW1lcmljSGV4O1xuICAgICAgICAgICAgdGhpcy5jb25zdW1lZCArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVOdW1lcmljSGV4KHN0ciwgb2Zmc2V0ICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IEVudGl0eURlY29kZXJTdGF0ZS5OdW1lcmljRGVjaW1hbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVOdW1lcmljRGVjaW1hbChzdHIsIG9mZnNldCk7XG4gICAgfVxuICAgIGFkZFRvTnVtZXJpY1Jlc3VsdChzdHIsIHN0YXJ0LCBlbmQsIGJhc2UpIHtcbiAgICAgICAgaWYgKHN0YXJ0ICE9PSBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpZ2l0Q291bnQgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0ID1cbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdCAqIE1hdGgucG93KGJhc2UsIGRpZ2l0Q291bnQpICtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3RyLnN1YnN0cihzdGFydCwgZGlnaXRDb3VudCksIGJhc2UpO1xuICAgICAgICAgICAgdGhpcy5jb25zdW1lZCArPSBkaWdpdENvdW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGhleGFkZWNpbWFsIG51bWVyaWMgZW50aXR5LlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudCB0byB0aGUgYEhleGFkZW1pY2FsIGNoYXJhY3RlciByZWZlcmVuY2Ugc3RhdGVgIGluIHRoZSBIVE1MIHNwZWMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXR5IChvciBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgZW50aXR5KS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBjdXJyZW50IG9mZnNldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3ZXJlIGNvbnN1bWVkLCBvciAtMSBpZiB0aGUgZW50aXR5IGlzIGluY29tcGxldGUuXG4gICAgICovXG4gICAgc3RhdGVOdW1lcmljSGV4KHN0ciwgb2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gb2Zmc2V0O1xuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoY2hhcikgfHwgaXNIZXhhZGVjaW1hbENoYXJhY3RlcihjaGFyKSkge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUb051bWVyaWNSZXN1bHQoc3RyLCBzdGFydElkeCwgb2Zmc2V0LCAxNik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdE51bWVyaWNFbnRpdHkoY2hhciwgMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRUb051bWVyaWNSZXN1bHQoc3RyLCBzdGFydElkeCwgb2Zmc2V0LCAxNik7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgZGVjaW1hbCBudW1lcmljIGVudGl0eS5cbiAgICAgKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gdGhlIGBEZWNpbWFsIGNoYXJhY3RlciByZWZlcmVuY2Ugc3RhdGVgIGluIHRoZSBIVE1MIHNwZWMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXR5IChvciBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgZW50aXR5KS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBjdXJyZW50IG9mZnNldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3ZXJlIGNvbnN1bWVkLCBvciAtMSBpZiB0aGUgZW50aXR5IGlzIGluY29tcGxldGUuXG4gICAgICovXG4gICAgc3RhdGVOdW1lcmljRGVjaW1hbChzdHIsIG9mZnNldCkge1xuICAgICAgICBjb25zdCBzdGFydElkeCA9IG9mZnNldDtcbiAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvTnVtZXJpY1Jlc3VsdChzdHIsIHN0YXJ0SWR4LCBvZmZzZXQsIDEwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0TnVtZXJpY0VudGl0eShjaGFyLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFRvTnVtZXJpY1Jlc3VsdChzdHIsIHN0YXJ0SWR4LCBvZmZzZXQsIDEwKTtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhbmQgZW1pdCBhIG51bWVyaWMgZW50aXR5LlxuICAgICAqXG4gICAgICogSW1wbGVtZW50cyB0aGUgbG9naWMgZnJvbSB0aGUgYEhleGFkZW1pY2FsIGNoYXJhY3RlciByZWZlcmVuY2Ugc3RhcnRcbiAgICAgKiBzdGF0ZWAgYW5kIGBOdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2UgZW5kIHN0YXRlYCBpbiB0aGUgSFRNTCBzcGVjLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhc3RDcCBUaGUgbGFzdCBjb2RlIHBvaW50IG9mIHRoZSBlbnRpdHkuIFVzZWQgdG8gc2VlIGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgZW50aXR5IHdhcyB0ZXJtaW5hdGVkIHdpdGggYSBzZW1pY29sb24uXG4gICAgICogQHBhcmFtIGV4cGVjdGVkTGVuZ3RoIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkLiBVc2VkIHRvIHZhbGlkYXRlIHRoYXQgYXQgbGVhc3Qgb25lIGRpZ2l0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIHdhcyBjb25zdW1lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3ZXJlIGNvbnN1bWVkLlxuICAgICAqL1xuICAgIGVtaXROdW1lcmljRW50aXR5KGxhc3RDcCwgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBFbnN1cmUgd2UgY29uc3VtZWQgYXQgbGVhc3Qgb25lIGRpZ2l0LlxuICAgICAgICBpZiAodGhpcy5jb25zdW1lZCA8PSBleHBlY3RlZExlbmd0aCkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5lcnJvcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hYnNlbmNlT2ZEaWdpdHNJbk51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UodGhpcy5jb25zdW1lZCk7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgYSBsZWdpdCBlbmQgb2YgdGhlIGVudGl0eVxuICAgICAgICBpZiAobGFzdENwID09PSBDaGFyQ29kZXMuU0VNSSkge1xuICAgICAgICAgICAgdGhpcy5jb25zdW1lZCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGVjb2RlTW9kZSA9PT0gRGVjb2RpbmdNb2RlLlN0cmljdCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0Q29kZVBvaW50KHJlcGxhY2VDb2RlUG9pbnQodGhpcy5yZXN1bHQpLCB0aGlzLmNvbnN1bWVkKTtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzKSB7XG4gICAgICAgICAgICBpZiAobGFzdENwICE9PSBDaGFyQ29kZXMuU0VNSSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLm1pc3NpbmdTZW1pY29sb25BZnRlckNoYXJhY3RlclJlZmVyZW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lcnJvcnMudmFsaWRhdGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKHRoaXMucmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdW1lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgbmFtZWQgZW50aXR5LlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudCB0byB0aGUgYE5hbWVkIGNoYXJhY3RlciByZWZlcmVuY2Ugc3RhdGVgIGluIHRoZSBIVE1MIHNwZWMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXR5IChvciBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgZW50aXR5KS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBjdXJyZW50IG9mZnNldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3ZXJlIGNvbnN1bWVkLCBvciAtMSBpZiB0aGUgZW50aXR5IGlzIGluY29tcGxldGUuXG4gICAgICovXG4gICAgc3RhdGVOYW1lZEVudGl0eShzdHIsIG9mZnNldCkge1xuICAgICAgICBjb25zdCB7IGRlY29kZVRyZWUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBjdXJyZW50ID0gZGVjb2RlVHJlZVt0aGlzLnRyZWVJbmRleF07XG4gICAgICAgIC8vIFRoZSBtYXNrIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIHZhbHVlLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgYnl0ZS5cbiAgICAgICAgbGV0IHZhbHVlTGVuZ3RoID0gKGN1cnJlbnQgJiBCaW5UcmllRmxhZ3MuVkFMVUVfTEVOR1RIKSA+PiAxNDtcbiAgICAgICAgZm9yICg7IG9mZnNldCA8IHN0ci5sZW5ndGg7IG9mZnNldCsrLCB0aGlzLmV4Y2VzcysrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQob2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMudHJlZUluZGV4ID0gZGV0ZXJtaW5lQnJhbmNoKGRlY29kZVRyZWUsIGN1cnJlbnQsIHRoaXMudHJlZUluZGV4ICsgTWF0aC5tYXgoMSwgdmFsdWVMZW5ndGgpLCBjaGFyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQgPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHBhcnNpbmcgYW4gYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmRlY29kZU1vZGUgPT09IERlY29kaW5nTW9kZS5BdHRyaWJ1dGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBoYXZlIGNvbnN1bWVkIGFueSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVMZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGhlcmUgc2hvdWxkIGJlIG5vIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VudGl0eUluQXR0cmlidXRlSW52YWxpZEVuZChjaGFyKSkpXG4gICAgICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZW1pdE5vdFRlcm1pbmF0ZWROYW1lZEVudGl0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudCA9IGRlY29kZVRyZWVbdGhpcy50cmVlSW5kZXhdO1xuICAgICAgICAgICAgdmFsdWVMZW5ndGggPSAoY3VycmVudCAmIEJpblRyaWVGbGFncy5WQUxVRV9MRU5HVEgpID4+IDE0O1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJyYW5jaCBpcyBhIHZhbHVlLCBzdG9yZSBpdCBhbmQgY29udGludWVcbiAgICAgICAgICAgIGlmICh2YWx1ZUxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbnRpdHkgaXMgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbiwgd2UgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IENoYXJDb2Rlcy5TRU1JKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXROYW1lZEVudGl0eURhdGEodGhpcy50cmVlSW5kZXgsIHZhbHVlTGVuZ3RoLCB0aGlzLmNvbnN1bWVkICsgdGhpcy5leGNlc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBub24tdGVybWluYXRlZCAobGVnYWN5KSBlbnRpdHkgd2hpbGUgcGFyc2luZyBzdHJpY3RseSwgdGhlbiBpZ25vcmUgaXQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVjb2RlTW9kZSAhPT0gRGVjb2RpbmdNb2RlLlN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHRoaXMudHJlZUluZGV4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWVkICs9IHRoaXMuZXhjZXNzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4Y2VzcyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdCBhIG5hbWVkIGVudGl0eSB0aGF0IHdhcyBub3QgdGVybWluYXRlZCB3aXRoIGEgc2VtaWNvbG9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkLlxuICAgICAqL1xuICAgIGVtaXROb3RUZXJtaW5hdGVkTmFtZWRFbnRpdHkoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyByZXN1bHQsIGRlY29kZVRyZWUgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHZhbHVlTGVuZ3RoID0gKGRlY29kZVRyZWVbcmVzdWx0XSAmIEJpblRyaWVGbGFncy5WQUxVRV9MRU5HVEgpID4+IDE0O1xuICAgICAgICB0aGlzLmVtaXROYW1lZEVudGl0eURhdGEocmVzdWx0LCB2YWx1ZUxlbmd0aCwgdGhpcy5jb25zdW1lZCk7XG4gICAgICAgIChfYSA9IHRoaXMuZXJyb3JzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWlzc2luZ1NlbWljb2xvbkFmdGVyQ2hhcmFjdGVyUmVmZXJlbmNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN1bWVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGEgbmFtZWQgZW50aXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCBUaGUgaW5kZXggb2YgdGhlIGVudGl0eSBpbiB0aGUgZGVjb2RlIHRyZWUuXG4gICAgICogQHBhcmFtIHZhbHVlTGVuZ3RoIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gY29uc3VtZWQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkLlxuICAgICAqL1xuICAgIGVtaXROYW1lZEVudGl0eURhdGEocmVzdWx0LCB2YWx1ZUxlbmd0aCwgY29uc3VtZWQpIHtcbiAgICAgICAgY29uc3QgeyBkZWNvZGVUcmVlIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXRDb2RlUG9pbnQodmFsdWVMZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gZGVjb2RlVHJlZVtyZXN1bHRdICYgfkJpblRyaWVGbGFncy5WQUxVRV9MRU5HVEhcbiAgICAgICAgICAgIDogZGVjb2RlVHJlZVtyZXN1bHQgKyAxXSwgY29uc3VtZWQpO1xuICAgICAgICBpZiAodmFsdWVMZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIC8vIEZvciBtdWx0aS1ieXRlIHZhbHVlcywgd2UgbmVlZCB0byBlbWl0IHRoZSBzZWNvbmQgYnl0ZS5cbiAgICAgICAgICAgIHRoaXMuZW1pdENvZGVQb2ludChkZWNvZGVUcmVlW3Jlc3VsdCArIDJdLCBjb25zdW1lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnN1bWVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaWduYWwgdG8gdGhlIHBhcnNlciB0aGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IHdhcyByZWFjaGVkLlxuICAgICAqXG4gICAgICogUmVtYWluaW5nIGRhdGEgd2lsbCBiZSBlbWl0dGVkIGFuZCByZWxldmFudCBlcnJvcnMgd2lsbCBiZSBwcm9kdWNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb25zdW1lZC5cbiAgICAgKi9cbiAgICBlbmQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIEVudGl0eURlY29kZXJTdGF0ZS5OYW1lZEVudGl0eToge1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgYSBuYW1lZCBlbnRpdHkgaWYgd2UgaGF2ZSBvbmUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0ICE9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmRlY29kZU1vZGUgIT09IERlY29kaW5nTW9kZS5BdHRyaWJ1dGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0ID09PSB0aGlzLnRyZWVJbmRleClcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmVtaXROb3RUZXJtaW5hdGVkTmFtZWRFbnRpdHkoKVxuICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGVtaXQgYSBudW1lcmljIGVudGl0eSBpZiB3ZSBoYXZlIG9uZS5cbiAgICAgICAgICAgIGNhc2UgRW50aXR5RGVjb2RlclN0YXRlLk51bWVyaWNEZWNpbWFsOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdE51bWVyaWNFbnRpdHkoMCwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVudGl0eURlY29kZXJTdGF0ZS5OdW1lcmljSGV4OiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdE51bWVyaWNFbnRpdHkoMCwgMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEVudGl0eURlY29kZXJTdGF0ZS5OdW1lcmljU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLmVycm9ycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFic2VuY2VPZkRpZ2l0c0luTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZSh0aGlzLmNvbnN1bWVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRW50aXR5RGVjb2RlclN0YXRlLkVudGl0eVN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuIDAgaWYgd2UgaGF2ZSBubyBlbnRpdHkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGRlY29kZXMgZW50aXRpZXMgaW4gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGRlY29kZVRyZWUgVGhlIGRlY29kZSB0cmVlLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGRlY29kZXMgZW50aXRpZXMgaW4gYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldERlY29kZXIoZGVjb2RlVHJlZSkge1xuICAgIGxldCByZXQgPSBcIlwiO1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgRW50aXR5RGVjb2RlcihkZWNvZGVUcmVlLCAoc3RyKSA9PiAocmV0ICs9IGZyb21Db2RlUG9pbnQoc3RyKSkpO1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWNvZGVXaXRoVHJpZShzdHIsIGRlY29kZU1vZGUpIHtcbiAgICAgICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICB3aGlsZSAoKG9mZnNldCA9IHN0ci5pbmRleE9mKFwiJlwiLCBvZmZzZXQpKSA+PSAwKSB7XG4gICAgICAgICAgICByZXQgKz0gc3RyLnNsaWNlKGxhc3RJbmRleCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGRlY29kZXIuc3RhcnRFbnRpdHkoZGVjb2RlTW9kZSk7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBkZWNvZGVyLndyaXRlKHN0ciwgXG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBcIiZcIlxuICAgICAgICAgICAgb2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICBpZiAobGVuIDwgMCkge1xuICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG9mZnNldCArIGRlY29kZXIuZW5kKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0SW5kZXggPSBvZmZzZXQgKyBsZW47XG4gICAgICAgICAgICAvLyBJZiBgbGVuYCBpcyAwLCBza2lwIHRoZSBjdXJyZW50IGAmYCBhbmQgY29udGludWUuXG4gICAgICAgICAgICBvZmZzZXQgPSBsZW4gPT09IDAgPyBsYXN0SW5kZXggKyAxIDogbGFzdEluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJldCArIHN0ci5zbGljZShsYXN0SW5kZXgpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgZmluYWwgc3RyaW5nLlxuICAgICAgICByZXQgPSBcIlwiO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIGJyYW5jaCBvZiB0aGUgY3VycmVudCBub2RlIHRoYXQgaXMgdGFrZW4gZ2l2ZW4gdGhlIGN1cnJlbnRcbiAqIGNoYXJhY3Rlci4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSB0cmllLlxuICpcbiAqIEBwYXJhbSBkZWNvZGVUcmVlIFRoZSB0cmllLlxuICogQHBhcmFtIGN1cnJlbnQgVGhlIGN1cnJlbnQgbm9kZS5cbiAqIEBwYXJhbSBub2RlSWR4IFRoZSBpbmRleCByaWdodCBhZnRlciB0aGUgY3VycmVudCBub2RlIGFuZCBpdHMgdmFsdWUuXG4gKiBAcGFyYW0gY2hhciBUaGUgY3VycmVudCBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIG5leHQgbm9kZSwgb3IgLTEgaWYgbm8gYnJhbmNoIGlzIHRha2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5lQnJhbmNoKGRlY29kZVRyZWUsIGN1cnJlbnQsIG5vZGVJZHgsIGNoYXIpIHtcbiAgICBjb25zdCBicmFuY2hDb3VudCA9IChjdXJyZW50ICYgQmluVHJpZUZsYWdzLkJSQU5DSF9MRU5HVEgpID4+IDc7XG4gICAgY29uc3QganVtcE9mZnNldCA9IGN1cnJlbnQgJiBCaW5UcmllRmxhZ3MuSlVNUF9UQUJMRTtcbiAgICAvLyBDYXNlIDE6IFNpbmdsZSBicmFuY2ggZW5jb2RlZCBpbiBqdW1wIG9mZnNldFxuICAgIGlmIChicmFuY2hDb3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ganVtcE9mZnNldCAhPT0gMCAmJiBjaGFyID09PSBqdW1wT2Zmc2V0ID8gbm9kZUlkeCA6IC0xO1xuICAgIH1cbiAgICAvLyBDYXNlIDI6IE11bHRpcGxlIGJyYW5jaGVzIGVuY29kZWQgaW4ganVtcCB0YWJsZVxuICAgIGlmIChqdW1wT2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2hhciAtIGp1bXBPZmZzZXQ7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gYnJhbmNoQ291bnRcbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogZGVjb2RlVHJlZVtub2RlSWR4ICsgdmFsdWVdIC0gMTtcbiAgICB9XG4gICAgLy8gQ2FzZSAzOiBNdWx0aXBsZSBicmFuY2hlcyBlbmNvZGVkIGluIGRpY3Rpb25hcnlcbiAgICAvLyBCaW5hcnkgc2VhcmNoIGZvciB0aGUgY2hhcmFjdGVyLlxuICAgIGxldCBsbyA9IG5vZGVJZHg7XG4gICAgbGV0IGhpID0gbG8gKyBicmFuY2hDb3VudCAtIDE7XG4gICAgd2hpbGUgKGxvIDw9IGhpKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgY29uc3QgbWlkVmFsID0gZGVjb2RlVHJlZVttaWRdO1xuICAgICAgICBpZiAobWlkVmFsIDwgY2hhcikge1xuICAgICAgICAgICAgbG8gPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1pZFZhbCA+IGNoYXIpIHtcbiAgICAgICAgICAgIGhpID0gbWlkIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVUcmVlW21pZCArIGJyYW5jaENvdW50XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5jb25zdCBodG1sRGVjb2RlciA9IGdldERlY29kZXIoaHRtbERlY29kZVRyZWUpO1xuY29uc3QgeG1sRGVjb2RlciA9IGdldERlY29kZXIoeG1sRGVjb2RlVHJlZSk7XG4vKipcbiAqIERlY29kZXMgYW4gSFRNTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGRlY29kZS5cbiAqIEBwYXJhbSBtb2RlIFRoZSBkZWNvZGluZyBtb2RlLlxuICogQHJldHVybnMgVGhlIGRlY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlSFRNTChzdHIsIG1vZGUgPSBEZWNvZGluZ01vZGUuTGVnYWN5KSB7XG4gICAgcmV0dXJuIGh0bWxEZWNvZGVyKHN0ciwgbW9kZSk7XG59XG4vKipcbiAqIERlY29kZXMgYW4gSFRNTCBzdHJpbmcgaW4gYW4gYXR0cmlidXRlLlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBkZWNvZGUuXG4gKiBAcmV0dXJucyBUaGUgZGVjb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVIVE1MQXR0cmlidXRlKHN0cikge1xuICAgIHJldHVybiBodG1sRGVjb2RlcihzdHIsIERlY29kaW5nTW9kZS5BdHRyaWJ1dGUpO1xufVxuLyoqXG4gKiBEZWNvZGVzIGFuIEhUTUwgc3RyaW5nLCByZXF1aXJpbmcgYWxsIGVudGl0aWVzIHRvIGJlIHRlcm1pbmF0ZWQgYnkgYSBzZW1pY29sb24uXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGRlY29kZS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUhUTUxTdHJpY3Qoc3RyKSB7XG4gICAgcmV0dXJuIGh0bWxEZWNvZGVyKHN0ciwgRGVjb2RpbmdNb2RlLlN0cmljdCk7XG59XG4vKipcbiAqIERlY29kZXMgYW4gWE1MIHN0cmluZywgcmVxdWlyaW5nIGFsbCBlbnRpdGllcyB0byBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaWNvbG9uLlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBkZWNvZGUuXG4gKiBAcmV0dXJucyBUaGUgZGVjb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVYTUwoc3RyKSB7XG4gICAgcmV0dXJuIHhtbERlY29kZXIoc3RyLCBEZWNvZGluZ01vZGUuU3RyaWN0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY29kZS5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/decode.js\n"); - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/decode_codepoint.js": -/*!***********************************************************!*\ - !*** ./node_modules/entities/lib/esm/decode_codepoint.js ***! - \***********************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ decodeCodePoint),\n/* harmony export */ fromCodePoint: () => (/* binding */ fromCodePoint),\n/* harmony export */ replaceCodePoint: () => (/* binding */ replaceCodePoint)\n/* harmony export */ });\n// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nvar _a;\nconst decodeMap = new Map([\n [0, 65533],\n // C1 Unicode control character reference replacements\n [128, 8364],\n [130, 8218],\n [131, 402],\n [132, 8222],\n [133, 8230],\n [134, 8224],\n [135, 8225],\n [136, 710],\n [137, 8240],\n [138, 352],\n [139, 8249],\n [140, 338],\n [142, 381],\n [145, 8216],\n [146, 8217],\n [147, 8220],\n [148, 8221],\n [149, 8226],\n [150, 8211],\n [151, 8212],\n [152, 732],\n [153, 8482],\n [154, 353],\n [155, 8250],\n [156, 339],\n [158, 382],\n [159, 376],\n]);\n/**\n * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point.\n */\nconst fromCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, node/no-unsupported-features/es-builtins\n(_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) {\n let output = \"\";\n if (codePoint > 0xffff) {\n codePoint -= 0x10000;\n output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);\n codePoint = 0xdc00 | (codePoint & 0x3ff);\n }\n output += String.fromCharCode(codePoint);\n return output;\n};\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n */\nfunction replaceCodePoint(codePoint) {\n var _a;\n if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {\n return 0xfffd;\n }\n return (_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint;\n}\n/**\n * Replace the code point if relevant, then convert it to a string.\n *\n * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead.\n * @param codePoint The code point to decode.\n * @returns The decoded code point.\n */\nfunction decodeCodePoint(codePoint) {\n return fromCodePoint(replaceCodePoint(codePoint));\n}\n//# sourceMappingURL=decode_codepoint.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9kZWNvZGVfY29kZXBvaW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9lc20vZGVjb2RlX2NvZGVwb2ludC5qcz82ZDZiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9oZS9ibG9iLzM2YWZlMTc5MzkyMjI2Y2YxYjZjY2RiMTZlYmJiN2E1YTg0NGQ5M2Evc3JjL2hlLmpzI0wxMDYtTDEzNFxudmFyIF9hO1xuY29uc3QgZGVjb2RlTWFwID0gbmV3IE1hcChbXG4gICAgWzAsIDY1NTMzXSxcbiAgICAvLyBDMSBVbmljb2RlIGNvbnRyb2wgY2hhcmFjdGVyIHJlZmVyZW5jZSByZXBsYWNlbWVudHNcbiAgICBbMTI4LCA4MzY0XSxcbiAgICBbMTMwLCA4MjE4XSxcbiAgICBbMTMxLCA0MDJdLFxuICAgIFsxMzIsIDgyMjJdLFxuICAgIFsxMzMsIDgyMzBdLFxuICAgIFsxMzQsIDgyMjRdLFxuICAgIFsxMzUsIDgyMjVdLFxuICAgIFsxMzYsIDcxMF0sXG4gICAgWzEzNywgODI0MF0sXG4gICAgWzEzOCwgMzUyXSxcbiAgICBbMTM5LCA4MjQ5XSxcbiAgICBbMTQwLCAzMzhdLFxuICAgIFsxNDIsIDM4MV0sXG4gICAgWzE0NSwgODIxNl0sXG4gICAgWzE0NiwgODIxN10sXG4gICAgWzE0NywgODIyMF0sXG4gICAgWzE0OCwgODIyMV0sXG4gICAgWzE0OSwgODIyNl0sXG4gICAgWzE1MCwgODIxMV0sXG4gICAgWzE1MSwgODIxMl0sXG4gICAgWzE1MiwgNzMyXSxcbiAgICBbMTUzLCA4NDgyXSxcbiAgICBbMTU0LCAzNTNdLFxuICAgIFsxNTUsIDgyNTBdLFxuICAgIFsxNTYsIDMzOV0sXG4gICAgWzE1OCwgMzgyXSxcbiAgICBbMTU5LCAzNzZdLFxuXSk7XG4vKipcbiAqIFBvbHlmaWxsIGZvciBgU3RyaW5nLmZyb21Db2RlUG9pbnRgLiBJdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHN0cmluZyBmcm9tIGEgVW5pY29kZSBjb2RlIHBvaW50LlxuICovXG5leHBvcnQgY29uc3QgZnJvbUNvZGVQb2ludCA9IFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24sIG5vZGUvbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtYnVpbHRpbnNcbihfYSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgbGV0IG91dHB1dCA9IFwiXCI7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4+IDEwKSAmIDB4M2ZmKSB8IDB4ZDgwMCk7XG4gICAgICAgIGNvZGVQb2ludCA9IDB4ZGMwMCB8IChjb2RlUG9pbnQgJiAweDNmZik7XG4gICAgfVxuICAgIG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG4vKipcbiAqIFJlcGxhY2UgdGhlIGdpdmVuIGNvZGUgcG9pbnQgd2l0aCBhIHJlcGxhY2VtZW50IGNoYXJhY3RlciBpZiBpdCBpcyBhXG4gKiBzdXJyb2dhdGUgb3IgaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuIE90aGVyd2lzZSByZXR1cm4gdGhlIGNvZGVcbiAqIHBvaW50IHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VDb2RlUG9pbnQoY29kZVBvaW50KSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICgoY29kZVBvaW50ID49IDB4ZDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhkZmZmKSB8fCBjb2RlUG9pbnQgPiAweDEwZmZmZikge1xuICAgICAgICByZXR1cm4gMHhmZmZkO1xuICAgIH1cbiAgICByZXR1cm4gKF9hID0gZGVjb2RlTWFwLmdldChjb2RlUG9pbnQpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjb2RlUG9pbnQ7XG59XG4vKipcbiAqIFJlcGxhY2UgdGhlIGNvZGUgcG9pbnQgaWYgcmVsZXZhbnQsIHRoZW4gY29udmVydCBpdCB0byBhIHN0cmluZy5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGZyb21Db2RlUG9pbnQocmVwbGFjZUNvZGVQb2ludChjb2RlUG9pbnQpKWAgaW5zdGVhZC5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gZGVjb2RlLlxuICogQHJldHVybnMgVGhlIGRlY29kZWQgY29kZSBwb2ludC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50KGNvZGVQb2ludCkge1xuICAgIHJldHVybiBmcm9tQ29kZVBvaW50KHJlcGxhY2VDb2RlUG9pbnQoY29kZVBvaW50KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGVfY29kZXBvaW50LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/decode_codepoint.js\n"); - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/encode.js": -/*!*************************************************!*\ - !*** ./node_modules/entities/lib/esm/encode.js ***! - \*************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ encodeHTML: () => (/* binding */ encodeHTML),\n/* harmony export */ encodeNonAsciiHTML: () => (/* binding */ encodeNonAsciiHTML)\n/* harmony export */ });\n/* harmony import */ var _generated_encode_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./generated/encode-html.js */ \"./node_modules/entities/lib/esm/generated/encode-html.js\");\n/* harmony import */ var _escape_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./escape.js */ \"./node_modules/entities/lib/esm/escape.js\");\n\n\nconst htmlReplacer = /[\\t\\n!-,./:-@[-`\\f{-}$\\x80-\\uFFFF]/g;\n/**\n * Encodes all characters in the input using HTML entities. This includes\n * characters that are valid ASCII characters in HTML documents, such as `#`.\n *\n * To get a more compact output, consider using the `encodeNonAsciiHTML`\n * function, which will only encode characters that are not valid in HTML\n * documents, as well as non-ASCII characters.\n *\n * If a character has no equivalent entity, a numeric hexadecimal reference\n * (eg. `ü`) will be used.\n */\nfunction encodeHTML(data) {\n return encodeHTMLTrieRe(htmlReplacer, data);\n}\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in HTML\n * documents using HTML entities. This function will not encode characters that\n * are valid in HTML documents, such as `#`.\n *\n * If a character has no equivalent entity, a numeric hexadecimal reference\n * (eg. `ü`) will be used.\n */\nfunction encodeNonAsciiHTML(data) {\n return encodeHTMLTrieRe(_escape_js__WEBPACK_IMPORTED_MODULE_1__.xmlReplacer, data);\n}\nfunction encodeHTMLTrieRe(regExp, str) {\n let ret = \"\";\n let lastIdx = 0;\n let match;\n while ((match = regExp.exec(str)) !== null) {\n const i = match.index;\n ret += str.substring(lastIdx, i);\n const char = str.charCodeAt(i);\n let next = _generated_encode_html_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].get(char);\n if (typeof next === \"object\") {\n // We are in a branch. Try to match the next char.\n if (i + 1 < str.length) {\n const nextChar = str.charCodeAt(i + 1);\n const value = typeof next.n === \"number\"\n ? next.n === nextChar\n ? next.o\n : undefined\n : next.n.get(nextChar);\n if (value !== undefined) {\n ret += value;\n lastIdx = regExp.lastIndex += 1;\n continue;\n }\n }\n next = next.v;\n }\n // We might have a tree node without a value; skip and use a numeric entity.\n if (next !== undefined) {\n ret += next;\n lastIdx = i + 1;\n }\n else {\n const cp = (0,_escape_js__WEBPACK_IMPORTED_MODULE_1__.getCodePoint)(str, i);\n ret += `&#x${cp.toString(16)};`;\n // Increase by 1 if we have a surrogate pair\n lastIdx = regExp.lastIndex += Number(cp !== char);\n }\n }\n return ret + str.substr(lastIdx);\n}\n//# sourceMappingURL=encode.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9lbmNvZGUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFrRDtBQUNNO0FBQ3hELHlDQUF5QyxFQUFFO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNPO0FBQ1AsNEJBQTRCLG1EQUFXO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpRUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0RBQVk7QUFDbkMseUJBQXlCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9lbmNvZGUuanM/NjE5YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaHRtbFRyaWUgZnJvbSBcIi4vZ2VuZXJhdGVkL2VuY29kZS1odG1sLmpzXCI7XG5pbXBvcnQgeyB4bWxSZXBsYWNlciwgZ2V0Q29kZVBvaW50IH0gZnJvbSBcIi4vZXNjYXBlLmpzXCI7XG5jb25zdCBodG1sUmVwbGFjZXIgPSAvW1xcdFxcbiEtLC4vOi1AWy1gXFxmey19JFxceDgwLVxcdUZGRkZdL2c7XG4vKipcbiAqIEVuY29kZXMgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0IHVzaW5nIEhUTUwgZW50aXRpZXMuIFRoaXMgaW5jbHVkZXNcbiAqIGNoYXJhY3RlcnMgdGhhdCBhcmUgdmFsaWQgQVNDSUkgY2hhcmFjdGVycyBpbiBIVE1MIGRvY3VtZW50cywgc3VjaCBhcyBgI2AuXG4gKlxuICogVG8gZ2V0IGEgbW9yZSBjb21wYWN0IG91dHB1dCwgY29uc2lkZXIgdXNpbmcgdGhlIGBlbmNvZGVOb25Bc2NpaUhUTUxgXG4gKiBmdW5jdGlvbiwgd2hpY2ggd2lsbCBvbmx5IGVuY29kZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCB2YWxpZCBpbiBIVE1MXG4gKiBkb2N1bWVudHMsIGFzIHdlbGwgYXMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuXG4gKlxuICogSWYgYSBjaGFyYWN0ZXIgaGFzIG5vIGVxdWl2YWxlbnQgZW50aXR5LCBhIG51bWVyaWMgaGV4YWRlY2ltYWwgcmVmZXJlbmNlXG4gKiAoZWcuIGAmI3hmYztgKSB3aWxsIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVIVE1MKGRhdGEpIHtcbiAgICByZXR1cm4gZW5jb2RlSFRNTFRyaWVSZShodG1sUmVwbGFjZXIsIGRhdGEpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGFsbCBub24tQVNDSUkgY2hhcmFjdGVycywgYXMgd2VsbCBhcyBjaGFyYWN0ZXJzIG5vdCB2YWxpZCBpbiBIVE1MXG4gKiBkb2N1bWVudHMgdXNpbmcgSFRNTCBlbnRpdGllcy4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBlbmNvZGUgY2hhcmFjdGVycyB0aGF0XG4gKiBhcmUgdmFsaWQgaW4gSFRNTCBkb2N1bWVudHMsIHN1Y2ggYXMgYCNgLlxuICpcbiAqIElmIGEgY2hhcmFjdGVyIGhhcyBubyBlcXVpdmFsZW50IGVudGl0eSwgYSBudW1lcmljIGhleGFkZWNpbWFsIHJlZmVyZW5jZVxuICogKGVnLiBgJiN4ZmM7YCkgd2lsbCBiZSB1c2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlTm9uQXNjaWlIVE1MKGRhdGEpIHtcbiAgICByZXR1cm4gZW5jb2RlSFRNTFRyaWVSZSh4bWxSZXBsYWNlciwgZGF0YSk7XG59XG5mdW5jdGlvbiBlbmNvZGVIVE1MVHJpZVJlKHJlZ0V4cCwgc3RyKSB7XG4gICAgbGV0IHJldCA9IFwiXCI7XG4gICAgbGV0IGxhc3RJZHggPSAwO1xuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnRXhwLmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgaSA9IG1hdGNoLmluZGV4O1xuICAgICAgICByZXQgKz0gc3RyLnN1YnN0cmluZyhsYXN0SWR4LCBpKTtcbiAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBsZXQgbmV4dCA9IGh0bWxUcmllLmdldChjaGFyKTtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXh0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAvLyBXZSBhcmUgaW4gYSBicmFuY2guIFRyeSB0byBtYXRjaCB0aGUgbmV4dCBjaGFyLlxuICAgICAgICAgICAgaWYgKGkgKyAxIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gc3RyLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIG5leHQubiA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICA/IG5leHQubiA9PT0gbmV4dENoYXJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dC5vXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IG5leHQubi5nZXQobmV4dENoYXIpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldCArPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdElkeCA9IHJlZ0V4cC5sYXN0SW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dCA9IG5leHQudjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBtaWdodCBoYXZlIGEgdHJlZSBub2RlIHdpdGhvdXQgYSB2YWx1ZTsgc2tpcCBhbmQgdXNlIGEgbnVtZXJpYyBlbnRpdHkuXG4gICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldCArPSBuZXh0O1xuICAgICAgICAgICAgbGFzdElkeCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3AgPSBnZXRDb2RlUG9pbnQoc3RyLCBpKTtcbiAgICAgICAgICAgIHJldCArPSBgJiN4JHtjcC50b1N0cmluZygxNil9O2A7XG4gICAgICAgICAgICAvLyBJbmNyZWFzZSBieSAxIGlmIHdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpclxuICAgICAgICAgICAgbGFzdElkeCA9IHJlZ0V4cC5sYXN0SW5kZXggKz0gTnVtYmVyKGNwICE9PSBjaGFyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0ICsgc3RyLnN1YnN0cihsYXN0SWR4KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuY29kZS5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/encode.js\n"); - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/escape.js": -/*!*************************************************!*\ - !*** ./node_modules/entities/lib/esm/escape.js ***! - \*************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ encodeXML: () => (/* binding */ encodeXML),\n/* harmony export */ escape: () => (/* binding */ escape),\n/* harmony export */ escapeAttribute: () => (/* binding */ escapeAttribute),\n/* harmony export */ escapeText: () => (/* binding */ escapeText),\n/* harmony export */ escapeUTF8: () => (/* binding */ escapeUTF8),\n/* harmony export */ getCodePoint: () => (/* binding */ getCodePoint),\n/* harmony export */ xmlReplacer: () => (/* binding */ xmlReplacer)\n/* harmony export */ });\nconst xmlReplacer = /[\"&'<>$\\x80-\\uFFFF]/g;\nconst xmlCodeMap = new Map([\n [34, \""\"],\n [38, \"&\"],\n [39, \"'\"],\n [60, \"<\"],\n [62, \">\"],\n]);\n// For compatibility with node < 4, we wrap `codePointAt`\nconst getCodePoint = \n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nString.prototype.codePointAt != null\n ? (str, index) => str.codePointAt(index)\n : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n (c, index) => (c.charCodeAt(index) & 0xfc00) === 0xd800\n ? (c.charCodeAt(index) - 0xd800) * 0x400 +\n c.charCodeAt(index + 1) -\n 0xdc00 +\n 0x10000\n : c.charCodeAt(index);\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities.\n *\n * If a character has no equivalent entity, a\n * numeric hexadecimal reference (eg. `ü`) will be used.\n */\nfunction encodeXML(str) {\n let ret = \"\";\n let lastIdx = 0;\n let match;\n while ((match = xmlReplacer.exec(str)) !== null) {\n const i = match.index;\n const char = str.charCodeAt(i);\n const next = xmlCodeMap.get(char);\n if (next !== undefined) {\n ret += str.substring(lastIdx, i) + next;\n lastIdx = i + 1;\n }\n else {\n ret += `${str.substring(lastIdx, i)}&#x${getCodePoint(str, i).toString(16)};`;\n // Increase by 1 if we have a surrogate pair\n lastIdx = xmlReplacer.lastIndex += Number((char & 0xfc00) === 0xd800);\n }\n }\n return ret + str.substr(lastIdx);\n}\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `ü`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n *\n * @param data String to escape.\n */\nconst escape = encodeXML;\n/**\n * Creates a function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n *\n * @param regex Regular expression to match characters to escape.\n * @param map Map of characters to escape to their entities.\n *\n * @returns Function that escapes all characters matched by the given regular\n * expression using the given map of characters to escape to their entities.\n */\nfunction getEscaper(regex, map) {\n return function escape(data) {\n let match;\n let lastIdx = 0;\n let result = \"\";\n while ((match = regex.exec(data))) {\n if (lastIdx !== match.index) {\n result += data.substring(lastIdx, match.index);\n }\n // We know that this character will be in the map.\n result += map.get(match[0].charCodeAt(0));\n // Every match will be of length 1\n lastIdx = match.index + 1;\n }\n return result + data.substring(lastIdx);\n };\n}\n/**\n * Encodes all characters not valid in XML documents using XML entities.\n *\n * Note that the output will be character-set dependent.\n *\n * @param data String to escape.\n */\nconst escapeUTF8 = getEscaper(/[&<>'\"]/g, xmlCodeMap);\n/**\n * Encodes all characters that have to be escaped in HTML attributes,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n *\n * @param data String to escape.\n */\nconst escapeAttribute = getEscaper(/[\"&\\u00A0]/g, new Map([\n [34, \""\"],\n [38, \"&\"],\n [160, \" \"],\n]));\n/**\n * Encodes all characters that have to be escaped in HTML text,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n *\n * @param data String to escape.\n */\nconst escapeText = getEscaper(/[&<>\\u00A0]/g, new Map([\n [38, \"&\"],\n [60, \"<\"],\n [62, \">\"],\n [160, \" \"],\n]));\n//# sourceMappingURL=escape.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9lc2NhcGUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFPO0FBQ1A7QUFDQSxnQkFBZ0I7QUFDaEIsZUFBZTtBQUNmLGdCQUFnQjtBQUNoQixjQUFjO0FBQ2QsY0FBYztBQUNkO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBCQUEwQixLQUFLLG1DQUFtQztBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxjQUFjLHlFQUF5RTtBQUN2RjtBQUNBO0FBQ0E7QUFDTztBQUNQLGdCQUFnQjtBQUNoQixlQUFlO0FBQ2YsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGNBQWMseUVBQXlFO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsZUFBZTtBQUNmLGNBQWM7QUFDZCxjQUFjO0FBQ2QsaUJBQWlCO0FBQ2pCO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9lc20vZXNjYXBlLmpzP2RkYjUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHhtbFJlcGxhY2VyID0gL1tcIiYnPD4kXFx4ODAtXFx1RkZGRl0vZztcbmNvbnN0IHhtbENvZGVNYXAgPSBuZXcgTWFwKFtcbiAgICBbMzQsIFwiJnF1b3Q7XCJdLFxuICAgIFszOCwgXCImYW1wO1wiXSxcbiAgICBbMzksIFwiJmFwb3M7XCJdLFxuICAgIFs2MCwgXCImbHQ7XCJdLFxuICAgIFs2MiwgXCImZ3Q7XCJdLFxuXSk7XG4vLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vZGUgPCA0LCB3ZSB3cmFwIGBjb2RlUG9pbnRBdGBcbmV4cG9ydCBjb25zdCBnZXRDb2RlUG9pbnQgPSBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG5TdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0ICE9IG51bGxcbiAgICA/IChzdHIsIGluZGV4KSA9PiBzdHIuY29kZVBvaW50QXQoaW5kZXgpXG4gICAgOiAvLyBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuICAgICAgICAoYywgaW5kZXgpID0+IChjLmNoYXJDb2RlQXQoaW5kZXgpICYgMHhmYzAwKSA9PT0gMHhkODAwXG4gICAgICAgICAgICA/IChjLmNoYXJDb2RlQXQoaW5kZXgpIC0gMHhkODAwKSAqIDB4NDAwICtcbiAgICAgICAgICAgICAgICBjLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtXG4gICAgICAgICAgICAgICAgMHhkYzAwICtcbiAgICAgICAgICAgICAgICAweDEwMDAwXG4gICAgICAgICAgICA6IGMuY2hhckNvZGVBdChpbmRleCk7XG4vKipcbiAqIEVuY29kZXMgYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBhcyB3ZWxsIGFzIGNoYXJhY3RlcnMgbm90IHZhbGlkIGluIFhNTFxuICogZG9jdW1lbnRzIHVzaW5nIFhNTCBlbnRpdGllcy5cbiAqXG4gKiBJZiBhIGNoYXJhY3RlciBoYXMgbm8gZXF1aXZhbGVudCBlbnRpdHksIGFcbiAqIG51bWVyaWMgaGV4YWRlY2ltYWwgcmVmZXJlbmNlIChlZy4gYCYjeGZjO2ApIHdpbGwgYmUgdXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVhNTChzdHIpIHtcbiAgICBsZXQgcmV0ID0gXCJcIjtcbiAgICBsZXQgbGFzdElkeCA9IDA7XG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSB4bWxSZXBsYWNlci5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGkgPSBtYXRjaC5pbmRleDtcbiAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBjb25zdCBuZXh0ID0geG1sQ29kZU1hcC5nZXQoY2hhcik7XG4gICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldCArPSBzdHIuc3Vic3RyaW5nKGxhc3RJZHgsIGkpICsgbmV4dDtcbiAgICAgICAgICAgIGxhc3RJZHggPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldCArPSBgJHtzdHIuc3Vic3RyaW5nKGxhc3RJZHgsIGkpfSYjeCR7Z2V0Q29kZVBvaW50KHN0ciwgaSkudG9TdHJpbmcoMTYpfTtgO1xuICAgICAgICAgICAgLy8gSW5jcmVhc2UgYnkgMSBpZiB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgICAgIGxhc3RJZHggPSB4bWxSZXBsYWNlci5sYXN0SW5kZXggKz0gTnVtYmVyKChjaGFyICYgMHhmYzAwKSA9PT0gMHhkODAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0ICsgc3RyLnN1YnN0cihsYXN0SWR4KTtcbn1cbi8qKlxuICogRW5jb2RlcyBhbGwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGFzIHdlbGwgYXMgY2hhcmFjdGVycyBub3QgdmFsaWQgaW4gWE1MXG4gKiBkb2N1bWVudHMgdXNpbmcgbnVtZXJpYyBoZXhhZGVjaW1hbCByZWZlcmVuY2UgKGVnLiBgJiN4ZmM7YCkuXG4gKlxuICogSGF2ZSBhIGxvb2sgYXQgYGVzY2FwZVVURjhgIGlmIHlvdSB3YW50IGEgbW9yZSBjb25jaXNlIG91dHB1dCBhdCB0aGUgZXhwZW5zZVxuICogb2YgcmVkdWNlZCB0cmFuc3BvcnRhYmlsaXR5LlxuICpcbiAqIEBwYXJhbSBkYXRhIFN0cmluZyB0byBlc2NhcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGUgPSBlbmNvZGVYTUw7XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gcmVndWxhclxuICogZXhwcmVzc2lvbiB1c2luZyB0aGUgZ2l2ZW4gbWFwIG9mIGNoYXJhY3RlcnMgdG8gZXNjYXBlIHRvIHRoZWlyIGVudGl0aWVzLlxuICpcbiAqIEBwYXJhbSByZWdleCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggY2hhcmFjdGVycyB0byBlc2NhcGUuXG4gKiBAcGFyYW0gbWFwIE1hcCBvZiBjaGFyYWN0ZXJzIHRvIGVzY2FwZSB0byB0aGVpciBlbnRpdGllcy5cbiAqXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gcmVndWxhclxuICogZXhwcmVzc2lvbiB1c2luZyB0aGUgZ2l2ZW4gbWFwIG9mIGNoYXJhY3RlcnMgdG8gZXNjYXBlIHRvIHRoZWlyIGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiBnZXRFc2NhcGVyKHJlZ2V4LCBtYXApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZXNjYXBlKGRhdGEpIHtcbiAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICBsZXQgbGFzdElkeCA9IDA7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhkYXRhKSkpIHtcbiAgICAgICAgICAgIGlmIChsYXN0SWR4ICE9PSBtYXRjaC5pbmRleCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBkYXRhLnN1YnN0cmluZyhsYXN0SWR4LCBtYXRjaC5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgdGhpcyBjaGFyYWN0ZXIgd2lsbCBiZSBpbiB0aGUgbWFwLlxuICAgICAgICAgICAgcmVzdWx0ICs9IG1hcC5nZXQobWF0Y2hbMF0uY2hhckNvZGVBdCgwKSk7XG4gICAgICAgICAgICAvLyBFdmVyeSBtYXRjaCB3aWxsIGJlIG9mIGxlbmd0aCAxXG4gICAgICAgICAgICBsYXN0SWR4ID0gbWF0Y2guaW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBkYXRhLnN1YnN0cmluZyhsYXN0SWR4KTtcbiAgICB9O1xufVxuLyoqXG4gKiBFbmNvZGVzIGFsbCBjaGFyYWN0ZXJzIG5vdCB2YWxpZCBpbiBYTUwgZG9jdW1lbnRzIHVzaW5nIFhNTCBlbnRpdGllcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIG91dHB1dCB3aWxsIGJlIGNoYXJhY3Rlci1zZXQgZGVwZW5kZW50LlxuICpcbiAqIEBwYXJhbSBkYXRhIFN0cmluZyB0byBlc2NhcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGVVVEY4ID0gZ2V0RXNjYXBlcigvWyY8PidcIl0vZywgeG1sQ29kZU1hcCk7XG4vKipcbiAqIEVuY29kZXMgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRvIGJlIGVzY2FwZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLFxuICogZm9sbG93aW5nIHtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjZXNjYXBpbmdTdHJpbmd9LlxuICpcbiAqIEBwYXJhbSBkYXRhIFN0cmluZyB0byBlc2NhcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGVBdHRyaWJ1dGUgPSBnZXRFc2NhcGVyKC9bXCImXFx1MDBBMF0vZywgbmV3IE1hcChbXG4gICAgWzM0LCBcIiZxdW90O1wiXSxcbiAgICBbMzgsIFwiJmFtcDtcIl0sXG4gICAgWzE2MCwgXCImbmJzcDtcIl0sXG5dKSk7XG4vKipcbiAqIEVuY29kZXMgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRvIGJlIGVzY2FwZWQgaW4gSFRNTCB0ZXh0LFxuICogZm9sbG93aW5nIHtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjZXNjYXBpbmdTdHJpbmd9LlxuICpcbiAqIEBwYXJhbSBkYXRhIFN0cmluZyB0byBlc2NhcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGVUZXh0ID0gZ2V0RXNjYXBlcigvWyY8PlxcdTAwQTBdL2csIG5ldyBNYXAoW1xuICAgIFszOCwgXCImYW1wO1wiXSxcbiAgICBbNjAsIFwiJmx0O1wiXSxcbiAgICBbNjIsIFwiJmd0O1wiXSxcbiAgICBbMTYwLCBcIiZuYnNwO1wiXSxcbl0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzY2FwZS5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/escape.js\n"); - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/generated/decode-data-html.js": -/*!*********************************************************************!*\ - !*** ./node_modules/entities/lib/esm/generated/decode-data-html.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Generated using scripts/write-decode-map.ts\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new Uint16Array(\n// prettier-ignore\n\"\\u1d41<\\xd5\\u0131\\u028a\\u049d\\u057b\\u05d0\\u0675\\u06de\\u07a2\\u07d6\\u080f\\u0a4a\\u0a91\\u0da1\\u0e6d\\u0f09\\u0f26\\u10ca\\u1228\\u12e1\\u1415\\u149d\\u14c3\\u14df\\u1525\\0\\0\\0\\0\\0\\0\\u156b\\u16cd\\u198d\\u1c12\\u1ddd\\u1f7e\\u2060\\u21b0\\u228d\\u23c0\\u23fb\\u2442\\u2824\\u2912\\u2d08\\u2e48\\u2fce\\u3016\\u32ba\\u3639\\u37ac\\u38fe\\u3a28\\u3a71\\u3ae0\\u3b2e\\u0800EMabcfglmnoprstu\\\\bfms\\x7f\\x84\\x8b\\x90\\x95\\x98\\xa6\\xb3\\xb9\\xc8\\xcflig\\u803b\\xc6\\u40c6P\\u803b&\\u4026cute\\u803b\\xc1\\u40c1reve;\\u4102\\u0100iyx}rc\\u803b\\xc2\\u40c2;\\u4410r;\\uc000\\ud835\\udd04rave\\u803b\\xc0\\u40c0pha;\\u4391acr;\\u4100d;\\u6a53\\u0100gp\\x9d\\xa1on;\\u4104f;\\uc000\\ud835\\udd38plyFunction;\\u6061ing\\u803b\\xc5\\u40c5\\u0100cs\\xbe\\xc3r;\\uc000\\ud835\\udc9cign;\\u6254ilde\\u803b\\xc3\\u40c3ml\\u803b\\xc4\\u40c4\\u0400aceforsu\\xe5\\xfb\\xfe\\u0117\\u011c\\u0122\\u0127\\u012a\\u0100cr\\xea\\xf2kslash;\\u6216\\u0176\\xf6\\xf8;\\u6ae7ed;\\u6306y;\\u4411\\u0180crt\\u0105\\u010b\\u0114ause;\\u6235noullis;\\u612ca;\\u4392r;\\uc000\\ud835\\udd05pf;\\uc000\\ud835\\udd39eve;\\u42d8c\\xf2\\u0113mpeq;\\u624e\\u0700HOacdefhilorsu\\u014d\\u0151\\u0156\\u0180\\u019e\\u01a2\\u01b5\\u01b7\\u01ba\\u01dc\\u0215\\u0273\\u0278\\u027ecy;\\u4427PY\\u803b\\xa9\\u40a9\\u0180cpy\\u015d\\u0162\\u017aute;\\u4106\\u0100;i\\u0167\\u0168\\u62d2talDifferentialD;\\u6145leys;\\u612d\\u0200aeio\\u0189\\u018e\\u0194\\u0198ron;\\u410cdil\\u803b\\xc7\\u40c7rc;\\u4108nint;\\u6230ot;\\u410a\\u0100dn\\u01a7\\u01adilla;\\u40b8terDot;\\u40b7\\xf2\\u017fi;\\u43a7rcle\\u0200DMPT\\u01c7\\u01cb\\u01d1\\u01d6ot;\\u6299inus;\\u6296lus;\\u6295imes;\\u6297o\\u0100cs\\u01e2\\u01f8kwiseContourIntegral;\\u6232eCurly\\u0100DQ\\u0203\\u020foubleQuote;\\u601duote;\\u6019\\u0200lnpu\\u021e\\u0228\\u0247\\u0255on\\u0100;e\\u0225\\u0226\\u6237;\\u6a74\\u0180git\\u022f\\u0236\\u023aruent;\\u6261nt;\\u622fourIntegral;\\u622e\\u0100fr\\u024c\\u024e;\\u6102oduct;\\u6210nterClockwiseContourIntegral;\\u6233oss;\\u6a2fcr;\\uc000\\ud835\\udc9ep\\u0100;C\\u0284\\u0285\\u62d3ap;\\u624d\\u0580DJSZacefios\\u02a0\\u02ac\\u02b0\\u02b4\\u02b8\\u02cb\\u02d7\\u02e1\\u02e6\\u0333\\u048d\\u0100;o\\u0179\\u02a5trahd;\\u6911cy;\\u4402cy;\\u4405cy;\\u440f\\u0180grs\\u02bf\\u02c4\\u02c7ger;\\u6021r;\\u61a1hv;\\u6ae4\\u0100ay\\u02d0\\u02d5ron;\\u410e;\\u4414l\\u0100;t\\u02dd\\u02de\\u6207a;\\u4394r;\\uc000\\ud835\\udd07\\u0100af\\u02eb\\u0327\\u0100cm\\u02f0\\u0322ritical\\u0200ADGT\\u0300\\u0306\\u0316\\u031ccute;\\u40b4o\\u0174\\u030b\\u030d;\\u42d9bleAcute;\\u42ddrave;\\u4060ilde;\\u42dcond;\\u62c4ferentialD;\\u6146\\u0470\\u033d\\0\\0\\0\\u0342\\u0354\\0\\u0405f;\\uc000\\ud835\\udd3b\\u0180;DE\\u0348\\u0349\\u034d\\u40a8ot;\\u60dcqual;\\u6250ble\\u0300CDLRUV\\u0363\\u0372\\u0382\\u03cf\\u03e2\\u03f8ontourIntegra\\xec\\u0239o\\u0274\\u0379\\0\\0\\u037b\\xbb\\u0349nArrow;\\u61d3\\u0100eo\\u0387\\u03a4ft\\u0180ART\\u0390\\u0396\\u03a1rrow;\\u61d0ightArrow;\\u61d4e\\xe5\\u02cang\\u0100LR\\u03ab\\u03c4eft\\u0100AR\\u03b3\\u03b9rrow;\\u67f8ightArrow;\\u67faightArrow;\\u67f9ight\\u0100AT\\u03d8\\u03derrow;\\u61d2ee;\\u62a8p\\u0241\\u03e9\\0\\0\\u03efrrow;\\u61d1ownArrow;\\u61d5erticalBar;\\u6225n\\u0300ABLRTa\\u0412\\u042a\\u0430\\u045e\\u047f\\u037crrow\\u0180;BU\\u041d\\u041e\\u0422\\u6193ar;\\u6913pArrow;\\u61f5reve;\\u4311eft\\u02d2\\u043a\\0\\u0446\\0\\u0450ightVector;\\u6950eeVector;\\u695eector\\u0100;B\\u0459\\u045a\\u61bdar;\\u6956ight\\u01d4\\u0467\\0\\u0471eeVector;\\u695fector\\u0100;B\\u047a\\u047b\\u61c1ar;\\u6957ee\\u0100;A\\u0486\\u0487\\u62a4rrow;\\u61a7\\u0100ct\\u0492\\u0497r;\\uc000\\ud835\\udc9frok;\\u4110\\u0800NTacdfglmopqstux\\u04bd\\u04c0\\u04c4\\u04cb\\u04de\\u04e2\\u04e7\\u04ee\\u04f5\\u0521\\u052f\\u0536\\u0552\\u055d\\u0560\\u0565G;\\u414aH\\u803b\\xd0\\u40d0cute\\u803b\\xc9\\u40c9\\u0180aiy\\u04d2\\u04d7\\u04dcron;\\u411arc\\u803b\\xca\\u40ca;\\u442dot;\\u4116r;\\uc000\\ud835\\udd08rave\\u803b\\xc8\\u40c8ement;\\u6208\\u0100ap\\u04fa\\u04fecr;\\u4112ty\\u0253\\u0506\\0\\0\\u0512mallSquare;\\u65fberySmallSquare;\\u65ab\\u0100gp\\u0526\\u052aon;\\u4118f;\\uc000\\ud835\\udd3csilon;\\u4395u\\u0100ai\\u053c\\u0549l\\u0100;T\\u0542\\u0543\\u6a75ilde;\\u6242librium;\\u61cc\\u0100ci\\u0557\\u055ar;\\u6130m;\\u6a73a;\\u4397ml\\u803b\\xcb\\u40cb\\u0100ip\\u056a\\u056fsts;\\u6203onentialE;\\u6147\\u0280cfios\\u0585\\u0588\\u058d\\u05b2\\u05ccy;\\u4424r;\\uc000\\ud835\\udd09lled\\u0253\\u0597\\0\\0\\u05a3mallSquare;\\u65fcerySmallSquare;\\u65aa\\u0370\\u05ba\\0\\u05bf\\0\\0\\u05c4f;\\uc000\\ud835\\udd3dAll;\\u6200riertrf;\\u6131c\\xf2\\u05cb\\u0600JTabcdfgorst\\u05e8\\u05ec\\u05ef\\u05fa\\u0600\\u0612\\u0616\\u061b\\u061d\\u0623\\u066c\\u0672cy;\\u4403\\u803b>\\u403emma\\u0100;d\\u05f7\\u05f8\\u4393;\\u43dcreve;\\u411e\\u0180eiy\\u0607\\u060c\\u0610dil;\\u4122rc;\\u411c;\\u4413ot;\\u4120r;\\uc000\\ud835\\udd0a;\\u62d9pf;\\uc000\\ud835\\udd3eeater\\u0300EFGLST\\u0635\\u0644\\u064e\\u0656\\u065b\\u0666qual\\u0100;L\\u063e\\u063f\\u6265ess;\\u62dbullEqual;\\u6267reater;\\u6aa2ess;\\u6277lantEqual;\\u6a7eilde;\\u6273cr;\\uc000\\ud835\\udca2;\\u626b\\u0400Aacfiosu\\u0685\\u068b\\u0696\\u069b\\u069e\\u06aa\\u06be\\u06caRDcy;\\u442a\\u0100ct\\u0690\\u0694ek;\\u42c7;\\u405eirc;\\u4124r;\\u610clbertSpace;\\u610b\\u01f0\\u06af\\0\\u06b2f;\\u610dizontalLine;\\u6500\\u0100ct\\u06c3\\u06c5\\xf2\\u06a9rok;\\u4126mp\\u0144\\u06d0\\u06d8ownHum\\xf0\\u012fqual;\\u624f\\u0700EJOacdfgmnostu\\u06fa\\u06fe\\u0703\\u0707\\u070e\\u071a\\u071e\\u0721\\u0728\\u0744\\u0778\\u078b\\u078f\\u0795cy;\\u4415lig;\\u4132cy;\\u4401cute\\u803b\\xcd\\u40cd\\u0100iy\\u0713\\u0718rc\\u803b\\xce\\u40ce;\\u4418ot;\\u4130r;\\u6111rave\\u803b\\xcc\\u40cc\\u0180;ap\\u0720\\u072f\\u073f\\u0100cg\\u0734\\u0737r;\\u412ainaryI;\\u6148lie\\xf3\\u03dd\\u01f4\\u0749\\0\\u0762\\u0100;e\\u074d\\u074e\\u622c\\u0100gr\\u0753\\u0758ral;\\u622bsection;\\u62c2isible\\u0100CT\\u076c\\u0772omma;\\u6063imes;\\u6062\\u0180gpt\\u077f\\u0783\\u0788on;\\u412ef;\\uc000\\ud835\\udd40a;\\u4399cr;\\u6110ilde;\\u4128\\u01eb\\u079a\\0\\u079ecy;\\u4406l\\u803b\\xcf\\u40cf\\u0280cfosu\\u07ac\\u07b7\\u07bc\\u07c2\\u07d0\\u0100iy\\u07b1\\u07b5rc;\\u4134;\\u4419r;\\uc000\\ud835\\udd0dpf;\\uc000\\ud835\\udd41\\u01e3\\u07c7\\0\\u07ccr;\\uc000\\ud835\\udca5rcy;\\u4408kcy;\\u4404\\u0380HJacfos\\u07e4\\u07e8\\u07ec\\u07f1\\u07fd\\u0802\\u0808cy;\\u4425cy;\\u440cppa;\\u439a\\u0100ey\\u07f6\\u07fbdil;\\u4136;\\u441ar;\\uc000\\ud835\\udd0epf;\\uc000\\ud835\\udd42cr;\\uc000\\ud835\\udca6\\u0580JTaceflmost\\u0825\\u0829\\u082c\\u0850\\u0863\\u09b3\\u09b8\\u09c7\\u09cd\\u0a37\\u0a47cy;\\u4409\\u803b<\\u403c\\u0280cmnpr\\u0837\\u083c\\u0841\\u0844\\u084dute;\\u4139bda;\\u439bg;\\u67ealacetrf;\\u6112r;\\u619e\\u0180aey\\u0857\\u085c\\u0861ron;\\u413ddil;\\u413b;\\u441b\\u0100fs\\u0868\\u0970t\\u0500ACDFRTUVar\\u087e\\u08a9\\u08b1\\u08e0\\u08e6\\u08fc\\u092f\\u095b\\u0390\\u096a\\u0100nr\\u0883\\u088fgleBracket;\\u67e8row\\u0180;BR\\u0899\\u089a\\u089e\\u6190ar;\\u61e4ightArrow;\\u61c6eiling;\\u6308o\\u01f5\\u08b7\\0\\u08c3bleBracket;\\u67e6n\\u01d4\\u08c8\\0\\u08d2eeVector;\\u6961ector\\u0100;B\\u08db\\u08dc\\u61c3ar;\\u6959loor;\\u630aight\\u0100AV\\u08ef\\u08f5rrow;\\u6194ector;\\u694e\\u0100er\\u0901\\u0917e\\u0180;AV\\u0909\\u090a\\u0910\\u62a3rrow;\\u61a4ector;\\u695aiangle\\u0180;BE\\u0924\\u0925\\u0929\\u62b2ar;\\u69cfqual;\\u62b4p\\u0180DTV\\u0937\\u0942\\u094cownVector;\\u6951eeVector;\\u6960ector\\u0100;B\\u0956\\u0957\\u61bfar;\\u6958ector\\u0100;B\\u0965\\u0966\\u61bcar;\\u6952ight\\xe1\\u039cs\\u0300EFGLST\\u097e\\u098b\\u0995\\u099d\\u09a2\\u09adqualGreater;\\u62daullEqual;\\u6266reater;\\u6276ess;\\u6aa1lantEqual;\\u6a7dilde;\\u6272r;\\uc000\\ud835\\udd0f\\u0100;e\\u09bd\\u09be\\u62d8ftarrow;\\u61daidot;\\u413f\\u0180npw\\u09d4\\u0a16\\u0a1bg\\u0200LRlr\\u09de\\u09f7\\u0a02\\u0a10eft\\u0100AR\\u09e6\\u09ecrrow;\\u67f5ightArrow;\\u67f7ightArrow;\\u67f6eft\\u0100ar\\u03b3\\u0a0aight\\xe1\\u03bfight\\xe1\\u03caf;\\uc000\\ud835\\udd43er\\u0100LR\\u0a22\\u0a2ceftArrow;\\u6199ightArrow;\\u6198\\u0180cht\\u0a3e\\u0a40\\u0a42\\xf2\\u084c;\\u61b0rok;\\u4141;\\u626a\\u0400acefiosu\\u0a5a\\u0a5d\\u0a60\\u0a77\\u0a7c\\u0a85\\u0a8b\\u0a8ep;\\u6905y;\\u441c\\u0100dl\\u0a65\\u0a6fiumSpace;\\u605flintrf;\\u6133r;\\uc000\\ud835\\udd10nusPlus;\\u6213pf;\\uc000\\ud835\\udd44c\\xf2\\u0a76;\\u439c\\u0480Jacefostu\\u0aa3\\u0aa7\\u0aad\\u0ac0\\u0b14\\u0b19\\u0d91\\u0d97\\u0d9ecy;\\u440acute;\\u4143\\u0180aey\\u0ab4\\u0ab9\\u0aberon;\\u4147dil;\\u4145;\\u441d\\u0180gsw\\u0ac7\\u0af0\\u0b0eative\\u0180MTV\\u0ad3\\u0adf\\u0ae8ediumSpace;\\u600bhi\\u0100cn\\u0ae6\\u0ad8\\xeb\\u0ad9eryThi\\xee\\u0ad9ted\\u0100GL\\u0af8\\u0b06reaterGreate\\xf2\\u0673essLes\\xf3\\u0a48Line;\\u400ar;\\uc000\\ud835\\udd11\\u0200Bnpt\\u0b22\\u0b28\\u0b37\\u0b3areak;\\u6060BreakingSpace;\\u40a0f;\\u6115\\u0680;CDEGHLNPRSTV\\u0b55\\u0b56\\u0b6a\\u0b7c\\u0ba1\\u0beb\\u0c04\\u0c5e\\u0c84\\u0ca6\\u0cd8\\u0d61\\u0d85\\u6aec\\u0100ou\\u0b5b\\u0b64ngruent;\\u6262pCap;\\u626doubleVerticalBar;\\u6226\\u0180lqx\\u0b83\\u0b8a\\u0b9bement;\\u6209ual\\u0100;T\\u0b92\\u0b93\\u6260ilde;\\uc000\\u2242\\u0338ists;\\u6204reater\\u0380;EFGLST\\u0bb6\\u0bb7\\u0bbd\\u0bc9\\u0bd3\\u0bd8\\u0be5\\u626fqual;\\u6271ullEqual;\\uc000\\u2267\\u0338reater;\\uc000\\u226b\\u0338ess;\\u6279lantEqual;\\uc000\\u2a7e\\u0338ilde;\\u6275ump\\u0144\\u0bf2\\u0bfdownHump;\\uc000\\u224e\\u0338qual;\\uc000\\u224f\\u0338e\\u0100fs\\u0c0a\\u0c27tTriangle\\u0180;BE\\u0c1a\\u0c1b\\u0c21\\u62eaar;\\uc000\\u29cf\\u0338qual;\\u62ecs\\u0300;EGLST\\u0c35\\u0c36\\u0c3c\\u0c44\\u0c4b\\u0c58\\u626equal;\\u6270reater;\\u6278ess;\\uc000\\u226a\\u0338lantEqual;\\uc000\\u2a7d\\u0338ilde;\\u6274ested\\u0100GL\\u0c68\\u0c79reaterGreater;\\uc000\\u2aa2\\u0338essLess;\\uc000\\u2aa1\\u0338recedes\\u0180;ES\\u0c92\\u0c93\\u0c9b\\u6280qual;\\uc000\\u2aaf\\u0338lantEqual;\\u62e0\\u0100ei\\u0cab\\u0cb9verseElement;\\u620cghtTriangle\\u0180;BE\\u0ccb\\u0ccc\\u0cd2\\u62ebar;\\uc000\\u29d0\\u0338qual;\\u62ed\\u0100qu\\u0cdd\\u0d0cuareSu\\u0100bp\\u0ce8\\u0cf9set\\u0100;E\\u0cf0\\u0cf3\\uc000\\u228f\\u0338qual;\\u62e2erset\\u0100;E\\u0d03\\u0d06\\uc000\\u2290\\u0338qual;\\u62e3\\u0180bcp\\u0d13\\u0d24\\u0d4eset\\u0100;E\\u0d1b\\u0d1e\\uc000\\u2282\\u20d2qual;\\u6288ceeds\\u0200;EST\\u0d32\\u0d33\\u0d3b\\u0d46\\u6281qual;\\uc000\\u2ab0\\u0338lantEqual;\\u62e1ilde;\\uc000\\u227f\\u0338erset\\u0100;E\\u0d58\\u0d5b\\uc000\\u2283\\u20d2qual;\\u6289ilde\\u0200;EFT\\u0d6e\\u0d6f\\u0d75\\u0d7f\\u6241qual;\\u6244ullEqual;\\u6247ilde;\\u6249erticalBar;\\u6224cr;\\uc000\\ud835\\udca9ilde\\u803b\\xd1\\u40d1;\\u439d\\u0700Eacdfgmoprstuv\\u0dbd\\u0dc2\\u0dc9\\u0dd5\\u0ddb\\u0de0\\u0de7\\u0dfc\\u0e02\\u0e20\\u0e22\\u0e32\\u0e3f\\u0e44lig;\\u4152cute\\u803b\\xd3\\u40d3\\u0100iy\\u0dce\\u0dd3rc\\u803b\\xd4\\u40d4;\\u441eblac;\\u4150r;\\uc000\\ud835\\udd12rave\\u803b\\xd2\\u40d2\\u0180aei\\u0dee\\u0df2\\u0df6cr;\\u414cga;\\u43a9cron;\\u439fpf;\\uc000\\ud835\\udd46enCurly\\u0100DQ\\u0e0e\\u0e1aoubleQuote;\\u601cuote;\\u6018;\\u6a54\\u0100cl\\u0e27\\u0e2cr;\\uc000\\ud835\\udcaaash\\u803b\\xd8\\u40d8i\\u016c\\u0e37\\u0e3cde\\u803b\\xd5\\u40d5es;\\u6a37ml\\u803b\\xd6\\u40d6er\\u0100BP\\u0e4b\\u0e60\\u0100ar\\u0e50\\u0e53r;\\u603eac\\u0100ek\\u0e5a\\u0e5c;\\u63deet;\\u63b4arenthesis;\\u63dc\\u0480acfhilors\\u0e7f\\u0e87\\u0e8a\\u0e8f\\u0e92\\u0e94\\u0e9d\\u0eb0\\u0efcrtialD;\\u6202y;\\u441fr;\\uc000\\ud835\\udd13i;\\u43a6;\\u43a0usMinus;\\u40b1\\u0100ip\\u0ea2\\u0eadncareplan\\xe5\\u069df;\\u6119\\u0200;eio\\u0eb9\\u0eba\\u0ee0\\u0ee4\\u6abbcedes\\u0200;EST\\u0ec8\\u0ec9\\u0ecf\\u0eda\\u627aqual;\\u6aaflantEqual;\\u627cilde;\\u627eme;\\u6033\\u0100dp\\u0ee9\\u0eeeuct;\\u620fortion\\u0100;a\\u0225\\u0ef9l;\\u621d\\u0100ci\\u0f01\\u0f06r;\\uc000\\ud835\\udcab;\\u43a8\\u0200Ufos\\u0f11\\u0f16\\u0f1b\\u0f1fOT\\u803b\\\"\\u4022r;\\uc000\\ud835\\udd14pf;\\u611acr;\\uc000\\ud835\\udcac\\u0600BEacefhiorsu\\u0f3e\\u0f43\\u0f47\\u0f60\\u0f73\\u0fa7\\u0faa\\u0fad\\u1096\\u10a9\\u10b4\\u10bearr;\\u6910G\\u803b\\xae\\u40ae\\u0180cnr\\u0f4e\\u0f53\\u0f56ute;\\u4154g;\\u67ebr\\u0100;t\\u0f5c\\u0f5d\\u61a0l;\\u6916\\u0180aey\\u0f67\\u0f6c\\u0f71ron;\\u4158dil;\\u4156;\\u4420\\u0100;v\\u0f78\\u0f79\\u611cerse\\u0100EU\\u0f82\\u0f99\\u0100lq\\u0f87\\u0f8eement;\\u620builibrium;\\u61cbpEquilibrium;\\u696fr\\xbb\\u0f79o;\\u43a1ght\\u0400ACDFTUVa\\u0fc1\\u0feb\\u0ff3\\u1022\\u1028\\u105b\\u1087\\u03d8\\u0100nr\\u0fc6\\u0fd2gleBracket;\\u67e9row\\u0180;BL\\u0fdc\\u0fdd\\u0fe1\\u6192ar;\\u61e5eftArrow;\\u61c4eiling;\\u6309o\\u01f5\\u0ff9\\0\\u1005bleBracket;\\u67e7n\\u01d4\\u100a\\0\\u1014eeVector;\\u695dector\\u0100;B\\u101d\\u101e\\u61c2ar;\\u6955loor;\\u630b\\u0100er\\u102d\\u1043e\\u0180;AV\\u1035\\u1036\\u103c\\u62a2rrow;\\u61a6ector;\\u695biangle\\u0180;BE\\u1050\\u1051\\u1055\\u62b3ar;\\u69d0qual;\\u62b5p\\u0180DTV\\u1063\\u106e\\u1078ownVector;\\u694feeVector;\\u695cector\\u0100;B\\u1082\\u1083\\u61bear;\\u6954ector\\u0100;B\\u1091\\u1092\\u61c0ar;\\u6953\\u0100pu\\u109b\\u109ef;\\u611dndImplies;\\u6970ightarrow;\\u61db\\u0100ch\\u10b9\\u10bcr;\\u611b;\\u61b1leDelayed;\\u69f4\\u0680HOacfhimoqstu\\u10e4\\u10f1\\u10f7\\u10fd\\u1119\\u111e\\u1151\\u1156\\u1161\\u1167\\u11b5\\u11bb\\u11bf\\u0100Cc\\u10e9\\u10eeHcy;\\u4429y;\\u4428FTcy;\\u442ccute;\\u415a\\u0280;aeiy\\u1108\\u1109\\u110e\\u1113\\u1117\\u6abcron;\\u4160dil;\\u415erc;\\u415c;\\u4421r;\\uc000\\ud835\\udd16ort\\u0200DLRU\\u112a\\u1134\\u113e\\u1149ownArrow\\xbb\\u041eeftArrow\\xbb\\u089aightArrow\\xbb\\u0fddpArrow;\\u6191gma;\\u43a3allCircle;\\u6218pf;\\uc000\\ud835\\udd4a\\u0272\\u116d\\0\\0\\u1170t;\\u621aare\\u0200;ISU\\u117b\\u117c\\u1189\\u11af\\u65a1ntersection;\\u6293u\\u0100bp\\u118f\\u119eset\\u0100;E\\u1197\\u1198\\u628fqual;\\u6291erset\\u0100;E\\u11a8\\u11a9\\u6290qual;\\u6292nion;\\u6294cr;\\uc000\\ud835\\udcaear;\\u62c6\\u0200bcmp\\u11c8\\u11db\\u1209\\u120b\\u0100;s\\u11cd\\u11ce\\u62d0et\\u0100;E\\u11cd\\u11d5qual;\\u6286\\u0100ch\\u11e0\\u1205eeds\\u0200;EST\\u11ed\\u11ee\\u11f4\\u11ff\\u627bqual;\\u6ab0lantEqual;\\u627dilde;\\u627fTh\\xe1\\u0f8c;\\u6211\\u0180;es\\u1212\\u1213\\u1223\\u62d1rset\\u0100;E\\u121c\\u121d\\u6283qual;\\u6287et\\xbb\\u1213\\u0580HRSacfhiors\\u123e\\u1244\\u1249\\u1255\\u125e\\u1271\\u1276\\u129f\\u12c2\\u12c8\\u12d1ORN\\u803b\\xde\\u40deADE;\\u6122\\u0100Hc\\u124e\\u1252cy;\\u440by;\\u4426\\u0100bu\\u125a\\u125c;\\u4009;\\u43a4\\u0180aey\\u1265\\u126a\\u126fron;\\u4164dil;\\u4162;\\u4422r;\\uc000\\ud835\\udd17\\u0100ei\\u127b\\u1289\\u01f2\\u1280\\0\\u1287efore;\\u6234a;\\u4398\\u0100cn\\u128e\\u1298kSpace;\\uc000\\u205f\\u200aSpace;\\u6009lde\\u0200;EFT\\u12ab\\u12ac\\u12b2\\u12bc\\u623cqual;\\u6243ullEqual;\\u6245ilde;\\u6248pf;\\uc000\\ud835\\udd4bipleDot;\\u60db\\u0100ct\\u12d6\\u12dbr;\\uc000\\ud835\\udcafrok;\\u4166\\u0ae1\\u12f7\\u130e\\u131a\\u1326\\0\\u132c\\u1331\\0\\0\\0\\0\\0\\u1338\\u133d\\u1377\\u1385\\0\\u13ff\\u1404\\u140a\\u1410\\u0100cr\\u12fb\\u1301ute\\u803b\\xda\\u40dar\\u0100;o\\u1307\\u1308\\u619fcir;\\u6949r\\u01e3\\u1313\\0\\u1316y;\\u440eve;\\u416c\\u0100iy\\u131e\\u1323rc\\u803b\\xdb\\u40db;\\u4423blac;\\u4170r;\\uc000\\ud835\\udd18rave\\u803b\\xd9\\u40d9acr;\\u416a\\u0100di\\u1341\\u1369er\\u0100BP\\u1348\\u135d\\u0100ar\\u134d\\u1350r;\\u405fac\\u0100ek\\u1357\\u1359;\\u63dfet;\\u63b5arenthesis;\\u63ddon\\u0100;P\\u1370\\u1371\\u62c3lus;\\u628e\\u0100gp\\u137b\\u137fon;\\u4172f;\\uc000\\ud835\\udd4c\\u0400ADETadps\\u1395\\u13ae\\u13b8\\u13c4\\u03e8\\u13d2\\u13d7\\u13f3rrow\\u0180;BD\\u1150\\u13a0\\u13a4ar;\\u6912ownArrow;\\u61c5ownArrow;\\u6195quilibrium;\\u696eee\\u0100;A\\u13cb\\u13cc\\u62a5rrow;\\u61a5own\\xe1\\u03f3er\\u0100LR\\u13de\\u13e8eftArrow;\\u6196ightArrow;\\u6197i\\u0100;l\\u13f9\\u13fa\\u43d2on;\\u43a5ing;\\u416ecr;\\uc000\\ud835\\udcb0ilde;\\u4168ml\\u803b\\xdc\\u40dc\\u0480Dbcdefosv\\u1427\\u142c\\u1430\\u1433\\u143e\\u1485\\u148a\\u1490\\u1496ash;\\u62abar;\\u6aeby;\\u4412ash\\u0100;l\\u143b\\u143c\\u62a9;\\u6ae6\\u0100er\\u1443\\u1445;\\u62c1\\u0180bty\\u144c\\u1450\\u147aar;\\u6016\\u0100;i\\u144f\\u1455cal\\u0200BLST\\u1461\\u1465\\u146a\\u1474ar;\\u6223ine;\\u407ceparator;\\u6758ilde;\\u6240ThinSpace;\\u600ar;\\uc000\\ud835\\udd19pf;\\uc000\\ud835\\udd4dcr;\\uc000\\ud835\\udcb1dash;\\u62aa\\u0280cefos\\u14a7\\u14ac\\u14b1\\u14b6\\u14bcirc;\\u4174dge;\\u62c0r;\\uc000\\ud835\\udd1apf;\\uc000\\ud835\\udd4ecr;\\uc000\\ud835\\udcb2\\u0200fios\\u14cb\\u14d0\\u14d2\\u14d8r;\\uc000\\ud835\\udd1b;\\u439epf;\\uc000\\ud835\\udd4fcr;\\uc000\\ud835\\udcb3\\u0480AIUacfosu\\u14f1\\u14f5\\u14f9\\u14fd\\u1504\\u150f\\u1514\\u151a\\u1520cy;\\u442fcy;\\u4407cy;\\u442ecute\\u803b\\xdd\\u40dd\\u0100iy\\u1509\\u150drc;\\u4176;\\u442br;\\uc000\\ud835\\udd1cpf;\\uc000\\ud835\\udd50cr;\\uc000\\ud835\\udcb4ml;\\u4178\\u0400Hacdefos\\u1535\\u1539\\u153f\\u154b\\u154f\\u155d\\u1560\\u1564cy;\\u4416cute;\\u4179\\u0100ay\\u1544\\u1549ron;\\u417d;\\u4417ot;\\u417b\\u01f2\\u1554\\0\\u155boWidt\\xe8\\u0ad9a;\\u4396r;\\u6128pf;\\u6124cr;\\uc000\\ud835\\udcb5\\u0be1\\u1583\\u158a\\u1590\\0\\u15b0\\u15b6\\u15bf\\0\\0\\0\\0\\u15c6\\u15db\\u15eb\\u165f\\u166d\\0\\u1695\\u169b\\u16b2\\u16b9\\0\\u16becute\\u803b\\xe1\\u40e1reve;\\u4103\\u0300;Ediuy\\u159c\\u159d\\u15a1\\u15a3\\u15a8\\u15ad\\u623e;\\uc000\\u223e\\u0333;\\u623frc\\u803b\\xe2\\u40e2te\\u80bb\\xb4\\u0306;\\u4430lig\\u803b\\xe6\\u40e6\\u0100;r\\xb2\\u15ba;\\uc000\\ud835\\udd1erave\\u803b\\xe0\\u40e0\\u0100ep\\u15ca\\u15d6\\u0100fp\\u15cf\\u15d4sym;\\u6135\\xe8\\u15d3ha;\\u43b1\\u0100ap\\u15dfc\\u0100cl\\u15e4\\u15e7r;\\u4101g;\\u6a3f\\u0264\\u15f0\\0\\0\\u160a\\u0280;adsv\\u15fa\\u15fb\\u15ff\\u1601\\u1607\\u6227nd;\\u6a55;\\u6a5clope;\\u6a58;\\u6a5a\\u0380;elmrsz\\u1618\\u1619\\u161b\\u161e\\u163f\\u164f\\u1659\\u6220;\\u69a4e\\xbb\\u1619sd\\u0100;a\\u1625\\u1626\\u6221\\u0461\\u1630\\u1632\\u1634\\u1636\\u1638\\u163a\\u163c\\u163e;\\u69a8;\\u69a9;\\u69aa;\\u69ab;\\u69ac;\\u69ad;\\u69ae;\\u69aft\\u0100;v\\u1645\\u1646\\u621fb\\u0100;d\\u164c\\u164d\\u62be;\\u699d\\u0100pt\\u1654\\u1657h;\\u6222\\xbb\\xb9arr;\\u637c\\u0100gp\\u1663\\u1667on;\\u4105f;\\uc000\\ud835\\udd52\\u0380;Eaeiop\\u12c1\\u167b\\u167d\\u1682\\u1684\\u1687\\u168a;\\u6a70cir;\\u6a6f;\\u624ad;\\u624bs;\\u4027rox\\u0100;e\\u12c1\\u1692\\xf1\\u1683ing\\u803b\\xe5\\u40e5\\u0180cty\\u16a1\\u16a6\\u16a8r;\\uc000\\ud835\\udcb6;\\u402amp\\u0100;e\\u12c1\\u16af\\xf1\\u0288ilde\\u803b\\xe3\\u40e3ml\\u803b\\xe4\\u40e4\\u0100ci\\u16c2\\u16c8onin\\xf4\\u0272nt;\\u6a11\\u0800Nabcdefiklnoprsu\\u16ed\\u16f1\\u1730\\u173c\\u1743\\u1748\\u1778\\u177d\\u17e0\\u17e6\\u1839\\u1850\\u170d\\u193d\\u1948\\u1970ot;\\u6aed\\u0100cr\\u16f6\\u171ek\\u0200ceps\\u1700\\u1705\\u170d\\u1713ong;\\u624cpsilon;\\u43f6rime;\\u6035im\\u0100;e\\u171a\\u171b\\u623dq;\\u62cd\\u0176\\u1722\\u1726ee;\\u62bded\\u0100;g\\u172c\\u172d\\u6305e\\xbb\\u172drk\\u0100;t\\u135c\\u1737brk;\\u63b6\\u0100oy\\u1701\\u1741;\\u4431quo;\\u601e\\u0280cmprt\\u1753\\u175b\\u1761\\u1764\\u1768aus\\u0100;e\\u010a\\u0109ptyv;\\u69b0s\\xe9\\u170cno\\xf5\\u0113\\u0180ahw\\u176f\\u1771\\u1773;\\u43b2;\\u6136een;\\u626cr;\\uc000\\ud835\\udd1fg\\u0380costuvw\\u178d\\u179d\\u17b3\\u17c1\\u17d5\\u17db\\u17de\\u0180aiu\\u1794\\u1796\\u179a\\xf0\\u0760rc;\\u65efp\\xbb\\u1371\\u0180dpt\\u17a4\\u17a8\\u17adot;\\u6a00lus;\\u6a01imes;\\u6a02\\u0271\\u17b9\\0\\0\\u17becup;\\u6a06ar;\\u6605riangle\\u0100du\\u17cd\\u17d2own;\\u65bdp;\\u65b3plus;\\u6a04e\\xe5\\u1444\\xe5\\u14adarow;\\u690d\\u0180ako\\u17ed\\u1826\\u1835\\u0100cn\\u17f2\\u1823k\\u0180lst\\u17fa\\u05ab\\u1802ozenge;\\u69ebriangle\\u0200;dlr\\u1812\\u1813\\u1818\\u181d\\u65b4own;\\u65beeft;\\u65c2ight;\\u65b8k;\\u6423\\u01b1\\u182b\\0\\u1833\\u01b2\\u182f\\0\\u1831;\\u6592;\\u65914;\\u6593ck;\\u6588\\u0100eo\\u183e\\u184d\\u0100;q\\u1843\\u1846\\uc000=\\u20e5uiv;\\uc000\\u2261\\u20e5t;\\u6310\\u0200ptwx\\u1859\\u185e\\u1867\\u186cf;\\uc000\\ud835\\udd53\\u0100;t\\u13cb\\u1863om\\xbb\\u13cctie;\\u62c8\\u0600DHUVbdhmptuv\\u1885\\u1896\\u18aa\\u18bb\\u18d7\\u18db\\u18ec\\u18ff\\u1905\\u190a\\u1910\\u1921\\u0200LRlr\\u188e\\u1890\\u1892\\u1894;\\u6557;\\u6554;\\u6556;\\u6553\\u0280;DUdu\\u18a1\\u18a2\\u18a4\\u18a6\\u18a8\\u6550;\\u6566;\\u6569;\\u6564;\\u6567\\u0200LRlr\\u18b3\\u18b5\\u18b7\\u18b9;\\u655d;\\u655a;\\u655c;\\u6559\\u0380;HLRhlr\\u18ca\\u18cb\\u18cd\\u18cf\\u18d1\\u18d3\\u18d5\\u6551;\\u656c;\\u6563;\\u6560;\\u656b;\\u6562;\\u655fox;\\u69c9\\u0200LRlr\\u18e4\\u18e6\\u18e8\\u18ea;\\u6555;\\u6552;\\u6510;\\u650c\\u0280;DUdu\\u06bd\\u18f7\\u18f9\\u18fb\\u18fd;\\u6565;\\u6568;\\u652c;\\u6534inus;\\u629flus;\\u629eimes;\\u62a0\\u0200LRlr\\u1919\\u191b\\u191d\\u191f;\\u655b;\\u6558;\\u6518;\\u6514\\u0380;HLRhlr\\u1930\\u1931\\u1933\\u1935\\u1937\\u1939\\u193b\\u6502;\\u656a;\\u6561;\\u655e;\\u653c;\\u6524;\\u651c\\u0100ev\\u0123\\u1942bar\\u803b\\xa6\\u40a6\\u0200ceio\\u1951\\u1956\\u195a\\u1960r;\\uc000\\ud835\\udcb7mi;\\u604fm\\u0100;e\\u171a\\u171cl\\u0180;bh\\u1968\\u1969\\u196b\\u405c;\\u69c5sub;\\u67c8\\u016c\\u1974\\u197el\\u0100;e\\u1979\\u197a\\u6022t\\xbb\\u197ap\\u0180;Ee\\u012f\\u1985\\u1987;\\u6aae\\u0100;q\\u06dc\\u06db\\u0ce1\\u19a7\\0\\u19e8\\u1a11\\u1a15\\u1a32\\0\\u1a37\\u1a50\\0\\0\\u1ab4\\0\\0\\u1ac1\\0\\0\\u1b21\\u1b2e\\u1b4d\\u1b52\\0\\u1bfd\\0\\u1c0c\\u0180cpr\\u19ad\\u19b2\\u19ddute;\\u4107\\u0300;abcds\\u19bf\\u19c0\\u19c4\\u19ca\\u19d5\\u19d9\\u6229nd;\\u6a44rcup;\\u6a49\\u0100au\\u19cf\\u19d2p;\\u6a4bp;\\u6a47ot;\\u6a40;\\uc000\\u2229\\ufe00\\u0100eo\\u19e2\\u19e5t;\\u6041\\xee\\u0693\\u0200aeiu\\u19f0\\u19fb\\u1a01\\u1a05\\u01f0\\u19f5\\0\\u19f8s;\\u6a4don;\\u410ddil\\u803b\\xe7\\u40e7rc;\\u4109ps\\u0100;s\\u1a0c\\u1a0d\\u6a4cm;\\u6a50ot;\\u410b\\u0180dmn\\u1a1b\\u1a20\\u1a26il\\u80bb\\xb8\\u01adptyv;\\u69b2t\\u8100\\xa2;e\\u1a2d\\u1a2e\\u40a2r\\xe4\\u01b2r;\\uc000\\ud835\\udd20\\u0180cei\\u1a3d\\u1a40\\u1a4dy;\\u4447ck\\u0100;m\\u1a47\\u1a48\\u6713ark\\xbb\\u1a48;\\u43c7r\\u0380;Ecefms\\u1a5f\\u1a60\\u1a62\\u1a6b\\u1aa4\\u1aaa\\u1aae\\u65cb;\\u69c3\\u0180;el\\u1a69\\u1a6a\\u1a6d\\u42c6q;\\u6257e\\u0261\\u1a74\\0\\0\\u1a88rrow\\u0100lr\\u1a7c\\u1a81eft;\\u61baight;\\u61bb\\u0280RSacd\\u1a92\\u1a94\\u1a96\\u1a9a\\u1a9f\\xbb\\u0f47;\\u64c8st;\\u629birc;\\u629aash;\\u629dnint;\\u6a10id;\\u6aefcir;\\u69c2ubs\\u0100;u\\u1abb\\u1abc\\u6663it\\xbb\\u1abc\\u02ec\\u1ac7\\u1ad4\\u1afa\\0\\u1b0aon\\u0100;e\\u1acd\\u1ace\\u403a\\u0100;q\\xc7\\xc6\\u026d\\u1ad9\\0\\0\\u1ae2a\\u0100;t\\u1ade\\u1adf\\u402c;\\u4040\\u0180;fl\\u1ae8\\u1ae9\\u1aeb\\u6201\\xee\\u1160e\\u0100mx\\u1af1\\u1af6ent\\xbb\\u1ae9e\\xf3\\u024d\\u01e7\\u1afe\\0\\u1b07\\u0100;d\\u12bb\\u1b02ot;\\u6a6dn\\xf4\\u0246\\u0180fry\\u1b10\\u1b14\\u1b17;\\uc000\\ud835\\udd54o\\xe4\\u0254\\u8100\\xa9;s\\u0155\\u1b1dr;\\u6117\\u0100ao\\u1b25\\u1b29rr;\\u61b5ss;\\u6717\\u0100cu\\u1b32\\u1b37r;\\uc000\\ud835\\udcb8\\u0100bp\\u1b3c\\u1b44\\u0100;e\\u1b41\\u1b42\\u6acf;\\u6ad1\\u0100;e\\u1b49\\u1b4a\\u6ad0;\\u6ad2dot;\\u62ef\\u0380delprvw\\u1b60\\u1b6c\\u1b77\\u1b82\\u1bac\\u1bd4\\u1bf9arr\\u0100lr\\u1b68\\u1b6a;\\u6938;\\u6935\\u0270\\u1b72\\0\\0\\u1b75r;\\u62dec;\\u62dfarr\\u0100;p\\u1b7f\\u1b80\\u61b6;\\u693d\\u0300;bcdos\\u1b8f\\u1b90\\u1b96\\u1ba1\\u1ba5\\u1ba8\\u622arcap;\\u6a48\\u0100au\\u1b9b\\u1b9ep;\\u6a46p;\\u6a4aot;\\u628dr;\\u6a45;\\uc000\\u222a\\ufe00\\u0200alrv\\u1bb5\\u1bbf\\u1bde\\u1be3rr\\u0100;m\\u1bbc\\u1bbd\\u61b7;\\u693cy\\u0180evw\\u1bc7\\u1bd4\\u1bd8q\\u0270\\u1bce\\0\\0\\u1bd2re\\xe3\\u1b73u\\xe3\\u1b75ee;\\u62ceedge;\\u62cfen\\u803b\\xa4\\u40a4earrow\\u0100lr\\u1bee\\u1bf3eft\\xbb\\u1b80ight\\xbb\\u1bbde\\xe4\\u1bdd\\u0100ci\\u1c01\\u1c07onin\\xf4\\u01f7nt;\\u6231lcty;\\u632d\\u0980AHabcdefhijlorstuwz\\u1c38\\u1c3b\\u1c3f\\u1c5d\\u1c69\\u1c75\\u1c8a\\u1c9e\\u1cac\\u1cb7\\u1cfb\\u1cff\\u1d0d\\u1d7b\\u1d91\\u1dab\\u1dbb\\u1dc6\\u1dcdr\\xf2\\u0381ar;\\u6965\\u0200glrs\\u1c48\\u1c4d\\u1c52\\u1c54ger;\\u6020eth;\\u6138\\xf2\\u1133h\\u0100;v\\u1c5a\\u1c5b\\u6010\\xbb\\u090a\\u016b\\u1c61\\u1c67arow;\\u690fa\\xe3\\u0315\\u0100ay\\u1c6e\\u1c73ron;\\u410f;\\u4434\\u0180;ao\\u0332\\u1c7c\\u1c84\\u0100gr\\u02bf\\u1c81r;\\u61catseq;\\u6a77\\u0180glm\\u1c91\\u1c94\\u1c98\\u803b\\xb0\\u40b0ta;\\u43b4ptyv;\\u69b1\\u0100ir\\u1ca3\\u1ca8sht;\\u697f;\\uc000\\ud835\\udd21ar\\u0100lr\\u1cb3\\u1cb5\\xbb\\u08dc\\xbb\\u101e\\u0280aegsv\\u1cc2\\u0378\\u1cd6\\u1cdc\\u1ce0m\\u0180;os\\u0326\\u1cca\\u1cd4nd\\u0100;s\\u0326\\u1cd1uit;\\u6666amma;\\u43ddin;\\u62f2\\u0180;io\\u1ce7\\u1ce8\\u1cf8\\u40f7de\\u8100\\xf7;o\\u1ce7\\u1cf0ntimes;\\u62c7n\\xf8\\u1cf7cy;\\u4452c\\u026f\\u1d06\\0\\0\\u1d0arn;\\u631eop;\\u630d\\u0280lptuw\\u1d18\\u1d1d\\u1d22\\u1d49\\u1d55lar;\\u4024f;\\uc000\\ud835\\udd55\\u0280;emps\\u030b\\u1d2d\\u1d37\\u1d3d\\u1d42q\\u0100;d\\u0352\\u1d33ot;\\u6251inus;\\u6238lus;\\u6214quare;\\u62a1blebarwedg\\xe5\\xfan\\u0180adh\\u112e\\u1d5d\\u1d67ownarrow\\xf3\\u1c83arpoon\\u0100lr\\u1d72\\u1d76ef\\xf4\\u1cb4igh\\xf4\\u1cb6\\u0162\\u1d7f\\u1d85karo\\xf7\\u0f42\\u026f\\u1d8a\\0\\0\\u1d8ern;\\u631fop;\\u630c\\u0180cot\\u1d98\\u1da3\\u1da6\\u0100ry\\u1d9d\\u1da1;\\uc000\\ud835\\udcb9;\\u4455l;\\u69f6rok;\\u4111\\u0100dr\\u1db0\\u1db4ot;\\u62f1i\\u0100;f\\u1dba\\u1816\\u65bf\\u0100ah\\u1dc0\\u1dc3r\\xf2\\u0429a\\xf2\\u0fa6angle;\\u69a6\\u0100ci\\u1dd2\\u1dd5y;\\u445fgrarr;\\u67ff\\u0900Dacdefglmnopqrstux\\u1e01\\u1e09\\u1e19\\u1e38\\u0578\\u1e3c\\u1e49\\u1e61\\u1e7e\\u1ea5\\u1eaf\\u1ebd\\u1ee1\\u1f2a\\u1f37\\u1f44\\u1f4e\\u1f5a\\u0100Do\\u1e06\\u1d34o\\xf4\\u1c89\\u0100cs\\u1e0e\\u1e14ute\\u803b\\xe9\\u40e9ter;\\u6a6e\\u0200aioy\\u1e22\\u1e27\\u1e31\\u1e36ron;\\u411br\\u0100;c\\u1e2d\\u1e2e\\u6256\\u803b\\xea\\u40ealon;\\u6255;\\u444dot;\\u4117\\u0100Dr\\u1e41\\u1e45ot;\\u6252;\\uc000\\ud835\\udd22\\u0180;rs\\u1e50\\u1e51\\u1e57\\u6a9aave\\u803b\\xe8\\u40e8\\u0100;d\\u1e5c\\u1e5d\\u6a96ot;\\u6a98\\u0200;ils\\u1e6a\\u1e6b\\u1e72\\u1e74\\u6a99nters;\\u63e7;\\u6113\\u0100;d\\u1e79\\u1e7a\\u6a95ot;\\u6a97\\u0180aps\\u1e85\\u1e89\\u1e97cr;\\u4113ty\\u0180;sv\\u1e92\\u1e93\\u1e95\\u6205et\\xbb\\u1e93p\\u01001;\\u1e9d\\u1ea4\\u0133\\u1ea1\\u1ea3;\\u6004;\\u6005\\u6003\\u0100gs\\u1eaa\\u1eac;\\u414bp;\\u6002\\u0100gp\\u1eb4\\u1eb8on;\\u4119f;\\uc000\\ud835\\udd56\\u0180als\\u1ec4\\u1ece\\u1ed2r\\u0100;s\\u1eca\\u1ecb\\u62d5l;\\u69e3us;\\u6a71i\\u0180;lv\\u1eda\\u1edb\\u1edf\\u43b5on\\xbb\\u1edb;\\u43f5\\u0200csuv\\u1eea\\u1ef3\\u1f0b\\u1f23\\u0100io\\u1eef\\u1e31rc\\xbb\\u1e2e\\u0269\\u1ef9\\0\\0\\u1efb\\xed\\u0548ant\\u0100gl\\u1f02\\u1f06tr\\xbb\\u1e5dess\\xbb\\u1e7a\\u0180aei\\u1f12\\u1f16\\u1f1als;\\u403dst;\\u625fv\\u0100;D\\u0235\\u1f20D;\\u6a78parsl;\\u69e5\\u0100Da\\u1f2f\\u1f33ot;\\u6253rr;\\u6971\\u0180cdi\\u1f3e\\u1f41\\u1ef8r;\\u612fo\\xf4\\u0352\\u0100ah\\u1f49\\u1f4b;\\u43b7\\u803b\\xf0\\u40f0\\u0100mr\\u1f53\\u1f57l\\u803b\\xeb\\u40ebo;\\u60ac\\u0180cip\\u1f61\\u1f64\\u1f67l;\\u4021s\\xf4\\u056e\\u0100eo\\u1f6c\\u1f74ctatio\\xee\\u0559nential\\xe5\\u0579\\u09e1\\u1f92\\0\\u1f9e\\0\\u1fa1\\u1fa7\\0\\0\\u1fc6\\u1fcc\\0\\u1fd3\\0\\u1fe6\\u1fea\\u2000\\0\\u2008\\u205allingdotse\\xf1\\u1e44y;\\u4444male;\\u6640\\u0180ilr\\u1fad\\u1fb3\\u1fc1lig;\\u8000\\ufb03\\u0269\\u1fb9\\0\\0\\u1fbdg;\\u8000\\ufb00ig;\\u8000\\ufb04;\\uc000\\ud835\\udd23lig;\\u8000\\ufb01lig;\\uc000fj\\u0180alt\\u1fd9\\u1fdc\\u1fe1t;\\u666dig;\\u8000\\ufb02ns;\\u65b1of;\\u4192\\u01f0\\u1fee\\0\\u1ff3f;\\uc000\\ud835\\udd57\\u0100ak\\u05bf\\u1ff7\\u0100;v\\u1ffc\\u1ffd\\u62d4;\\u6ad9artint;\\u6a0d\\u0100ao\\u200c\\u2055\\u0100cs\\u2011\\u2052\\u03b1\\u201a\\u2030\\u2038\\u2045\\u2048\\0\\u2050\\u03b2\\u2022\\u2025\\u2027\\u202a\\u202c\\0\\u202e\\u803b\\xbd\\u40bd;\\u6153\\u803b\\xbc\\u40bc;\\u6155;\\u6159;\\u615b\\u01b3\\u2034\\0\\u2036;\\u6154;\\u6156\\u02b4\\u203e\\u2041\\0\\0\\u2043\\u803b\\xbe\\u40be;\\u6157;\\u615c5;\\u6158\\u01b6\\u204c\\0\\u204e;\\u615a;\\u615d8;\\u615el;\\u6044wn;\\u6322cr;\\uc000\\ud835\\udcbb\\u0880Eabcdefgijlnorstv\\u2082\\u2089\\u209f\\u20a5\\u20b0\\u20b4\\u20f0\\u20f5\\u20fa\\u20ff\\u2103\\u2112\\u2138\\u0317\\u213e\\u2152\\u219e\\u0100;l\\u064d\\u2087;\\u6a8c\\u0180cmp\\u2090\\u2095\\u209dute;\\u41f5ma\\u0100;d\\u209c\\u1cda\\u43b3;\\u6a86reve;\\u411f\\u0100iy\\u20aa\\u20aerc;\\u411d;\\u4433ot;\\u4121\\u0200;lqs\\u063e\\u0642\\u20bd\\u20c9\\u0180;qs\\u063e\\u064c\\u20c4lan\\xf4\\u0665\\u0200;cdl\\u0665\\u20d2\\u20d5\\u20e5c;\\u6aa9ot\\u0100;o\\u20dc\\u20dd\\u6a80\\u0100;l\\u20e2\\u20e3\\u6a82;\\u6a84\\u0100;e\\u20ea\\u20ed\\uc000\\u22db\\ufe00s;\\u6a94r;\\uc000\\ud835\\udd24\\u0100;g\\u0673\\u061bmel;\\u6137cy;\\u4453\\u0200;Eaj\\u065a\\u210c\\u210e\\u2110;\\u6a92;\\u6aa5;\\u6aa4\\u0200Eaes\\u211b\\u211d\\u2129\\u2134;\\u6269p\\u0100;p\\u2123\\u2124\\u6a8arox\\xbb\\u2124\\u0100;q\\u212e\\u212f\\u6a88\\u0100;q\\u212e\\u211bim;\\u62e7pf;\\uc000\\ud835\\udd58\\u0100ci\\u2143\\u2146r;\\u610am\\u0180;el\\u066b\\u214e\\u2150;\\u6a8e;\\u6a90\\u8300>;cdlqr\\u05ee\\u2160\\u216a\\u216e\\u2173\\u2179\\u0100ci\\u2165\\u2167;\\u6aa7r;\\u6a7aot;\\u62d7Par;\\u6995uest;\\u6a7c\\u0280adels\\u2184\\u216a\\u2190\\u0656\\u219b\\u01f0\\u2189\\0\\u218epro\\xf8\\u209er;\\u6978q\\u0100lq\\u063f\\u2196les\\xf3\\u2088i\\xed\\u066b\\u0100en\\u21a3\\u21adrtneqq;\\uc000\\u2269\\ufe00\\xc5\\u21aa\\u0500Aabcefkosy\\u21c4\\u21c7\\u21f1\\u21f5\\u21fa\\u2218\\u221d\\u222f\\u2268\\u227dr\\xf2\\u03a0\\u0200ilmr\\u21d0\\u21d4\\u21d7\\u21dbrs\\xf0\\u1484f\\xbb\\u2024il\\xf4\\u06a9\\u0100dr\\u21e0\\u21e4cy;\\u444a\\u0180;cw\\u08f4\\u21eb\\u21efir;\\u6948;\\u61adar;\\u610firc;\\u4125\\u0180alr\\u2201\\u220e\\u2213rts\\u0100;u\\u2209\\u220a\\u6665it\\xbb\\u220alip;\\u6026con;\\u62b9r;\\uc000\\ud835\\udd25s\\u0100ew\\u2223\\u2229arow;\\u6925arow;\\u6926\\u0280amopr\\u223a\\u223e\\u2243\\u225e\\u2263rr;\\u61fftht;\\u623bk\\u0100lr\\u2249\\u2253eftarrow;\\u61a9ightarrow;\\u61aaf;\\uc000\\ud835\\udd59bar;\\u6015\\u0180clt\\u226f\\u2274\\u2278r;\\uc000\\ud835\\udcbdas\\xe8\\u21f4rok;\\u4127\\u0100bp\\u2282\\u2287ull;\\u6043hen\\xbb\\u1c5b\\u0ae1\\u22a3\\0\\u22aa\\0\\u22b8\\u22c5\\u22ce\\0\\u22d5\\u22f3\\0\\0\\u22f8\\u2322\\u2367\\u2362\\u237f\\0\\u2386\\u23aa\\u23b4cute\\u803b\\xed\\u40ed\\u0180;iy\\u0771\\u22b0\\u22b5rc\\u803b\\xee\\u40ee;\\u4438\\u0100cx\\u22bc\\u22bfy;\\u4435cl\\u803b\\xa1\\u40a1\\u0100fr\\u039f\\u22c9;\\uc000\\ud835\\udd26rave\\u803b\\xec\\u40ec\\u0200;ino\\u073e\\u22dd\\u22e9\\u22ee\\u0100in\\u22e2\\u22e6nt;\\u6a0ct;\\u622dfin;\\u69dcta;\\u6129lig;\\u4133\\u0180aop\\u22fe\\u231a\\u231d\\u0180cgt\\u2305\\u2308\\u2317r;\\u412b\\u0180elp\\u071f\\u230f\\u2313in\\xe5\\u078ear\\xf4\\u0720h;\\u4131f;\\u62b7ed;\\u41b5\\u0280;cfot\\u04f4\\u232c\\u2331\\u233d\\u2341are;\\u6105in\\u0100;t\\u2338\\u2339\\u621eie;\\u69dddo\\xf4\\u2319\\u0280;celp\\u0757\\u234c\\u2350\\u235b\\u2361al;\\u62ba\\u0100gr\\u2355\\u2359er\\xf3\\u1563\\xe3\\u234darhk;\\u6a17rod;\\u6a3c\\u0200cgpt\\u236f\\u2372\\u2376\\u237by;\\u4451on;\\u412ff;\\uc000\\ud835\\udd5aa;\\u43b9uest\\u803b\\xbf\\u40bf\\u0100ci\\u238a\\u238fr;\\uc000\\ud835\\udcben\\u0280;Edsv\\u04f4\\u239b\\u239d\\u23a1\\u04f3;\\u62f9ot;\\u62f5\\u0100;v\\u23a6\\u23a7\\u62f4;\\u62f3\\u0100;i\\u0777\\u23aelde;\\u4129\\u01eb\\u23b8\\0\\u23bccy;\\u4456l\\u803b\\xef\\u40ef\\u0300cfmosu\\u23cc\\u23d7\\u23dc\\u23e1\\u23e7\\u23f5\\u0100iy\\u23d1\\u23d5rc;\\u4135;\\u4439r;\\uc000\\ud835\\udd27ath;\\u4237pf;\\uc000\\ud835\\udd5b\\u01e3\\u23ec\\0\\u23f1r;\\uc000\\ud835\\udcbfrcy;\\u4458kcy;\\u4454\\u0400acfghjos\\u240b\\u2416\\u2422\\u2427\\u242d\\u2431\\u2435\\u243bppa\\u0100;v\\u2413\\u2414\\u43ba;\\u43f0\\u0100ey\\u241b\\u2420dil;\\u4137;\\u443ar;\\uc000\\ud835\\udd28reen;\\u4138cy;\\u4445cy;\\u445cpf;\\uc000\\ud835\\udd5ccr;\\uc000\\ud835\\udcc0\\u0b80ABEHabcdefghjlmnoprstuv\\u2470\\u2481\\u2486\\u248d\\u2491\\u250e\\u253d\\u255a\\u2580\\u264e\\u265e\\u2665\\u2679\\u267d\\u269a\\u26b2\\u26d8\\u275d\\u2768\\u278b\\u27c0\\u2801\\u2812\\u0180art\\u2477\\u247a\\u247cr\\xf2\\u09c6\\xf2\\u0395ail;\\u691barr;\\u690e\\u0100;g\\u0994\\u248b;\\u6a8bar;\\u6962\\u0963\\u24a5\\0\\u24aa\\0\\u24b1\\0\\0\\0\\0\\0\\u24b5\\u24ba\\0\\u24c6\\u24c8\\u24cd\\0\\u24f9ute;\\u413amptyv;\\u69b4ra\\xee\\u084cbda;\\u43bbg\\u0180;dl\\u088e\\u24c1\\u24c3;\\u6991\\xe5\\u088e;\\u6a85uo\\u803b\\xab\\u40abr\\u0400;bfhlpst\\u0899\\u24de\\u24e6\\u24e9\\u24eb\\u24ee\\u24f1\\u24f5\\u0100;f\\u089d\\u24e3s;\\u691fs;\\u691d\\xeb\\u2252p;\\u61abl;\\u6939im;\\u6973l;\\u61a2\\u0180;ae\\u24ff\\u2500\\u2504\\u6aabil;\\u6919\\u0100;s\\u2509\\u250a\\u6aad;\\uc000\\u2aad\\ufe00\\u0180abr\\u2515\\u2519\\u251drr;\\u690crk;\\u6772\\u0100ak\\u2522\\u252cc\\u0100ek\\u2528\\u252a;\\u407b;\\u405b\\u0100es\\u2531\\u2533;\\u698bl\\u0100du\\u2539\\u253b;\\u698f;\\u698d\\u0200aeuy\\u2546\\u254b\\u2556\\u2558ron;\\u413e\\u0100di\\u2550\\u2554il;\\u413c\\xec\\u08b0\\xe2\\u2529;\\u443b\\u0200cqrs\\u2563\\u2566\\u256d\\u257da;\\u6936uo\\u0100;r\\u0e19\\u1746\\u0100du\\u2572\\u2577har;\\u6967shar;\\u694bh;\\u61b2\\u0280;fgqs\\u258b\\u258c\\u0989\\u25f3\\u25ff\\u6264t\\u0280ahlrt\\u2598\\u25a4\\u25b7\\u25c2\\u25e8rrow\\u0100;t\\u0899\\u25a1a\\xe9\\u24f6arpoon\\u0100du\\u25af\\u25b4own\\xbb\\u045ap\\xbb\\u0966eftarrows;\\u61c7ight\\u0180ahs\\u25cd\\u25d6\\u25derrow\\u0100;s\\u08f4\\u08a7arpoon\\xf3\\u0f98quigarro\\xf7\\u21f0hreetimes;\\u62cb\\u0180;qs\\u258b\\u0993\\u25falan\\xf4\\u09ac\\u0280;cdgs\\u09ac\\u260a\\u260d\\u261d\\u2628c;\\u6aa8ot\\u0100;o\\u2614\\u2615\\u6a7f\\u0100;r\\u261a\\u261b\\u6a81;\\u6a83\\u0100;e\\u2622\\u2625\\uc000\\u22da\\ufe00s;\\u6a93\\u0280adegs\\u2633\\u2639\\u263d\\u2649\\u264bppro\\xf8\\u24c6ot;\\u62d6q\\u0100gq\\u2643\\u2645\\xf4\\u0989gt\\xf2\\u248c\\xf4\\u099bi\\xed\\u09b2\\u0180ilr\\u2655\\u08e1\\u265asht;\\u697c;\\uc000\\ud835\\udd29\\u0100;E\\u099c\\u2663;\\u6a91\\u0161\\u2669\\u2676r\\u0100du\\u25b2\\u266e\\u0100;l\\u0965\\u2673;\\u696alk;\\u6584cy;\\u4459\\u0280;acht\\u0a48\\u2688\\u268b\\u2691\\u2696r\\xf2\\u25c1orne\\xf2\\u1d08ard;\\u696bri;\\u65fa\\u0100io\\u269f\\u26a4dot;\\u4140ust\\u0100;a\\u26ac\\u26ad\\u63b0che\\xbb\\u26ad\\u0200Eaes\\u26bb\\u26bd\\u26c9\\u26d4;\\u6268p\\u0100;p\\u26c3\\u26c4\\u6a89rox\\xbb\\u26c4\\u0100;q\\u26ce\\u26cf\\u6a87\\u0100;q\\u26ce\\u26bbim;\\u62e6\\u0400abnoptwz\\u26e9\\u26f4\\u26f7\\u271a\\u272f\\u2741\\u2747\\u2750\\u0100nr\\u26ee\\u26f1g;\\u67ecr;\\u61fdr\\xeb\\u08c1g\\u0180lmr\\u26ff\\u270d\\u2714eft\\u0100ar\\u09e6\\u2707ight\\xe1\\u09f2apsto;\\u67fcight\\xe1\\u09fdparrow\\u0100lr\\u2725\\u2729ef\\xf4\\u24edight;\\u61ac\\u0180afl\\u2736\\u2739\\u273dr;\\u6985;\\uc000\\ud835\\udd5dus;\\u6a2dimes;\\u6a34\\u0161\\u274b\\u274fst;\\u6217\\xe1\\u134e\\u0180;ef\\u2757\\u2758\\u1800\\u65cange\\xbb\\u2758ar\\u0100;l\\u2764\\u2765\\u4028t;\\u6993\\u0280achmt\\u2773\\u2776\\u277c\\u2785\\u2787r\\xf2\\u08a8orne\\xf2\\u1d8car\\u0100;d\\u0f98\\u2783;\\u696d;\\u600eri;\\u62bf\\u0300achiqt\\u2798\\u279d\\u0a40\\u27a2\\u27ae\\u27bbquo;\\u6039r;\\uc000\\ud835\\udcc1m\\u0180;eg\\u09b2\\u27aa\\u27ac;\\u6a8d;\\u6a8f\\u0100bu\\u252a\\u27b3o\\u0100;r\\u0e1f\\u27b9;\\u601arok;\\u4142\\u8400<;cdhilqr\\u082b\\u27d2\\u2639\\u27dc\\u27e0\\u27e5\\u27ea\\u27f0\\u0100ci\\u27d7\\u27d9;\\u6aa6r;\\u6a79re\\xe5\\u25f2mes;\\u62c9arr;\\u6976uest;\\u6a7b\\u0100Pi\\u27f5\\u27f9ar;\\u6996\\u0180;ef\\u2800\\u092d\\u181b\\u65c3r\\u0100du\\u2807\\u280dshar;\\u694ahar;\\u6966\\u0100en\\u2817\\u2821rtneqq;\\uc000\\u2268\\ufe00\\xc5\\u281e\\u0700Dacdefhilnopsu\\u2840\\u2845\\u2882\\u288e\\u2893\\u28a0\\u28a5\\u28a8\\u28da\\u28e2\\u28e4\\u0a83\\u28f3\\u2902Dot;\\u623a\\u0200clpr\\u284e\\u2852\\u2863\\u287dr\\u803b\\xaf\\u40af\\u0100et\\u2857\\u2859;\\u6642\\u0100;e\\u285e\\u285f\\u6720se\\xbb\\u285f\\u0100;s\\u103b\\u2868to\\u0200;dlu\\u103b\\u2873\\u2877\\u287bow\\xee\\u048cef\\xf4\\u090f\\xf0\\u13d1ker;\\u65ae\\u0100oy\\u2887\\u288cmma;\\u6a29;\\u443cash;\\u6014asuredangle\\xbb\\u1626r;\\uc000\\ud835\\udd2ao;\\u6127\\u0180cdn\\u28af\\u28b4\\u28c9ro\\u803b\\xb5\\u40b5\\u0200;acd\\u1464\\u28bd\\u28c0\\u28c4s\\xf4\\u16a7ir;\\u6af0ot\\u80bb\\xb7\\u01b5us\\u0180;bd\\u28d2\\u1903\\u28d3\\u6212\\u0100;u\\u1d3c\\u28d8;\\u6a2a\\u0163\\u28de\\u28e1p;\\u6adb\\xf2\\u2212\\xf0\\u0a81\\u0100dp\\u28e9\\u28eeels;\\u62a7f;\\uc000\\ud835\\udd5e\\u0100ct\\u28f8\\u28fdr;\\uc000\\ud835\\udcc2pos\\xbb\\u159d\\u0180;lm\\u2909\\u290a\\u290d\\u43bctimap;\\u62b8\\u0c00GLRVabcdefghijlmoprstuvw\\u2942\\u2953\\u297e\\u2989\\u2998\\u29da\\u29e9\\u2a15\\u2a1a\\u2a58\\u2a5d\\u2a83\\u2a95\\u2aa4\\u2aa8\\u2b04\\u2b07\\u2b44\\u2b7f\\u2bae\\u2c34\\u2c67\\u2c7c\\u2ce9\\u0100gt\\u2947\\u294b;\\uc000\\u22d9\\u0338\\u0100;v\\u2950\\u0bcf\\uc000\\u226b\\u20d2\\u0180elt\\u295a\\u2972\\u2976ft\\u0100ar\\u2961\\u2967rrow;\\u61cdightarrow;\\u61ce;\\uc000\\u22d8\\u0338\\u0100;v\\u297b\\u0c47\\uc000\\u226a\\u20d2ightarrow;\\u61cf\\u0100Dd\\u298e\\u2993ash;\\u62afash;\\u62ae\\u0280bcnpt\\u29a3\\u29a7\\u29ac\\u29b1\\u29ccla\\xbb\\u02deute;\\u4144g;\\uc000\\u2220\\u20d2\\u0280;Eiop\\u0d84\\u29bc\\u29c0\\u29c5\\u29c8;\\uc000\\u2a70\\u0338d;\\uc000\\u224b\\u0338s;\\u4149ro\\xf8\\u0d84ur\\u0100;a\\u29d3\\u29d4\\u666el\\u0100;s\\u29d3\\u0b38\\u01f3\\u29df\\0\\u29e3p\\u80bb\\xa0\\u0b37mp\\u0100;e\\u0bf9\\u0c00\\u0280aeouy\\u29f4\\u29fe\\u2a03\\u2a10\\u2a13\\u01f0\\u29f9\\0\\u29fb;\\u6a43on;\\u4148dil;\\u4146ng\\u0100;d\\u0d7e\\u2a0aot;\\uc000\\u2a6d\\u0338p;\\u6a42;\\u443dash;\\u6013\\u0380;Aadqsx\\u0b92\\u2a29\\u2a2d\\u2a3b\\u2a41\\u2a45\\u2a50rr;\\u61d7r\\u0100hr\\u2a33\\u2a36k;\\u6924\\u0100;o\\u13f2\\u13f0ot;\\uc000\\u2250\\u0338ui\\xf6\\u0b63\\u0100ei\\u2a4a\\u2a4ear;\\u6928\\xed\\u0b98ist\\u0100;s\\u0ba0\\u0b9fr;\\uc000\\ud835\\udd2b\\u0200Eest\\u0bc5\\u2a66\\u2a79\\u2a7c\\u0180;qs\\u0bbc\\u2a6d\\u0be1\\u0180;qs\\u0bbc\\u0bc5\\u2a74lan\\xf4\\u0be2i\\xed\\u0bea\\u0100;r\\u0bb6\\u2a81\\xbb\\u0bb7\\u0180Aap\\u2a8a\\u2a8d\\u2a91r\\xf2\\u2971rr;\\u61aear;\\u6af2\\u0180;sv\\u0f8d\\u2a9c\\u0f8c\\u0100;d\\u2aa1\\u2aa2\\u62fc;\\u62facy;\\u445a\\u0380AEadest\\u2ab7\\u2aba\\u2abe\\u2ac2\\u2ac5\\u2af6\\u2af9r\\xf2\\u2966;\\uc000\\u2266\\u0338rr;\\u619ar;\\u6025\\u0200;fqs\\u0c3b\\u2ace\\u2ae3\\u2aeft\\u0100ar\\u2ad4\\u2ad9rro\\xf7\\u2ac1ightarro\\xf7\\u2a90\\u0180;qs\\u0c3b\\u2aba\\u2aealan\\xf4\\u0c55\\u0100;s\\u0c55\\u2af4\\xbb\\u0c36i\\xed\\u0c5d\\u0100;r\\u0c35\\u2afei\\u0100;e\\u0c1a\\u0c25i\\xe4\\u0d90\\u0100pt\\u2b0c\\u2b11f;\\uc000\\ud835\\udd5f\\u8180\\xac;in\\u2b19\\u2b1a\\u2b36\\u40acn\\u0200;Edv\\u0b89\\u2b24\\u2b28\\u2b2e;\\uc000\\u22f9\\u0338ot;\\uc000\\u22f5\\u0338\\u01e1\\u0b89\\u2b33\\u2b35;\\u62f7;\\u62f6i\\u0100;v\\u0cb8\\u2b3c\\u01e1\\u0cb8\\u2b41\\u2b43;\\u62fe;\\u62fd\\u0180aor\\u2b4b\\u2b63\\u2b69r\\u0200;ast\\u0b7b\\u2b55\\u2b5a\\u2b5flle\\xec\\u0b7bl;\\uc000\\u2afd\\u20e5;\\uc000\\u2202\\u0338lint;\\u6a14\\u0180;ce\\u0c92\\u2b70\\u2b73u\\xe5\\u0ca5\\u0100;c\\u0c98\\u2b78\\u0100;e\\u0c92\\u2b7d\\xf1\\u0c98\\u0200Aait\\u2b88\\u2b8b\\u2b9d\\u2ba7r\\xf2\\u2988rr\\u0180;cw\\u2b94\\u2b95\\u2b99\\u619b;\\uc000\\u2933\\u0338;\\uc000\\u219d\\u0338ghtarrow\\xbb\\u2b95ri\\u0100;e\\u0ccb\\u0cd6\\u0380chimpqu\\u2bbd\\u2bcd\\u2bd9\\u2b04\\u0b78\\u2be4\\u2bef\\u0200;cer\\u0d32\\u2bc6\\u0d37\\u2bc9u\\xe5\\u0d45;\\uc000\\ud835\\udcc3ort\\u026d\\u2b05\\0\\0\\u2bd6ar\\xe1\\u2b56m\\u0100;e\\u0d6e\\u2bdf\\u0100;q\\u0d74\\u0d73su\\u0100bp\\u2beb\\u2bed\\xe5\\u0cf8\\xe5\\u0d0b\\u0180bcp\\u2bf6\\u2c11\\u2c19\\u0200;Ees\\u2bff\\u2c00\\u0d22\\u2c04\\u6284;\\uc000\\u2ac5\\u0338et\\u0100;e\\u0d1b\\u2c0bq\\u0100;q\\u0d23\\u2c00c\\u0100;e\\u0d32\\u2c17\\xf1\\u0d38\\u0200;Ees\\u2c22\\u2c23\\u0d5f\\u2c27\\u6285;\\uc000\\u2ac6\\u0338et\\u0100;e\\u0d58\\u2c2eq\\u0100;q\\u0d60\\u2c23\\u0200gilr\\u2c3d\\u2c3f\\u2c45\\u2c47\\xec\\u0bd7lde\\u803b\\xf1\\u40f1\\xe7\\u0c43iangle\\u0100lr\\u2c52\\u2c5ceft\\u0100;e\\u0c1a\\u2c5a\\xf1\\u0c26ight\\u0100;e\\u0ccb\\u2c65\\xf1\\u0cd7\\u0100;m\\u2c6c\\u2c6d\\u43bd\\u0180;es\\u2c74\\u2c75\\u2c79\\u4023ro;\\u6116p;\\u6007\\u0480DHadgilrs\\u2c8f\\u2c94\\u2c99\\u2c9e\\u2ca3\\u2cb0\\u2cb6\\u2cd3\\u2ce3ash;\\u62adarr;\\u6904p;\\uc000\\u224d\\u20d2ash;\\u62ac\\u0100et\\u2ca8\\u2cac;\\uc000\\u2265\\u20d2;\\uc000>\\u20d2nfin;\\u69de\\u0180Aet\\u2cbd\\u2cc1\\u2cc5rr;\\u6902;\\uc000\\u2264\\u20d2\\u0100;r\\u2cca\\u2ccd\\uc000<\\u20d2ie;\\uc000\\u22b4\\u20d2\\u0100At\\u2cd8\\u2cdcrr;\\u6903rie;\\uc000\\u22b5\\u20d2im;\\uc000\\u223c\\u20d2\\u0180Aan\\u2cf0\\u2cf4\\u2d02rr;\\u61d6r\\u0100hr\\u2cfa\\u2cfdk;\\u6923\\u0100;o\\u13e7\\u13e5ear;\\u6927\\u1253\\u1a95\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\u2d2d\\0\\u2d38\\u2d48\\u2d60\\u2d65\\u2d72\\u2d84\\u1b07\\0\\0\\u2d8d\\u2dab\\0\\u2dc8\\u2dce\\0\\u2ddc\\u2e19\\u2e2b\\u2e3e\\u2e43\\u0100cs\\u2d31\\u1a97ute\\u803b\\xf3\\u40f3\\u0100iy\\u2d3c\\u2d45r\\u0100;c\\u1a9e\\u2d42\\u803b\\xf4\\u40f4;\\u443e\\u0280abios\\u1aa0\\u2d52\\u2d57\\u01c8\\u2d5alac;\\u4151v;\\u6a38old;\\u69bclig;\\u4153\\u0100cr\\u2d69\\u2d6dir;\\u69bf;\\uc000\\ud835\\udd2c\\u036f\\u2d79\\0\\0\\u2d7c\\0\\u2d82n;\\u42dbave\\u803b\\xf2\\u40f2;\\u69c1\\u0100bm\\u2d88\\u0df4ar;\\u69b5\\u0200acit\\u2d95\\u2d98\\u2da5\\u2da8r\\xf2\\u1a80\\u0100ir\\u2d9d\\u2da0r;\\u69beoss;\\u69bbn\\xe5\\u0e52;\\u69c0\\u0180aei\\u2db1\\u2db5\\u2db9cr;\\u414dga;\\u43c9\\u0180cdn\\u2dc0\\u2dc5\\u01cdron;\\u43bf;\\u69b6pf;\\uc000\\ud835\\udd60\\u0180ael\\u2dd4\\u2dd7\\u01d2r;\\u69b7rp;\\u69b9\\u0380;adiosv\\u2dea\\u2deb\\u2dee\\u2e08\\u2e0d\\u2e10\\u2e16\\u6228r\\xf2\\u1a86\\u0200;efm\\u2df7\\u2df8\\u2e02\\u2e05\\u6a5dr\\u0100;o\\u2dfe\\u2dff\\u6134f\\xbb\\u2dff\\u803b\\xaa\\u40aa\\u803b\\xba\\u40bagof;\\u62b6r;\\u6a56lope;\\u6a57;\\u6a5b\\u0180clo\\u2e1f\\u2e21\\u2e27\\xf2\\u2e01ash\\u803b\\xf8\\u40f8l;\\u6298i\\u016c\\u2e2f\\u2e34de\\u803b\\xf5\\u40f5es\\u0100;a\\u01db\\u2e3as;\\u6a36ml\\u803b\\xf6\\u40f6bar;\\u633d\\u0ae1\\u2e5e\\0\\u2e7d\\0\\u2e80\\u2e9d\\0\\u2ea2\\u2eb9\\0\\0\\u2ecb\\u0e9c\\0\\u2f13\\0\\0\\u2f2b\\u2fbc\\0\\u2fc8r\\u0200;ast\\u0403\\u2e67\\u2e72\\u0e85\\u8100\\xb6;l\\u2e6d\\u2e6e\\u40b6le\\xec\\u0403\\u0269\\u2e78\\0\\0\\u2e7bm;\\u6af3;\\u6afdy;\\u443fr\\u0280cimpt\\u2e8b\\u2e8f\\u2e93\\u1865\\u2e97nt;\\u4025od;\\u402eil;\\u6030enk;\\u6031r;\\uc000\\ud835\\udd2d\\u0180imo\\u2ea8\\u2eb0\\u2eb4\\u0100;v\\u2ead\\u2eae\\u43c6;\\u43d5ma\\xf4\\u0a76ne;\\u660e\\u0180;tv\\u2ebf\\u2ec0\\u2ec8\\u43c0chfork\\xbb\\u1ffd;\\u43d6\\u0100au\\u2ecf\\u2edfn\\u0100ck\\u2ed5\\u2eddk\\u0100;h\\u21f4\\u2edb;\\u610e\\xf6\\u21f4s\\u0480;abcdemst\\u2ef3\\u2ef4\\u1908\\u2ef9\\u2efd\\u2f04\\u2f06\\u2f0a\\u2f0e\\u402bcir;\\u6a23ir;\\u6a22\\u0100ou\\u1d40\\u2f02;\\u6a25;\\u6a72n\\u80bb\\xb1\\u0e9dim;\\u6a26wo;\\u6a27\\u0180ipu\\u2f19\\u2f20\\u2f25ntint;\\u6a15f;\\uc000\\ud835\\udd61nd\\u803b\\xa3\\u40a3\\u0500;Eaceinosu\\u0ec8\\u2f3f\\u2f41\\u2f44\\u2f47\\u2f81\\u2f89\\u2f92\\u2f7e\\u2fb6;\\u6ab3p;\\u6ab7u\\xe5\\u0ed9\\u0100;c\\u0ece\\u2f4c\\u0300;acens\\u0ec8\\u2f59\\u2f5f\\u2f66\\u2f68\\u2f7eppro\\xf8\\u2f43urlye\\xf1\\u0ed9\\xf1\\u0ece\\u0180aes\\u2f6f\\u2f76\\u2f7approx;\\u6ab9qq;\\u6ab5im;\\u62e8i\\xed\\u0edfme\\u0100;s\\u2f88\\u0eae\\u6032\\u0180Eas\\u2f78\\u2f90\\u2f7a\\xf0\\u2f75\\u0180dfp\\u0eec\\u2f99\\u2faf\\u0180als\\u2fa0\\u2fa5\\u2faalar;\\u632eine;\\u6312urf;\\u6313\\u0100;t\\u0efb\\u2fb4\\xef\\u0efbrel;\\u62b0\\u0100ci\\u2fc0\\u2fc5r;\\uc000\\ud835\\udcc5;\\u43c8ncsp;\\u6008\\u0300fiopsu\\u2fda\\u22e2\\u2fdf\\u2fe5\\u2feb\\u2ff1r;\\uc000\\ud835\\udd2epf;\\uc000\\ud835\\udd62rime;\\u6057cr;\\uc000\\ud835\\udcc6\\u0180aeo\\u2ff8\\u3009\\u3013t\\u0100ei\\u2ffe\\u3005rnion\\xf3\\u06b0nt;\\u6a16st\\u0100;e\\u3010\\u3011\\u403f\\xf1\\u1f19\\xf4\\u0f14\\u0a80ABHabcdefhilmnoprstux\\u3040\\u3051\\u3055\\u3059\\u30e0\\u310e\\u312b\\u3147\\u3162\\u3172\\u318e\\u3206\\u3215\\u3224\\u3229\\u3258\\u326e\\u3272\\u3290\\u32b0\\u32b7\\u0180art\\u3047\\u304a\\u304cr\\xf2\\u10b3\\xf2\\u03ddail;\\u691car\\xf2\\u1c65ar;\\u6964\\u0380cdenqrt\\u3068\\u3075\\u3078\\u307f\\u308f\\u3094\\u30cc\\u0100eu\\u306d\\u3071;\\uc000\\u223d\\u0331te;\\u4155i\\xe3\\u116emptyv;\\u69b3g\\u0200;del\\u0fd1\\u3089\\u308b\\u308d;\\u6992;\\u69a5\\xe5\\u0fd1uo\\u803b\\xbb\\u40bbr\\u0580;abcfhlpstw\\u0fdc\\u30ac\\u30af\\u30b7\\u30b9\\u30bc\\u30be\\u30c0\\u30c3\\u30c7\\u30cap;\\u6975\\u0100;f\\u0fe0\\u30b4s;\\u6920;\\u6933s;\\u691e\\xeb\\u225d\\xf0\\u272el;\\u6945im;\\u6974l;\\u61a3;\\u619d\\u0100ai\\u30d1\\u30d5il;\\u691ao\\u0100;n\\u30db\\u30dc\\u6236al\\xf3\\u0f1e\\u0180abr\\u30e7\\u30ea\\u30eer\\xf2\\u17e5rk;\\u6773\\u0100ak\\u30f3\\u30fdc\\u0100ek\\u30f9\\u30fb;\\u407d;\\u405d\\u0100es\\u3102\\u3104;\\u698cl\\u0100du\\u310a\\u310c;\\u698e;\\u6990\\u0200aeuy\\u3117\\u311c\\u3127\\u3129ron;\\u4159\\u0100di\\u3121\\u3125il;\\u4157\\xec\\u0ff2\\xe2\\u30fa;\\u4440\\u0200clqs\\u3134\\u3137\\u313d\\u3144a;\\u6937dhar;\\u6969uo\\u0100;r\\u020e\\u020dh;\\u61b3\\u0180acg\\u314e\\u315f\\u0f44l\\u0200;ips\\u0f78\\u3158\\u315b\\u109cn\\xe5\\u10bbar\\xf4\\u0fa9t;\\u65ad\\u0180ilr\\u3169\\u1023\\u316esht;\\u697d;\\uc000\\ud835\\udd2f\\u0100ao\\u3177\\u3186r\\u0100du\\u317d\\u317f\\xbb\\u047b\\u0100;l\\u1091\\u3184;\\u696c\\u0100;v\\u318b\\u318c\\u43c1;\\u43f1\\u0180gns\\u3195\\u31f9\\u31fcht\\u0300ahlrst\\u31a4\\u31b0\\u31c2\\u31d8\\u31e4\\u31eerrow\\u0100;t\\u0fdc\\u31ada\\xe9\\u30c8arpoon\\u0100du\\u31bb\\u31bfow\\xee\\u317ep\\xbb\\u1092eft\\u0100ah\\u31ca\\u31d0rrow\\xf3\\u0feaarpoon\\xf3\\u0551ightarrows;\\u61c9quigarro\\xf7\\u30cbhreetimes;\\u62ccg;\\u42daingdotse\\xf1\\u1f32\\u0180ahm\\u320d\\u3210\\u3213r\\xf2\\u0feaa\\xf2\\u0551;\\u600foust\\u0100;a\\u321e\\u321f\\u63b1che\\xbb\\u321fmid;\\u6aee\\u0200abpt\\u3232\\u323d\\u3240\\u3252\\u0100nr\\u3237\\u323ag;\\u67edr;\\u61fer\\xeb\\u1003\\u0180afl\\u3247\\u324a\\u324er;\\u6986;\\uc000\\ud835\\udd63us;\\u6a2eimes;\\u6a35\\u0100ap\\u325d\\u3267r\\u0100;g\\u3263\\u3264\\u4029t;\\u6994olint;\\u6a12ar\\xf2\\u31e3\\u0200achq\\u327b\\u3280\\u10bc\\u3285quo;\\u603ar;\\uc000\\ud835\\udcc7\\u0100bu\\u30fb\\u328ao\\u0100;r\\u0214\\u0213\\u0180hir\\u3297\\u329b\\u32a0re\\xe5\\u31f8mes;\\u62cai\\u0200;efl\\u32aa\\u1059\\u1821\\u32ab\\u65b9tri;\\u69celuhar;\\u6968;\\u611e\\u0d61\\u32d5\\u32db\\u32df\\u332c\\u3338\\u3371\\0\\u337a\\u33a4\\0\\0\\u33ec\\u33f0\\0\\u3428\\u3448\\u345a\\u34ad\\u34b1\\u34ca\\u34f1\\0\\u3616\\0\\0\\u3633cute;\\u415bqu\\xef\\u27ba\\u0500;Eaceinpsy\\u11ed\\u32f3\\u32f5\\u32ff\\u3302\\u330b\\u330f\\u331f\\u3326\\u3329;\\u6ab4\\u01f0\\u32fa\\0\\u32fc;\\u6ab8on;\\u4161u\\xe5\\u11fe\\u0100;d\\u11f3\\u3307il;\\u415frc;\\u415d\\u0180Eas\\u3316\\u3318\\u331b;\\u6ab6p;\\u6abaim;\\u62e9olint;\\u6a13i\\xed\\u1204;\\u4441ot\\u0180;be\\u3334\\u1d47\\u3335\\u62c5;\\u6a66\\u0380Aacmstx\\u3346\\u334a\\u3357\\u335b\\u335e\\u3363\\u336drr;\\u61d8r\\u0100hr\\u3350\\u3352\\xeb\\u2228\\u0100;o\\u0a36\\u0a34t\\u803b\\xa7\\u40a7i;\\u403bwar;\\u6929m\\u0100in\\u3369\\xf0nu\\xf3\\xf1t;\\u6736r\\u0100;o\\u3376\\u2055\\uc000\\ud835\\udd30\\u0200acoy\\u3382\\u3386\\u3391\\u33a0rp;\\u666f\\u0100hy\\u338b\\u338fcy;\\u4449;\\u4448rt\\u026d\\u3399\\0\\0\\u339ci\\xe4\\u1464ara\\xec\\u2e6f\\u803b\\xad\\u40ad\\u0100gm\\u33a8\\u33b4ma\\u0180;fv\\u33b1\\u33b2\\u33b2\\u43c3;\\u43c2\\u0400;deglnpr\\u12ab\\u33c5\\u33c9\\u33ce\\u33d6\\u33de\\u33e1\\u33e6ot;\\u6a6a\\u0100;q\\u12b1\\u12b0\\u0100;E\\u33d3\\u33d4\\u6a9e;\\u6aa0\\u0100;E\\u33db\\u33dc\\u6a9d;\\u6a9fe;\\u6246lus;\\u6a24arr;\\u6972ar\\xf2\\u113d\\u0200aeit\\u33f8\\u3408\\u340f\\u3417\\u0100ls\\u33fd\\u3404lsetm\\xe9\\u336ahp;\\u6a33parsl;\\u69e4\\u0100dl\\u1463\\u3414e;\\u6323\\u0100;e\\u341c\\u341d\\u6aaa\\u0100;s\\u3422\\u3423\\u6aac;\\uc000\\u2aac\\ufe00\\u0180flp\\u342e\\u3433\\u3442tcy;\\u444c\\u0100;b\\u3438\\u3439\\u402f\\u0100;a\\u343e\\u343f\\u69c4r;\\u633ff;\\uc000\\ud835\\udd64a\\u0100dr\\u344d\\u0402es\\u0100;u\\u3454\\u3455\\u6660it\\xbb\\u3455\\u0180csu\\u3460\\u3479\\u349f\\u0100au\\u3465\\u346fp\\u0100;s\\u1188\\u346b;\\uc000\\u2293\\ufe00p\\u0100;s\\u11b4\\u3475;\\uc000\\u2294\\ufe00u\\u0100bp\\u347f\\u348f\\u0180;es\\u1197\\u119c\\u3486et\\u0100;e\\u1197\\u348d\\xf1\\u119d\\u0180;es\\u11a8\\u11ad\\u3496et\\u0100;e\\u11a8\\u349d\\xf1\\u11ae\\u0180;af\\u117b\\u34a6\\u05b0r\\u0165\\u34ab\\u05b1\\xbb\\u117car\\xf2\\u1148\\u0200cemt\\u34b9\\u34be\\u34c2\\u34c5r;\\uc000\\ud835\\udcc8tm\\xee\\xf1i\\xec\\u3415ar\\xe6\\u11be\\u0100ar\\u34ce\\u34d5r\\u0100;f\\u34d4\\u17bf\\u6606\\u0100an\\u34da\\u34edight\\u0100ep\\u34e3\\u34eapsilo\\xee\\u1ee0h\\xe9\\u2eafs\\xbb\\u2852\\u0280bcmnp\\u34fb\\u355e\\u1209\\u358b\\u358e\\u0480;Edemnprs\\u350e\\u350f\\u3511\\u3515\\u351e\\u3523\\u352c\\u3531\\u3536\\u6282;\\u6ac5ot;\\u6abd\\u0100;d\\u11da\\u351aot;\\u6ac3ult;\\u6ac1\\u0100Ee\\u3528\\u352a;\\u6acb;\\u628alus;\\u6abfarr;\\u6979\\u0180eiu\\u353d\\u3552\\u3555t\\u0180;en\\u350e\\u3545\\u354bq\\u0100;q\\u11da\\u350feq\\u0100;q\\u352b\\u3528m;\\u6ac7\\u0100bp\\u355a\\u355c;\\u6ad5;\\u6ad3c\\u0300;acens\\u11ed\\u356c\\u3572\\u3579\\u357b\\u3326ppro\\xf8\\u32faurlye\\xf1\\u11fe\\xf1\\u11f3\\u0180aes\\u3582\\u3588\\u331bppro\\xf8\\u331aq\\xf1\\u3317g;\\u666a\\u0680123;Edehlmnps\\u35a9\\u35ac\\u35af\\u121c\\u35b2\\u35b4\\u35c0\\u35c9\\u35d5\\u35da\\u35df\\u35e8\\u35ed\\u803b\\xb9\\u40b9\\u803b\\xb2\\u40b2\\u803b\\xb3\\u40b3;\\u6ac6\\u0100os\\u35b9\\u35bct;\\u6abeub;\\u6ad8\\u0100;d\\u1222\\u35c5ot;\\u6ac4s\\u0100ou\\u35cf\\u35d2l;\\u67c9b;\\u6ad7arr;\\u697bult;\\u6ac2\\u0100Ee\\u35e4\\u35e6;\\u6acc;\\u628blus;\\u6ac0\\u0180eiu\\u35f4\\u3609\\u360ct\\u0180;en\\u121c\\u35fc\\u3602q\\u0100;q\\u1222\\u35b2eq\\u0100;q\\u35e7\\u35e4m;\\u6ac8\\u0100bp\\u3611\\u3613;\\u6ad4;\\u6ad6\\u0180Aan\\u361c\\u3620\\u362drr;\\u61d9r\\u0100hr\\u3626\\u3628\\xeb\\u222e\\u0100;o\\u0a2b\\u0a29war;\\u692alig\\u803b\\xdf\\u40df\\u0be1\\u3651\\u365d\\u3660\\u12ce\\u3673\\u3679\\0\\u367e\\u36c2\\0\\0\\0\\0\\0\\u36db\\u3703\\0\\u3709\\u376c\\0\\0\\0\\u3787\\u0272\\u3656\\0\\0\\u365bget;\\u6316;\\u43c4r\\xeb\\u0e5f\\u0180aey\\u3666\\u366b\\u3670ron;\\u4165dil;\\u4163;\\u4442lrec;\\u6315r;\\uc000\\ud835\\udd31\\u0200eiko\\u3686\\u369d\\u36b5\\u36bc\\u01f2\\u368b\\0\\u3691e\\u01004f\\u1284\\u1281a\\u0180;sv\\u3698\\u3699\\u369b\\u43b8ym;\\u43d1\\u0100cn\\u36a2\\u36b2k\\u0100as\\u36a8\\u36aeppro\\xf8\\u12c1im\\xbb\\u12acs\\xf0\\u129e\\u0100as\\u36ba\\u36ae\\xf0\\u12c1rn\\u803b\\xfe\\u40fe\\u01ec\\u031f\\u36c6\\u22e7es\\u8180\\xd7;bd\\u36cf\\u36d0\\u36d8\\u40d7\\u0100;a\\u190f\\u36d5r;\\u6a31;\\u6a30\\u0180eps\\u36e1\\u36e3\\u3700\\xe1\\u2a4d\\u0200;bcf\\u0486\\u36ec\\u36f0\\u36f4ot;\\u6336ir;\\u6af1\\u0100;o\\u36f9\\u36fc\\uc000\\ud835\\udd65rk;\\u6ada\\xe1\\u3362rime;\\u6034\\u0180aip\\u370f\\u3712\\u3764d\\xe5\\u1248\\u0380adempst\\u3721\\u374d\\u3740\\u3751\\u3757\\u375c\\u375fngle\\u0280;dlqr\\u3730\\u3731\\u3736\\u3740\\u3742\\u65b5own\\xbb\\u1dbbeft\\u0100;e\\u2800\\u373e\\xf1\\u092e;\\u625cight\\u0100;e\\u32aa\\u374b\\xf1\\u105aot;\\u65ecinus;\\u6a3alus;\\u6a39b;\\u69cdime;\\u6a3bezium;\\u63e2\\u0180cht\\u3772\\u377d\\u3781\\u0100ry\\u3777\\u377b;\\uc000\\ud835\\udcc9;\\u4446cy;\\u445brok;\\u4167\\u0100io\\u378b\\u378ex\\xf4\\u1777head\\u0100lr\\u3797\\u37a0eftarro\\xf7\\u084fightarrow\\xbb\\u0f5d\\u0900AHabcdfghlmoprstuw\\u37d0\\u37d3\\u37d7\\u37e4\\u37f0\\u37fc\\u380e\\u381c\\u3823\\u3834\\u3851\\u385d\\u386b\\u38a9\\u38cc\\u38d2\\u38ea\\u38f6r\\xf2\\u03edar;\\u6963\\u0100cr\\u37dc\\u37e2ute\\u803b\\xfa\\u40fa\\xf2\\u1150r\\u01e3\\u37ea\\0\\u37edy;\\u445eve;\\u416d\\u0100iy\\u37f5\\u37farc\\u803b\\xfb\\u40fb;\\u4443\\u0180abh\\u3803\\u3806\\u380br\\xf2\\u13adlac;\\u4171a\\xf2\\u13c3\\u0100ir\\u3813\\u3818sht;\\u697e;\\uc000\\ud835\\udd32rave\\u803b\\xf9\\u40f9\\u0161\\u3827\\u3831r\\u0100lr\\u382c\\u382e\\xbb\\u0957\\xbb\\u1083lk;\\u6580\\u0100ct\\u3839\\u384d\\u026f\\u383f\\0\\0\\u384arn\\u0100;e\\u3845\\u3846\\u631cr\\xbb\\u3846op;\\u630fri;\\u65f8\\u0100al\\u3856\\u385acr;\\u416b\\u80bb\\xa8\\u0349\\u0100gp\\u3862\\u3866on;\\u4173f;\\uc000\\ud835\\udd66\\u0300adhlsu\\u114b\\u3878\\u387d\\u1372\\u3891\\u38a0own\\xe1\\u13b3arpoon\\u0100lr\\u3888\\u388cef\\xf4\\u382digh\\xf4\\u382fi\\u0180;hl\\u3899\\u389a\\u389c\\u43c5\\xbb\\u13faon\\xbb\\u389aparrows;\\u61c8\\u0180cit\\u38b0\\u38c4\\u38c8\\u026f\\u38b6\\0\\0\\u38c1rn\\u0100;e\\u38bc\\u38bd\\u631dr\\xbb\\u38bdop;\\u630eng;\\u416fri;\\u65f9cr;\\uc000\\ud835\\udcca\\u0180dir\\u38d9\\u38dd\\u38e2ot;\\u62f0lde;\\u4169i\\u0100;f\\u3730\\u38e8\\xbb\\u1813\\u0100am\\u38ef\\u38f2r\\xf2\\u38a8l\\u803b\\xfc\\u40fcangle;\\u69a7\\u0780ABDacdeflnoprsz\\u391c\\u391f\\u3929\\u392d\\u39b5\\u39b8\\u39bd\\u39df\\u39e4\\u39e8\\u39f3\\u39f9\\u39fd\\u3a01\\u3a20r\\xf2\\u03f7ar\\u0100;v\\u3926\\u3927\\u6ae8;\\u6ae9as\\xe8\\u03e1\\u0100nr\\u3932\\u3937grt;\\u699c\\u0380eknprst\\u34e3\\u3946\\u394b\\u3952\\u395d\\u3964\\u3996app\\xe1\\u2415othin\\xe7\\u1e96\\u0180hir\\u34eb\\u2ec8\\u3959op\\xf4\\u2fb5\\u0100;h\\u13b7\\u3962\\xef\\u318d\\u0100iu\\u3969\\u396dgm\\xe1\\u33b3\\u0100bp\\u3972\\u3984setneq\\u0100;q\\u397d\\u3980\\uc000\\u228a\\ufe00;\\uc000\\u2acb\\ufe00setneq\\u0100;q\\u398f\\u3992\\uc000\\u228b\\ufe00;\\uc000\\u2acc\\ufe00\\u0100hr\\u399b\\u399fet\\xe1\\u369ciangle\\u0100lr\\u39aa\\u39afeft\\xbb\\u0925ight\\xbb\\u1051y;\\u4432ash\\xbb\\u1036\\u0180elr\\u39c4\\u39d2\\u39d7\\u0180;be\\u2dea\\u39cb\\u39cfar;\\u62bbq;\\u625alip;\\u62ee\\u0100bt\\u39dc\\u1468a\\xf2\\u1469r;\\uc000\\ud835\\udd33tr\\xe9\\u39aesu\\u0100bp\\u39ef\\u39f1\\xbb\\u0d1c\\xbb\\u0d59pf;\\uc000\\ud835\\udd67ro\\xf0\\u0efbtr\\xe9\\u39b4\\u0100cu\\u3a06\\u3a0br;\\uc000\\ud835\\udccb\\u0100bp\\u3a10\\u3a18n\\u0100Ee\\u3980\\u3a16\\xbb\\u397en\\u0100Ee\\u3992\\u3a1e\\xbb\\u3990igzag;\\u699a\\u0380cefoprs\\u3a36\\u3a3b\\u3a56\\u3a5b\\u3a54\\u3a61\\u3a6airc;\\u4175\\u0100di\\u3a40\\u3a51\\u0100bg\\u3a45\\u3a49ar;\\u6a5fe\\u0100;q\\u15fa\\u3a4f;\\u6259erp;\\u6118r;\\uc000\\ud835\\udd34pf;\\uc000\\ud835\\udd68\\u0100;e\\u1479\\u3a66at\\xe8\\u1479cr;\\uc000\\ud835\\udccc\\u0ae3\\u178e\\u3a87\\0\\u3a8b\\0\\u3a90\\u3a9b\\0\\0\\u3a9d\\u3aa8\\u3aab\\u3aaf\\0\\0\\u3ac3\\u3ace\\0\\u3ad8\\u17dc\\u17dftr\\xe9\\u17d1r;\\uc000\\ud835\\udd35\\u0100Aa\\u3a94\\u3a97r\\xf2\\u03c3r\\xf2\\u09f6;\\u43be\\u0100Aa\\u3aa1\\u3aa4r\\xf2\\u03b8r\\xf2\\u09eba\\xf0\\u2713is;\\u62fb\\u0180dpt\\u17a4\\u3ab5\\u3abe\\u0100fl\\u3aba\\u17a9;\\uc000\\ud835\\udd69im\\xe5\\u17b2\\u0100Aa\\u3ac7\\u3acar\\xf2\\u03cer\\xf2\\u0a01\\u0100cq\\u3ad2\\u17b8r;\\uc000\\ud835\\udccd\\u0100pt\\u17d6\\u3adcr\\xe9\\u17d4\\u0400acefiosu\\u3af0\\u3afd\\u3b08\\u3b0c\\u3b11\\u3b15\\u3b1b\\u3b21c\\u0100uy\\u3af6\\u3afbte\\u803b\\xfd\\u40fd;\\u444f\\u0100iy\\u3b02\\u3b06rc;\\u4177;\\u444bn\\u803b\\xa5\\u40a5r;\\uc000\\ud835\\udd36cy;\\u4457pf;\\uc000\\ud835\\udd6acr;\\uc000\\ud835\\udcce\\u0100cm\\u3b26\\u3b29y;\\u444el\\u803b\\xff\\u40ff\\u0500acdefhiosw\\u3b42\\u3b48\\u3b54\\u3b58\\u3b64\\u3b69\\u3b6d\\u3b74\\u3b7a\\u3b80cute;\\u417a\\u0100ay\\u3b4d\\u3b52ron;\\u417e;\\u4437ot;\\u417c\\u0100et\\u3b5d\\u3b61tr\\xe6\\u155fa;\\u43b6r;\\uc000\\ud835\\udd37cy;\\u4436grarr;\\u61ddpf;\\uc000\\ud835\\udd6bcr;\\uc000\\ud835\\udccf\\u0100jn\\u3b85\\u3b87;\\u600dj;\\u600c\"\n .split(\"\")\n .map((c) => c.charCodeAt(0))));\n//# sourceMappingURL=decode-data-html.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEtaHRtbC5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQSxpRUFBZTtBQUNmO0FBQ0Esc2NBQXNjLGdCQUFnQixtQkFBbUIsUUFBUSwwQ0FBMEMsVUFBVSxRQUFRLHlCQUF5QixRQUFRLDhCQUE4QiwyQ0FBMkMsc0JBQXNCLDJIQUEySCxxQkFBcUIsU0FBUyxRQUFRLHNDQUFzQyxjQUFjLFFBQVEsUUFBUSxxQkFBcUIsc0JBQXNCLHNCQUFzQixpSEFBaUgsdURBQXVELGFBQWEsb0NBQW9DLFdBQVcsNENBQTRDLDRCQUE0QixXQUFXLFNBQVMsK0JBQStCLGFBQWEsa0JBQWtCLCtDQUErQyxXQUFXLFVBQVUsV0FBVyxnREFBZ0QsMkNBQTJDLFdBQVcsaURBQWlELG9CQUFvQix1Q0FBdUMsU0FBUyxrQkFBa0IsMkJBQTJCLFlBQVksbUNBQW1DLFVBQVUsU0FBUywwQkFBMEIsc0JBQXNCLGdHQUFnRyxtQkFBbUIsU0FBUyxTQUFTLFNBQVMscUNBQXFDLFFBQVEsU0FBUyw4QkFBOEIsT0FBTyxjQUFjLHFCQUFxQixRQUFRLHdHQUF3RywwQkFBMEIsZUFBZSxXQUFXLFdBQVcsVUFBVSxpQkFBaUIsOENBQThDLHlCQUF5Qiw2QkFBNkIsV0FBVyx3SEFBd0gsNERBQTRELGdCQUFnQixtRUFBbUUsZ0JBQWdCLGdCQUFnQixtQ0FBbUMsU0FBUyxrQ0FBa0MsZUFBZSxpQkFBaUIsa0VBQWtFLDZCQUE2QixhQUFhLFdBQVcsZ0RBQWdELGVBQWUsa0JBQWtCLHNCQUFzQix1Q0FBdUMsa0JBQWtCLHNCQUFzQixlQUFlLHdCQUF3Qiw0QkFBNEIsc0JBQXNCLDhIQUE4SCwwRUFBMEUseUJBQXlCLFNBQVMsUUFBUSw0Q0FBNEMsNkJBQTZCLHlDQUF5QyxxQkFBcUIsNkJBQTZCLFFBQVEsd0JBQXdCLG1DQUFtQyx3QkFBd0IsY0FBYyw0QkFBNEIsUUFBUSxRQUFRLGdEQUFnRCxnQkFBZ0IsaURBQWlELFFBQVEsdURBQXVELHFCQUFxQixzQ0FBc0Msc0JBQXNCLGNBQWMsOEdBQThHLDZCQUE2QixvQkFBb0IsV0FBVyxxQ0FBcUMsU0FBUyxPQUFPLFNBQVMsUUFBUSxtQkFBbUIsU0FBUyxrRkFBa0YsdUJBQXVCLGVBQWUsYUFBYSxVQUFVLGdCQUFnQixXQUFXLFNBQVMsbUJBQW1CLHlFQUF5RSw2QkFBNkIsT0FBTyxVQUFVLFFBQVEsaUJBQWlCLDRCQUE0QixrQkFBa0Isd0NBQXdDLCtDQUErQyxpSEFBaUgsVUFBVSxTQUFTLGlFQUFpRSxTQUFTLFFBQVEsaUNBQWlDLDBDQUEwQyxhQUFhLDhDQUE4QywyQ0FBMkMsY0FBYyxxQ0FBcUMsV0FBVyxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxXQUFXLDZCQUE2Qix1RkFBdUYsT0FBTyxRQUFRLHFCQUFxQix3Q0FBd0Msc0JBQXNCLFVBQVUsZ0VBQWdFLFNBQVMsVUFBVSw4QkFBOEIsT0FBTyxRQUFRLHFCQUFxQixxQkFBcUIsd0dBQXdHLGdFQUFnRSxVQUFVLFFBQVEsY0FBYyxRQUFRLHFDQUFxQyxVQUFVLE9BQU8sc0lBQXNJLGdCQUFnQiw2QkFBNkIsZ0JBQWdCLGFBQWEsc0NBQXNDLG9DQUFvQyxrQkFBa0Isc0JBQXNCLFdBQVcsbUNBQW1DLFlBQVksa0NBQWtDLCtCQUErQixZQUFZLG1CQUFtQiw2QkFBNkIsV0FBVyw0Q0FBNEMsZUFBZSxrQkFBa0Isc0JBQXNCLGtCQUFrQixzQkFBc0IsaUZBQWlGLGVBQWUsYUFBYSxVQUFVLGdCQUFnQixXQUFXLFFBQVEseUJBQXlCLDJCQUEyQixXQUFXLGdHQUFnRyxnQkFBZ0IsZ0JBQWdCLDJEQUEyRCxpREFBaUQsZ0JBQWdCLDRDQUE0QyxVQUFVLE9BQU8sc0VBQXNFLFFBQVEsbUNBQW1DLGFBQWEsUUFBUSwwQkFBMEIsU0FBUyw4QkFBOEIsOEVBQThFLFdBQVcscUNBQXFDLFVBQVUsT0FBTyw0RUFBNEUsd0hBQXdILFFBQVEseURBQXlELG9CQUFvQixRQUFRLGFBQWEsNEhBQTRILFdBQVcsdUJBQXVCLHVDQUF1QyxnQkFBZ0Isd0JBQXdCLHVCQUF1QixtQkFBbUIsMkRBQTJELGVBQWUseUJBQXlCLHNCQUFzQixnQkFBZ0IsdUJBQXVCLG1DQUFtQyx1QkFBdUIsdURBQXVELDZCQUE2Qix1QkFBdUIsY0FBYyxvREFBb0QsYUFBYSxVQUFVLDRCQUE0Qix1QkFBdUIsNkNBQTZDLDBCQUEwQixnQ0FBZ0MsK0JBQStCLDRCQUE0Qix1Q0FBdUMsd0JBQXdCLDZCQUE2Qix1QkFBdUIsOERBQThELG9DQUFvQyxrQkFBa0Isb0NBQW9DLDJDQUEyQyxvQ0FBb0Msa0JBQWtCLHNDQUFzQyw0QkFBNEIsV0FBVyw4QkFBOEIsb0NBQW9DLGlCQUFpQixzQ0FBc0MsZUFBZSxXQUFXLGlCQUFpQixTQUFTLHVDQUF1QyxrSEFBa0gsaUVBQWlFLFdBQVcsUUFBUSxvRUFBb0UsU0FBUyxXQUFXLFNBQVMsd0RBQXdELFdBQVcsT0FBTyw0QkFBNEIsNkVBQTZFLG9FQUFvRSw2QkFBNkIsU0FBUyxpQkFBaUIsa0ZBQWtGLFFBQVEsUUFBUSxvQkFBb0IsT0FBTyxjQUFjLCtDQUErQyxhQUFhLDZDQUE2QyxzQ0FBc0MsZ0JBQWdCLFdBQVcsU0FBUyw4QkFBOEIsbUJBQW1CLGVBQWUsNEJBQTRCLG1CQUFtQiwwREFBMEQscUJBQXFCLFNBQVMsZ0hBQWdILHNEQUFzRCxRQUFRLGNBQWMscUJBQXFCLHFDQUFxQyxVQUFVLE9BQU8sYUFBYSxxRUFBcUUsZ0JBQWdCLG1CQUFtQixtQkFBbUIsc0dBQXNHLGdCQUFnQiw2QkFBNkIsZUFBZSxhQUFhLHNDQUFzQyxvQ0FBb0Msa0JBQWtCLHNCQUFzQixXQUFXLGtDQUFrQywrQkFBK0IsWUFBWSxtQkFBbUIsNkJBQTZCLFdBQVcsNENBQTRDLGVBQWUsa0JBQWtCLHNCQUFzQixrQkFBa0Isc0JBQXNCLDRCQUE0QixnQkFBZ0IsZ0JBQWdCLDRCQUE0QixPQUFPLGdCQUFnQiwrSEFBK0gsUUFBUSxXQUFXLFdBQVcsYUFBYSw0Q0FBNEMsVUFBVSxTQUFTLE9BQU8sUUFBUSxxSEFBcUgsVUFBVSxnQkFBZ0IsU0FBUywwQ0FBMEMsZ0JBQWdCLDZDQUE2QyxxQ0FBcUMsd0JBQXdCLGtCQUFrQix3QkFBd0IsV0FBVyxTQUFTLHFCQUFxQiwrQ0FBK0MsNEJBQTRCLGtCQUFrQixxQ0FBcUMsc0NBQXNDLGdCQUFnQixXQUFXLG1CQUFtQixhQUFhLHFDQUFxQyx3QkFBd0IsNEhBQTRILDZCQUE2QixRQUFRLDJCQUEyQixPQUFPLHFDQUFxQyxVQUFVLE9BQU8sUUFBUSxnRUFBZ0UsUUFBUSxpQ0FBaUMsd0JBQXdCLGdCQUFnQixzQ0FBc0MsZUFBZSxXQUFXLFNBQVMsMEJBQTBCLDRCQUE0QixzQkFBc0IsNkpBQTZKLHVCQUF1Qiw2QkFBNkIsU0FBUyw2Q0FBNkMsV0FBVyxRQUFRLDBDQUEwQyxzRUFBc0UsNkJBQTZCLFNBQVMsaUJBQWlCLGVBQWUsdUJBQXVCLDZCQUE2QixRQUFRLDJGQUEyRix1QkFBdUIsZUFBZSxlQUFlLGlCQUFpQixlQUFlLHdCQUF3QixrREFBa0QsZ0JBQWdCLGNBQWMsc0JBQXNCLFVBQVUsU0FBUyx1QkFBdUIsaUdBQWlHLFNBQVMsUUFBUSxnQkFBZ0Isb0JBQW9CLDJCQUEyQixvQ0FBb0MsYUFBYSxxREFBcUQsVUFBVSxlQUFlLFdBQVcsZ0JBQWdCLFFBQVEscUJBQXFCLHFCQUFxQix1QkFBdUIsbURBQW1ELFVBQVUsUUFBUSxxQkFBcUIscUJBQXFCLHNEQUFzRCxtQkFBbUIsU0FBUyxxQkFBcUIsMEZBQTBGLFNBQVMsU0FBUyxpREFBaUQsT0FBTyxRQUFRLHFCQUFxQixxQkFBcUIscUJBQXFCLHVFQUF1RSxXQUFXLDhCQUE4QixPQUFPLFNBQVMsMkNBQTJDLFFBQVEsU0FBUyxTQUFTLCtKQUErSixhQUFhLGdEQUFnRCxtQkFBbUIsMkNBQTJDLGdDQUFnQyxZQUFZLGtGQUFrRixtQkFBbUIsMkNBQTJDLFFBQVEsbUNBQW1DLDJDQUEyQyxPQUFPLFdBQVcsT0FBTyxhQUFhLHVEQUF1RCwwQkFBMEIsMEVBQTBFLE9BQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sY0FBYywyQkFBMkIsb0JBQW9CLDRCQUE0QixrQkFBa0IsNkJBQTZCLFFBQVEseUJBQXlCLGlEQUFpRCxVQUFVLE9BQU8sUUFBUSxRQUFRLGdCQUFnQix1RUFBdUUsbUJBQW1CLGVBQWUsa0dBQWtHLCtIQUErSCxpRUFBaUUsYUFBYSxXQUFXLGVBQWUscUJBQXFCLDJCQUEyQixlQUFlLHVDQUF1QyxpQkFBaUIsMkJBQTJCLFVBQVUseURBQXlELGtCQUFrQix5REFBeUQsT0FBTyxVQUFVLFFBQVEsa0hBQWtILCtDQUErQyxVQUFVLFdBQVcsZ0NBQWdDLFNBQVMscUNBQXFDLFFBQVEsV0FBVyxnQ0FBZ0Msd0ZBQXdGLG9CQUFvQixxQ0FBcUMsVUFBVSxXQUFXLFFBQVEsK0NBQStDLE9BQU8sUUFBUSxTQUFTLGlDQUFpQyw4QkFBOEIsb0JBQW9CLDBDQUEwQyx5QkFBeUIsNkJBQTZCLG1JQUFtSSxPQUFPLE9BQU8sT0FBTyxhQUFhLHlDQUF5QyxPQUFPLE9BQU8sT0FBTyx5Q0FBeUMsT0FBTyxPQUFPLE9BQU8sYUFBYSx1REFBdUQsT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLFNBQVMseUNBQXlDLE9BQU8sT0FBTyxPQUFPLGFBQWEsbUNBQW1DLE9BQU8sT0FBTyxPQUFPLFdBQVcsVUFBVSxXQUFXLHlDQUF5QyxPQUFPLE9BQU8sT0FBTyxhQUFhLHVEQUF1RCxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8saUZBQWlGLHFCQUFxQixjQUFjLHFCQUFxQiwyQkFBMkIsVUFBVSxnQ0FBZ0Msc0NBQXNDLHFCQUFxQixhQUFhLGdLQUFnSyxhQUFhLGtEQUFrRCxXQUFXLDRCQUE0QixRQUFRLFNBQVMsT0FBTyx3Q0FBd0Msd0VBQXdFLFNBQVMsNEJBQTRCLGVBQWUscUJBQXFCLFNBQVMsd0RBQXdELGtCQUFrQixnQ0FBZ0MsK0NBQStDLGVBQWUsaUNBQWlDLGNBQWMsdURBQXVELGFBQWEsNEJBQTRCLHlEQUF5RCxXQUFXLDBEQUEwRCxTQUFTLFVBQVUsVUFBVSxXQUFXLFNBQVMsVUFBVSxnQkFBZ0Isd0VBQXdFLDBCQUEwQix1Q0FBdUMsb0JBQW9CLGFBQWEsNEdBQTRHLGdCQUFnQiw2Q0FBNkMsd0NBQXdDLGVBQWUsNkJBQTZCLFNBQVMsNEJBQTRCLDZDQUE2QyxvQkFBb0IsYUFBYSxvQkFBb0IsVUFBVSxxRkFBcUYsT0FBTyw4QkFBOEIsUUFBUSxnQkFBZ0Isb0JBQW9CLGFBQWEsb0RBQW9ELDRCQUE0QixRQUFRLFNBQVMsUUFBUSxPQUFPLDZEQUE2RCxvQkFBb0IsbUZBQW1GLFdBQVcsNkhBQTZILFdBQVcsK0pBQStKLDRDQUE0QyxVQUFVLHdCQUF3QixvREFBb0QseUNBQXlDLE9BQU8sYUFBYSwwQ0FBMEMsV0FBVyxvREFBb0QsV0FBVyw4QkFBOEIsT0FBTyw2R0FBNkcsNkJBQTZCLGlCQUFpQixXQUFXLFNBQVMsYUFBYSx1Q0FBdUMsb0JBQW9CLG9CQUFvQixnQ0FBZ0MsU0FBUyxtREFBbUQsUUFBUSx5QkFBeUIsMENBQTBDLGdCQUFnQixXQUFXLFVBQVUsWUFBWSxrTEFBa0wsU0FBUyxzREFBc0QsbUJBQW1CLFFBQVEsVUFBVSw2QkFBNkIsY0FBYyxtRUFBbUUsNEJBQTRCLFlBQVksb05BQW9OLDRDQUE0QyxjQUFjLHVDQUF1QyxPQUFPLFNBQVMsNkJBQTZCLE9BQU8seUJBQXlCLG9EQUFvRCxzQkFBc0IsYUFBYSx1Q0FBdUMsT0FBTyxhQUFhLHNCQUFzQixvQ0FBb0MsZUFBZSwrQ0FBK0MsK0JBQStCLE9BQU8saUNBQWlDLFFBQVEsNkJBQTZCLFFBQVEscURBQXFELHFCQUFxQixTQUFTLGNBQWMsdUNBQXVDLHNMQUFzTCxTQUFTLGNBQWMsZUFBZSxZQUFZLDZCQUE2QixTQUFTLG1DQUFtQyxzQ0FBc0MsNkRBQTZELG1DQUFtQyx3TEFBd0wsV0FBVyxxQ0FBcUMsb0NBQW9DLGVBQWUsYUFBYSxzQkFBc0IsZ0JBQWdCLHFDQUFxQyxTQUFTLGVBQWUsU0FBUyw0QkFBNEIsNkNBQTZDLG9CQUFvQixhQUFhLHVKQUF1Six1QkFBdUIsT0FBTyxPQUFPLDJCQUEyQixPQUFPLG1EQUFtRCxPQUFPLFFBQVEsMkJBQTJCLE9BQU8sUUFBUSxRQUFRLFNBQVMsU0FBUyxzSkFBc0osY0FBYyxxQ0FBcUMsZUFBZSxvQkFBb0IsV0FBVyw2QkFBNkIsT0FBTyxTQUFTLGFBQWEsa0NBQWtDLHdDQUF3Qyw2QkFBNkIsZUFBZSwwQkFBMEIsb0JBQW9CLGFBQWEsaUNBQWlDLFFBQVEseUJBQXlCLGlCQUFpQixTQUFTLGFBQWEsNEJBQTRCLE9BQU8sT0FBTyx5Q0FBeUMsY0FBYyx1Q0FBdUMsMEJBQTBCLGdCQUFnQixTQUFTLHdDQUF3QyxjQUFjLHFCQUFxQixPQUFPLGNBQWMsOERBQThELFFBQVEsU0FBUyxVQUFVLFdBQVcsa0ZBQWtGLDhFQUE4RSwrTUFBK00sYUFBYSx1QkFBdUIsT0FBTyxTQUFTLFVBQVUsMkNBQTJDLG1DQUFtQyxVQUFVLFFBQVEsNENBQTRDLFdBQVcsa0RBQWtELFVBQVUsb0NBQW9DLGdCQUFnQixRQUFRLHNCQUFzQixtQ0FBbUMsa0NBQWtDLDhCQUE4QiwwSkFBMEosdUNBQXVDLDRCQUE0Qiw2Q0FBNkMsNkNBQTZDLGtEQUFrRCxRQUFRLFVBQVUsU0FBUyxVQUFVLDhEQUE4RCwyREFBMkQsUUFBUSxTQUFTLGFBQWEsc0NBQXNDLGVBQWUsc0JBQXNCLHlCQUF5QixxQ0FBcUMscURBQXFELFVBQVUsMENBQTBDLFNBQVMsUUFBUSxvQkFBb0IsZ0RBQWdELDBCQUEwQixtQ0FBbUMsU0FBUyxhQUFhLG9CQUFvQixhQUFhLGlCQUFpQiw2QkFBNkIsOEZBQThGLE9BQU8sUUFBUSxzQkFBc0IsU0FBUyx3Q0FBd0Msc0JBQXNCLFVBQVUsOEVBQThFLG9CQUFvQiw4QkFBOEIsT0FBTyxRQUFRLHVCQUF1QixTQUFTLFNBQVMsU0FBUyxxQkFBcUIsNk9BQTZPLFVBQVUsYUFBYSxjQUFjLFNBQVMsd0ZBQXdGLFlBQVksc0JBQXNCLGNBQWMscUJBQXFCLGlCQUFpQixnQ0FBZ0MsOERBQThELGVBQWUsUUFBUSxrQkFBa0IsUUFBUSxTQUFTLFFBQVEsYUFBYSw2QkFBNkIsYUFBYSxvQkFBb0IsZ0RBQWdELFNBQVMsZ0RBQWdELE9BQU8sMkJBQTJCLDRCQUE0QixPQUFPLDRDQUE0Qyw2QkFBNkIsMkJBQTJCLDBDQUEwQyxlQUFlLHFDQUFxQyxXQUFXLFFBQVEsYUFBYSw2RkFBNkYsb0ZBQW9GLGdEQUFnRCx5REFBeUQsYUFBYSx3Q0FBd0Msb0NBQW9DLGVBQWUsMEJBQTBCLG9CQUFvQixhQUFhLGlDQUFpQyxnRUFBZ0UscUdBQXFHLE9BQU8seUJBQXlCLGNBQWMsb0RBQW9ELGNBQWMsU0FBUyxTQUFTLGFBQWEsK0RBQStELFNBQVMsOEJBQThCLGdCQUFnQixtRUFBbUUsY0FBYyx1Q0FBdUMsMEJBQTBCLGdCQUFnQiwwRkFBMEYsUUFBUSx3RkFBd0YsK0RBQStELG1DQUFtQyxPQUFPLHFCQUFxQixXQUFXLDJCQUEyQix1QkFBdUIsZ0RBQWdELHFCQUFxQixpRkFBaUYsY0FBYyxPQUFPLFNBQVMsMERBQTBELFFBQVEsMEJBQTBCLHFCQUFxQixPQUFPLGtDQUFrQyxjQUFjLFVBQVUsY0FBYyw0RUFBNEUsUUFBUSxzQkFBc0IsVUFBVSxXQUFXLDZCQUE2QixhQUFhLG9EQUFvRCxVQUFVLGlDQUFpQyx3SUFBd0ksOEVBQThFLGFBQWEsc0NBQXNDLHNCQUFzQixpRUFBaUUsOEJBQThCLE9BQU8sVUFBVSw2QkFBNkIsb0JBQW9CLDBEQUEwRCx5Q0FBeUMsaUNBQWlDLGlDQUFpQyxjQUFjLDBCQUEwQixrREFBa0QsUUFBUSx3Q0FBd0Msc0NBQXNDLGdDQUFnQyx5TUFBeU0seUJBQXlCLHFGQUFxRixnQkFBZ0IsT0FBTyx5QkFBeUIseUNBQXlDLDhCQUE4QixVQUFVLCtEQUErRCxRQUFRLHlCQUF5QixtQ0FBbUMsb0JBQW9CLG9CQUFvQiwyQkFBMkIsMkJBQTJCLDJEQUEyRCwyRUFBMkUsU0FBUyxVQUFVLGVBQWUsZ0JBQWdCLG9CQUFvQixPQUFPLFVBQVUsYUFBYSxtREFBbUQsNkJBQTZCLGFBQWEsZ0JBQWdCLHFEQUFxRCwwQkFBMEIsZUFBZSwyREFBMkQsMkJBQTJCLG1EQUFtRCxnRUFBZ0UsU0FBUyxhQUFhLDJCQUEyQixvQkFBb0IsU0FBUyx5RUFBeUUscUJBQXFCLFFBQVEsYUFBYSxzRkFBc0Ysd0NBQXdDLHlDQUF5QyxxQkFBcUIsOENBQThDLDZCQUE2QixrQ0FBa0MsNEJBQTRCLHFCQUFxQiwyQ0FBMkMsT0FBTyxjQUFjLHNDQUFzQyxPQUFPLHlDQUF5QywwQ0FBMEMsbUJBQW1CLHVCQUF1QixhQUFhLHNDQUFzQyxvQkFBb0IsNkVBQTZFLDJCQUEyQixtQkFBbUIsNkNBQTZDLDJFQUEyRSx1Q0FBdUMsK0RBQStELG9CQUFvQix5RkFBeUYsa0NBQWtDLDJCQUEyQixxQkFBcUIscUJBQXFCLDhCQUE4QixrQ0FBa0MsMkJBQTJCLHFCQUFxQiwwSEFBMEgsa0NBQWtDLDhCQUE4QiwwQkFBMEIsNkJBQTZCLFFBQVEsK0VBQStFLFVBQVUsUUFBUSxzQkFBc0IsMkJBQTJCLG1CQUFtQixrQkFBa0Isb0NBQW9DLE9BQU8seUJBQXlCLDZCQUE2Qix5Q0FBeUMsVUFBVSxxQkFBcUIsZ0RBQWdELDZCQUE2QixhQUFhLGlCQUFpQiwrTkFBK04sOEJBQThCLG1EQUFtRCxRQUFRLFVBQVUsVUFBVSw2QkFBNkIsT0FBTyxrREFBa0QsMEJBQTBCLDZCQUE2Qix5RUFBeUUsVUFBVSxrQkFBa0Isb0NBQW9DLFNBQVMscUNBQXFDLE9BQU8sU0FBUywrQ0FBK0MsU0FBUyxhQUFhLHdFQUF3RSx5Q0FBeUMsa0VBQWtFLFFBQVEsV0FBVyxPQUFPLGdFQUFnRSxvREFBb0QsZUFBZSw0QkFBNEIsOEdBQThHLHNDQUFzQyx1REFBdUQsT0FBTyxRQUFRLG1EQUFtRCxTQUFTLFNBQVMsVUFBVSxRQUFRLG9EQUFvRCxvQkFBb0IscUJBQXFCLGFBQWEsMkNBQTJDLHVEQUF1RCxjQUFjLHdCQUF3Qix3RUFBd0UsU0FBUywyQkFBMkIsT0FBTywwQkFBMEIsU0FBUyx1Q0FBdUMsUUFBUSwyQ0FBMkMsc0VBQXNFLFFBQVEsd0JBQXdCLG9CQUFvQixpSEFBaUgsU0FBUyxTQUFTLDBCQUEwQixrSEFBa0gsVUFBVSxVQUFVLGFBQWEsMkJBQTJCLDRCQUE0QixtQkFBbUIsV0FBVyx3REFBd0QscUJBQXFCLHVCQUF1QixTQUFTLG9GQUFvRixlQUFlLG9QQUFvUCxxQkFBcUIsa0ZBQWtGLHFCQUFxQix1QkFBdUIsY0FBYyw0QkFBNEIsT0FBTywwQ0FBMEMsOEVBQThFLGFBQWEsZUFBZSxPQUFPLFFBQVEsNEJBQTRCLFNBQVMsUUFBUSxPQUFPLDZCQUE2QixjQUFjLHdFQUF3RSxnREFBZ0QsT0FBTywyQkFBMkIsNEJBQTRCLE9BQU8sNENBQTRDLDZCQUE2QiwyQkFBMkIsMENBQTBDLFdBQVcsZUFBZSxlQUFlLHlDQUF5QyxvREFBb0QscUNBQXFDLE9BQU8sNEVBQTRFLGNBQWMsYUFBYSxvQkFBb0IsOEZBQThGLHlJQUF5SSxrQ0FBa0MsUUFBUSwwRUFBMEUsaUJBQWlCLG9DQUFvQyw4REFBOEQsUUFBUSw4Q0FBOEMsT0FBTyxxQkFBcUIsV0FBVyxrQ0FBa0MscUJBQXFCLFlBQVksd0RBQXdELFFBQVEsOENBQThDLHdEQUF3RCxjQUFjLHFDQUFxQyxZQUFZLE9BQU8saUpBQWlKLHlCQUF5QixzRUFBc0UsMkJBQTJCLFNBQVMsd0JBQXdCLGdCQUFnQixTQUFTLGtDQUFrQyxRQUFRLFNBQVMsWUFBWSxrQkFBa0IsZUFBZSwyQkFBMkIsZ0VBQWdFLDRDQUE0QyxnQ0FBZ0MsVUFBVSxxQ0FBcUMsY0FBYyxvRUFBb0UsNkJBQTZCLE9BQU8sbUdBQW1HLDJCQUEyQixhQUFhLDBEQUEwRCxhQUFhLG9CQUFvQixvQkFBb0IsYUFBYSxvQkFBb0IsUUFBUSxVQUFVLFVBQVUsMEZBQTBGLFlBQVksNEJBQTRCLGFBQWEsMEJBQTBCLG9CQUFvQixpREFBaUQsYUFBYSwwQkFBMEIscUJBQXFCLFFBQVEsZ0RBQWdELHNGQUFzRixjQUFjLDBCQUEwQixjQUFjLDhDQUE4Qyw2QkFBNkIsOEJBQThCLDZCQUE2Qiw4QkFBOEIsaUdBQWlHLCtFQUErRSxvSkFBb0oscUVBQXFFLFNBQVMsYUFBYSxnQkFBZ0IsVUFBVSwyQkFBMkIsT0FBTyxVQUFVLFVBQVUseUNBQXlDLDRCQUE0QixzQkFBc0IsZUFBZSwyQkFBMkIsT0FBTyxjQUFjLHNJQUFzSSxnQkFBZ0Isd0lBQXdJLDRCQUE0QixTQUFTLGFBQWEsZ0JBQWdCLDZCQUE2QixRQUFRLFVBQVUsVUFBVSwyQkFBMkIsT0FBTyxVQUFVLHlDQUF5Qyw0QkFBNEIsc0JBQXNCLGVBQWUsMkJBQTJCLE9BQU8sb0NBQW9DLDRDQUE0QyxpQkFBaUIsMkpBQTJKLE9BQU8sZ0RBQWdELFVBQVUsT0FBTyxXQUFXLFFBQVEscUdBQXFHLDZCQUE2Qix5S0FBeUssaUNBQWlDLGVBQWUsT0FBTyxrREFBa0QsOEJBQThCLFNBQVMsYUFBYSxrQ0FBa0MscUJBQXFCLDhHQUE4RywrREFBK0Qsd0JBQXdCLGlCQUFpQiwwQkFBMEIsV0FBVyxVQUFVLFFBQVEsVUFBVSxZQUFZLHNEQUFzRCxtQkFBbUIsU0FBUyxVQUFVLG1QQUFtUCw4RUFBOEUsU0FBUyw2Q0FBNkMsZ0RBQWdELHlDQUF5QyxPQUFPLG9HQUFvRyx5REFBeUQsaUNBQWlDLFNBQVMsNkJBQTZCLDZDQUE2QyxRQUFRLDBJQUEwSSx3REFBd0QsZ0VBQWdFLGlDQUFpQyxTQUFTLFNBQVMsU0FBUyxnREFBZ0QsVUFBVSxjQUFjLDZFQUE2RSx5SUFBeUksb0JBQW9CLDBDQUEwQyx1SUFBdUksd0ZBQXdGLGdDQUFnQywrQkFBK0IsZ0NBQWdDLHlHQUF5RyxxREFBcUQsdUJBQXVCLFFBQVEsVUFBVSx1Q0FBdUMsMkVBQTJFLGdFQUFnRSwwR0FBMEcsaUVBQWlFLGlEQUFpRCxjQUFjLGNBQWMsVUFBVSxRQUFRLHFCQUFxQix5QkFBeUIsNEJBQTRCLHdJQUF3SSw2REFBNkQsOERBQThELHNEQUFzRCw4RkFBOEYsdUpBQXVKLDZCQUE2QixPQUFPLHlCQUF5QixxQkFBcUIsU0FBUyxxQkFBcUIsd0NBQXdDLHdHQUF3Ryw4QkFBOEIsT0FBTyxTQUFTLHdDQUF3QyxRQUFRLHFCQUFxQixZQUFZLFNBQVMscUJBQXFCLHVDQUF1QyxRQUFRO0FBQ3A2OEM7QUFDQSxpQ0FBaUMsRUFBQztBQUNsQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEtaHRtbC5qcz9kZTY4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCB1c2luZyBzY3JpcHRzL3dyaXRlLWRlY29kZS1tYXAudHNcbmV4cG9ydCBkZWZhdWx0IG5ldyBVaW50MTZBcnJheShcbi8vIHByZXR0aWVyLWlnbm9yZVxuXCJcXHUxZDQxPFxceGQ1XFx1MDEzMVxcdTAyOGFcXHUwNDlkXFx1MDU3YlxcdTA1ZDBcXHUwNjc1XFx1MDZkZVxcdTA3YTJcXHUwN2Q2XFx1MDgwZlxcdTBhNGFcXHUwYTkxXFx1MGRhMVxcdTBlNmRcXHUwZjA5XFx1MGYyNlxcdTEwY2FcXHUxMjI4XFx1MTJlMVxcdTE0MTVcXHUxNDlkXFx1MTRjM1xcdTE0ZGZcXHUxNTI1XFwwXFwwXFwwXFwwXFwwXFwwXFx1MTU2YlxcdTE2Y2RcXHUxOThkXFx1MWMxMlxcdTFkZGRcXHUxZjdlXFx1MjA2MFxcdTIxYjBcXHUyMjhkXFx1MjNjMFxcdTIzZmJcXHUyNDQyXFx1MjgyNFxcdTI5MTJcXHUyZDA4XFx1MmU0OFxcdTJmY2VcXHUzMDE2XFx1MzJiYVxcdTM2MzlcXHUzN2FjXFx1MzhmZVxcdTNhMjhcXHUzYTcxXFx1M2FlMFxcdTNiMmVcXHUwODAwRU1hYmNmZ2xtbm9wcnN0dVxcXFxiZm1zXFx4N2ZcXHg4NFxceDhiXFx4OTBcXHg5NVxceDk4XFx4YTZcXHhiM1xceGI5XFx4YzhcXHhjZmxpZ1xcdTgwM2JcXHhjNlxcdTQwYzZQXFx1ODAzYiZcXHU0MDI2Y3V0ZVxcdTgwM2JcXHhjMVxcdTQwYzFyZXZlO1xcdTQxMDJcXHUwMTAwaXl4fXJjXFx1ODAzYlxceGMyXFx1NDBjMjtcXHU0NDEwcjtcXHVjMDAwXFx1ZDgzNVxcdWRkMDRyYXZlXFx1ODAzYlxceGMwXFx1NDBjMHBoYTtcXHU0MzkxYWNyO1xcdTQxMDBkO1xcdTZhNTNcXHUwMTAwZ3BcXHg5ZFxceGExb247XFx1NDEwNGY7XFx1YzAwMFxcdWQ4MzVcXHVkZDM4cGx5RnVuY3Rpb247XFx1NjA2MWluZ1xcdTgwM2JcXHhjNVxcdTQwYzVcXHUwMTAwY3NcXHhiZVxceGMzcjtcXHVjMDAwXFx1ZDgzNVxcdWRjOWNpZ247XFx1NjI1NGlsZGVcXHU4MDNiXFx4YzNcXHU0MGMzbWxcXHU4MDNiXFx4YzRcXHU0MGM0XFx1MDQwMGFjZWZvcnN1XFx4ZTVcXHhmYlxceGZlXFx1MDExN1xcdTAxMWNcXHUwMTIyXFx1MDEyN1xcdTAxMmFcXHUwMTAwY3JcXHhlYVxceGYya3NsYXNoO1xcdTYyMTZcXHUwMTc2XFx4ZjZcXHhmODtcXHU2YWU3ZWQ7XFx1NjMwNnk7XFx1NDQxMVxcdTAxODBjcnRcXHUwMTA1XFx1MDEwYlxcdTAxMTRhdXNlO1xcdTYyMzVub3VsbGlzO1xcdTYxMmNhO1xcdTQzOTJyO1xcdWMwMDBcXHVkODM1XFx1ZGQwNXBmO1xcdWMwMDBcXHVkODM1XFx1ZGQzOWV2ZTtcXHU0MmQ4Y1xceGYyXFx1MDExM21wZXE7XFx1NjI0ZVxcdTA3MDBIT2FjZGVmaGlsb3JzdVxcdTAxNGRcXHUwMTUxXFx1MDE1NlxcdTAxODBcXHUwMTllXFx1MDFhMlxcdTAxYjVcXHUwMWI3XFx1MDFiYVxcdTAxZGNcXHUwMjE1XFx1MDI3M1xcdTAyNzhcXHUwMjdlY3k7XFx1NDQyN1BZXFx1ODAzYlxceGE5XFx1NDBhOVxcdTAxODBjcHlcXHUwMTVkXFx1MDE2MlxcdTAxN2F1dGU7XFx1NDEwNlxcdTAxMDA7aVxcdTAxNjdcXHUwMTY4XFx1NjJkMnRhbERpZmZlcmVudGlhbEQ7XFx1NjE0NWxleXM7XFx1NjEyZFxcdTAyMDBhZWlvXFx1MDE4OVxcdTAxOGVcXHUwMTk0XFx1MDE5OHJvbjtcXHU0MTBjZGlsXFx1ODAzYlxceGM3XFx1NDBjN3JjO1xcdTQxMDhuaW50O1xcdTYyMzBvdDtcXHU0MTBhXFx1MDEwMGRuXFx1MDFhN1xcdTAxYWRpbGxhO1xcdTQwYjh0ZXJEb3Q7XFx1NDBiN1xceGYyXFx1MDE3Zmk7XFx1NDNhN3JjbGVcXHUwMjAwRE1QVFxcdTAxYzdcXHUwMWNiXFx1MDFkMVxcdTAxZDZvdDtcXHU2Mjk5aW51cztcXHU2Mjk2bHVzO1xcdTYyOTVpbWVzO1xcdTYyOTdvXFx1MDEwMGNzXFx1MDFlMlxcdTAxZjhrd2lzZUNvbnRvdXJJbnRlZ3JhbDtcXHU2MjMyZUN1cmx5XFx1MDEwMERRXFx1MDIwM1xcdTAyMGZvdWJsZVF1b3RlO1xcdTYwMWR1b3RlO1xcdTYwMTlcXHUwMjAwbG5wdVxcdTAyMWVcXHUwMjI4XFx1MDI0N1xcdTAyNTVvblxcdTAxMDA7ZVxcdTAyMjVcXHUwMjI2XFx1NjIzNztcXHU2YTc0XFx1MDE4MGdpdFxcdTAyMmZcXHUwMjM2XFx1MDIzYXJ1ZW50O1xcdTYyNjFudDtcXHU2MjJmb3VySW50ZWdyYWw7XFx1NjIyZVxcdTAxMDBmclxcdTAyNGNcXHUwMjRlO1xcdTYxMDJvZHVjdDtcXHU2MjEwbnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbDtcXHU2MjMzb3NzO1xcdTZhMmZjcjtcXHVjMDAwXFx1ZDgzNVxcdWRjOWVwXFx1MDEwMDtDXFx1MDI4NFxcdTAyODVcXHU2MmQzYXA7XFx1NjI0ZFxcdTA1ODBESlNaYWNlZmlvc1xcdTAyYTBcXHUwMmFjXFx1MDJiMFxcdTAyYjRcXHUwMmI4XFx1MDJjYlxcdTAyZDdcXHUwMmUxXFx1MDJlNlxcdTAzMzNcXHUwNDhkXFx1MDEwMDtvXFx1MDE3OVxcdTAyYTV0cmFoZDtcXHU2OTExY3k7XFx1NDQwMmN5O1xcdTQ0MDVjeTtcXHU0NDBmXFx1MDE4MGdyc1xcdTAyYmZcXHUwMmM0XFx1MDJjN2dlcjtcXHU2MDIxcjtcXHU2MWExaHY7XFx1NmFlNFxcdTAxMDBheVxcdTAyZDBcXHUwMmQ1cm9uO1xcdTQxMGU7XFx1NDQxNGxcXHUwMTAwO3RcXHUwMmRkXFx1MDJkZVxcdTYyMDdhO1xcdTQzOTRyO1xcdWMwMDBcXHVkODM1XFx1ZGQwN1xcdTAxMDBhZlxcdTAyZWJcXHUwMzI3XFx1MDEwMGNtXFx1MDJmMFxcdTAzMjJyaXRpY2FsXFx1MDIwMEFER1RcXHUwMzAwXFx1MDMwNlxcdTAzMTZcXHUwMzFjY3V0ZTtcXHU0MGI0b1xcdTAxNzRcXHUwMzBiXFx1MDMwZDtcXHU0MmQ5YmxlQWN1dGU7XFx1NDJkZHJhdmU7XFx1NDA2MGlsZGU7XFx1NDJkY29uZDtcXHU2MmM0ZmVyZW50aWFsRDtcXHU2MTQ2XFx1MDQ3MFxcdTAzM2RcXDBcXDBcXDBcXHUwMzQyXFx1MDM1NFxcMFxcdTA0MDVmO1xcdWMwMDBcXHVkODM1XFx1ZGQzYlxcdTAxODA7REVcXHUwMzQ4XFx1MDM0OVxcdTAzNGRcXHU0MGE4b3Q7XFx1NjBkY3F1YWw7XFx1NjI1MGJsZVxcdTAzMDBDRExSVVZcXHUwMzYzXFx1MDM3MlxcdTAzODJcXHUwM2NmXFx1MDNlMlxcdTAzZjhvbnRvdXJJbnRlZ3JhXFx4ZWNcXHUwMjM5b1xcdTAyNzRcXHUwMzc5XFwwXFwwXFx1MDM3YlxceGJiXFx1MDM0OW5BcnJvdztcXHU2MWQzXFx1MDEwMGVvXFx1MDM4N1xcdTAzYTRmdFxcdTAxODBBUlRcXHUwMzkwXFx1MDM5NlxcdTAzYTFycm93O1xcdTYxZDBpZ2h0QXJyb3c7XFx1NjFkNGVcXHhlNVxcdTAyY2FuZ1xcdTAxMDBMUlxcdTAzYWJcXHUwM2M0ZWZ0XFx1MDEwMEFSXFx1MDNiM1xcdTAzYjlycm93O1xcdTY3ZjhpZ2h0QXJyb3c7XFx1NjdmYWlnaHRBcnJvdztcXHU2N2Y5aWdodFxcdTAxMDBBVFxcdTAzZDhcXHUwM2RlcnJvdztcXHU2MWQyZWU7XFx1NjJhOHBcXHUwMjQxXFx1MDNlOVxcMFxcMFxcdTAzZWZycm93O1xcdTYxZDFvd25BcnJvdztcXHU2MWQ1ZXJ0aWNhbEJhcjtcXHU2MjI1blxcdTAzMDBBQkxSVGFcXHUwNDEyXFx1MDQyYVxcdTA0MzBcXHUwNDVlXFx1MDQ3ZlxcdTAzN2Nycm93XFx1MDE4MDtCVVxcdTA0MWRcXHUwNDFlXFx1MDQyMlxcdTYxOTNhcjtcXHU2OTEzcEFycm93O1xcdTYxZjVyZXZlO1xcdTQzMTFlZnRcXHUwMmQyXFx1MDQzYVxcMFxcdTA0NDZcXDBcXHUwNDUwaWdodFZlY3RvcjtcXHU2OTUwZWVWZWN0b3I7XFx1Njk1ZWVjdG9yXFx1MDEwMDtCXFx1MDQ1OVxcdTA0NWFcXHU2MWJkYXI7XFx1Njk1NmlnaHRcXHUwMWQ0XFx1MDQ2N1xcMFxcdTA0NzFlZVZlY3RvcjtcXHU2OTVmZWN0b3JcXHUwMTAwO0JcXHUwNDdhXFx1MDQ3YlxcdTYxYzFhcjtcXHU2OTU3ZWVcXHUwMTAwO0FcXHUwNDg2XFx1MDQ4N1xcdTYyYTRycm93O1xcdTYxYTdcXHUwMTAwY3RcXHUwNDkyXFx1MDQ5N3I7XFx1YzAwMFxcdWQ4MzVcXHVkYzlmcm9rO1xcdTQxMTBcXHUwODAwTlRhY2RmZ2xtb3Bxc3R1eFxcdTA0YmRcXHUwNGMwXFx1MDRjNFxcdTA0Y2JcXHUwNGRlXFx1MDRlMlxcdTA0ZTdcXHUwNGVlXFx1MDRmNVxcdTA1MjFcXHUwNTJmXFx1MDUzNlxcdTA1NTJcXHUwNTVkXFx1MDU2MFxcdTA1NjVHO1xcdTQxNGFIXFx1ODAzYlxceGQwXFx1NDBkMGN1dGVcXHU4MDNiXFx4YzlcXHU0MGM5XFx1MDE4MGFpeVxcdTA0ZDJcXHUwNGQ3XFx1MDRkY3JvbjtcXHU0MTFhcmNcXHU4MDNiXFx4Y2FcXHU0MGNhO1xcdTQ0MmRvdDtcXHU0MTE2cjtcXHVjMDAwXFx1ZDgzNVxcdWRkMDhyYXZlXFx1ODAzYlxceGM4XFx1NDBjOGVtZW50O1xcdTYyMDhcXHUwMTAwYXBcXHUwNGZhXFx1MDRmZWNyO1xcdTQxMTJ0eVxcdTAyNTNcXHUwNTA2XFwwXFwwXFx1MDUxMm1hbGxTcXVhcmU7XFx1NjVmYmVyeVNtYWxsU3F1YXJlO1xcdTY1YWJcXHUwMTAwZ3BcXHUwNTI2XFx1MDUyYW9uO1xcdTQxMThmO1xcdWMwMDBcXHVkODM1XFx1ZGQzY3NpbG9uO1xcdTQzOTV1XFx1MDEwMGFpXFx1MDUzY1xcdTA1NDlsXFx1MDEwMDtUXFx1MDU0MlxcdTA1NDNcXHU2YTc1aWxkZTtcXHU2MjQybGlicml1bTtcXHU2MWNjXFx1MDEwMGNpXFx1MDU1N1xcdTA1NWFyO1xcdTYxMzBtO1xcdTZhNzNhO1xcdTQzOTdtbFxcdTgwM2JcXHhjYlxcdTQwY2JcXHUwMTAwaXBcXHUwNTZhXFx1MDU2ZnN0cztcXHU2MjAzb25lbnRpYWxFO1xcdTYxNDdcXHUwMjgwY2Zpb3NcXHUwNTg1XFx1MDU4OFxcdTA1OGRcXHUwNWIyXFx1MDVjY3k7XFx1NDQyNHI7XFx1YzAwMFxcdWQ4MzVcXHVkZDA5bGxlZFxcdTAyNTNcXHUwNTk3XFwwXFwwXFx1MDVhM21hbGxTcXVhcmU7XFx1NjVmY2VyeVNtYWxsU3F1YXJlO1xcdTY1YWFcXHUwMzcwXFx1MDViYVxcMFxcdTA1YmZcXDBcXDBcXHUwNWM0ZjtcXHVjMDAwXFx1ZDgzNVxcdWRkM2RBbGw7XFx1NjIwMHJpZXJ0cmY7XFx1NjEzMWNcXHhmMlxcdTA1Y2JcXHUwNjAwSlRhYmNkZmdvcnN0XFx1MDVlOFxcdTA1ZWNcXHUwNWVmXFx1MDVmYVxcdTA2MDBcXHUwNjEyXFx1MDYxNlxcdTA2MWJcXHUwNjFkXFx1MDYyM1xcdTA2NmNcXHUwNjcyY3k7XFx1NDQwM1xcdTgwM2I+XFx1NDAzZW1tYVxcdTAxMDA7ZFxcdTA1ZjdcXHUwNWY4XFx1NDM5MztcXHU0M2RjcmV2ZTtcXHU0MTFlXFx1MDE4MGVpeVxcdTA2MDdcXHUwNjBjXFx1MDYxMGRpbDtcXHU0MTIycmM7XFx1NDExYztcXHU0NDEzb3Q7XFx1NDEyMHI7XFx1YzAwMFxcdWQ4MzVcXHVkZDBhO1xcdTYyZDlwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkM2VlYXRlclxcdTAzMDBFRkdMU1RcXHUwNjM1XFx1MDY0NFxcdTA2NGVcXHUwNjU2XFx1MDY1YlxcdTA2NjZxdWFsXFx1MDEwMDtMXFx1MDYzZVxcdTA2M2ZcXHU2MjY1ZXNzO1xcdTYyZGJ1bGxFcXVhbDtcXHU2MjY3cmVhdGVyO1xcdTZhYTJlc3M7XFx1NjI3N2xhbnRFcXVhbDtcXHU2YTdlaWxkZTtcXHU2MjczY3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2EyO1xcdTYyNmJcXHUwNDAwQWFjZmlvc3VcXHUwNjg1XFx1MDY4YlxcdTA2OTZcXHUwNjliXFx1MDY5ZVxcdTA2YWFcXHUwNmJlXFx1MDZjYVJEY3k7XFx1NDQyYVxcdTAxMDBjdFxcdTA2OTBcXHUwNjk0ZWs7XFx1NDJjNztcXHU0MDVlaXJjO1xcdTQxMjRyO1xcdTYxMGNsYmVydFNwYWNlO1xcdTYxMGJcXHUwMWYwXFx1MDZhZlxcMFxcdTA2YjJmO1xcdTYxMGRpem9udGFsTGluZTtcXHU2NTAwXFx1MDEwMGN0XFx1MDZjM1xcdTA2YzVcXHhmMlxcdTA2YTlyb2s7XFx1NDEyNm1wXFx1MDE0NFxcdTA2ZDBcXHUwNmQ4b3duSHVtXFx4ZjBcXHUwMTJmcXVhbDtcXHU2MjRmXFx1MDcwMEVKT2FjZGZnbW5vc3R1XFx1MDZmYVxcdTA2ZmVcXHUwNzAzXFx1MDcwN1xcdTA3MGVcXHUwNzFhXFx1MDcxZVxcdTA3MjFcXHUwNzI4XFx1MDc0NFxcdTA3NzhcXHUwNzhiXFx1MDc4ZlxcdTA3OTVjeTtcXHU0NDE1bGlnO1xcdTQxMzJjeTtcXHU0NDAxY3V0ZVxcdTgwM2JcXHhjZFxcdTQwY2RcXHUwMTAwaXlcXHUwNzEzXFx1MDcxOHJjXFx1ODAzYlxceGNlXFx1NDBjZTtcXHU0NDE4b3Q7XFx1NDEzMHI7XFx1NjExMXJhdmVcXHU4MDNiXFx4Y2NcXHU0MGNjXFx1MDE4MDthcFxcdTA3MjBcXHUwNzJmXFx1MDczZlxcdTAxMDBjZ1xcdTA3MzRcXHUwNzM3cjtcXHU0MTJhaW5hcnlJO1xcdTYxNDhsaWVcXHhmM1xcdTAzZGRcXHUwMWY0XFx1MDc0OVxcMFxcdTA3NjJcXHUwMTAwO2VcXHUwNzRkXFx1MDc0ZVxcdTYyMmNcXHUwMTAwZ3JcXHUwNzUzXFx1MDc1OHJhbDtcXHU2MjJic2VjdGlvbjtcXHU2MmMyaXNpYmxlXFx1MDEwMENUXFx1MDc2Y1xcdTA3NzJvbW1hO1xcdTYwNjNpbWVzO1xcdTYwNjJcXHUwMTgwZ3B0XFx1MDc3ZlxcdTA3ODNcXHUwNzg4b247XFx1NDEyZWY7XFx1YzAwMFxcdWQ4MzVcXHVkZDQwYTtcXHU0Mzk5Y3I7XFx1NjExMGlsZGU7XFx1NDEyOFxcdTAxZWJcXHUwNzlhXFwwXFx1MDc5ZWN5O1xcdTQ0MDZsXFx1ODAzYlxceGNmXFx1NDBjZlxcdTAyODBjZm9zdVxcdTA3YWNcXHUwN2I3XFx1MDdiY1xcdTA3YzJcXHUwN2QwXFx1MDEwMGl5XFx1MDdiMVxcdTA3YjVyYztcXHU0MTM0O1xcdTQ0MTlyO1xcdWMwMDBcXHVkODM1XFx1ZGQwZHBmO1xcdWMwMDBcXHVkODM1XFx1ZGQ0MVxcdTAxZTNcXHUwN2M3XFwwXFx1MDdjY3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2E1cmN5O1xcdTQ0MDhrY3k7XFx1NDQwNFxcdTAzODBISmFjZm9zXFx1MDdlNFxcdTA3ZThcXHUwN2VjXFx1MDdmMVxcdTA3ZmRcXHUwODAyXFx1MDgwOGN5O1xcdTQ0MjVjeTtcXHU0NDBjcHBhO1xcdTQzOWFcXHUwMTAwZXlcXHUwN2Y2XFx1MDdmYmRpbDtcXHU0MTM2O1xcdTQ0MWFyO1xcdWMwMDBcXHVkODM1XFx1ZGQwZXBmO1xcdWMwMDBcXHVkODM1XFx1ZGQ0MmNyO1xcdWMwMDBcXHVkODM1XFx1ZGNhNlxcdTA1ODBKVGFjZWZsbW9zdFxcdTA4MjVcXHUwODI5XFx1MDgyY1xcdTA4NTBcXHUwODYzXFx1MDliM1xcdTA5YjhcXHUwOWM3XFx1MDljZFxcdTBhMzdcXHUwYTQ3Y3k7XFx1NDQwOVxcdTgwM2I8XFx1NDAzY1xcdTAyODBjbW5wclxcdTA4MzdcXHUwODNjXFx1MDg0MVxcdTA4NDRcXHUwODRkdXRlO1xcdTQxMzliZGE7XFx1NDM5Ymc7XFx1NjdlYWxhY2V0cmY7XFx1NjExMnI7XFx1NjE5ZVxcdTAxODBhZXlcXHUwODU3XFx1MDg1Y1xcdTA4NjFyb247XFx1NDEzZGRpbDtcXHU0MTNiO1xcdTQ0MWJcXHUwMTAwZnNcXHUwODY4XFx1MDk3MHRcXHUwNTAwQUNERlJUVVZhclxcdTA4N2VcXHUwOGE5XFx1MDhiMVxcdTA4ZTBcXHUwOGU2XFx1MDhmY1xcdTA5MmZcXHUwOTViXFx1MDM5MFxcdTA5NmFcXHUwMTAwbnJcXHUwODgzXFx1MDg4ZmdsZUJyYWNrZXQ7XFx1NjdlOHJvd1xcdTAxODA7QlJcXHUwODk5XFx1MDg5YVxcdTA4OWVcXHU2MTkwYXI7XFx1NjFlNGlnaHRBcnJvdztcXHU2MWM2ZWlsaW5nO1xcdTYzMDhvXFx1MDFmNVxcdTA4YjdcXDBcXHUwOGMzYmxlQnJhY2tldDtcXHU2N2U2blxcdTAxZDRcXHUwOGM4XFwwXFx1MDhkMmVlVmVjdG9yO1xcdTY5NjFlY3RvclxcdTAxMDA7QlxcdTA4ZGJcXHUwOGRjXFx1NjFjM2FyO1xcdTY5NTlsb29yO1xcdTYzMGFpZ2h0XFx1MDEwMEFWXFx1MDhlZlxcdTA4ZjVycm93O1xcdTYxOTRlY3RvcjtcXHU2OTRlXFx1MDEwMGVyXFx1MDkwMVxcdTA5MTdlXFx1MDE4MDtBVlxcdTA5MDlcXHUwOTBhXFx1MDkxMFxcdTYyYTNycm93O1xcdTYxYTRlY3RvcjtcXHU2OTVhaWFuZ2xlXFx1MDE4MDtCRVxcdTA5MjRcXHUwOTI1XFx1MDkyOVxcdTYyYjJhcjtcXHU2OWNmcXVhbDtcXHU2MmI0cFxcdTAxODBEVFZcXHUwOTM3XFx1MDk0MlxcdTA5NGNvd25WZWN0b3I7XFx1Njk1MWVlVmVjdG9yO1xcdTY5NjBlY3RvclxcdTAxMDA7QlxcdTA5NTZcXHUwOTU3XFx1NjFiZmFyO1xcdTY5NThlY3RvclxcdTAxMDA7QlxcdTA5NjVcXHUwOTY2XFx1NjFiY2FyO1xcdTY5NTJpZ2h0XFx4ZTFcXHUwMzljc1xcdTAzMDBFRkdMU1RcXHUwOTdlXFx1MDk4YlxcdTA5OTVcXHUwOTlkXFx1MDlhMlxcdTA5YWRxdWFsR3JlYXRlcjtcXHU2MmRhdWxsRXF1YWw7XFx1NjI2NnJlYXRlcjtcXHU2Mjc2ZXNzO1xcdTZhYTFsYW50RXF1YWw7XFx1NmE3ZGlsZGU7XFx1NjI3MnI7XFx1YzAwMFxcdWQ4MzVcXHVkZDBmXFx1MDEwMDtlXFx1MDliZFxcdTA5YmVcXHU2MmQ4ZnRhcnJvdztcXHU2MWRhaWRvdDtcXHU0MTNmXFx1MDE4MG5wd1xcdTA5ZDRcXHUwYTE2XFx1MGExYmdcXHUwMjAwTFJsclxcdTA5ZGVcXHUwOWY3XFx1MGEwMlxcdTBhMTBlZnRcXHUwMTAwQVJcXHUwOWU2XFx1MDllY3Jyb3c7XFx1NjdmNWlnaHRBcnJvdztcXHU2N2Y3aWdodEFycm93O1xcdTY3ZjZlZnRcXHUwMTAwYXJcXHUwM2IzXFx1MGEwYWlnaHRcXHhlMVxcdTAzYmZpZ2h0XFx4ZTFcXHUwM2NhZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNDNlclxcdTAxMDBMUlxcdTBhMjJcXHUwYTJjZWZ0QXJyb3c7XFx1NjE5OWlnaHRBcnJvdztcXHU2MTk4XFx1MDE4MGNodFxcdTBhM2VcXHUwYTQwXFx1MGE0MlxceGYyXFx1MDg0YztcXHU2MWIwcm9rO1xcdTQxNDE7XFx1NjI2YVxcdTA0MDBhY2VmaW9zdVxcdTBhNWFcXHUwYTVkXFx1MGE2MFxcdTBhNzdcXHUwYTdjXFx1MGE4NVxcdTBhOGJcXHUwYThlcDtcXHU2OTA1eTtcXHU0NDFjXFx1MDEwMGRsXFx1MGE2NVxcdTBhNmZpdW1TcGFjZTtcXHU2MDVmbGludHJmO1xcdTYxMzNyO1xcdWMwMDBcXHVkODM1XFx1ZGQxMG51c1BsdXM7XFx1NjIxM3BmO1xcdWMwMDBcXHVkODM1XFx1ZGQ0NGNcXHhmMlxcdTBhNzY7XFx1NDM5Y1xcdTA0ODBKYWNlZm9zdHVcXHUwYWEzXFx1MGFhN1xcdTBhYWRcXHUwYWMwXFx1MGIxNFxcdTBiMTlcXHUwZDkxXFx1MGQ5N1xcdTBkOWVjeTtcXHU0NDBhY3V0ZTtcXHU0MTQzXFx1MDE4MGFleVxcdTBhYjRcXHUwYWI5XFx1MGFiZXJvbjtcXHU0MTQ3ZGlsO1xcdTQxNDU7XFx1NDQxZFxcdTAxODBnc3dcXHUwYWM3XFx1MGFmMFxcdTBiMGVhdGl2ZVxcdTAxODBNVFZcXHUwYWQzXFx1MGFkZlxcdTBhZThlZGl1bVNwYWNlO1xcdTYwMGJoaVxcdTAxMDBjblxcdTBhZTZcXHUwYWQ4XFx4ZWJcXHUwYWQ5ZXJ5VGhpXFx4ZWVcXHUwYWQ5dGVkXFx1MDEwMEdMXFx1MGFmOFxcdTBiMDZyZWF0ZXJHcmVhdGVcXHhmMlxcdTA2NzNlc3NMZXNcXHhmM1xcdTBhNDhMaW5lO1xcdTQwMGFyO1xcdWMwMDBcXHVkODM1XFx1ZGQxMVxcdTAyMDBCbnB0XFx1MGIyMlxcdTBiMjhcXHUwYjM3XFx1MGIzYXJlYWs7XFx1NjA2MEJyZWFraW5nU3BhY2U7XFx1NDBhMGY7XFx1NjExNVxcdTA2ODA7Q0RFR0hMTlBSU1RWXFx1MGI1NVxcdTBiNTZcXHUwYjZhXFx1MGI3Y1xcdTBiYTFcXHUwYmViXFx1MGMwNFxcdTBjNWVcXHUwYzg0XFx1MGNhNlxcdTBjZDhcXHUwZDYxXFx1MGQ4NVxcdTZhZWNcXHUwMTAwb3VcXHUwYjViXFx1MGI2NG5ncnVlbnQ7XFx1NjI2MnBDYXA7XFx1NjI2ZG91YmxlVmVydGljYWxCYXI7XFx1NjIyNlxcdTAxODBscXhcXHUwYjgzXFx1MGI4YVxcdTBiOWJlbWVudDtcXHU2MjA5dWFsXFx1MDEwMDtUXFx1MGI5MlxcdTBiOTNcXHU2MjYwaWxkZTtcXHVjMDAwXFx1MjI0MlxcdTAzMzhpc3RzO1xcdTYyMDRyZWF0ZXJcXHUwMzgwO0VGR0xTVFxcdTBiYjZcXHUwYmI3XFx1MGJiZFxcdTBiYzlcXHUwYmQzXFx1MGJkOFxcdTBiZTVcXHU2MjZmcXVhbDtcXHU2MjcxdWxsRXF1YWw7XFx1YzAwMFxcdTIyNjdcXHUwMzM4cmVhdGVyO1xcdWMwMDBcXHUyMjZiXFx1MDMzOGVzcztcXHU2Mjc5bGFudEVxdWFsO1xcdWMwMDBcXHUyYTdlXFx1MDMzOGlsZGU7XFx1NjI3NXVtcFxcdTAxNDRcXHUwYmYyXFx1MGJmZG93bkh1bXA7XFx1YzAwMFxcdTIyNGVcXHUwMzM4cXVhbDtcXHVjMDAwXFx1MjI0ZlxcdTAzMzhlXFx1MDEwMGZzXFx1MGMwYVxcdTBjMjd0VHJpYW5nbGVcXHUwMTgwO0JFXFx1MGMxYVxcdTBjMWJcXHUwYzIxXFx1NjJlYWFyO1xcdWMwMDBcXHUyOWNmXFx1MDMzOHF1YWw7XFx1NjJlY3NcXHUwMzAwO0VHTFNUXFx1MGMzNVxcdTBjMzZcXHUwYzNjXFx1MGM0NFxcdTBjNGJcXHUwYzU4XFx1NjI2ZXF1YWw7XFx1NjI3MHJlYXRlcjtcXHU2Mjc4ZXNzO1xcdWMwMDBcXHUyMjZhXFx1MDMzOGxhbnRFcXVhbDtcXHVjMDAwXFx1MmE3ZFxcdTAzMzhpbGRlO1xcdTYyNzRlc3RlZFxcdTAxMDBHTFxcdTBjNjhcXHUwYzc5cmVhdGVyR3JlYXRlcjtcXHVjMDAwXFx1MmFhMlxcdTAzMzhlc3NMZXNzO1xcdWMwMDBcXHUyYWExXFx1MDMzOHJlY2VkZXNcXHUwMTgwO0VTXFx1MGM5MlxcdTBjOTNcXHUwYzliXFx1NjI4MHF1YWw7XFx1YzAwMFxcdTJhYWZcXHUwMzM4bGFudEVxdWFsO1xcdTYyZTBcXHUwMTAwZWlcXHUwY2FiXFx1MGNiOXZlcnNlRWxlbWVudDtcXHU2MjBjZ2h0VHJpYW5nbGVcXHUwMTgwO0JFXFx1MGNjYlxcdTBjY2NcXHUwY2QyXFx1NjJlYmFyO1xcdWMwMDBcXHUyOWQwXFx1MDMzOHF1YWw7XFx1NjJlZFxcdTAxMDBxdVxcdTBjZGRcXHUwZDBjdWFyZVN1XFx1MDEwMGJwXFx1MGNlOFxcdTBjZjlzZXRcXHUwMTAwO0VcXHUwY2YwXFx1MGNmM1xcdWMwMDBcXHUyMjhmXFx1MDMzOHF1YWw7XFx1NjJlMmVyc2V0XFx1MDEwMDtFXFx1MGQwM1xcdTBkMDZcXHVjMDAwXFx1MjI5MFxcdTAzMzhxdWFsO1xcdTYyZTNcXHUwMTgwYmNwXFx1MGQxM1xcdTBkMjRcXHUwZDRlc2V0XFx1MDEwMDtFXFx1MGQxYlxcdTBkMWVcXHVjMDAwXFx1MjI4MlxcdTIwZDJxdWFsO1xcdTYyODhjZWVkc1xcdTAyMDA7RVNUXFx1MGQzMlxcdTBkMzNcXHUwZDNiXFx1MGQ0NlxcdTYyODFxdWFsO1xcdWMwMDBcXHUyYWIwXFx1MDMzOGxhbnRFcXVhbDtcXHU2MmUxaWxkZTtcXHVjMDAwXFx1MjI3ZlxcdTAzMzhlcnNldFxcdTAxMDA7RVxcdTBkNThcXHUwZDViXFx1YzAwMFxcdTIyODNcXHUyMGQycXVhbDtcXHU2Mjg5aWxkZVxcdTAyMDA7RUZUXFx1MGQ2ZVxcdTBkNmZcXHUwZDc1XFx1MGQ3ZlxcdTYyNDFxdWFsO1xcdTYyNDR1bGxFcXVhbDtcXHU2MjQ3aWxkZTtcXHU2MjQ5ZXJ0aWNhbEJhcjtcXHU2MjI0Y3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2E5aWxkZVxcdTgwM2JcXHhkMVxcdTQwZDE7XFx1NDM5ZFxcdTA3MDBFYWNkZmdtb3Byc3R1dlxcdTBkYmRcXHUwZGMyXFx1MGRjOVxcdTBkZDVcXHUwZGRiXFx1MGRlMFxcdTBkZTdcXHUwZGZjXFx1MGUwMlxcdTBlMjBcXHUwZTIyXFx1MGUzMlxcdTBlM2ZcXHUwZTQ0bGlnO1xcdTQxNTJjdXRlXFx1ODAzYlxceGQzXFx1NDBkM1xcdTAxMDBpeVxcdTBkY2VcXHUwZGQzcmNcXHU4MDNiXFx4ZDRcXHU0MGQ0O1xcdTQ0MWVibGFjO1xcdTQxNTByO1xcdWMwMDBcXHVkODM1XFx1ZGQxMnJhdmVcXHU4MDNiXFx4ZDJcXHU0MGQyXFx1MDE4MGFlaVxcdTBkZWVcXHUwZGYyXFx1MGRmNmNyO1xcdTQxNGNnYTtcXHU0M2E5Y3JvbjtcXHU0MzlmcGY7XFx1YzAwMFxcdWQ4MzVcXHVkZDQ2ZW5DdXJseVxcdTAxMDBEUVxcdTBlMGVcXHUwZTFhb3VibGVRdW90ZTtcXHU2MDFjdW90ZTtcXHU2MDE4O1xcdTZhNTRcXHUwMTAwY2xcXHUwZTI3XFx1MGUyY3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2FhYXNoXFx1ODAzYlxceGQ4XFx1NDBkOGlcXHUwMTZjXFx1MGUzN1xcdTBlM2NkZVxcdTgwM2JcXHhkNVxcdTQwZDVlcztcXHU2YTM3bWxcXHU4MDNiXFx4ZDZcXHU0MGQ2ZXJcXHUwMTAwQlBcXHUwZTRiXFx1MGU2MFxcdTAxMDBhclxcdTBlNTBcXHUwZTUzcjtcXHU2MDNlYWNcXHUwMTAwZWtcXHUwZTVhXFx1MGU1YztcXHU2M2RlZXQ7XFx1NjNiNGFyZW50aGVzaXM7XFx1NjNkY1xcdTA0ODBhY2ZoaWxvcnNcXHUwZTdmXFx1MGU4N1xcdTBlOGFcXHUwZThmXFx1MGU5MlxcdTBlOTRcXHUwZTlkXFx1MGViMFxcdTBlZmNydGlhbEQ7XFx1NjIwMnk7XFx1NDQxZnI7XFx1YzAwMFxcdWQ4MzVcXHVkZDEzaTtcXHU0M2E2O1xcdTQzYTB1c01pbnVzO1xcdTQwYjFcXHUwMTAwaXBcXHUwZWEyXFx1MGVhZG5jYXJlcGxhblxceGU1XFx1MDY5ZGY7XFx1NjExOVxcdTAyMDA7ZWlvXFx1MGViOVxcdTBlYmFcXHUwZWUwXFx1MGVlNFxcdTZhYmJjZWRlc1xcdTAyMDA7RVNUXFx1MGVjOFxcdTBlYzlcXHUwZWNmXFx1MGVkYVxcdTYyN2FxdWFsO1xcdTZhYWZsYW50RXF1YWw7XFx1NjI3Y2lsZGU7XFx1NjI3ZW1lO1xcdTYwMzNcXHUwMTAwZHBcXHUwZWU5XFx1MGVlZXVjdDtcXHU2MjBmb3J0aW9uXFx1MDEwMDthXFx1MDIyNVxcdTBlZjlsO1xcdTYyMWRcXHUwMTAwY2lcXHUwZjAxXFx1MGYwNnI7XFx1YzAwMFxcdWQ4MzVcXHVkY2FiO1xcdTQzYThcXHUwMjAwVWZvc1xcdTBmMTFcXHUwZjE2XFx1MGYxYlxcdTBmMWZPVFxcdTgwM2JcXFwiXFx1NDAyMnI7XFx1YzAwMFxcdWQ4MzVcXHVkZDE0cGY7XFx1NjExYWNyO1xcdWMwMDBcXHVkODM1XFx1ZGNhY1xcdTA2MDBCRWFjZWZoaW9yc3VcXHUwZjNlXFx1MGY0M1xcdTBmNDdcXHUwZjYwXFx1MGY3M1xcdTBmYTdcXHUwZmFhXFx1MGZhZFxcdTEwOTZcXHUxMGE5XFx1MTBiNFxcdTEwYmVhcnI7XFx1NjkxMEdcXHU4MDNiXFx4YWVcXHU0MGFlXFx1MDE4MGNuclxcdTBmNGVcXHUwZjUzXFx1MGY1NnV0ZTtcXHU0MTU0ZztcXHU2N2ViclxcdTAxMDA7dFxcdTBmNWNcXHUwZjVkXFx1NjFhMGw7XFx1NjkxNlxcdTAxODBhZXlcXHUwZjY3XFx1MGY2Y1xcdTBmNzFyb247XFx1NDE1OGRpbDtcXHU0MTU2O1xcdTQ0MjBcXHUwMTAwO3ZcXHUwZjc4XFx1MGY3OVxcdTYxMWNlcnNlXFx1MDEwMEVVXFx1MGY4MlxcdTBmOTlcXHUwMTAwbHFcXHUwZjg3XFx1MGY4ZWVtZW50O1xcdTYyMGJ1aWxpYnJpdW07XFx1NjFjYnBFcXVpbGlicml1bTtcXHU2OTZmclxceGJiXFx1MGY3OW87XFx1NDNhMWdodFxcdTA0MDBBQ0RGVFVWYVxcdTBmYzFcXHUwZmViXFx1MGZmM1xcdTEwMjJcXHUxMDI4XFx1MTA1YlxcdTEwODdcXHUwM2Q4XFx1MDEwMG5yXFx1MGZjNlxcdTBmZDJnbGVCcmFja2V0O1xcdTY3ZTlyb3dcXHUwMTgwO0JMXFx1MGZkY1xcdTBmZGRcXHUwZmUxXFx1NjE5MmFyO1xcdTYxZTVlZnRBcnJvdztcXHU2MWM0ZWlsaW5nO1xcdTYzMDlvXFx1MDFmNVxcdTBmZjlcXDBcXHUxMDA1YmxlQnJhY2tldDtcXHU2N2U3blxcdTAxZDRcXHUxMDBhXFwwXFx1MTAxNGVlVmVjdG9yO1xcdTY5NWRlY3RvclxcdTAxMDA7QlxcdTEwMWRcXHUxMDFlXFx1NjFjMmFyO1xcdTY5NTVsb29yO1xcdTYzMGJcXHUwMTAwZXJcXHUxMDJkXFx1MTA0M2VcXHUwMTgwO0FWXFx1MTAzNVxcdTEwMzZcXHUxMDNjXFx1NjJhMnJyb3c7XFx1NjFhNmVjdG9yO1xcdTY5NWJpYW5nbGVcXHUwMTgwO0JFXFx1MTA1MFxcdTEwNTFcXHUxMDU1XFx1NjJiM2FyO1xcdTY5ZDBxdWFsO1xcdTYyYjVwXFx1MDE4MERUVlxcdTEwNjNcXHUxMDZlXFx1MTA3OG93blZlY3RvcjtcXHU2OTRmZWVWZWN0b3I7XFx1Njk1Y2VjdG9yXFx1MDEwMDtCXFx1MTA4MlxcdTEwODNcXHU2MWJlYXI7XFx1Njk1NGVjdG9yXFx1MDEwMDtCXFx1MTA5MVxcdTEwOTJcXHU2MWMwYXI7XFx1Njk1M1xcdTAxMDBwdVxcdTEwOWJcXHUxMDllZjtcXHU2MTFkbmRJbXBsaWVzO1xcdTY5NzBpZ2h0YXJyb3c7XFx1NjFkYlxcdTAxMDBjaFxcdTEwYjlcXHUxMGJjcjtcXHU2MTFiO1xcdTYxYjFsZURlbGF5ZWQ7XFx1NjlmNFxcdTA2ODBIT2FjZmhpbW9xc3R1XFx1MTBlNFxcdTEwZjFcXHUxMGY3XFx1MTBmZFxcdTExMTlcXHUxMTFlXFx1MTE1MVxcdTExNTZcXHUxMTYxXFx1MTE2N1xcdTExYjVcXHUxMWJiXFx1MTFiZlxcdTAxMDBDY1xcdTEwZTlcXHUxMGVlSGN5O1xcdTQ0Mjl5O1xcdTQ0MjhGVGN5O1xcdTQ0MmNjdXRlO1xcdTQxNWFcXHUwMjgwO2FlaXlcXHUxMTA4XFx1MTEwOVxcdTExMGVcXHUxMTEzXFx1MTExN1xcdTZhYmNyb247XFx1NDE2MGRpbDtcXHU0MTVlcmM7XFx1NDE1YztcXHU0NDIxcjtcXHVjMDAwXFx1ZDgzNVxcdWRkMTZvcnRcXHUwMjAwRExSVVxcdTExMmFcXHUxMTM0XFx1MTEzZVxcdTExNDlvd25BcnJvd1xceGJiXFx1MDQxZWVmdEFycm93XFx4YmJcXHUwODlhaWdodEFycm93XFx4YmJcXHUwZmRkcEFycm93O1xcdTYxOTFnbWE7XFx1NDNhM2FsbENpcmNsZTtcXHU2MjE4cGY7XFx1YzAwMFxcdWQ4MzVcXHVkZDRhXFx1MDI3MlxcdTExNmRcXDBcXDBcXHUxMTcwdDtcXHU2MjFhYXJlXFx1MDIwMDtJU1VcXHUxMTdiXFx1MTE3Y1xcdTExODlcXHUxMWFmXFx1NjVhMW50ZXJzZWN0aW9uO1xcdTYyOTN1XFx1MDEwMGJwXFx1MTE4ZlxcdTExOWVzZXRcXHUwMTAwO0VcXHUxMTk3XFx1MTE5OFxcdTYyOGZxdWFsO1xcdTYyOTFlcnNldFxcdTAxMDA7RVxcdTExYThcXHUxMWE5XFx1NjI5MHF1YWw7XFx1NjI5Mm5pb247XFx1NjI5NGNyO1xcdWMwMDBcXHVkODM1XFx1ZGNhZWFyO1xcdTYyYzZcXHUwMjAwYmNtcFxcdTExYzhcXHUxMWRiXFx1MTIwOVxcdTEyMGJcXHUwMTAwO3NcXHUxMWNkXFx1MTFjZVxcdTYyZDBldFxcdTAxMDA7RVxcdTExY2RcXHUxMWQ1cXVhbDtcXHU2Mjg2XFx1MDEwMGNoXFx1MTFlMFxcdTEyMDVlZWRzXFx1MDIwMDtFU1RcXHUxMWVkXFx1MTFlZVxcdTExZjRcXHUxMWZmXFx1NjI3YnF1YWw7XFx1NmFiMGxhbnRFcXVhbDtcXHU2MjdkaWxkZTtcXHU2MjdmVGhcXHhlMVxcdTBmOGM7XFx1NjIxMVxcdTAxODA7ZXNcXHUxMjEyXFx1MTIxM1xcdTEyMjNcXHU2MmQxcnNldFxcdTAxMDA7RVxcdTEyMWNcXHUxMjFkXFx1NjI4M3F1YWw7XFx1NjI4N2V0XFx4YmJcXHUxMjEzXFx1MDU4MEhSU2FjZmhpb3JzXFx1MTIzZVxcdTEyNDRcXHUxMjQ5XFx1MTI1NVxcdTEyNWVcXHUxMjcxXFx1MTI3NlxcdTEyOWZcXHUxMmMyXFx1MTJjOFxcdTEyZDFPUk5cXHU4MDNiXFx4ZGVcXHU0MGRlQURFO1xcdTYxMjJcXHUwMTAwSGNcXHUxMjRlXFx1MTI1MmN5O1xcdTQ0MGJ5O1xcdTQ0MjZcXHUwMTAwYnVcXHUxMjVhXFx1MTI1YztcXHU0MDA5O1xcdTQzYTRcXHUwMTgwYWV5XFx1MTI2NVxcdTEyNmFcXHUxMjZmcm9uO1xcdTQxNjRkaWw7XFx1NDE2MjtcXHU0NDIycjtcXHVjMDAwXFx1ZDgzNVxcdWRkMTdcXHUwMTAwZWlcXHUxMjdiXFx1MTI4OVxcdTAxZjJcXHUxMjgwXFwwXFx1MTI4N2Vmb3JlO1xcdTYyMzRhO1xcdTQzOThcXHUwMTAwY25cXHUxMjhlXFx1MTI5OGtTcGFjZTtcXHVjMDAwXFx1MjA1ZlxcdTIwMGFTcGFjZTtcXHU2MDA5bGRlXFx1MDIwMDtFRlRcXHUxMmFiXFx1MTJhY1xcdTEyYjJcXHUxMmJjXFx1NjIzY3F1YWw7XFx1NjI0M3VsbEVxdWFsO1xcdTYyNDVpbGRlO1xcdTYyNDhwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNGJpcGxlRG90O1xcdTYwZGJcXHUwMTAwY3RcXHUxMmQ2XFx1MTJkYnI7XFx1YzAwMFxcdWQ4MzVcXHVkY2Fmcm9rO1xcdTQxNjZcXHUwYWUxXFx1MTJmN1xcdTEzMGVcXHUxMzFhXFx1MTMyNlxcMFxcdTEzMmNcXHUxMzMxXFwwXFwwXFwwXFwwXFwwXFx1MTMzOFxcdTEzM2RcXHUxMzc3XFx1MTM4NVxcMFxcdTEzZmZcXHUxNDA0XFx1MTQwYVxcdTE0MTBcXHUwMTAwY3JcXHUxMmZiXFx1MTMwMXV0ZVxcdTgwM2JcXHhkYVxcdTQwZGFyXFx1MDEwMDtvXFx1MTMwN1xcdTEzMDhcXHU2MTlmY2lyO1xcdTY5NDlyXFx1MDFlM1xcdTEzMTNcXDBcXHUxMzE2eTtcXHU0NDBldmU7XFx1NDE2Y1xcdTAxMDBpeVxcdTEzMWVcXHUxMzIzcmNcXHU4MDNiXFx4ZGJcXHU0MGRiO1xcdTQ0MjNibGFjO1xcdTQxNzByO1xcdWMwMDBcXHVkODM1XFx1ZGQxOHJhdmVcXHU4MDNiXFx4ZDlcXHU0MGQ5YWNyO1xcdTQxNmFcXHUwMTAwZGlcXHUxMzQxXFx1MTM2OWVyXFx1MDEwMEJQXFx1MTM0OFxcdTEzNWRcXHUwMTAwYXJcXHUxMzRkXFx1MTM1MHI7XFx1NDA1ZmFjXFx1MDEwMGVrXFx1MTM1N1xcdTEzNTk7XFx1NjNkZmV0O1xcdTYzYjVhcmVudGhlc2lzO1xcdTYzZGRvblxcdTAxMDA7UFxcdTEzNzBcXHUxMzcxXFx1NjJjM2x1cztcXHU2MjhlXFx1MDEwMGdwXFx1MTM3YlxcdTEzN2ZvbjtcXHU0MTcyZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNGNcXHUwNDAwQURFVGFkcHNcXHUxMzk1XFx1MTNhZVxcdTEzYjhcXHUxM2M0XFx1MDNlOFxcdTEzZDJcXHUxM2Q3XFx1MTNmM3Jyb3dcXHUwMTgwO0JEXFx1MTE1MFxcdTEzYTBcXHUxM2E0YXI7XFx1NjkxMm93bkFycm93O1xcdTYxYzVvd25BcnJvdztcXHU2MTk1cXVpbGlicml1bTtcXHU2OTZlZWVcXHUwMTAwO0FcXHUxM2NiXFx1MTNjY1xcdTYyYTVycm93O1xcdTYxYTVvd25cXHhlMVxcdTAzZjNlclxcdTAxMDBMUlxcdTEzZGVcXHUxM2U4ZWZ0QXJyb3c7XFx1NjE5NmlnaHRBcnJvdztcXHU2MTk3aVxcdTAxMDA7bFxcdTEzZjlcXHUxM2ZhXFx1NDNkMm9uO1xcdTQzYTVpbmc7XFx1NDE2ZWNyO1xcdWMwMDBcXHVkODM1XFx1ZGNiMGlsZGU7XFx1NDE2OG1sXFx1ODAzYlxceGRjXFx1NDBkY1xcdTA0ODBEYmNkZWZvc3ZcXHUxNDI3XFx1MTQyY1xcdTE0MzBcXHUxNDMzXFx1MTQzZVxcdTE0ODVcXHUxNDhhXFx1MTQ5MFxcdTE0OTZhc2g7XFx1NjJhYmFyO1xcdTZhZWJ5O1xcdTQ0MTJhc2hcXHUwMTAwO2xcXHUxNDNiXFx1MTQzY1xcdTYyYTk7XFx1NmFlNlxcdTAxMDBlclxcdTE0NDNcXHUxNDQ1O1xcdTYyYzFcXHUwMTgwYnR5XFx1MTQ0Y1xcdTE0NTBcXHUxNDdhYXI7XFx1NjAxNlxcdTAxMDA7aVxcdTE0NGZcXHUxNDU1Y2FsXFx1MDIwMEJMU1RcXHUxNDYxXFx1MTQ2NVxcdTE0NmFcXHUxNDc0YXI7XFx1NjIyM2luZTtcXHU0MDdjZXBhcmF0b3I7XFx1Njc1OGlsZGU7XFx1NjI0MFRoaW5TcGFjZTtcXHU2MDBhcjtcXHVjMDAwXFx1ZDgzNVxcdWRkMTlwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNGRjcjtcXHVjMDAwXFx1ZDgzNVxcdWRjYjFkYXNoO1xcdTYyYWFcXHUwMjgwY2Vmb3NcXHUxNGE3XFx1MTRhY1xcdTE0YjFcXHUxNGI2XFx1MTRiY2lyYztcXHU0MTc0ZGdlO1xcdTYyYzByO1xcdWMwMDBcXHVkODM1XFx1ZGQxYXBmO1xcdWMwMDBcXHVkODM1XFx1ZGQ0ZWNyO1xcdWMwMDBcXHVkODM1XFx1ZGNiMlxcdTAyMDBmaW9zXFx1MTRjYlxcdTE0ZDBcXHUxNGQyXFx1MTRkOHI7XFx1YzAwMFxcdWQ4MzVcXHVkZDFiO1xcdTQzOWVwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNGZjcjtcXHVjMDAwXFx1ZDgzNVxcdWRjYjNcXHUwNDgwQUlVYWNmb3N1XFx1MTRmMVxcdTE0ZjVcXHUxNGY5XFx1MTRmZFxcdTE1MDRcXHUxNTBmXFx1MTUxNFxcdTE1MWFcXHUxNTIwY3k7XFx1NDQyZmN5O1xcdTQ0MDdjeTtcXHU0NDJlY3V0ZVxcdTgwM2JcXHhkZFxcdTQwZGRcXHUwMTAwaXlcXHUxNTA5XFx1MTUwZHJjO1xcdTQxNzY7XFx1NDQyYnI7XFx1YzAwMFxcdWQ4MzVcXHVkZDFjcGY7XFx1YzAwMFxcdWQ4MzVcXHVkZDUwY3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2I0bWw7XFx1NDE3OFxcdTA0MDBIYWNkZWZvc1xcdTE1MzVcXHUxNTM5XFx1MTUzZlxcdTE1NGJcXHUxNTRmXFx1MTU1ZFxcdTE1NjBcXHUxNTY0Y3k7XFx1NDQxNmN1dGU7XFx1NDE3OVxcdTAxMDBheVxcdTE1NDRcXHUxNTQ5cm9uO1xcdTQxN2Q7XFx1NDQxN290O1xcdTQxN2JcXHUwMWYyXFx1MTU1NFxcMFxcdTE1NWJvV2lkdFxceGU4XFx1MGFkOWE7XFx1NDM5NnI7XFx1NjEyOHBmO1xcdTYxMjRjcjtcXHVjMDAwXFx1ZDgzNVxcdWRjYjVcXHUwYmUxXFx1MTU4M1xcdTE1OGFcXHUxNTkwXFwwXFx1MTViMFxcdTE1YjZcXHUxNWJmXFwwXFwwXFwwXFwwXFx1MTVjNlxcdTE1ZGJcXHUxNWViXFx1MTY1ZlxcdTE2NmRcXDBcXHUxNjk1XFx1MTY5YlxcdTE2YjJcXHUxNmI5XFwwXFx1MTZiZWN1dGVcXHU4MDNiXFx4ZTFcXHU0MGUxcmV2ZTtcXHU0MTAzXFx1MDMwMDtFZGl1eVxcdTE1OWNcXHUxNTlkXFx1MTVhMVxcdTE1YTNcXHUxNWE4XFx1MTVhZFxcdTYyM2U7XFx1YzAwMFxcdTIyM2VcXHUwMzMzO1xcdTYyM2ZyY1xcdTgwM2JcXHhlMlxcdTQwZTJ0ZVxcdTgwYmJcXHhiNFxcdTAzMDY7XFx1NDQzMGxpZ1xcdTgwM2JcXHhlNlxcdTQwZTZcXHUwMTAwO3JcXHhiMlxcdTE1YmE7XFx1YzAwMFxcdWQ4MzVcXHVkZDFlcmF2ZVxcdTgwM2JcXHhlMFxcdTQwZTBcXHUwMTAwZXBcXHUxNWNhXFx1MTVkNlxcdTAxMDBmcFxcdTE1Y2ZcXHUxNWQ0c3ltO1xcdTYxMzVcXHhlOFxcdTE1ZDNoYTtcXHU0M2IxXFx1MDEwMGFwXFx1MTVkZmNcXHUwMTAwY2xcXHUxNWU0XFx1MTVlN3I7XFx1NDEwMWc7XFx1NmEzZlxcdTAyNjRcXHUxNWYwXFwwXFwwXFx1MTYwYVxcdTAyODA7YWRzdlxcdTE1ZmFcXHUxNWZiXFx1MTVmZlxcdTE2MDFcXHUxNjA3XFx1NjIyN25kO1xcdTZhNTU7XFx1NmE1Y2xvcGU7XFx1NmE1ODtcXHU2YTVhXFx1MDM4MDtlbG1yc3pcXHUxNjE4XFx1MTYxOVxcdTE2MWJcXHUxNjFlXFx1MTYzZlxcdTE2NGZcXHUxNjU5XFx1NjIyMDtcXHU2OWE0ZVxceGJiXFx1MTYxOXNkXFx1MDEwMDthXFx1MTYyNVxcdTE2MjZcXHU2MjIxXFx1MDQ2MVxcdTE2MzBcXHUxNjMyXFx1MTYzNFxcdTE2MzZcXHUxNjM4XFx1MTYzYVxcdTE2M2NcXHUxNjNlO1xcdTY5YTg7XFx1NjlhOTtcXHU2OWFhO1xcdTY5YWI7XFx1NjlhYztcXHU2OWFkO1xcdTY5YWU7XFx1NjlhZnRcXHUwMTAwO3ZcXHUxNjQ1XFx1MTY0NlxcdTYyMWZiXFx1MDEwMDtkXFx1MTY0Y1xcdTE2NGRcXHU2MmJlO1xcdTY5OWRcXHUwMTAwcHRcXHUxNjU0XFx1MTY1N2g7XFx1NjIyMlxceGJiXFx4YjlhcnI7XFx1NjM3Y1xcdTAxMDBncFxcdTE2NjNcXHUxNjY3b247XFx1NDEwNWY7XFx1YzAwMFxcdWQ4MzVcXHVkZDUyXFx1MDM4MDtFYWVpb3BcXHUxMmMxXFx1MTY3YlxcdTE2N2RcXHUxNjgyXFx1MTY4NFxcdTE2ODdcXHUxNjhhO1xcdTZhNzBjaXI7XFx1NmE2ZjtcXHU2MjRhZDtcXHU2MjRicztcXHU0MDI3cm94XFx1MDEwMDtlXFx1MTJjMVxcdTE2OTJcXHhmMVxcdTE2ODNpbmdcXHU4MDNiXFx4ZTVcXHU0MGU1XFx1MDE4MGN0eVxcdTE2YTFcXHUxNmE2XFx1MTZhOHI7XFx1YzAwMFxcdWQ4MzVcXHVkY2I2O1xcdTQwMmFtcFxcdTAxMDA7ZVxcdTEyYzFcXHUxNmFmXFx4ZjFcXHUwMjg4aWxkZVxcdTgwM2JcXHhlM1xcdTQwZTNtbFxcdTgwM2JcXHhlNFxcdTQwZTRcXHUwMTAwY2lcXHUxNmMyXFx1MTZjOG9uaW5cXHhmNFxcdTAyNzJudDtcXHU2YTExXFx1MDgwME5hYmNkZWZpa2xub3Byc3VcXHUxNmVkXFx1MTZmMVxcdTE3MzBcXHUxNzNjXFx1MTc0M1xcdTE3NDhcXHUxNzc4XFx1MTc3ZFxcdTE3ZTBcXHUxN2U2XFx1MTgzOVxcdTE4NTBcXHUxNzBkXFx1MTkzZFxcdTE5NDhcXHUxOTcwb3Q7XFx1NmFlZFxcdTAxMDBjclxcdTE2ZjZcXHUxNzFla1xcdTAyMDBjZXBzXFx1MTcwMFxcdTE3MDVcXHUxNzBkXFx1MTcxM29uZztcXHU2MjRjcHNpbG9uO1xcdTQzZjZyaW1lO1xcdTYwMzVpbVxcdTAxMDA7ZVxcdTE3MWFcXHUxNzFiXFx1NjIzZHE7XFx1NjJjZFxcdTAxNzZcXHUxNzIyXFx1MTcyNmVlO1xcdTYyYmRlZFxcdTAxMDA7Z1xcdTE3MmNcXHUxNzJkXFx1NjMwNWVcXHhiYlxcdTE3MmRya1xcdTAxMDA7dFxcdTEzNWNcXHUxNzM3YnJrO1xcdTYzYjZcXHUwMTAwb3lcXHUxNzAxXFx1MTc0MTtcXHU0NDMxcXVvO1xcdTYwMWVcXHUwMjgwY21wcnRcXHUxNzUzXFx1MTc1YlxcdTE3NjFcXHUxNzY0XFx1MTc2OGF1c1xcdTAxMDA7ZVxcdTAxMGFcXHUwMTA5cHR5djtcXHU2OWIwc1xceGU5XFx1MTcwY25vXFx4ZjVcXHUwMTEzXFx1MDE4MGFod1xcdTE3NmZcXHUxNzcxXFx1MTc3MztcXHU0M2IyO1xcdTYxMzZlZW47XFx1NjI2Y3I7XFx1YzAwMFxcdWQ4MzVcXHVkZDFmZ1xcdTAzODBjb3N0dXZ3XFx1MTc4ZFxcdTE3OWRcXHUxN2IzXFx1MTdjMVxcdTE3ZDVcXHUxN2RiXFx1MTdkZVxcdTAxODBhaXVcXHUxNzk0XFx1MTc5NlxcdTE3OWFcXHhmMFxcdTA3NjByYztcXHU2NWVmcFxceGJiXFx1MTM3MVxcdTAxODBkcHRcXHUxN2E0XFx1MTdhOFxcdTE3YWRvdDtcXHU2YTAwbHVzO1xcdTZhMDFpbWVzO1xcdTZhMDJcXHUwMjcxXFx1MTdiOVxcMFxcMFxcdTE3YmVjdXA7XFx1NmEwNmFyO1xcdTY2MDVyaWFuZ2xlXFx1MDEwMGR1XFx1MTdjZFxcdTE3ZDJvd247XFx1NjViZHA7XFx1NjViM3BsdXM7XFx1NmEwNGVcXHhlNVxcdTE0NDRcXHhlNVxcdTE0YWRhcm93O1xcdTY5MGRcXHUwMTgwYWtvXFx1MTdlZFxcdTE4MjZcXHUxODM1XFx1MDEwMGNuXFx1MTdmMlxcdTE4MjNrXFx1MDE4MGxzdFxcdTE3ZmFcXHUwNWFiXFx1MTgwMm96ZW5nZTtcXHU2OWVicmlhbmdsZVxcdTAyMDA7ZGxyXFx1MTgxMlxcdTE4MTNcXHUxODE4XFx1MTgxZFxcdTY1YjRvd247XFx1NjViZWVmdDtcXHU2NWMyaWdodDtcXHU2NWI4aztcXHU2NDIzXFx1MDFiMVxcdTE4MmJcXDBcXHUxODMzXFx1MDFiMlxcdTE4MmZcXDBcXHUxODMxO1xcdTY1OTI7XFx1NjU5MTQ7XFx1NjU5M2NrO1xcdTY1ODhcXHUwMTAwZW9cXHUxODNlXFx1MTg0ZFxcdTAxMDA7cVxcdTE4NDNcXHUxODQ2XFx1YzAwMD1cXHUyMGU1dWl2O1xcdWMwMDBcXHUyMjYxXFx1MjBlNXQ7XFx1NjMxMFxcdTAyMDBwdHd4XFx1MTg1OVxcdTE4NWVcXHUxODY3XFx1MTg2Y2Y7XFx1YzAwMFxcdWQ4MzVcXHVkZDUzXFx1MDEwMDt0XFx1MTNjYlxcdTE4NjNvbVxceGJiXFx1MTNjY3RpZTtcXHU2MmM4XFx1MDYwMERIVVZiZGhtcHR1dlxcdTE4ODVcXHUxODk2XFx1MThhYVxcdTE4YmJcXHUxOGQ3XFx1MThkYlxcdTE4ZWNcXHUxOGZmXFx1MTkwNVxcdTE5MGFcXHUxOTEwXFx1MTkyMVxcdTAyMDBMUmxyXFx1MTg4ZVxcdTE4OTBcXHUxODkyXFx1MTg5NDtcXHU2NTU3O1xcdTY1NTQ7XFx1NjU1NjtcXHU2NTUzXFx1MDI4MDtEVWR1XFx1MThhMVxcdTE4YTJcXHUxOGE0XFx1MThhNlxcdTE4YThcXHU2NTUwO1xcdTY1NjY7XFx1NjU2OTtcXHU2NTY0O1xcdTY1NjdcXHUwMjAwTFJsclxcdTE4YjNcXHUxOGI1XFx1MThiN1xcdTE4Yjk7XFx1NjU1ZDtcXHU2NTVhO1xcdTY1NWM7XFx1NjU1OVxcdTAzODA7SExSaGxyXFx1MThjYVxcdTE4Y2JcXHUxOGNkXFx1MThjZlxcdTE4ZDFcXHUxOGQzXFx1MThkNVxcdTY1NTE7XFx1NjU2YztcXHU2NTYzO1xcdTY1NjA7XFx1NjU2YjtcXHU2NTYyO1xcdTY1NWZveDtcXHU2OWM5XFx1MDIwMExSbHJcXHUxOGU0XFx1MThlNlxcdTE4ZThcXHUxOGVhO1xcdTY1NTU7XFx1NjU1MjtcXHU2NTEwO1xcdTY1MGNcXHUwMjgwO0RVZHVcXHUwNmJkXFx1MThmN1xcdTE4ZjlcXHUxOGZiXFx1MThmZDtcXHU2NTY1O1xcdTY1Njg7XFx1NjUyYztcXHU2NTM0aW51cztcXHU2MjlmbHVzO1xcdTYyOWVpbWVzO1xcdTYyYTBcXHUwMjAwTFJsclxcdTE5MTlcXHUxOTFiXFx1MTkxZFxcdTE5MWY7XFx1NjU1YjtcXHU2NTU4O1xcdTY1MTg7XFx1NjUxNFxcdTAzODA7SExSaGxyXFx1MTkzMFxcdTE5MzFcXHUxOTMzXFx1MTkzNVxcdTE5MzdcXHUxOTM5XFx1MTkzYlxcdTY1MDI7XFx1NjU2YTtcXHU2NTYxO1xcdTY1NWU7XFx1NjUzYztcXHU2NTI0O1xcdTY1MWNcXHUwMTAwZXZcXHUwMTIzXFx1MTk0MmJhclxcdTgwM2JcXHhhNlxcdTQwYTZcXHUwMjAwY2Vpb1xcdTE5NTFcXHUxOTU2XFx1MTk1YVxcdTE5NjByO1xcdWMwMDBcXHVkODM1XFx1ZGNiN21pO1xcdTYwNGZtXFx1MDEwMDtlXFx1MTcxYVxcdTE3MWNsXFx1MDE4MDtiaFxcdTE5NjhcXHUxOTY5XFx1MTk2YlxcdTQwNWM7XFx1NjljNXN1YjtcXHU2N2M4XFx1MDE2Y1xcdTE5NzRcXHUxOTdlbFxcdTAxMDA7ZVxcdTE5NzlcXHUxOTdhXFx1NjAyMnRcXHhiYlxcdTE5N2FwXFx1MDE4MDtFZVxcdTAxMmZcXHUxOTg1XFx1MTk4NztcXHU2YWFlXFx1MDEwMDtxXFx1MDZkY1xcdTA2ZGJcXHUwY2UxXFx1MTlhN1xcMFxcdTE5ZThcXHUxYTExXFx1MWExNVxcdTFhMzJcXDBcXHUxYTM3XFx1MWE1MFxcMFxcMFxcdTFhYjRcXDBcXDBcXHUxYWMxXFwwXFwwXFx1MWIyMVxcdTFiMmVcXHUxYjRkXFx1MWI1MlxcMFxcdTFiZmRcXDBcXHUxYzBjXFx1MDE4MGNwclxcdTE5YWRcXHUxOWIyXFx1MTlkZHV0ZTtcXHU0MTA3XFx1MDMwMDthYmNkc1xcdTE5YmZcXHUxOWMwXFx1MTljNFxcdTE5Y2FcXHUxOWQ1XFx1MTlkOVxcdTYyMjluZDtcXHU2YTQ0cmN1cDtcXHU2YTQ5XFx1MDEwMGF1XFx1MTljZlxcdTE5ZDJwO1xcdTZhNGJwO1xcdTZhNDdvdDtcXHU2YTQwO1xcdWMwMDBcXHUyMjI5XFx1ZmUwMFxcdTAxMDBlb1xcdTE5ZTJcXHUxOWU1dDtcXHU2MDQxXFx4ZWVcXHUwNjkzXFx1MDIwMGFlaXVcXHUxOWYwXFx1MTlmYlxcdTFhMDFcXHUxYTA1XFx1MDFmMFxcdTE5ZjVcXDBcXHUxOWY4cztcXHU2YTRkb247XFx1NDEwZGRpbFxcdTgwM2JcXHhlN1xcdTQwZTdyYztcXHU0MTA5cHNcXHUwMTAwO3NcXHUxYTBjXFx1MWEwZFxcdTZhNGNtO1xcdTZhNTBvdDtcXHU0MTBiXFx1MDE4MGRtblxcdTFhMWJcXHUxYTIwXFx1MWEyNmlsXFx1ODBiYlxceGI4XFx1MDFhZHB0eXY7XFx1NjliMnRcXHU4MTAwXFx4YTI7ZVxcdTFhMmRcXHUxYTJlXFx1NDBhMnJcXHhlNFxcdTAxYjJyO1xcdWMwMDBcXHVkODM1XFx1ZGQyMFxcdTAxODBjZWlcXHUxYTNkXFx1MWE0MFxcdTFhNGR5O1xcdTQ0NDdja1xcdTAxMDA7bVxcdTFhNDdcXHUxYTQ4XFx1NjcxM2Fya1xceGJiXFx1MWE0ODtcXHU0M2M3clxcdTAzODA7RWNlZm1zXFx1MWE1ZlxcdTFhNjBcXHUxYTYyXFx1MWE2YlxcdTFhYTRcXHUxYWFhXFx1MWFhZVxcdTY1Y2I7XFx1NjljM1xcdTAxODA7ZWxcXHUxYTY5XFx1MWE2YVxcdTFhNmRcXHU0MmM2cTtcXHU2MjU3ZVxcdTAyNjFcXHUxYTc0XFwwXFwwXFx1MWE4OHJyb3dcXHUwMTAwbHJcXHUxYTdjXFx1MWE4MWVmdDtcXHU2MWJhaWdodDtcXHU2MWJiXFx1MDI4MFJTYWNkXFx1MWE5MlxcdTFhOTRcXHUxYTk2XFx1MWE5YVxcdTFhOWZcXHhiYlxcdTBmNDc7XFx1NjRjOHN0O1xcdTYyOWJpcmM7XFx1NjI5YWFzaDtcXHU2MjlkbmludDtcXHU2YTEwaWQ7XFx1NmFlZmNpcjtcXHU2OWMydWJzXFx1MDEwMDt1XFx1MWFiYlxcdTFhYmNcXHU2NjYzaXRcXHhiYlxcdTFhYmNcXHUwMmVjXFx1MWFjN1xcdTFhZDRcXHUxYWZhXFwwXFx1MWIwYW9uXFx1MDEwMDtlXFx1MWFjZFxcdTFhY2VcXHU0MDNhXFx1MDEwMDtxXFx4YzdcXHhjNlxcdTAyNmRcXHUxYWQ5XFwwXFwwXFx1MWFlMmFcXHUwMTAwO3RcXHUxYWRlXFx1MWFkZlxcdTQwMmM7XFx1NDA0MFxcdTAxODA7ZmxcXHUxYWU4XFx1MWFlOVxcdTFhZWJcXHU2MjAxXFx4ZWVcXHUxMTYwZVxcdTAxMDBteFxcdTFhZjFcXHUxYWY2ZW50XFx4YmJcXHUxYWU5ZVxceGYzXFx1MDI0ZFxcdTAxZTdcXHUxYWZlXFwwXFx1MWIwN1xcdTAxMDA7ZFxcdTEyYmJcXHUxYjAyb3Q7XFx1NmE2ZG5cXHhmNFxcdTAyNDZcXHUwMTgwZnJ5XFx1MWIxMFxcdTFiMTRcXHUxYjE3O1xcdWMwMDBcXHVkODM1XFx1ZGQ1NG9cXHhlNFxcdTAyNTRcXHU4MTAwXFx4YTk7c1xcdTAxNTVcXHUxYjFkcjtcXHU2MTE3XFx1MDEwMGFvXFx1MWIyNVxcdTFiMjlycjtcXHU2MWI1c3M7XFx1NjcxN1xcdTAxMDBjdVxcdTFiMzJcXHUxYjM3cjtcXHVjMDAwXFx1ZDgzNVxcdWRjYjhcXHUwMTAwYnBcXHUxYjNjXFx1MWI0NFxcdTAxMDA7ZVxcdTFiNDFcXHUxYjQyXFx1NmFjZjtcXHU2YWQxXFx1MDEwMDtlXFx1MWI0OVxcdTFiNGFcXHU2YWQwO1xcdTZhZDJkb3Q7XFx1NjJlZlxcdTAzODBkZWxwcnZ3XFx1MWI2MFxcdTFiNmNcXHUxYjc3XFx1MWI4MlxcdTFiYWNcXHUxYmQ0XFx1MWJmOWFyclxcdTAxMDBsclxcdTFiNjhcXHUxYjZhO1xcdTY5Mzg7XFx1NjkzNVxcdTAyNzBcXHUxYjcyXFwwXFwwXFx1MWI3NXI7XFx1NjJkZWM7XFx1NjJkZmFyclxcdTAxMDA7cFxcdTFiN2ZcXHUxYjgwXFx1NjFiNjtcXHU2OTNkXFx1MDMwMDtiY2Rvc1xcdTFiOGZcXHUxYjkwXFx1MWI5NlxcdTFiYTFcXHUxYmE1XFx1MWJhOFxcdTYyMmFyY2FwO1xcdTZhNDhcXHUwMTAwYXVcXHUxYjliXFx1MWI5ZXA7XFx1NmE0NnA7XFx1NmE0YW90O1xcdTYyOGRyO1xcdTZhNDU7XFx1YzAwMFxcdTIyMmFcXHVmZTAwXFx1MDIwMGFscnZcXHUxYmI1XFx1MWJiZlxcdTFiZGVcXHUxYmUzcnJcXHUwMTAwO21cXHUxYmJjXFx1MWJiZFxcdTYxYjc7XFx1NjkzY3lcXHUwMTgwZXZ3XFx1MWJjN1xcdTFiZDRcXHUxYmQ4cVxcdTAyNzBcXHUxYmNlXFwwXFwwXFx1MWJkMnJlXFx4ZTNcXHUxYjczdVxceGUzXFx1MWI3NWVlO1xcdTYyY2VlZGdlO1xcdTYyY2ZlblxcdTgwM2JcXHhhNFxcdTQwYTRlYXJyb3dcXHUwMTAwbHJcXHUxYmVlXFx1MWJmM2VmdFxceGJiXFx1MWI4MGlnaHRcXHhiYlxcdTFiYmRlXFx4ZTRcXHUxYmRkXFx1MDEwMGNpXFx1MWMwMVxcdTFjMDdvbmluXFx4ZjRcXHUwMWY3bnQ7XFx1NjIzMWxjdHk7XFx1NjMyZFxcdTA5ODBBSGFiY2RlZmhpamxvcnN0dXd6XFx1MWMzOFxcdTFjM2JcXHUxYzNmXFx1MWM1ZFxcdTFjNjlcXHUxYzc1XFx1MWM4YVxcdTFjOWVcXHUxY2FjXFx1MWNiN1xcdTFjZmJcXHUxY2ZmXFx1MWQwZFxcdTFkN2JcXHUxZDkxXFx1MWRhYlxcdTFkYmJcXHUxZGM2XFx1MWRjZHJcXHhmMlxcdTAzODFhcjtcXHU2OTY1XFx1MDIwMGdscnNcXHUxYzQ4XFx1MWM0ZFxcdTFjNTJcXHUxYzU0Z2VyO1xcdTYwMjBldGg7XFx1NjEzOFxceGYyXFx1MTEzM2hcXHUwMTAwO3ZcXHUxYzVhXFx1MWM1YlxcdTYwMTBcXHhiYlxcdTA5MGFcXHUwMTZiXFx1MWM2MVxcdTFjNjdhcm93O1xcdTY5MGZhXFx4ZTNcXHUwMzE1XFx1MDEwMGF5XFx1MWM2ZVxcdTFjNzNyb247XFx1NDEwZjtcXHU0NDM0XFx1MDE4MDthb1xcdTAzMzJcXHUxYzdjXFx1MWM4NFxcdTAxMDBnclxcdTAyYmZcXHUxYzgxcjtcXHU2MWNhdHNlcTtcXHU2YTc3XFx1MDE4MGdsbVxcdTFjOTFcXHUxYzk0XFx1MWM5OFxcdTgwM2JcXHhiMFxcdTQwYjB0YTtcXHU0M2I0cHR5djtcXHU2OWIxXFx1MDEwMGlyXFx1MWNhM1xcdTFjYThzaHQ7XFx1Njk3ZjtcXHVjMDAwXFx1ZDgzNVxcdWRkMjFhclxcdTAxMDBsclxcdTFjYjNcXHUxY2I1XFx4YmJcXHUwOGRjXFx4YmJcXHUxMDFlXFx1MDI4MGFlZ3N2XFx1MWNjMlxcdTAzNzhcXHUxY2Q2XFx1MWNkY1xcdTFjZTBtXFx1MDE4MDtvc1xcdTAzMjZcXHUxY2NhXFx1MWNkNG5kXFx1MDEwMDtzXFx1MDMyNlxcdTFjZDF1aXQ7XFx1NjY2NmFtbWE7XFx1NDNkZGluO1xcdTYyZjJcXHUwMTgwO2lvXFx1MWNlN1xcdTFjZThcXHUxY2Y4XFx1NDBmN2RlXFx1ODEwMFxceGY3O29cXHUxY2U3XFx1MWNmMG50aW1lcztcXHU2MmM3blxceGY4XFx1MWNmN2N5O1xcdTQ0NTJjXFx1MDI2ZlxcdTFkMDZcXDBcXDBcXHUxZDBhcm47XFx1NjMxZW9wO1xcdTYzMGRcXHUwMjgwbHB0dXdcXHUxZDE4XFx1MWQxZFxcdTFkMjJcXHUxZDQ5XFx1MWQ1NWxhcjtcXHU0MDI0ZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNTVcXHUwMjgwO2VtcHNcXHUwMzBiXFx1MWQyZFxcdTFkMzdcXHUxZDNkXFx1MWQ0MnFcXHUwMTAwO2RcXHUwMzUyXFx1MWQzM290O1xcdTYyNTFpbnVzO1xcdTYyMzhsdXM7XFx1NjIxNHF1YXJlO1xcdTYyYTFibGViYXJ3ZWRnXFx4ZTVcXHhmYW5cXHUwMTgwYWRoXFx1MTEyZVxcdTFkNWRcXHUxZDY3b3duYXJyb3dcXHhmM1xcdTFjODNhcnBvb25cXHUwMTAwbHJcXHUxZDcyXFx1MWQ3NmVmXFx4ZjRcXHUxY2I0aWdoXFx4ZjRcXHUxY2I2XFx1MDE2MlxcdTFkN2ZcXHUxZDg1a2Fyb1xceGY3XFx1MGY0MlxcdTAyNmZcXHUxZDhhXFwwXFwwXFx1MWQ4ZXJuO1xcdTYzMWZvcDtcXHU2MzBjXFx1MDE4MGNvdFxcdTFkOThcXHUxZGEzXFx1MWRhNlxcdTAxMDByeVxcdTFkOWRcXHUxZGExO1xcdWMwMDBcXHVkODM1XFx1ZGNiOTtcXHU0NDU1bDtcXHU2OWY2cm9rO1xcdTQxMTFcXHUwMTAwZHJcXHUxZGIwXFx1MWRiNG90O1xcdTYyZjFpXFx1MDEwMDtmXFx1MWRiYVxcdTE4MTZcXHU2NWJmXFx1MDEwMGFoXFx1MWRjMFxcdTFkYzNyXFx4ZjJcXHUwNDI5YVxceGYyXFx1MGZhNmFuZ2xlO1xcdTY5YTZcXHUwMTAwY2lcXHUxZGQyXFx1MWRkNXk7XFx1NDQ1ZmdyYXJyO1xcdTY3ZmZcXHUwOTAwRGFjZGVmZ2xtbm9wcXJzdHV4XFx1MWUwMVxcdTFlMDlcXHUxZTE5XFx1MWUzOFxcdTA1NzhcXHUxZTNjXFx1MWU0OVxcdTFlNjFcXHUxZTdlXFx1MWVhNVxcdTFlYWZcXHUxZWJkXFx1MWVlMVxcdTFmMmFcXHUxZjM3XFx1MWY0NFxcdTFmNGVcXHUxZjVhXFx1MDEwMERvXFx1MWUwNlxcdTFkMzRvXFx4ZjRcXHUxYzg5XFx1MDEwMGNzXFx1MWUwZVxcdTFlMTR1dGVcXHU4MDNiXFx4ZTlcXHU0MGU5dGVyO1xcdTZhNmVcXHUwMjAwYWlveVxcdTFlMjJcXHUxZTI3XFx1MWUzMVxcdTFlMzZyb247XFx1NDExYnJcXHUwMTAwO2NcXHUxZTJkXFx1MWUyZVxcdTYyNTZcXHU4MDNiXFx4ZWFcXHU0MGVhbG9uO1xcdTYyNTU7XFx1NDQ0ZG90O1xcdTQxMTdcXHUwMTAwRHJcXHUxZTQxXFx1MWU0NW90O1xcdTYyNTI7XFx1YzAwMFxcdWQ4MzVcXHVkZDIyXFx1MDE4MDtyc1xcdTFlNTBcXHUxZTUxXFx1MWU1N1xcdTZhOWFhdmVcXHU4MDNiXFx4ZThcXHU0MGU4XFx1MDEwMDtkXFx1MWU1Y1xcdTFlNWRcXHU2YTk2b3Q7XFx1NmE5OFxcdTAyMDA7aWxzXFx1MWU2YVxcdTFlNmJcXHUxZTcyXFx1MWU3NFxcdTZhOTludGVycztcXHU2M2U3O1xcdTYxMTNcXHUwMTAwO2RcXHUxZTc5XFx1MWU3YVxcdTZhOTVvdDtcXHU2YTk3XFx1MDE4MGFwc1xcdTFlODVcXHUxZTg5XFx1MWU5N2NyO1xcdTQxMTN0eVxcdTAxODA7c3ZcXHUxZTkyXFx1MWU5M1xcdTFlOTVcXHU2MjA1ZXRcXHhiYlxcdTFlOTNwXFx1MDEwMDE7XFx1MWU5ZFxcdTFlYTRcXHUwMTMzXFx1MWVhMVxcdTFlYTM7XFx1NjAwNDtcXHU2MDA1XFx1NjAwM1xcdTAxMDBnc1xcdTFlYWFcXHUxZWFjO1xcdTQxNGJwO1xcdTYwMDJcXHUwMTAwZ3BcXHUxZWI0XFx1MWViOG9uO1xcdTQxMTlmO1xcdWMwMDBcXHVkODM1XFx1ZGQ1NlxcdTAxODBhbHNcXHUxZWM0XFx1MWVjZVxcdTFlZDJyXFx1MDEwMDtzXFx1MWVjYVxcdTFlY2JcXHU2MmQ1bDtcXHU2OWUzdXM7XFx1NmE3MWlcXHUwMTgwO2x2XFx1MWVkYVxcdTFlZGJcXHUxZWRmXFx1NDNiNW9uXFx4YmJcXHUxZWRiO1xcdTQzZjVcXHUwMjAwY3N1dlxcdTFlZWFcXHUxZWYzXFx1MWYwYlxcdTFmMjNcXHUwMTAwaW9cXHUxZWVmXFx1MWUzMXJjXFx4YmJcXHUxZTJlXFx1MDI2OVxcdTFlZjlcXDBcXDBcXHUxZWZiXFx4ZWRcXHUwNTQ4YW50XFx1MDEwMGdsXFx1MWYwMlxcdTFmMDZ0clxceGJiXFx1MWU1ZGVzc1xceGJiXFx1MWU3YVxcdTAxODBhZWlcXHUxZjEyXFx1MWYxNlxcdTFmMWFscztcXHU0MDNkc3Q7XFx1NjI1ZnZcXHUwMTAwO0RcXHUwMjM1XFx1MWYyMEQ7XFx1NmE3OHBhcnNsO1xcdTY5ZTVcXHUwMTAwRGFcXHUxZjJmXFx1MWYzM290O1xcdTYyNTNycjtcXHU2OTcxXFx1MDE4MGNkaVxcdTFmM2VcXHUxZjQxXFx1MWVmOHI7XFx1NjEyZm9cXHhmNFxcdTAzNTJcXHUwMTAwYWhcXHUxZjQ5XFx1MWY0YjtcXHU0M2I3XFx1ODAzYlxceGYwXFx1NDBmMFxcdTAxMDBtclxcdTFmNTNcXHUxZjU3bFxcdTgwM2JcXHhlYlxcdTQwZWJvO1xcdTYwYWNcXHUwMTgwY2lwXFx1MWY2MVxcdTFmNjRcXHUxZjY3bDtcXHU0MDIxc1xceGY0XFx1MDU2ZVxcdTAxMDBlb1xcdTFmNmNcXHUxZjc0Y3RhdGlvXFx4ZWVcXHUwNTU5bmVudGlhbFxceGU1XFx1MDU3OVxcdTA5ZTFcXHUxZjkyXFwwXFx1MWY5ZVxcMFxcdTFmYTFcXHUxZmE3XFwwXFwwXFx1MWZjNlxcdTFmY2NcXDBcXHUxZmQzXFwwXFx1MWZlNlxcdTFmZWFcXHUyMDAwXFwwXFx1MjAwOFxcdTIwNWFsbGluZ2RvdHNlXFx4ZjFcXHUxZTQ0eTtcXHU0NDQ0bWFsZTtcXHU2NjQwXFx1MDE4MGlsclxcdTFmYWRcXHUxZmIzXFx1MWZjMWxpZztcXHU4MDAwXFx1ZmIwM1xcdTAyNjlcXHUxZmI5XFwwXFwwXFx1MWZiZGc7XFx1ODAwMFxcdWZiMDBpZztcXHU4MDAwXFx1ZmIwNDtcXHVjMDAwXFx1ZDgzNVxcdWRkMjNsaWc7XFx1ODAwMFxcdWZiMDFsaWc7XFx1YzAwMGZqXFx1MDE4MGFsdFxcdTFmZDlcXHUxZmRjXFx1MWZlMXQ7XFx1NjY2ZGlnO1xcdTgwMDBcXHVmYjAybnM7XFx1NjViMW9mO1xcdTQxOTJcXHUwMWYwXFx1MWZlZVxcMFxcdTFmZjNmO1xcdWMwMDBcXHVkODM1XFx1ZGQ1N1xcdTAxMDBha1xcdTA1YmZcXHUxZmY3XFx1MDEwMDt2XFx1MWZmY1xcdTFmZmRcXHU2MmQ0O1xcdTZhZDlhcnRpbnQ7XFx1NmEwZFxcdTAxMDBhb1xcdTIwMGNcXHUyMDU1XFx1MDEwMGNzXFx1MjAxMVxcdTIwNTJcXHUwM2IxXFx1MjAxYVxcdTIwMzBcXHUyMDM4XFx1MjA0NVxcdTIwNDhcXDBcXHUyMDUwXFx1MDNiMlxcdTIwMjJcXHUyMDI1XFx1MjAyN1xcdTIwMmFcXHUyMDJjXFwwXFx1MjAyZVxcdTgwM2JcXHhiZFxcdTQwYmQ7XFx1NjE1M1xcdTgwM2JcXHhiY1xcdTQwYmM7XFx1NjE1NTtcXHU2MTU5O1xcdTYxNWJcXHUwMWIzXFx1MjAzNFxcMFxcdTIwMzY7XFx1NjE1NDtcXHU2MTU2XFx1MDJiNFxcdTIwM2VcXHUyMDQxXFwwXFwwXFx1MjA0M1xcdTgwM2JcXHhiZVxcdTQwYmU7XFx1NjE1NztcXHU2MTVjNTtcXHU2MTU4XFx1MDFiNlxcdTIwNGNcXDBcXHUyMDRlO1xcdTYxNWE7XFx1NjE1ZDg7XFx1NjE1ZWw7XFx1NjA0NHduO1xcdTYzMjJjcjtcXHVjMDAwXFx1ZDgzNVxcdWRjYmJcXHUwODgwRWFiY2RlZmdpamxub3JzdHZcXHUyMDgyXFx1MjA4OVxcdTIwOWZcXHUyMGE1XFx1MjBiMFxcdTIwYjRcXHUyMGYwXFx1MjBmNVxcdTIwZmFcXHUyMGZmXFx1MjEwM1xcdTIxMTJcXHUyMTM4XFx1MDMxN1xcdTIxM2VcXHUyMTUyXFx1MjE5ZVxcdTAxMDA7bFxcdTA2NGRcXHUyMDg3O1xcdTZhOGNcXHUwMTgwY21wXFx1MjA5MFxcdTIwOTVcXHUyMDlkdXRlO1xcdTQxZjVtYVxcdTAxMDA7ZFxcdTIwOWNcXHUxY2RhXFx1NDNiMztcXHU2YTg2cmV2ZTtcXHU0MTFmXFx1MDEwMGl5XFx1MjBhYVxcdTIwYWVyYztcXHU0MTFkO1xcdTQ0MzNvdDtcXHU0MTIxXFx1MDIwMDtscXNcXHUwNjNlXFx1MDY0MlxcdTIwYmRcXHUyMGM5XFx1MDE4MDtxc1xcdTA2M2VcXHUwNjRjXFx1MjBjNGxhblxceGY0XFx1MDY2NVxcdTAyMDA7Y2RsXFx1MDY2NVxcdTIwZDJcXHUyMGQ1XFx1MjBlNWM7XFx1NmFhOW90XFx1MDEwMDtvXFx1MjBkY1xcdTIwZGRcXHU2YTgwXFx1MDEwMDtsXFx1MjBlMlxcdTIwZTNcXHU2YTgyO1xcdTZhODRcXHUwMTAwO2VcXHUyMGVhXFx1MjBlZFxcdWMwMDBcXHUyMmRiXFx1ZmUwMHM7XFx1NmE5NHI7XFx1YzAwMFxcdWQ4MzVcXHVkZDI0XFx1MDEwMDtnXFx1MDY3M1xcdTA2MWJtZWw7XFx1NjEzN2N5O1xcdTQ0NTNcXHUwMjAwO0VhalxcdTA2NWFcXHUyMTBjXFx1MjEwZVxcdTIxMTA7XFx1NmE5MjtcXHU2YWE1O1xcdTZhYTRcXHUwMjAwRWFlc1xcdTIxMWJcXHUyMTFkXFx1MjEyOVxcdTIxMzQ7XFx1NjI2OXBcXHUwMTAwO3BcXHUyMTIzXFx1MjEyNFxcdTZhOGFyb3hcXHhiYlxcdTIxMjRcXHUwMTAwO3FcXHUyMTJlXFx1MjEyZlxcdTZhODhcXHUwMTAwO3FcXHUyMTJlXFx1MjExYmltO1xcdTYyZTdwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNThcXHUwMTAwY2lcXHUyMTQzXFx1MjE0NnI7XFx1NjEwYW1cXHUwMTgwO2VsXFx1MDY2YlxcdTIxNGVcXHUyMTUwO1xcdTZhOGU7XFx1NmE5MFxcdTgzMDA+O2NkbHFyXFx1MDVlZVxcdTIxNjBcXHUyMTZhXFx1MjE2ZVxcdTIxNzNcXHUyMTc5XFx1MDEwMGNpXFx1MjE2NVxcdTIxNjc7XFx1NmFhN3I7XFx1NmE3YW90O1xcdTYyZDdQYXI7XFx1Njk5NXVlc3Q7XFx1NmE3Y1xcdTAyODBhZGVsc1xcdTIxODRcXHUyMTZhXFx1MjE5MFxcdTA2NTZcXHUyMTliXFx1MDFmMFxcdTIxODlcXDBcXHUyMThlcHJvXFx4ZjhcXHUyMDllcjtcXHU2OTc4cVxcdTAxMDBscVxcdTA2M2ZcXHUyMTk2bGVzXFx4ZjNcXHUyMDg4aVxceGVkXFx1MDY2YlxcdTAxMDBlblxcdTIxYTNcXHUyMWFkcnRuZXFxO1xcdWMwMDBcXHUyMjY5XFx1ZmUwMFxceGM1XFx1MjFhYVxcdTA1MDBBYWJjZWZrb3N5XFx1MjFjNFxcdTIxYzdcXHUyMWYxXFx1MjFmNVxcdTIxZmFcXHUyMjE4XFx1MjIxZFxcdTIyMmZcXHUyMjY4XFx1MjI3ZHJcXHhmMlxcdTAzYTBcXHUwMjAwaWxtclxcdTIxZDBcXHUyMWQ0XFx1MjFkN1xcdTIxZGJyc1xceGYwXFx1MTQ4NGZcXHhiYlxcdTIwMjRpbFxceGY0XFx1MDZhOVxcdTAxMDBkclxcdTIxZTBcXHUyMWU0Y3k7XFx1NDQ0YVxcdTAxODA7Y3dcXHUwOGY0XFx1MjFlYlxcdTIxZWZpcjtcXHU2OTQ4O1xcdTYxYWRhcjtcXHU2MTBmaXJjO1xcdTQxMjVcXHUwMTgwYWxyXFx1MjIwMVxcdTIyMGVcXHUyMjEzcnRzXFx1MDEwMDt1XFx1MjIwOVxcdTIyMGFcXHU2NjY1aXRcXHhiYlxcdTIyMGFsaXA7XFx1NjAyNmNvbjtcXHU2MmI5cjtcXHVjMDAwXFx1ZDgzNVxcdWRkMjVzXFx1MDEwMGV3XFx1MjIyM1xcdTIyMjlhcm93O1xcdTY5MjVhcm93O1xcdTY5MjZcXHUwMjgwYW1vcHJcXHUyMjNhXFx1MjIzZVxcdTIyNDNcXHUyMjVlXFx1MjI2M3JyO1xcdTYxZmZ0aHQ7XFx1NjIzYmtcXHUwMTAwbHJcXHUyMjQ5XFx1MjI1M2VmdGFycm93O1xcdTYxYTlpZ2h0YXJyb3c7XFx1NjFhYWY7XFx1YzAwMFxcdWQ4MzVcXHVkZDU5YmFyO1xcdTYwMTVcXHUwMTgwY2x0XFx1MjI2ZlxcdTIyNzRcXHUyMjc4cjtcXHVjMDAwXFx1ZDgzNVxcdWRjYmRhc1xceGU4XFx1MjFmNHJvaztcXHU0MTI3XFx1MDEwMGJwXFx1MjI4MlxcdTIyODd1bGw7XFx1NjA0M2hlblxceGJiXFx1MWM1YlxcdTBhZTFcXHUyMmEzXFwwXFx1MjJhYVxcMFxcdTIyYjhcXHUyMmM1XFx1MjJjZVxcMFxcdTIyZDVcXHUyMmYzXFwwXFwwXFx1MjJmOFxcdTIzMjJcXHUyMzY3XFx1MjM2MlxcdTIzN2ZcXDBcXHUyMzg2XFx1MjNhYVxcdTIzYjRjdXRlXFx1ODAzYlxceGVkXFx1NDBlZFxcdTAxODA7aXlcXHUwNzcxXFx1MjJiMFxcdTIyYjVyY1xcdTgwM2JcXHhlZVxcdTQwZWU7XFx1NDQzOFxcdTAxMDBjeFxcdTIyYmNcXHUyMmJmeTtcXHU0NDM1Y2xcXHU4MDNiXFx4YTFcXHU0MGExXFx1MDEwMGZyXFx1MDM5ZlxcdTIyYzk7XFx1YzAwMFxcdWQ4MzVcXHVkZDI2cmF2ZVxcdTgwM2JcXHhlY1xcdTQwZWNcXHUwMjAwO2lub1xcdTA3M2VcXHUyMmRkXFx1MjJlOVxcdTIyZWVcXHUwMTAwaW5cXHUyMmUyXFx1MjJlNm50O1xcdTZhMGN0O1xcdTYyMmRmaW47XFx1NjlkY3RhO1xcdTYxMjlsaWc7XFx1NDEzM1xcdTAxODBhb3BcXHUyMmZlXFx1MjMxYVxcdTIzMWRcXHUwMTgwY2d0XFx1MjMwNVxcdTIzMDhcXHUyMzE3cjtcXHU0MTJiXFx1MDE4MGVscFxcdTA3MWZcXHUyMzBmXFx1MjMxM2luXFx4ZTVcXHUwNzhlYXJcXHhmNFxcdTA3MjBoO1xcdTQxMzFmO1xcdTYyYjdlZDtcXHU0MWI1XFx1MDI4MDtjZm90XFx1MDRmNFxcdTIzMmNcXHUyMzMxXFx1MjMzZFxcdTIzNDFhcmU7XFx1NjEwNWluXFx1MDEwMDt0XFx1MjMzOFxcdTIzMzlcXHU2MjFlaWU7XFx1NjlkZGRvXFx4ZjRcXHUyMzE5XFx1MDI4MDtjZWxwXFx1MDc1N1xcdTIzNGNcXHUyMzUwXFx1MjM1YlxcdTIzNjFhbDtcXHU2MmJhXFx1MDEwMGdyXFx1MjM1NVxcdTIzNTllclxceGYzXFx1MTU2M1xceGUzXFx1MjM0ZGFyaGs7XFx1NmExN3JvZDtcXHU2YTNjXFx1MDIwMGNncHRcXHUyMzZmXFx1MjM3MlxcdTIzNzZcXHUyMzdieTtcXHU0NDUxb247XFx1NDEyZmY7XFx1YzAwMFxcdWQ4MzVcXHVkZDVhYTtcXHU0M2I5dWVzdFxcdTgwM2JcXHhiZlxcdTQwYmZcXHUwMTAwY2lcXHUyMzhhXFx1MjM4ZnI7XFx1YzAwMFxcdWQ4MzVcXHVkY2JlblxcdTAyODA7RWRzdlxcdTA0ZjRcXHUyMzliXFx1MjM5ZFxcdTIzYTFcXHUwNGYzO1xcdTYyZjlvdDtcXHU2MmY1XFx1MDEwMDt2XFx1MjNhNlxcdTIzYTdcXHU2MmY0O1xcdTYyZjNcXHUwMTAwO2lcXHUwNzc3XFx1MjNhZWxkZTtcXHU0MTI5XFx1MDFlYlxcdTIzYjhcXDBcXHUyM2JjY3k7XFx1NDQ1NmxcXHU4MDNiXFx4ZWZcXHU0MGVmXFx1MDMwMGNmbW9zdVxcdTIzY2NcXHUyM2Q3XFx1MjNkY1xcdTIzZTFcXHUyM2U3XFx1MjNmNVxcdTAxMDBpeVxcdTIzZDFcXHUyM2Q1cmM7XFx1NDEzNTtcXHU0NDM5cjtcXHVjMDAwXFx1ZDgzNVxcdWRkMjdhdGg7XFx1NDIzN3BmO1xcdWMwMDBcXHVkODM1XFx1ZGQ1YlxcdTAxZTNcXHUyM2VjXFwwXFx1MjNmMXI7XFx1YzAwMFxcdWQ4MzVcXHVkY2JmcmN5O1xcdTQ0NThrY3k7XFx1NDQ1NFxcdTA0MDBhY2ZnaGpvc1xcdTI0MGJcXHUyNDE2XFx1MjQyMlxcdTI0MjdcXHUyNDJkXFx1MjQzMVxcdTI0MzVcXHUyNDNicHBhXFx1MDEwMDt2XFx1MjQxM1xcdTI0MTRcXHU0M2JhO1xcdTQzZjBcXHUwMTAwZXlcXHUyNDFiXFx1MjQyMGRpbDtcXHU0MTM3O1xcdTQ0M2FyO1xcdWMwMDBcXHVkODM1XFx1ZGQyOHJlZW47XFx1NDEzOGN5O1xcdTQ0NDVjeTtcXHU0NDVjcGY7XFx1YzAwMFxcdWQ4MzVcXHVkZDVjY3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2MwXFx1MGI4MEFCRUhhYmNkZWZnaGpsbW5vcHJzdHV2XFx1MjQ3MFxcdTI0ODFcXHUyNDg2XFx1MjQ4ZFxcdTI0OTFcXHUyNTBlXFx1MjUzZFxcdTI1NWFcXHUyNTgwXFx1MjY0ZVxcdTI2NWVcXHUyNjY1XFx1MjY3OVxcdTI2N2RcXHUyNjlhXFx1MjZiMlxcdTI2ZDhcXHUyNzVkXFx1Mjc2OFxcdTI3OGJcXHUyN2MwXFx1MjgwMVxcdTI4MTJcXHUwMTgwYXJ0XFx1MjQ3N1xcdTI0N2FcXHUyNDdjclxceGYyXFx1MDljNlxceGYyXFx1MDM5NWFpbDtcXHU2OTFiYXJyO1xcdTY5MGVcXHUwMTAwO2dcXHUwOTk0XFx1MjQ4YjtcXHU2YThiYXI7XFx1Njk2MlxcdTA5NjNcXHUyNGE1XFwwXFx1MjRhYVxcMFxcdTI0YjFcXDBcXDBcXDBcXDBcXDBcXHUyNGI1XFx1MjRiYVxcMFxcdTI0YzZcXHUyNGM4XFx1MjRjZFxcMFxcdTI0Zjl1dGU7XFx1NDEzYW1wdHl2O1xcdTY5YjRyYVxceGVlXFx1MDg0Y2JkYTtcXHU0M2JiZ1xcdTAxODA7ZGxcXHUwODhlXFx1MjRjMVxcdTI0YzM7XFx1Njk5MVxceGU1XFx1MDg4ZTtcXHU2YTg1dW9cXHU4MDNiXFx4YWJcXHU0MGFiclxcdTA0MDA7YmZobHBzdFxcdTA4OTlcXHUyNGRlXFx1MjRlNlxcdTI0ZTlcXHUyNGViXFx1MjRlZVxcdTI0ZjFcXHUyNGY1XFx1MDEwMDtmXFx1MDg5ZFxcdTI0ZTNzO1xcdTY5MWZzO1xcdTY5MWRcXHhlYlxcdTIyNTJwO1xcdTYxYWJsO1xcdTY5MzlpbTtcXHU2OTczbDtcXHU2MWEyXFx1MDE4MDthZVxcdTI0ZmZcXHUyNTAwXFx1MjUwNFxcdTZhYWJpbDtcXHU2OTE5XFx1MDEwMDtzXFx1MjUwOVxcdTI1MGFcXHU2YWFkO1xcdWMwMDBcXHUyYWFkXFx1ZmUwMFxcdTAxODBhYnJcXHUyNTE1XFx1MjUxOVxcdTI1MWRycjtcXHU2OTBjcms7XFx1Njc3MlxcdTAxMDBha1xcdTI1MjJcXHUyNTJjY1xcdTAxMDBla1xcdTI1MjhcXHUyNTJhO1xcdTQwN2I7XFx1NDA1YlxcdTAxMDBlc1xcdTI1MzFcXHUyNTMzO1xcdTY5OGJsXFx1MDEwMGR1XFx1MjUzOVxcdTI1M2I7XFx1Njk4ZjtcXHU2OThkXFx1MDIwMGFldXlcXHUyNTQ2XFx1MjU0YlxcdTI1NTZcXHUyNTU4cm9uO1xcdTQxM2VcXHUwMTAwZGlcXHUyNTUwXFx1MjU1NGlsO1xcdTQxM2NcXHhlY1xcdTA4YjBcXHhlMlxcdTI1Mjk7XFx1NDQzYlxcdTAyMDBjcXJzXFx1MjU2M1xcdTI1NjZcXHUyNTZkXFx1MjU3ZGE7XFx1NjkzNnVvXFx1MDEwMDtyXFx1MGUxOVxcdTE3NDZcXHUwMTAwZHVcXHUyNTcyXFx1MjU3N2hhcjtcXHU2OTY3c2hhcjtcXHU2OTRiaDtcXHU2MWIyXFx1MDI4MDtmZ3FzXFx1MjU4YlxcdTI1OGNcXHUwOTg5XFx1MjVmM1xcdTI1ZmZcXHU2MjY0dFxcdTAyODBhaGxydFxcdTI1OThcXHUyNWE0XFx1MjViN1xcdTI1YzJcXHUyNWU4cnJvd1xcdTAxMDA7dFxcdTA4OTlcXHUyNWExYVxceGU5XFx1MjRmNmFycG9vblxcdTAxMDBkdVxcdTI1YWZcXHUyNWI0b3duXFx4YmJcXHUwNDVhcFxceGJiXFx1MDk2NmVmdGFycm93cztcXHU2MWM3aWdodFxcdTAxODBhaHNcXHUyNWNkXFx1MjVkNlxcdTI1ZGVycm93XFx1MDEwMDtzXFx1MDhmNFxcdTA4YTdhcnBvb25cXHhmM1xcdTBmOThxdWlnYXJyb1xceGY3XFx1MjFmMGhyZWV0aW1lcztcXHU2MmNiXFx1MDE4MDtxc1xcdTI1OGJcXHUwOTkzXFx1MjVmYWxhblxceGY0XFx1MDlhY1xcdTAyODA7Y2Rnc1xcdTA5YWNcXHUyNjBhXFx1MjYwZFxcdTI2MWRcXHUyNjI4YztcXHU2YWE4b3RcXHUwMTAwO29cXHUyNjE0XFx1MjYxNVxcdTZhN2ZcXHUwMTAwO3JcXHUyNjFhXFx1MjYxYlxcdTZhODE7XFx1NmE4M1xcdTAxMDA7ZVxcdTI2MjJcXHUyNjI1XFx1YzAwMFxcdTIyZGFcXHVmZTAwcztcXHU2YTkzXFx1MDI4MGFkZWdzXFx1MjYzM1xcdTI2MzlcXHUyNjNkXFx1MjY0OVxcdTI2NGJwcHJvXFx4ZjhcXHUyNGM2b3Q7XFx1NjJkNnFcXHUwMTAwZ3FcXHUyNjQzXFx1MjY0NVxceGY0XFx1MDk4OWd0XFx4ZjJcXHUyNDhjXFx4ZjRcXHUwOTliaVxceGVkXFx1MDliMlxcdTAxODBpbHJcXHUyNjU1XFx1MDhlMVxcdTI2NWFzaHQ7XFx1Njk3YztcXHVjMDAwXFx1ZDgzNVxcdWRkMjlcXHUwMTAwO0VcXHUwOTljXFx1MjY2MztcXHU2YTkxXFx1MDE2MVxcdTI2NjlcXHUyNjc2clxcdTAxMDBkdVxcdTI1YjJcXHUyNjZlXFx1MDEwMDtsXFx1MDk2NVxcdTI2NzM7XFx1Njk2YWxrO1xcdTY1ODRjeTtcXHU0NDU5XFx1MDI4MDthY2h0XFx1MGE0OFxcdTI2ODhcXHUyNjhiXFx1MjY5MVxcdTI2OTZyXFx4ZjJcXHUyNWMxb3JuZVxceGYyXFx1MWQwOGFyZDtcXHU2OTZicmk7XFx1NjVmYVxcdTAxMDBpb1xcdTI2OWZcXHUyNmE0ZG90O1xcdTQxNDB1c3RcXHUwMTAwO2FcXHUyNmFjXFx1MjZhZFxcdTYzYjBjaGVcXHhiYlxcdTI2YWRcXHUwMjAwRWFlc1xcdTI2YmJcXHUyNmJkXFx1MjZjOVxcdTI2ZDQ7XFx1NjI2OHBcXHUwMTAwO3BcXHUyNmMzXFx1MjZjNFxcdTZhODlyb3hcXHhiYlxcdTI2YzRcXHUwMTAwO3FcXHUyNmNlXFx1MjZjZlxcdTZhODdcXHUwMTAwO3FcXHUyNmNlXFx1MjZiYmltO1xcdTYyZTZcXHUwNDAwYWJub3B0d3pcXHUyNmU5XFx1MjZmNFxcdTI2ZjdcXHUyNzFhXFx1MjcyZlxcdTI3NDFcXHUyNzQ3XFx1Mjc1MFxcdTAxMDBuclxcdTI2ZWVcXHUyNmYxZztcXHU2N2VjcjtcXHU2MWZkclxceGViXFx1MDhjMWdcXHUwMTgwbG1yXFx1MjZmZlxcdTI3MGRcXHUyNzE0ZWZ0XFx1MDEwMGFyXFx1MDllNlxcdTI3MDdpZ2h0XFx4ZTFcXHUwOWYyYXBzdG87XFx1NjdmY2lnaHRcXHhlMVxcdTA5ZmRwYXJyb3dcXHUwMTAwbHJcXHUyNzI1XFx1MjcyOWVmXFx4ZjRcXHUyNGVkaWdodDtcXHU2MWFjXFx1MDE4MGFmbFxcdTI3MzZcXHUyNzM5XFx1MjczZHI7XFx1Njk4NTtcXHVjMDAwXFx1ZDgzNVxcdWRkNWR1cztcXHU2YTJkaW1lcztcXHU2YTM0XFx1MDE2MVxcdTI3NGJcXHUyNzRmc3Q7XFx1NjIxN1xceGUxXFx1MTM0ZVxcdTAxODA7ZWZcXHUyNzU3XFx1Mjc1OFxcdTE4MDBcXHU2NWNhbmdlXFx4YmJcXHUyNzU4YXJcXHUwMTAwO2xcXHUyNzY0XFx1Mjc2NVxcdTQwMjh0O1xcdTY5OTNcXHUwMjgwYWNobXRcXHUyNzczXFx1Mjc3NlxcdTI3N2NcXHUyNzg1XFx1Mjc4N3JcXHhmMlxcdTA4YThvcm5lXFx4ZjJcXHUxZDhjYXJcXHUwMTAwO2RcXHUwZjk4XFx1Mjc4MztcXHU2OTZkO1xcdTYwMGVyaTtcXHU2MmJmXFx1MDMwMGFjaGlxdFxcdTI3OThcXHUyNzlkXFx1MGE0MFxcdTI3YTJcXHUyN2FlXFx1MjdiYnF1bztcXHU2MDM5cjtcXHVjMDAwXFx1ZDgzNVxcdWRjYzFtXFx1MDE4MDtlZ1xcdTA5YjJcXHUyN2FhXFx1MjdhYztcXHU2YThkO1xcdTZhOGZcXHUwMTAwYnVcXHUyNTJhXFx1MjdiM29cXHUwMTAwO3JcXHUwZTFmXFx1MjdiOTtcXHU2MDFhcm9rO1xcdTQxNDJcXHU4NDAwPDtjZGhpbHFyXFx1MDgyYlxcdTI3ZDJcXHUyNjM5XFx1MjdkY1xcdTI3ZTBcXHUyN2U1XFx1MjdlYVxcdTI3ZjBcXHUwMTAwY2lcXHUyN2Q3XFx1MjdkOTtcXHU2YWE2cjtcXHU2YTc5cmVcXHhlNVxcdTI1ZjJtZXM7XFx1NjJjOWFycjtcXHU2OTc2dWVzdDtcXHU2YTdiXFx1MDEwMFBpXFx1MjdmNVxcdTI3ZjlhcjtcXHU2OTk2XFx1MDE4MDtlZlxcdTI4MDBcXHUwOTJkXFx1MTgxYlxcdTY1YzNyXFx1MDEwMGR1XFx1MjgwN1xcdTI4MGRzaGFyO1xcdTY5NGFoYXI7XFx1Njk2NlxcdTAxMDBlblxcdTI4MTdcXHUyODIxcnRuZXFxO1xcdWMwMDBcXHUyMjY4XFx1ZmUwMFxceGM1XFx1MjgxZVxcdTA3MDBEYWNkZWZoaWxub3BzdVxcdTI4NDBcXHUyODQ1XFx1Mjg4MlxcdTI4OGVcXHUyODkzXFx1MjhhMFxcdTI4YTVcXHUyOGE4XFx1MjhkYVxcdTI4ZTJcXHUyOGU0XFx1MGE4M1xcdTI4ZjNcXHUyOTAyRG90O1xcdTYyM2FcXHUwMjAwY2xwclxcdTI4NGVcXHUyODUyXFx1Mjg2M1xcdTI4N2RyXFx1ODAzYlxceGFmXFx1NDBhZlxcdTAxMDBldFxcdTI4NTdcXHUyODU5O1xcdTY2NDJcXHUwMTAwO2VcXHUyODVlXFx1Mjg1ZlxcdTY3MjBzZVxceGJiXFx1Mjg1ZlxcdTAxMDA7c1xcdTEwM2JcXHUyODY4dG9cXHUwMjAwO2RsdVxcdTEwM2JcXHUyODczXFx1Mjg3N1xcdTI4N2Jvd1xceGVlXFx1MDQ4Y2VmXFx4ZjRcXHUwOTBmXFx4ZjBcXHUxM2Qxa2VyO1xcdTY1YWVcXHUwMTAwb3lcXHUyODg3XFx1Mjg4Y21tYTtcXHU2YTI5O1xcdTQ0M2Nhc2g7XFx1NjAxNGFzdXJlZGFuZ2xlXFx4YmJcXHUxNjI2cjtcXHVjMDAwXFx1ZDgzNVxcdWRkMmFvO1xcdTYxMjdcXHUwMTgwY2RuXFx1MjhhZlxcdTI4YjRcXHUyOGM5cm9cXHU4MDNiXFx4YjVcXHU0MGI1XFx1MDIwMDthY2RcXHUxNDY0XFx1MjhiZFxcdTI4YzBcXHUyOGM0c1xceGY0XFx1MTZhN2lyO1xcdTZhZjBvdFxcdTgwYmJcXHhiN1xcdTAxYjV1c1xcdTAxODA7YmRcXHUyOGQyXFx1MTkwM1xcdTI4ZDNcXHU2MjEyXFx1MDEwMDt1XFx1MWQzY1xcdTI4ZDg7XFx1NmEyYVxcdTAxNjNcXHUyOGRlXFx1MjhlMXA7XFx1NmFkYlxceGYyXFx1MjIxMlxceGYwXFx1MGE4MVxcdTAxMDBkcFxcdTI4ZTlcXHUyOGVlZWxzO1xcdTYyYTdmO1xcdWMwMDBcXHVkODM1XFx1ZGQ1ZVxcdTAxMDBjdFxcdTI4ZjhcXHUyOGZkcjtcXHVjMDAwXFx1ZDgzNVxcdWRjYzJwb3NcXHhiYlxcdTE1OWRcXHUwMTgwO2xtXFx1MjkwOVxcdTI5MGFcXHUyOTBkXFx1NDNiY3RpbWFwO1xcdTYyYjhcXHUwYzAwR0xSVmFiY2RlZmdoaWpsbW9wcnN0dXZ3XFx1Mjk0MlxcdTI5NTNcXHUyOTdlXFx1Mjk4OVxcdTI5OThcXHUyOWRhXFx1MjllOVxcdTJhMTVcXHUyYTFhXFx1MmE1OFxcdTJhNWRcXHUyYTgzXFx1MmE5NVxcdTJhYTRcXHUyYWE4XFx1MmIwNFxcdTJiMDdcXHUyYjQ0XFx1MmI3ZlxcdTJiYWVcXHUyYzM0XFx1MmM2N1xcdTJjN2NcXHUyY2U5XFx1MDEwMGd0XFx1Mjk0N1xcdTI5NGI7XFx1YzAwMFxcdTIyZDlcXHUwMzM4XFx1MDEwMDt2XFx1Mjk1MFxcdTBiY2ZcXHVjMDAwXFx1MjI2YlxcdTIwZDJcXHUwMTgwZWx0XFx1Mjk1YVxcdTI5NzJcXHUyOTc2ZnRcXHUwMTAwYXJcXHUyOTYxXFx1Mjk2N3Jyb3c7XFx1NjFjZGlnaHRhcnJvdztcXHU2MWNlO1xcdWMwMDBcXHUyMmQ4XFx1MDMzOFxcdTAxMDA7dlxcdTI5N2JcXHUwYzQ3XFx1YzAwMFxcdTIyNmFcXHUyMGQyaWdodGFycm93O1xcdTYxY2ZcXHUwMTAwRGRcXHUyOThlXFx1Mjk5M2FzaDtcXHU2MmFmYXNoO1xcdTYyYWVcXHUwMjgwYmNucHRcXHUyOWEzXFx1MjlhN1xcdTI5YWNcXHUyOWIxXFx1MjljY2xhXFx4YmJcXHUwMmRldXRlO1xcdTQxNDRnO1xcdWMwMDBcXHUyMjIwXFx1MjBkMlxcdTAyODA7RWlvcFxcdTBkODRcXHUyOWJjXFx1MjljMFxcdTI5YzVcXHUyOWM4O1xcdWMwMDBcXHUyYTcwXFx1MDMzOGQ7XFx1YzAwMFxcdTIyNGJcXHUwMzM4cztcXHU0MTQ5cm9cXHhmOFxcdTBkODR1clxcdTAxMDA7YVxcdTI5ZDNcXHUyOWQ0XFx1NjY2ZWxcXHUwMTAwO3NcXHUyOWQzXFx1MGIzOFxcdTAxZjNcXHUyOWRmXFwwXFx1MjllM3BcXHU4MGJiXFx4YTBcXHUwYjM3bXBcXHUwMTAwO2VcXHUwYmY5XFx1MGMwMFxcdTAyODBhZW91eVxcdTI5ZjRcXHUyOWZlXFx1MmEwM1xcdTJhMTBcXHUyYTEzXFx1MDFmMFxcdTI5ZjlcXDBcXHUyOWZiO1xcdTZhNDNvbjtcXHU0MTQ4ZGlsO1xcdTQxNDZuZ1xcdTAxMDA7ZFxcdTBkN2VcXHUyYTBhb3Q7XFx1YzAwMFxcdTJhNmRcXHUwMzM4cDtcXHU2YTQyO1xcdTQ0M2Rhc2g7XFx1NjAxM1xcdTAzODA7QWFkcXN4XFx1MGI5MlxcdTJhMjlcXHUyYTJkXFx1MmEzYlxcdTJhNDFcXHUyYTQ1XFx1MmE1MHJyO1xcdTYxZDdyXFx1MDEwMGhyXFx1MmEzM1xcdTJhMzZrO1xcdTY5MjRcXHUwMTAwO29cXHUxM2YyXFx1MTNmMG90O1xcdWMwMDBcXHUyMjUwXFx1MDMzOHVpXFx4ZjZcXHUwYjYzXFx1MDEwMGVpXFx1MmE0YVxcdTJhNGVhcjtcXHU2OTI4XFx4ZWRcXHUwYjk4aXN0XFx1MDEwMDtzXFx1MGJhMFxcdTBiOWZyO1xcdWMwMDBcXHVkODM1XFx1ZGQyYlxcdTAyMDBFZXN0XFx1MGJjNVxcdTJhNjZcXHUyYTc5XFx1MmE3Y1xcdTAxODA7cXNcXHUwYmJjXFx1MmE2ZFxcdTBiZTFcXHUwMTgwO3FzXFx1MGJiY1xcdTBiYzVcXHUyYTc0bGFuXFx4ZjRcXHUwYmUyaVxceGVkXFx1MGJlYVxcdTAxMDA7clxcdTBiYjZcXHUyYTgxXFx4YmJcXHUwYmI3XFx1MDE4MEFhcFxcdTJhOGFcXHUyYThkXFx1MmE5MXJcXHhmMlxcdTI5NzFycjtcXHU2MWFlYXI7XFx1NmFmMlxcdTAxODA7c3ZcXHUwZjhkXFx1MmE5Y1xcdTBmOGNcXHUwMTAwO2RcXHUyYWExXFx1MmFhMlxcdTYyZmM7XFx1NjJmYWN5O1xcdTQ0NWFcXHUwMzgwQUVhZGVzdFxcdTJhYjdcXHUyYWJhXFx1MmFiZVxcdTJhYzJcXHUyYWM1XFx1MmFmNlxcdTJhZjlyXFx4ZjJcXHUyOTY2O1xcdWMwMDBcXHUyMjY2XFx1MDMzOHJyO1xcdTYxOWFyO1xcdTYwMjVcXHUwMjAwO2Zxc1xcdTBjM2JcXHUyYWNlXFx1MmFlM1xcdTJhZWZ0XFx1MDEwMGFyXFx1MmFkNFxcdTJhZDlycm9cXHhmN1xcdTJhYzFpZ2h0YXJyb1xceGY3XFx1MmE5MFxcdTAxODA7cXNcXHUwYzNiXFx1MmFiYVxcdTJhZWFsYW5cXHhmNFxcdTBjNTVcXHUwMTAwO3NcXHUwYzU1XFx1MmFmNFxceGJiXFx1MGMzNmlcXHhlZFxcdTBjNWRcXHUwMTAwO3JcXHUwYzM1XFx1MmFmZWlcXHUwMTAwO2VcXHUwYzFhXFx1MGMyNWlcXHhlNFxcdTBkOTBcXHUwMTAwcHRcXHUyYjBjXFx1MmIxMWY7XFx1YzAwMFxcdWQ4MzVcXHVkZDVmXFx1ODE4MFxceGFjO2luXFx1MmIxOVxcdTJiMWFcXHUyYjM2XFx1NDBhY25cXHUwMjAwO0VkdlxcdTBiODlcXHUyYjI0XFx1MmIyOFxcdTJiMmU7XFx1YzAwMFxcdTIyZjlcXHUwMzM4b3Q7XFx1YzAwMFxcdTIyZjVcXHUwMzM4XFx1MDFlMVxcdTBiODlcXHUyYjMzXFx1MmIzNTtcXHU2MmY3O1xcdTYyZjZpXFx1MDEwMDt2XFx1MGNiOFxcdTJiM2NcXHUwMWUxXFx1MGNiOFxcdTJiNDFcXHUyYjQzO1xcdTYyZmU7XFx1NjJmZFxcdTAxODBhb3JcXHUyYjRiXFx1MmI2M1xcdTJiNjlyXFx1MDIwMDthc3RcXHUwYjdiXFx1MmI1NVxcdTJiNWFcXHUyYjVmbGxlXFx4ZWNcXHUwYjdibDtcXHVjMDAwXFx1MmFmZFxcdTIwZTU7XFx1YzAwMFxcdTIyMDJcXHUwMzM4bGludDtcXHU2YTE0XFx1MDE4MDtjZVxcdTBjOTJcXHUyYjcwXFx1MmI3M3VcXHhlNVxcdTBjYTVcXHUwMTAwO2NcXHUwYzk4XFx1MmI3OFxcdTAxMDA7ZVxcdTBjOTJcXHUyYjdkXFx4ZjFcXHUwYzk4XFx1MDIwMEFhaXRcXHUyYjg4XFx1MmI4YlxcdTJiOWRcXHUyYmE3clxceGYyXFx1Mjk4OHJyXFx1MDE4MDtjd1xcdTJiOTRcXHUyYjk1XFx1MmI5OVxcdTYxOWI7XFx1YzAwMFxcdTI5MzNcXHUwMzM4O1xcdWMwMDBcXHUyMTlkXFx1MDMzOGdodGFycm93XFx4YmJcXHUyYjk1cmlcXHUwMTAwO2VcXHUwY2NiXFx1MGNkNlxcdTAzODBjaGltcHF1XFx1MmJiZFxcdTJiY2RcXHUyYmQ5XFx1MmIwNFxcdTBiNzhcXHUyYmU0XFx1MmJlZlxcdTAyMDA7Y2VyXFx1MGQzMlxcdTJiYzZcXHUwZDM3XFx1MmJjOXVcXHhlNVxcdTBkNDU7XFx1YzAwMFxcdWQ4MzVcXHVkY2Mzb3J0XFx1MDI2ZFxcdTJiMDVcXDBcXDBcXHUyYmQ2YXJcXHhlMVxcdTJiNTZtXFx1MDEwMDtlXFx1MGQ2ZVxcdTJiZGZcXHUwMTAwO3FcXHUwZDc0XFx1MGQ3M3N1XFx1MDEwMGJwXFx1MmJlYlxcdTJiZWRcXHhlNVxcdTBjZjhcXHhlNVxcdTBkMGJcXHUwMTgwYmNwXFx1MmJmNlxcdTJjMTFcXHUyYzE5XFx1MDIwMDtFZXNcXHUyYmZmXFx1MmMwMFxcdTBkMjJcXHUyYzA0XFx1NjI4NDtcXHVjMDAwXFx1MmFjNVxcdTAzMzhldFxcdTAxMDA7ZVxcdTBkMWJcXHUyYzBicVxcdTAxMDA7cVxcdTBkMjNcXHUyYzAwY1xcdTAxMDA7ZVxcdTBkMzJcXHUyYzE3XFx4ZjFcXHUwZDM4XFx1MDIwMDtFZXNcXHUyYzIyXFx1MmMyM1xcdTBkNWZcXHUyYzI3XFx1NjI4NTtcXHVjMDAwXFx1MmFjNlxcdTAzMzhldFxcdTAxMDA7ZVxcdTBkNThcXHUyYzJlcVxcdTAxMDA7cVxcdTBkNjBcXHUyYzIzXFx1MDIwMGdpbHJcXHUyYzNkXFx1MmMzZlxcdTJjNDVcXHUyYzQ3XFx4ZWNcXHUwYmQ3bGRlXFx1ODAzYlxceGYxXFx1NDBmMVxceGU3XFx1MGM0M2lhbmdsZVxcdTAxMDBsclxcdTJjNTJcXHUyYzVjZWZ0XFx1MDEwMDtlXFx1MGMxYVxcdTJjNWFcXHhmMVxcdTBjMjZpZ2h0XFx1MDEwMDtlXFx1MGNjYlxcdTJjNjVcXHhmMVxcdTBjZDdcXHUwMTAwO21cXHUyYzZjXFx1MmM2ZFxcdTQzYmRcXHUwMTgwO2VzXFx1MmM3NFxcdTJjNzVcXHUyYzc5XFx1NDAyM3JvO1xcdTYxMTZwO1xcdTYwMDdcXHUwNDgwREhhZGdpbHJzXFx1MmM4ZlxcdTJjOTRcXHUyYzk5XFx1MmM5ZVxcdTJjYTNcXHUyY2IwXFx1MmNiNlxcdTJjZDNcXHUyY2UzYXNoO1xcdTYyYWRhcnI7XFx1NjkwNHA7XFx1YzAwMFxcdTIyNGRcXHUyMGQyYXNoO1xcdTYyYWNcXHUwMTAwZXRcXHUyY2E4XFx1MmNhYztcXHVjMDAwXFx1MjI2NVxcdTIwZDI7XFx1YzAwMD5cXHUyMGQybmZpbjtcXHU2OWRlXFx1MDE4MEFldFxcdTJjYmRcXHUyY2MxXFx1MmNjNXJyO1xcdTY5MDI7XFx1YzAwMFxcdTIyNjRcXHUyMGQyXFx1MDEwMDtyXFx1MmNjYVxcdTJjY2RcXHVjMDAwPFxcdTIwZDJpZTtcXHVjMDAwXFx1MjJiNFxcdTIwZDJcXHUwMTAwQXRcXHUyY2Q4XFx1MmNkY3JyO1xcdTY5MDNyaWU7XFx1YzAwMFxcdTIyYjVcXHUyMGQyaW07XFx1YzAwMFxcdTIyM2NcXHUyMGQyXFx1MDE4MEFhblxcdTJjZjBcXHUyY2Y0XFx1MmQwMnJyO1xcdTYxZDZyXFx1MDEwMGhyXFx1MmNmYVxcdTJjZmRrO1xcdTY5MjNcXHUwMTAwO29cXHUxM2U3XFx1MTNlNWVhcjtcXHU2OTI3XFx1MTI1M1xcdTFhOTVcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXHUyZDJkXFwwXFx1MmQzOFxcdTJkNDhcXHUyZDYwXFx1MmQ2NVxcdTJkNzJcXHUyZDg0XFx1MWIwN1xcMFxcMFxcdTJkOGRcXHUyZGFiXFwwXFx1MmRjOFxcdTJkY2VcXDBcXHUyZGRjXFx1MmUxOVxcdTJlMmJcXHUyZTNlXFx1MmU0M1xcdTAxMDBjc1xcdTJkMzFcXHUxYTk3dXRlXFx1ODAzYlxceGYzXFx1NDBmM1xcdTAxMDBpeVxcdTJkM2NcXHUyZDQ1clxcdTAxMDA7Y1xcdTFhOWVcXHUyZDQyXFx1ODAzYlxceGY0XFx1NDBmNDtcXHU0NDNlXFx1MDI4MGFiaW9zXFx1MWFhMFxcdTJkNTJcXHUyZDU3XFx1MDFjOFxcdTJkNWFsYWM7XFx1NDE1MXY7XFx1NmEzOG9sZDtcXHU2OWJjbGlnO1xcdTQxNTNcXHUwMTAwY3JcXHUyZDY5XFx1MmQ2ZGlyO1xcdTY5YmY7XFx1YzAwMFxcdWQ4MzVcXHVkZDJjXFx1MDM2ZlxcdTJkNzlcXDBcXDBcXHUyZDdjXFwwXFx1MmQ4Mm47XFx1NDJkYmF2ZVxcdTgwM2JcXHhmMlxcdTQwZjI7XFx1NjljMVxcdTAxMDBibVxcdTJkODhcXHUwZGY0YXI7XFx1NjliNVxcdTAyMDBhY2l0XFx1MmQ5NVxcdTJkOThcXHUyZGE1XFx1MmRhOHJcXHhmMlxcdTFhODBcXHUwMTAwaXJcXHUyZDlkXFx1MmRhMHI7XFx1NjliZW9zcztcXHU2OWJiblxceGU1XFx1MGU1MjtcXHU2OWMwXFx1MDE4MGFlaVxcdTJkYjFcXHUyZGI1XFx1MmRiOWNyO1xcdTQxNGRnYTtcXHU0M2M5XFx1MDE4MGNkblxcdTJkYzBcXHUyZGM1XFx1MDFjZHJvbjtcXHU0M2JmO1xcdTY5YjZwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNjBcXHUwMTgwYWVsXFx1MmRkNFxcdTJkZDdcXHUwMWQycjtcXHU2OWI3cnA7XFx1NjliOVxcdTAzODA7YWRpb3N2XFx1MmRlYVxcdTJkZWJcXHUyZGVlXFx1MmUwOFxcdTJlMGRcXHUyZTEwXFx1MmUxNlxcdTYyMjhyXFx4ZjJcXHUxYTg2XFx1MDIwMDtlZm1cXHUyZGY3XFx1MmRmOFxcdTJlMDJcXHUyZTA1XFx1NmE1ZHJcXHUwMTAwO29cXHUyZGZlXFx1MmRmZlxcdTYxMzRmXFx4YmJcXHUyZGZmXFx1ODAzYlxceGFhXFx1NDBhYVxcdTgwM2JcXHhiYVxcdTQwYmFnb2Y7XFx1NjJiNnI7XFx1NmE1NmxvcGU7XFx1NmE1NztcXHU2YTViXFx1MDE4MGNsb1xcdTJlMWZcXHUyZTIxXFx1MmUyN1xceGYyXFx1MmUwMWFzaFxcdTgwM2JcXHhmOFxcdTQwZjhsO1xcdTYyOThpXFx1MDE2Y1xcdTJlMmZcXHUyZTM0ZGVcXHU4MDNiXFx4ZjVcXHU0MGY1ZXNcXHUwMTAwO2FcXHUwMWRiXFx1MmUzYXM7XFx1NmEzNm1sXFx1ODAzYlxceGY2XFx1NDBmNmJhcjtcXHU2MzNkXFx1MGFlMVxcdTJlNWVcXDBcXHUyZTdkXFwwXFx1MmU4MFxcdTJlOWRcXDBcXHUyZWEyXFx1MmViOVxcMFxcMFxcdTJlY2JcXHUwZTljXFwwXFx1MmYxM1xcMFxcMFxcdTJmMmJcXHUyZmJjXFwwXFx1MmZjOHJcXHUwMjAwO2FzdFxcdTA0MDNcXHUyZTY3XFx1MmU3MlxcdTBlODVcXHU4MTAwXFx4YjY7bFxcdTJlNmRcXHUyZTZlXFx1NDBiNmxlXFx4ZWNcXHUwNDAzXFx1MDI2OVxcdTJlNzhcXDBcXDBcXHUyZTdibTtcXHU2YWYzO1xcdTZhZmR5O1xcdTQ0M2ZyXFx1MDI4MGNpbXB0XFx1MmU4YlxcdTJlOGZcXHUyZTkzXFx1MTg2NVxcdTJlOTdudDtcXHU0MDI1b2Q7XFx1NDAyZWlsO1xcdTYwMzBlbms7XFx1NjAzMXI7XFx1YzAwMFxcdWQ4MzVcXHVkZDJkXFx1MDE4MGltb1xcdTJlYThcXHUyZWIwXFx1MmViNFxcdTAxMDA7dlxcdTJlYWRcXHUyZWFlXFx1NDNjNjtcXHU0M2Q1bWFcXHhmNFxcdTBhNzZuZTtcXHU2NjBlXFx1MDE4MDt0dlxcdTJlYmZcXHUyZWMwXFx1MmVjOFxcdTQzYzBjaGZvcmtcXHhiYlxcdTFmZmQ7XFx1NDNkNlxcdTAxMDBhdVxcdTJlY2ZcXHUyZWRmblxcdTAxMDBja1xcdTJlZDVcXHUyZWRka1xcdTAxMDA7aFxcdTIxZjRcXHUyZWRiO1xcdTYxMGVcXHhmNlxcdTIxZjRzXFx1MDQ4MDthYmNkZW1zdFxcdTJlZjNcXHUyZWY0XFx1MTkwOFxcdTJlZjlcXHUyZWZkXFx1MmYwNFxcdTJmMDZcXHUyZjBhXFx1MmYwZVxcdTQwMmJjaXI7XFx1NmEyM2lyO1xcdTZhMjJcXHUwMTAwb3VcXHUxZDQwXFx1MmYwMjtcXHU2YTI1O1xcdTZhNzJuXFx1ODBiYlxceGIxXFx1MGU5ZGltO1xcdTZhMjZ3bztcXHU2YTI3XFx1MDE4MGlwdVxcdTJmMTlcXHUyZjIwXFx1MmYyNW50aW50O1xcdTZhMTVmO1xcdWMwMDBcXHVkODM1XFx1ZGQ2MW5kXFx1ODAzYlxceGEzXFx1NDBhM1xcdTA1MDA7RWFjZWlub3N1XFx1MGVjOFxcdTJmM2ZcXHUyZjQxXFx1MmY0NFxcdTJmNDdcXHUyZjgxXFx1MmY4OVxcdTJmOTJcXHUyZjdlXFx1MmZiNjtcXHU2YWIzcDtcXHU2YWI3dVxceGU1XFx1MGVkOVxcdTAxMDA7Y1xcdTBlY2VcXHUyZjRjXFx1MDMwMDthY2Vuc1xcdTBlYzhcXHUyZjU5XFx1MmY1ZlxcdTJmNjZcXHUyZjY4XFx1MmY3ZXBwcm9cXHhmOFxcdTJmNDN1cmx5ZVxceGYxXFx1MGVkOVxceGYxXFx1MGVjZVxcdTAxODBhZXNcXHUyZjZmXFx1MmY3NlxcdTJmN2FwcHJveDtcXHU2YWI5cXE7XFx1NmFiNWltO1xcdTYyZThpXFx4ZWRcXHUwZWRmbWVcXHUwMTAwO3NcXHUyZjg4XFx1MGVhZVxcdTYwMzJcXHUwMTgwRWFzXFx1MmY3OFxcdTJmOTBcXHUyZjdhXFx4ZjBcXHUyZjc1XFx1MDE4MGRmcFxcdTBlZWNcXHUyZjk5XFx1MmZhZlxcdTAxODBhbHNcXHUyZmEwXFx1MmZhNVxcdTJmYWFsYXI7XFx1NjMyZWluZTtcXHU2MzEydXJmO1xcdTYzMTNcXHUwMTAwO3RcXHUwZWZiXFx1MmZiNFxceGVmXFx1MGVmYnJlbDtcXHU2MmIwXFx1MDEwMGNpXFx1MmZjMFxcdTJmYzVyO1xcdWMwMDBcXHVkODM1XFx1ZGNjNTtcXHU0M2M4bmNzcDtcXHU2MDA4XFx1MDMwMGZpb3BzdVxcdTJmZGFcXHUyMmUyXFx1MmZkZlxcdTJmZTVcXHUyZmViXFx1MmZmMXI7XFx1YzAwMFxcdWQ4MzVcXHVkZDJlcGY7XFx1YzAwMFxcdWQ4MzVcXHVkZDYycmltZTtcXHU2MDU3Y3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2M2XFx1MDE4MGFlb1xcdTJmZjhcXHUzMDA5XFx1MzAxM3RcXHUwMTAwZWlcXHUyZmZlXFx1MzAwNXJuaW9uXFx4ZjNcXHUwNmIwbnQ7XFx1NmExNnN0XFx1MDEwMDtlXFx1MzAxMFxcdTMwMTFcXHU0MDNmXFx4ZjFcXHUxZjE5XFx4ZjRcXHUwZjE0XFx1MGE4MEFCSGFiY2RlZmhpbG1ub3Byc3R1eFxcdTMwNDBcXHUzMDUxXFx1MzA1NVxcdTMwNTlcXHUzMGUwXFx1MzEwZVxcdTMxMmJcXHUzMTQ3XFx1MzE2MlxcdTMxNzJcXHUzMThlXFx1MzIwNlxcdTMyMTVcXHUzMjI0XFx1MzIyOVxcdTMyNThcXHUzMjZlXFx1MzI3MlxcdTMyOTBcXHUzMmIwXFx1MzJiN1xcdTAxODBhcnRcXHUzMDQ3XFx1MzA0YVxcdTMwNGNyXFx4ZjJcXHUxMGIzXFx4ZjJcXHUwM2RkYWlsO1xcdTY5MWNhclxceGYyXFx1MWM2NWFyO1xcdTY5NjRcXHUwMzgwY2RlbnFydFxcdTMwNjhcXHUzMDc1XFx1MzA3OFxcdTMwN2ZcXHUzMDhmXFx1MzA5NFxcdTMwY2NcXHUwMTAwZXVcXHUzMDZkXFx1MzA3MTtcXHVjMDAwXFx1MjIzZFxcdTAzMzF0ZTtcXHU0MTU1aVxceGUzXFx1MTE2ZW1wdHl2O1xcdTY5YjNnXFx1MDIwMDtkZWxcXHUwZmQxXFx1MzA4OVxcdTMwOGJcXHUzMDhkO1xcdTY5OTI7XFx1NjlhNVxceGU1XFx1MGZkMXVvXFx1ODAzYlxceGJiXFx1NDBiYnJcXHUwNTgwO2FiY2ZobHBzdHdcXHUwZmRjXFx1MzBhY1xcdTMwYWZcXHUzMGI3XFx1MzBiOVxcdTMwYmNcXHUzMGJlXFx1MzBjMFxcdTMwYzNcXHUzMGM3XFx1MzBjYXA7XFx1Njk3NVxcdTAxMDA7ZlxcdTBmZTBcXHUzMGI0cztcXHU2OTIwO1xcdTY5MzNzO1xcdTY5MWVcXHhlYlxcdTIyNWRcXHhmMFxcdTI3MmVsO1xcdTY5NDVpbTtcXHU2OTc0bDtcXHU2MWEzO1xcdTYxOWRcXHUwMTAwYWlcXHUzMGQxXFx1MzBkNWlsO1xcdTY5MWFvXFx1MDEwMDtuXFx1MzBkYlxcdTMwZGNcXHU2MjM2YWxcXHhmM1xcdTBmMWVcXHUwMTgwYWJyXFx1MzBlN1xcdTMwZWFcXHUzMGVlclxceGYyXFx1MTdlNXJrO1xcdTY3NzNcXHUwMTAwYWtcXHUzMGYzXFx1MzBmZGNcXHUwMTAwZWtcXHUzMGY5XFx1MzBmYjtcXHU0MDdkO1xcdTQwNWRcXHUwMTAwZXNcXHUzMTAyXFx1MzEwNDtcXHU2OThjbFxcdTAxMDBkdVxcdTMxMGFcXHUzMTBjO1xcdTY5OGU7XFx1Njk5MFxcdTAyMDBhZXV5XFx1MzExN1xcdTMxMWNcXHUzMTI3XFx1MzEyOXJvbjtcXHU0MTU5XFx1MDEwMGRpXFx1MzEyMVxcdTMxMjVpbDtcXHU0MTU3XFx4ZWNcXHUwZmYyXFx4ZTJcXHUzMGZhO1xcdTQ0NDBcXHUwMjAwY2xxc1xcdTMxMzRcXHUzMTM3XFx1MzEzZFxcdTMxNDRhO1xcdTY5MzdkaGFyO1xcdTY5Njl1b1xcdTAxMDA7clxcdTAyMGVcXHUwMjBkaDtcXHU2MWIzXFx1MDE4MGFjZ1xcdTMxNGVcXHUzMTVmXFx1MGY0NGxcXHUwMjAwO2lwc1xcdTBmNzhcXHUzMTU4XFx1MzE1YlxcdTEwOWNuXFx4ZTVcXHUxMGJiYXJcXHhmNFxcdTBmYTl0O1xcdTY1YWRcXHUwMTgwaWxyXFx1MzE2OVxcdTEwMjNcXHUzMTZlc2h0O1xcdTY5N2Q7XFx1YzAwMFxcdWQ4MzVcXHVkZDJmXFx1MDEwMGFvXFx1MzE3N1xcdTMxODZyXFx1MDEwMGR1XFx1MzE3ZFxcdTMxN2ZcXHhiYlxcdTA0N2JcXHUwMTAwO2xcXHUxMDkxXFx1MzE4NDtcXHU2OTZjXFx1MDEwMDt2XFx1MzE4YlxcdTMxOGNcXHU0M2MxO1xcdTQzZjFcXHUwMTgwZ25zXFx1MzE5NVxcdTMxZjlcXHUzMWZjaHRcXHUwMzAwYWhscnN0XFx1MzFhNFxcdTMxYjBcXHUzMWMyXFx1MzFkOFxcdTMxZTRcXHUzMWVlcnJvd1xcdTAxMDA7dFxcdTBmZGNcXHUzMWFkYVxceGU5XFx1MzBjOGFycG9vblxcdTAxMDBkdVxcdTMxYmJcXHUzMWJmb3dcXHhlZVxcdTMxN2VwXFx4YmJcXHUxMDkyZWZ0XFx1MDEwMGFoXFx1MzFjYVxcdTMxZDBycm93XFx4ZjNcXHUwZmVhYXJwb29uXFx4ZjNcXHUwNTUxaWdodGFycm93cztcXHU2MWM5cXVpZ2Fycm9cXHhmN1xcdTMwY2JocmVldGltZXM7XFx1NjJjY2c7XFx1NDJkYWluZ2RvdHNlXFx4ZjFcXHUxZjMyXFx1MDE4MGFobVxcdTMyMGRcXHUzMjEwXFx1MzIxM3JcXHhmMlxcdTBmZWFhXFx4ZjJcXHUwNTUxO1xcdTYwMGZvdXN0XFx1MDEwMDthXFx1MzIxZVxcdTMyMWZcXHU2M2IxY2hlXFx4YmJcXHUzMjFmbWlkO1xcdTZhZWVcXHUwMjAwYWJwdFxcdTMyMzJcXHUzMjNkXFx1MzI0MFxcdTMyNTJcXHUwMTAwbnJcXHUzMjM3XFx1MzIzYWc7XFx1NjdlZHI7XFx1NjFmZXJcXHhlYlxcdTEwMDNcXHUwMTgwYWZsXFx1MzI0N1xcdTMyNGFcXHUzMjRlcjtcXHU2OTg2O1xcdWMwMDBcXHVkODM1XFx1ZGQ2M3VzO1xcdTZhMmVpbWVzO1xcdTZhMzVcXHUwMTAwYXBcXHUzMjVkXFx1MzI2N3JcXHUwMTAwO2dcXHUzMjYzXFx1MzI2NFxcdTQwMjl0O1xcdTY5OTRvbGludDtcXHU2YTEyYXJcXHhmMlxcdTMxZTNcXHUwMjAwYWNocVxcdTMyN2JcXHUzMjgwXFx1MTBiY1xcdTMyODVxdW87XFx1NjAzYXI7XFx1YzAwMFxcdWQ4MzVcXHVkY2M3XFx1MDEwMGJ1XFx1MzBmYlxcdTMyOGFvXFx1MDEwMDtyXFx1MDIxNFxcdTAyMTNcXHUwMTgwaGlyXFx1MzI5N1xcdTMyOWJcXHUzMmEwcmVcXHhlNVxcdTMxZjhtZXM7XFx1NjJjYWlcXHUwMjAwO2VmbFxcdTMyYWFcXHUxMDU5XFx1MTgyMVxcdTMyYWJcXHU2NWI5dHJpO1xcdTY5Y2VsdWhhcjtcXHU2OTY4O1xcdTYxMWVcXHUwZDYxXFx1MzJkNVxcdTMyZGJcXHUzMmRmXFx1MzMyY1xcdTMzMzhcXHUzMzcxXFwwXFx1MzM3YVxcdTMzYTRcXDBcXDBcXHUzM2VjXFx1MzNmMFxcMFxcdTM0MjhcXHUzNDQ4XFx1MzQ1YVxcdTM0YWRcXHUzNGIxXFx1MzRjYVxcdTM0ZjFcXDBcXHUzNjE2XFwwXFwwXFx1MzYzM2N1dGU7XFx1NDE1YnF1XFx4ZWZcXHUyN2JhXFx1MDUwMDtFYWNlaW5wc3lcXHUxMWVkXFx1MzJmM1xcdTMyZjVcXHUzMmZmXFx1MzMwMlxcdTMzMGJcXHUzMzBmXFx1MzMxZlxcdTMzMjZcXHUzMzI5O1xcdTZhYjRcXHUwMWYwXFx1MzJmYVxcMFxcdTMyZmM7XFx1NmFiOG9uO1xcdTQxNjF1XFx4ZTVcXHUxMWZlXFx1MDEwMDtkXFx1MTFmM1xcdTMzMDdpbDtcXHU0MTVmcmM7XFx1NDE1ZFxcdTAxODBFYXNcXHUzMzE2XFx1MzMxOFxcdTMzMWI7XFx1NmFiNnA7XFx1NmFiYWltO1xcdTYyZTlvbGludDtcXHU2YTEzaVxceGVkXFx1MTIwNDtcXHU0NDQxb3RcXHUwMTgwO2JlXFx1MzMzNFxcdTFkNDdcXHUzMzM1XFx1NjJjNTtcXHU2YTY2XFx1MDM4MEFhY21zdHhcXHUzMzQ2XFx1MzM0YVxcdTMzNTdcXHUzMzViXFx1MzM1ZVxcdTMzNjNcXHUzMzZkcnI7XFx1NjFkOHJcXHUwMTAwaHJcXHUzMzUwXFx1MzM1MlxceGViXFx1MjIyOFxcdTAxMDA7b1xcdTBhMzZcXHUwYTM0dFxcdTgwM2JcXHhhN1xcdTQwYTdpO1xcdTQwM2J3YXI7XFx1NjkyOW1cXHUwMTAwaW5cXHUzMzY5XFx4ZjBudVxceGYzXFx4ZjF0O1xcdTY3MzZyXFx1MDEwMDtvXFx1MzM3NlxcdTIwNTVcXHVjMDAwXFx1ZDgzNVxcdWRkMzBcXHUwMjAwYWNveVxcdTMzODJcXHUzMzg2XFx1MzM5MVxcdTMzYTBycDtcXHU2NjZmXFx1MDEwMGh5XFx1MzM4YlxcdTMzOGZjeTtcXHU0NDQ5O1xcdTQ0NDhydFxcdTAyNmRcXHUzMzk5XFwwXFwwXFx1MzM5Y2lcXHhlNFxcdTE0NjRhcmFcXHhlY1xcdTJlNmZcXHU4MDNiXFx4YWRcXHU0MGFkXFx1MDEwMGdtXFx1MzNhOFxcdTMzYjRtYVxcdTAxODA7ZnZcXHUzM2IxXFx1MzNiMlxcdTMzYjJcXHU0M2MzO1xcdTQzYzJcXHUwNDAwO2RlZ2xucHJcXHUxMmFiXFx1MzNjNVxcdTMzYzlcXHUzM2NlXFx1MzNkNlxcdTMzZGVcXHUzM2UxXFx1MzNlNm90O1xcdTZhNmFcXHUwMTAwO3FcXHUxMmIxXFx1MTJiMFxcdTAxMDA7RVxcdTMzZDNcXHUzM2Q0XFx1NmE5ZTtcXHU2YWEwXFx1MDEwMDtFXFx1MzNkYlxcdTMzZGNcXHU2YTlkO1xcdTZhOWZlO1xcdTYyNDZsdXM7XFx1NmEyNGFycjtcXHU2OTcyYXJcXHhmMlxcdTExM2RcXHUwMjAwYWVpdFxcdTMzZjhcXHUzNDA4XFx1MzQwZlxcdTM0MTdcXHUwMTAwbHNcXHUzM2ZkXFx1MzQwNGxzZXRtXFx4ZTlcXHUzMzZhaHA7XFx1NmEzM3BhcnNsO1xcdTY5ZTRcXHUwMTAwZGxcXHUxNDYzXFx1MzQxNGU7XFx1NjMyM1xcdTAxMDA7ZVxcdTM0MWNcXHUzNDFkXFx1NmFhYVxcdTAxMDA7c1xcdTM0MjJcXHUzNDIzXFx1NmFhYztcXHVjMDAwXFx1MmFhY1xcdWZlMDBcXHUwMTgwZmxwXFx1MzQyZVxcdTM0MzNcXHUzNDQydGN5O1xcdTQ0NGNcXHUwMTAwO2JcXHUzNDM4XFx1MzQzOVxcdTQwMmZcXHUwMTAwO2FcXHUzNDNlXFx1MzQzZlxcdTY5YzRyO1xcdTYzM2ZmO1xcdWMwMDBcXHVkODM1XFx1ZGQ2NGFcXHUwMTAwZHJcXHUzNDRkXFx1MDQwMmVzXFx1MDEwMDt1XFx1MzQ1NFxcdTM0NTVcXHU2NjYwaXRcXHhiYlxcdTM0NTVcXHUwMTgwY3N1XFx1MzQ2MFxcdTM0NzlcXHUzNDlmXFx1MDEwMGF1XFx1MzQ2NVxcdTM0NmZwXFx1MDEwMDtzXFx1MTE4OFxcdTM0NmI7XFx1YzAwMFxcdTIyOTNcXHVmZTAwcFxcdTAxMDA7c1xcdTExYjRcXHUzNDc1O1xcdWMwMDBcXHUyMjk0XFx1ZmUwMHVcXHUwMTAwYnBcXHUzNDdmXFx1MzQ4ZlxcdTAxODA7ZXNcXHUxMTk3XFx1MTE5Y1xcdTM0ODZldFxcdTAxMDA7ZVxcdTExOTdcXHUzNDhkXFx4ZjFcXHUxMTlkXFx1MDE4MDtlc1xcdTExYThcXHUxMWFkXFx1MzQ5NmV0XFx1MDEwMDtlXFx1MTFhOFxcdTM0OWRcXHhmMVxcdTExYWVcXHUwMTgwO2FmXFx1MTE3YlxcdTM0YTZcXHUwNWIwclxcdTAxNjVcXHUzNGFiXFx1MDViMVxceGJiXFx1MTE3Y2FyXFx4ZjJcXHUxMTQ4XFx1MDIwMGNlbXRcXHUzNGI5XFx1MzRiZVxcdTM0YzJcXHUzNGM1cjtcXHVjMDAwXFx1ZDgzNVxcdWRjYzh0bVxceGVlXFx4ZjFpXFx4ZWNcXHUzNDE1YXJcXHhlNlxcdTExYmVcXHUwMTAwYXJcXHUzNGNlXFx1MzRkNXJcXHUwMTAwO2ZcXHUzNGQ0XFx1MTdiZlxcdTY2MDZcXHUwMTAwYW5cXHUzNGRhXFx1MzRlZGlnaHRcXHUwMTAwZXBcXHUzNGUzXFx1MzRlYXBzaWxvXFx4ZWVcXHUxZWUwaFxceGU5XFx1MmVhZnNcXHhiYlxcdTI4NTJcXHUwMjgwYmNtbnBcXHUzNGZiXFx1MzU1ZVxcdTEyMDlcXHUzNThiXFx1MzU4ZVxcdTA0ODA7RWRlbW5wcnNcXHUzNTBlXFx1MzUwZlxcdTM1MTFcXHUzNTE1XFx1MzUxZVxcdTM1MjNcXHUzNTJjXFx1MzUzMVxcdTM1MzZcXHU2MjgyO1xcdTZhYzVvdDtcXHU2YWJkXFx1MDEwMDtkXFx1MTFkYVxcdTM1MWFvdDtcXHU2YWMzdWx0O1xcdTZhYzFcXHUwMTAwRWVcXHUzNTI4XFx1MzUyYTtcXHU2YWNiO1xcdTYyOGFsdXM7XFx1NmFiZmFycjtcXHU2OTc5XFx1MDE4MGVpdVxcdTM1M2RcXHUzNTUyXFx1MzU1NXRcXHUwMTgwO2VuXFx1MzUwZVxcdTM1NDVcXHUzNTRicVxcdTAxMDA7cVxcdTExZGFcXHUzNTBmZXFcXHUwMTAwO3FcXHUzNTJiXFx1MzUyOG07XFx1NmFjN1xcdTAxMDBicFxcdTM1NWFcXHUzNTVjO1xcdTZhZDU7XFx1NmFkM2NcXHUwMzAwO2FjZW5zXFx1MTFlZFxcdTM1NmNcXHUzNTcyXFx1MzU3OVxcdTM1N2JcXHUzMzI2cHByb1xceGY4XFx1MzJmYXVybHllXFx4ZjFcXHUxMWZlXFx4ZjFcXHUxMWYzXFx1MDE4MGFlc1xcdTM1ODJcXHUzNTg4XFx1MzMxYnBwcm9cXHhmOFxcdTMzMWFxXFx4ZjFcXHUzMzE3ZztcXHU2NjZhXFx1MDY4MDEyMztFZGVobG1ucHNcXHUzNWE5XFx1MzVhY1xcdTM1YWZcXHUxMjFjXFx1MzViMlxcdTM1YjRcXHUzNWMwXFx1MzVjOVxcdTM1ZDVcXHUzNWRhXFx1MzVkZlxcdTM1ZThcXHUzNWVkXFx1ODAzYlxceGI5XFx1NDBiOVxcdTgwM2JcXHhiMlxcdTQwYjJcXHU4MDNiXFx4YjNcXHU0MGIzO1xcdTZhYzZcXHUwMTAwb3NcXHUzNWI5XFx1MzViY3Q7XFx1NmFiZXViO1xcdTZhZDhcXHUwMTAwO2RcXHUxMjIyXFx1MzVjNW90O1xcdTZhYzRzXFx1MDEwMG91XFx1MzVjZlxcdTM1ZDJsO1xcdTY3YzliO1xcdTZhZDdhcnI7XFx1Njk3YnVsdDtcXHU2YWMyXFx1MDEwMEVlXFx1MzVlNFxcdTM1ZTY7XFx1NmFjYztcXHU2MjhibHVzO1xcdTZhYzBcXHUwMTgwZWl1XFx1MzVmNFxcdTM2MDlcXHUzNjBjdFxcdTAxODA7ZW5cXHUxMjFjXFx1MzVmY1xcdTM2MDJxXFx1MDEwMDtxXFx1MTIyMlxcdTM1YjJlcVxcdTAxMDA7cVxcdTM1ZTdcXHUzNWU0bTtcXHU2YWM4XFx1MDEwMGJwXFx1MzYxMVxcdTM2MTM7XFx1NmFkNDtcXHU2YWQ2XFx1MDE4MEFhblxcdTM2MWNcXHUzNjIwXFx1MzYyZHJyO1xcdTYxZDlyXFx1MDEwMGhyXFx1MzYyNlxcdTM2MjhcXHhlYlxcdTIyMmVcXHUwMTAwO29cXHUwYTJiXFx1MGEyOXdhcjtcXHU2OTJhbGlnXFx1ODAzYlxceGRmXFx1NDBkZlxcdTBiZTFcXHUzNjUxXFx1MzY1ZFxcdTM2NjBcXHUxMmNlXFx1MzY3M1xcdTM2NzlcXDBcXHUzNjdlXFx1MzZjMlxcMFxcMFxcMFxcMFxcMFxcdTM2ZGJcXHUzNzAzXFwwXFx1MzcwOVxcdTM3NmNcXDBcXDBcXDBcXHUzNzg3XFx1MDI3MlxcdTM2NTZcXDBcXDBcXHUzNjViZ2V0O1xcdTYzMTY7XFx1NDNjNHJcXHhlYlxcdTBlNWZcXHUwMTgwYWV5XFx1MzY2NlxcdTM2NmJcXHUzNjcwcm9uO1xcdTQxNjVkaWw7XFx1NDE2MztcXHU0NDQybHJlYztcXHU2MzE1cjtcXHVjMDAwXFx1ZDgzNVxcdWRkMzFcXHUwMjAwZWlrb1xcdTM2ODZcXHUzNjlkXFx1MzZiNVxcdTM2YmNcXHUwMWYyXFx1MzY4YlxcMFxcdTM2OTFlXFx1MDEwMDRmXFx1MTI4NFxcdTEyODFhXFx1MDE4MDtzdlxcdTM2OThcXHUzNjk5XFx1MzY5YlxcdTQzYjh5bTtcXHU0M2QxXFx1MDEwMGNuXFx1MzZhMlxcdTM2YjJrXFx1MDEwMGFzXFx1MzZhOFxcdTM2YWVwcHJvXFx4ZjhcXHUxMmMxaW1cXHhiYlxcdTEyYWNzXFx4ZjBcXHUxMjllXFx1MDEwMGFzXFx1MzZiYVxcdTM2YWVcXHhmMFxcdTEyYzFyblxcdTgwM2JcXHhmZVxcdTQwZmVcXHUwMWVjXFx1MDMxZlxcdTM2YzZcXHUyMmU3ZXNcXHU4MTgwXFx4ZDc7YmRcXHUzNmNmXFx1MzZkMFxcdTM2ZDhcXHU0MGQ3XFx1MDEwMDthXFx1MTkwZlxcdTM2ZDVyO1xcdTZhMzE7XFx1NmEzMFxcdTAxODBlcHNcXHUzNmUxXFx1MzZlM1xcdTM3MDBcXHhlMVxcdTJhNGRcXHUwMjAwO2JjZlxcdTA0ODZcXHUzNmVjXFx1MzZmMFxcdTM2ZjRvdDtcXHU2MzM2aXI7XFx1NmFmMVxcdTAxMDA7b1xcdTM2ZjlcXHUzNmZjXFx1YzAwMFxcdWQ4MzVcXHVkZDY1cms7XFx1NmFkYVxceGUxXFx1MzM2MnJpbWU7XFx1NjAzNFxcdTAxODBhaXBcXHUzNzBmXFx1MzcxMlxcdTM3NjRkXFx4ZTVcXHUxMjQ4XFx1MDM4MGFkZW1wc3RcXHUzNzIxXFx1Mzc0ZFxcdTM3NDBcXHUzNzUxXFx1Mzc1N1xcdTM3NWNcXHUzNzVmbmdsZVxcdTAyODA7ZGxxclxcdTM3MzBcXHUzNzMxXFx1MzczNlxcdTM3NDBcXHUzNzQyXFx1NjViNW93blxceGJiXFx1MWRiYmVmdFxcdTAxMDA7ZVxcdTI4MDBcXHUzNzNlXFx4ZjFcXHUwOTJlO1xcdTYyNWNpZ2h0XFx1MDEwMDtlXFx1MzJhYVxcdTM3NGJcXHhmMVxcdTEwNWFvdDtcXHU2NWVjaW51cztcXHU2YTNhbHVzO1xcdTZhMzliO1xcdTY5Y2RpbWU7XFx1NmEzYmV6aXVtO1xcdTYzZTJcXHUwMTgwY2h0XFx1Mzc3MlxcdTM3N2RcXHUzNzgxXFx1MDEwMHJ5XFx1Mzc3N1xcdTM3N2I7XFx1YzAwMFxcdWQ4MzVcXHVkY2M5O1xcdTQ0NDZjeTtcXHU0NDVicm9rO1xcdTQxNjdcXHUwMTAwaW9cXHUzNzhiXFx1Mzc4ZXhcXHhmNFxcdTE3NzdoZWFkXFx1MDEwMGxyXFx1Mzc5N1xcdTM3YTBlZnRhcnJvXFx4ZjdcXHUwODRmaWdodGFycm93XFx4YmJcXHUwZjVkXFx1MDkwMEFIYWJjZGZnaGxtb3Byc3R1d1xcdTM3ZDBcXHUzN2QzXFx1MzdkN1xcdTM3ZTRcXHUzN2YwXFx1MzdmY1xcdTM4MGVcXHUzODFjXFx1MzgyM1xcdTM4MzRcXHUzODUxXFx1Mzg1ZFxcdTM4NmJcXHUzOGE5XFx1MzhjY1xcdTM4ZDJcXHUzOGVhXFx1MzhmNnJcXHhmMlxcdTAzZWRhcjtcXHU2OTYzXFx1MDEwMGNyXFx1MzdkY1xcdTM3ZTJ1dGVcXHU4MDNiXFx4ZmFcXHU0MGZhXFx4ZjJcXHUxMTUwclxcdTAxZTNcXHUzN2VhXFwwXFx1MzdlZHk7XFx1NDQ1ZXZlO1xcdTQxNmRcXHUwMTAwaXlcXHUzN2Y1XFx1MzdmYXJjXFx1ODAzYlxceGZiXFx1NDBmYjtcXHU0NDQzXFx1MDE4MGFiaFxcdTM4MDNcXHUzODA2XFx1MzgwYnJcXHhmMlxcdTEzYWRsYWM7XFx1NDE3MWFcXHhmMlxcdTEzYzNcXHUwMTAwaXJcXHUzODEzXFx1MzgxOHNodDtcXHU2OTdlO1xcdWMwMDBcXHVkODM1XFx1ZGQzMnJhdmVcXHU4MDNiXFx4ZjlcXHU0MGY5XFx1MDE2MVxcdTM4MjdcXHUzODMxclxcdTAxMDBsclxcdTM4MmNcXHUzODJlXFx4YmJcXHUwOTU3XFx4YmJcXHUxMDgzbGs7XFx1NjU4MFxcdTAxMDBjdFxcdTM4MzlcXHUzODRkXFx1MDI2ZlxcdTM4M2ZcXDBcXDBcXHUzODRhcm5cXHUwMTAwO2VcXHUzODQ1XFx1Mzg0NlxcdTYzMWNyXFx4YmJcXHUzODQ2b3A7XFx1NjMwZnJpO1xcdTY1ZjhcXHUwMTAwYWxcXHUzODU2XFx1Mzg1YWNyO1xcdTQxNmJcXHU4MGJiXFx4YThcXHUwMzQ5XFx1MDEwMGdwXFx1Mzg2MlxcdTM4NjZvbjtcXHU0MTczZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNjZcXHUwMzAwYWRobHN1XFx1MTE0YlxcdTM4NzhcXHUzODdkXFx1MTM3MlxcdTM4OTFcXHUzOGEwb3duXFx4ZTFcXHUxM2IzYXJwb29uXFx1MDEwMGxyXFx1Mzg4OFxcdTM4OGNlZlxceGY0XFx1MzgyZGlnaFxceGY0XFx1MzgyZmlcXHUwMTgwO2hsXFx1Mzg5OVxcdTM4OWFcXHUzODljXFx1NDNjNVxceGJiXFx1MTNmYW9uXFx4YmJcXHUzODlhcGFycm93cztcXHU2MWM4XFx1MDE4MGNpdFxcdTM4YjBcXHUzOGM0XFx1MzhjOFxcdTAyNmZcXHUzOGI2XFwwXFwwXFx1MzhjMXJuXFx1MDEwMDtlXFx1MzhiY1xcdTM4YmRcXHU2MzFkclxceGJiXFx1MzhiZG9wO1xcdTYzMGVuZztcXHU0MTZmcmk7XFx1NjVmOWNyO1xcdWMwMDBcXHVkODM1XFx1ZGNjYVxcdTAxODBkaXJcXHUzOGQ5XFx1MzhkZFxcdTM4ZTJvdDtcXHU2MmYwbGRlO1xcdTQxNjlpXFx1MDEwMDtmXFx1MzczMFxcdTM4ZThcXHhiYlxcdTE4MTNcXHUwMTAwYW1cXHUzOGVmXFx1MzhmMnJcXHhmMlxcdTM4YThsXFx1ODAzYlxceGZjXFx1NDBmY2FuZ2xlO1xcdTY5YTdcXHUwNzgwQUJEYWNkZWZsbm9wcnN6XFx1MzkxY1xcdTM5MWZcXHUzOTI5XFx1MzkyZFxcdTM5YjVcXHUzOWI4XFx1MzliZFxcdTM5ZGZcXHUzOWU0XFx1MzllOFxcdTM5ZjNcXHUzOWY5XFx1MzlmZFxcdTNhMDFcXHUzYTIwclxceGYyXFx1MDNmN2FyXFx1MDEwMDt2XFx1MzkyNlxcdTM5MjdcXHU2YWU4O1xcdTZhZTlhc1xceGU4XFx1MDNlMVxcdTAxMDBuclxcdTM5MzJcXHUzOTM3Z3J0O1xcdTY5OWNcXHUwMzgwZWtucHJzdFxcdTM0ZTNcXHUzOTQ2XFx1Mzk0YlxcdTM5NTJcXHUzOTVkXFx1Mzk2NFxcdTM5OTZhcHBcXHhlMVxcdTI0MTVvdGhpblxceGU3XFx1MWU5NlxcdTAxODBoaXJcXHUzNGViXFx1MmVjOFxcdTM5NTlvcFxceGY0XFx1MmZiNVxcdTAxMDA7aFxcdTEzYjdcXHUzOTYyXFx4ZWZcXHUzMThkXFx1MDEwMGl1XFx1Mzk2OVxcdTM5NmRnbVxceGUxXFx1MzNiM1xcdTAxMDBicFxcdTM5NzJcXHUzOTg0c2V0bmVxXFx1MDEwMDtxXFx1Mzk3ZFxcdTM5ODBcXHVjMDAwXFx1MjI4YVxcdWZlMDA7XFx1YzAwMFxcdTJhY2JcXHVmZTAwc2V0bmVxXFx1MDEwMDtxXFx1Mzk4ZlxcdTM5OTJcXHVjMDAwXFx1MjI4YlxcdWZlMDA7XFx1YzAwMFxcdTJhY2NcXHVmZTAwXFx1MDEwMGhyXFx1Mzk5YlxcdTM5OWZldFxceGUxXFx1MzY5Y2lhbmdsZVxcdTAxMDBsclxcdTM5YWFcXHUzOWFmZWZ0XFx4YmJcXHUwOTI1aWdodFxceGJiXFx1MTA1MXk7XFx1NDQzMmFzaFxceGJiXFx1MTAzNlxcdTAxODBlbHJcXHUzOWM0XFx1MzlkMlxcdTM5ZDdcXHUwMTgwO2JlXFx1MmRlYVxcdTM5Y2JcXHUzOWNmYXI7XFx1NjJiYnE7XFx1NjI1YWxpcDtcXHU2MmVlXFx1MDEwMGJ0XFx1MzlkY1xcdTE0NjhhXFx4ZjJcXHUxNDY5cjtcXHVjMDAwXFx1ZDgzNVxcdWRkMzN0clxceGU5XFx1MzlhZXN1XFx1MDEwMGJwXFx1MzllZlxcdTM5ZjFcXHhiYlxcdTBkMWNcXHhiYlxcdTBkNTlwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNjdyb1xceGYwXFx1MGVmYnRyXFx4ZTlcXHUzOWI0XFx1MDEwMGN1XFx1M2EwNlxcdTNhMGJyO1xcdWMwMDBcXHVkODM1XFx1ZGNjYlxcdTAxMDBicFxcdTNhMTBcXHUzYTE4blxcdTAxMDBFZVxcdTM5ODBcXHUzYTE2XFx4YmJcXHUzOTdlblxcdTAxMDBFZVxcdTM5OTJcXHUzYTFlXFx4YmJcXHUzOTkwaWd6YWc7XFx1Njk5YVxcdTAzODBjZWZvcHJzXFx1M2EzNlxcdTNhM2JcXHUzYTU2XFx1M2E1YlxcdTNhNTRcXHUzYTYxXFx1M2E2YWlyYztcXHU0MTc1XFx1MDEwMGRpXFx1M2E0MFxcdTNhNTFcXHUwMTAwYmdcXHUzYTQ1XFx1M2E0OWFyO1xcdTZhNWZlXFx1MDEwMDtxXFx1MTVmYVxcdTNhNGY7XFx1NjI1OWVycDtcXHU2MTE4cjtcXHVjMDAwXFx1ZDgzNVxcdWRkMzRwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNjhcXHUwMTAwO2VcXHUxNDc5XFx1M2E2NmF0XFx4ZThcXHUxNDc5Y3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2NjXFx1MGFlM1xcdTE3OGVcXHUzYTg3XFwwXFx1M2E4YlxcMFxcdTNhOTBcXHUzYTliXFwwXFwwXFx1M2E5ZFxcdTNhYThcXHUzYWFiXFx1M2FhZlxcMFxcMFxcdTNhYzNcXHUzYWNlXFwwXFx1M2FkOFxcdTE3ZGNcXHUxN2RmdHJcXHhlOVxcdTE3ZDFyO1xcdWMwMDBcXHVkODM1XFx1ZGQzNVxcdTAxMDBBYVxcdTNhOTRcXHUzYTk3clxceGYyXFx1MDNjM3JcXHhmMlxcdTA5ZjY7XFx1NDNiZVxcdTAxMDBBYVxcdTNhYTFcXHUzYWE0clxceGYyXFx1MDNiOHJcXHhmMlxcdTA5ZWJhXFx4ZjBcXHUyNzEzaXM7XFx1NjJmYlxcdTAxODBkcHRcXHUxN2E0XFx1M2FiNVxcdTNhYmVcXHUwMTAwZmxcXHUzYWJhXFx1MTdhOTtcXHVjMDAwXFx1ZDgzNVxcdWRkNjlpbVxceGU1XFx1MTdiMlxcdTAxMDBBYVxcdTNhYzdcXHUzYWNhclxceGYyXFx1MDNjZXJcXHhmMlxcdTBhMDFcXHUwMTAwY3FcXHUzYWQyXFx1MTdiOHI7XFx1YzAwMFxcdWQ4MzVcXHVkY2NkXFx1MDEwMHB0XFx1MTdkNlxcdTNhZGNyXFx4ZTlcXHUxN2Q0XFx1MDQwMGFjZWZpb3N1XFx1M2FmMFxcdTNhZmRcXHUzYjA4XFx1M2IwY1xcdTNiMTFcXHUzYjE1XFx1M2IxYlxcdTNiMjFjXFx1MDEwMHV5XFx1M2FmNlxcdTNhZmJ0ZVxcdTgwM2JcXHhmZFxcdTQwZmQ7XFx1NDQ0ZlxcdTAxMDBpeVxcdTNiMDJcXHUzYjA2cmM7XFx1NDE3NztcXHU0NDRiblxcdTgwM2JcXHhhNVxcdTQwYTVyO1xcdWMwMDBcXHVkODM1XFx1ZGQzNmN5O1xcdTQ0NTdwZjtcXHVjMDAwXFx1ZDgzNVxcdWRkNmFjcjtcXHVjMDAwXFx1ZDgzNVxcdWRjY2VcXHUwMTAwY21cXHUzYjI2XFx1M2IyOXk7XFx1NDQ0ZWxcXHU4MDNiXFx4ZmZcXHU0MGZmXFx1MDUwMGFjZGVmaGlvc3dcXHUzYjQyXFx1M2I0OFxcdTNiNTRcXHUzYjU4XFx1M2I2NFxcdTNiNjlcXHUzYjZkXFx1M2I3NFxcdTNiN2FcXHUzYjgwY3V0ZTtcXHU0MTdhXFx1MDEwMGF5XFx1M2I0ZFxcdTNiNTJyb247XFx1NDE3ZTtcXHU0NDM3b3Q7XFx1NDE3Y1xcdTAxMDBldFxcdTNiNWRcXHUzYjYxdHJcXHhlNlxcdTE1NWZhO1xcdTQzYjZyO1xcdWMwMDBcXHVkODM1XFx1ZGQzN2N5O1xcdTQ0MzZncmFycjtcXHU2MWRkcGY7XFx1YzAwMFxcdWQ4MzVcXHVkZDZiY3I7XFx1YzAwMFxcdWQ4MzVcXHVkY2NmXFx1MDEwMGpuXFx1M2I4NVxcdTNiODc7XFx1NjAwZGo7XFx1NjAwY1wiXG4gICAgLnNwbGl0KFwiXCIpXG4gICAgLm1hcCgoYykgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGUtZGF0YS1odG1sLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/generated/decode-data-html.js\n"); - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/generated/decode-data-xml.js": -/*!********************************************************************!*\ - !*** ./node_modules/entities/lib/esm/generated/decode-data-xml.js ***! - \********************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Generated using scripts/write-decode-map.ts\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new Uint16Array(\n// prettier-ignore\n\"\\u0200aglq\\t\\x15\\x18\\x1b\\u026d\\x0f\\0\\0\\x12p;\\u4026os;\\u4027t;\\u403et;\\u403cuot;\\u4022\"\n .split(\"\")\n .map((c) => c.charCodeAt(0))));\n//# sourceMappingURL=decode-data-xml.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEteG1sLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBLGlFQUFlO0FBQ2Y7QUFDQSw2Q0FBNkMsU0FBUyxRQUFRLFFBQVEsVUFBVTtBQUNoRjtBQUNBLGlDQUFpQyxFQUFDO0FBQ2xDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL25vZGVfbW9kdWxlcy9lbnRpdGllcy9saWIvZXNtL2dlbmVyYXRlZC9kZWNvZGUtZGF0YS14bWwuanM/YTAxNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHZW5lcmF0ZWQgdXNpbmcgc2NyaXB0cy93cml0ZS1kZWNvZGUtbWFwLnRzXG5leHBvcnQgZGVmYXVsdCBuZXcgVWludDE2QXJyYXkoXG4vLyBwcmV0dGllci1pZ25vcmVcblwiXFx1MDIwMGFnbHFcXHRcXHgxNVxceDE4XFx4MWJcXHUwMjZkXFx4MGZcXDBcXDBcXHgxMnA7XFx1NDAyNm9zO1xcdTQwMjd0O1xcdTQwM2V0O1xcdTQwM2N1b3Q7XFx1NDAyMlwiXG4gICAgLnNwbGl0KFwiXCIpXG4gICAgLm1hcCgoYykgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGUtZGF0YS14bWwuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/generated/decode-data-xml.js\n"); - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/generated/encode-html.js": -/*!****************************************************************!*\ - !*** ./node_modules/entities/lib/esm/generated/encode-html.js ***! - \****************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Generated using scripts/write-encode-map.ts\nfunction restoreDiff(arr) {\n for (let i = 1; i < arr.length; i++) {\n arr[i][0] += arr[i - 1][0] + 1;\n }\n return arr;\n}\n// prettier-ignore\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (new Map(/* #__PURE__ */ restoreDiff([[9, \" \"], [0, \" \"], [22, \"!\"], [0, \""\"], [0, \"#\"], [0, \"$\"], [0, \"%\"], [0, \"&\"], [0, \"'\"], [0, \"(\"], [0, \")\"], [0, \"*\"], [0, \"+\"], [0, \",\"], [1, \".\"], [0, \"/\"], [10, \":\"], [0, \";\"], [0, { v: \"<\", n: 8402, o: \"<⃒\" }], [0, { v: \"=\", n: 8421, o: \"=⃥\" }], [0, { v: \">\", n: 8402, o: \">⃒\" }], [0, \"?\"], [0, \"@\"], [26, \"[\"], [0, \"\\"], [0, \"]\"], [0, \"^\"], [0, \"_\"], [0, \"`\"], [5, { n: 106, o: \"fj\" }], [20, \"{\"], [0, \"|\"], [0, \"}\"], [34, \" \"], [0, \"¡\"], [0, \"¢\"], [0, \"£\"], [0, \"¤\"], [0, \"¥\"], [0, \"¦\"], [0, \"§\"], [0, \"¨\"], [0, \"©\"], [0, \"ª\"], [0, \"«\"], [0, \"¬\"], [0, \"­\"], [0, \"®\"], [0, \"¯\"], [0, \"°\"], [0, \"±\"], [0, \"²\"], [0, \"³\"], [0, \"´\"], [0, \"µ\"], [0, \"¶\"], [0, \"·\"], [0, \"¸\"], [0, \"¹\"], [0, \"º\"], [0, \"»\"], [0, \"¼\"], [0, \"½\"], [0, \"¾\"], [0, \"¿\"], [0, \"À\"], [0, \"Á\"], [0, \"Â\"], [0, \"Ã\"], [0, \"Ä\"], [0, \"Å\"], [0, \"Æ\"], [0, \"Ç\"], [0, \"È\"], [0, \"É\"], [0, \"Ê\"], [0, \"Ë\"], [0, \"Ì\"], [0, \"Í\"], [0, \"Î\"], [0, \"Ï\"], [0, \"Ð\"], [0, \"Ñ\"], [0, \"Ò\"], [0, \"Ó\"], [0, \"Ô\"], [0, \"Õ\"], [0, \"Ö\"], [0, \"×\"], [0, \"Ø\"], [0, \"Ù\"], [0, \"Ú\"], [0, \"Û\"], [0, \"Ü\"], [0, \"Ý\"], [0, \"Þ\"], [0, \"ß\"], [0, \"à\"], [0, \"á\"], [0, \"â\"], [0, \"ã\"], [0, \"ä\"], [0, \"å\"], [0, \"æ\"], [0, \"ç\"], [0, \"è\"], [0, \"é\"], [0, \"ê\"], [0, \"ë\"], [0, \"ì\"], [0, \"í\"], [0, \"î\"], [0, \"ï\"], [0, \"ð\"], [0, \"ñ\"], [0, \"ò\"], [0, \"ó\"], [0, \"ô\"], [0, \"õ\"], [0, \"ö\"], [0, \"÷\"], [0, \"ø\"], [0, \"ù\"], [0, \"ú\"], [0, \"û\"], [0, \"ü\"], [0, \"ý\"], [0, \"þ\"], [0, \"ÿ\"], [0, \"Ā\"], [0, \"ā\"], [0, \"Ă\"], [0, \"ă\"], [0, \"Ą\"], [0, \"ą\"], [0, \"Ć\"], [0, \"ć\"], [0, \"Ĉ\"], [0, \"ĉ\"], [0, \"Ċ\"], [0, \"ċ\"], [0, \"Č\"], [0, \"č\"], [0, \"Ď\"], [0, \"ď\"], [0, \"Đ\"], [0, \"đ\"], [0, \"Ē\"], [0, \"ē\"], [2, \"Ė\"], [0, \"ė\"], [0, \"Ę\"], [0, \"ę\"], [0, \"Ě\"], [0, \"ě\"], [0, \"Ĝ\"], [0, \"ĝ\"], [0, \"Ğ\"], [0, \"ğ\"], [0, \"Ġ\"], [0, \"ġ\"], [0, \"Ģ\"], [1, \"Ĥ\"], [0, \"ĥ\"], [0, \"Ħ\"], [0, \"ħ\"], [0, \"Ĩ\"], [0, \"ĩ\"], [0, \"Ī\"], [0, \"ī\"], [2, \"Į\"], [0, \"į\"], [0, \"İ\"], [0, \"ı\"], [0, \"IJ\"], [0, \"ij\"], [0, \"Ĵ\"], [0, \"ĵ\"], [0, \"Ķ\"], [0, \"ķ\"], [0, \"ĸ\"], [0, \"Ĺ\"], [0, \"ĺ\"], [0, \"Ļ\"], [0, \"ļ\"], [0, \"Ľ\"], [0, \"ľ\"], [0, \"Ŀ\"], [0, \"ŀ\"], [0, \"Ł\"], [0, \"ł\"], [0, \"Ń\"], [0, \"ń\"], [0, \"Ņ\"], [0, \"ņ\"], [0, \"Ň\"], [0, \"ň\"], [0, \"ʼn\"], [0, \"Ŋ\"], [0, \"ŋ\"], [0, \"Ō\"], [0, \"ō\"], [2, \"Ő\"], [0, \"ő\"], [0, \"Œ\"], [0, \"œ\"], [0, \"Ŕ\"], [0, \"ŕ\"], [0, \"Ŗ\"], [0, \"ŗ\"], [0, \"Ř\"], [0, \"ř\"], [0, \"Ś\"], [0, \"ś\"], [0, \"Ŝ\"], [0, \"ŝ\"], [0, \"Ş\"], [0, \"ş\"], [0, \"Š\"], [0, \"š\"], [0, \"Ţ\"], [0, \"ţ\"], [0, \"Ť\"], [0, \"ť\"], [0, \"Ŧ\"], [0, \"ŧ\"], [0, \"Ũ\"], [0, \"ũ\"], [0, \"Ū\"], [0, \"ū\"], [0, \"Ŭ\"], [0, \"ŭ\"], [0, \"Ů\"], [0, \"ů\"], [0, \"Ű\"], [0, \"ű\"], [0, \"Ų\"], [0, \"ų\"], [0, \"Ŵ\"], [0, \"ŵ\"], [0, \"Ŷ\"], [0, \"ŷ\"], [0, \"Ÿ\"], [0, \"Ź\"], [0, \"ź\"], [0, \"Ż\"], [0, \"ż\"], [0, \"Ž\"], [0, \"ž\"], [19, \"ƒ\"], [34, \"Ƶ\"], [63, \"ǵ\"], [65, \"ȷ\"], [142, \"ˆ\"], [0, \"ˇ\"], [16, \"˘\"], [0, \"˙\"], [0, \"˚\"], [0, \"˛\"], [0, \"˜\"], [0, \"˝\"], [51, \"̑\"], [127, \"Α\"], [0, \"Β\"], [0, \"Γ\"], [0, \"Δ\"], [0, \"Ε\"], [0, \"Ζ\"], [0, \"Η\"], [0, \"Θ\"], [0, \"Ι\"], [0, \"Κ\"], [0, \"Λ\"], [0, \"Μ\"], [0, \"Ν\"], [0, \"Ξ\"], [0, \"Ο\"], [0, \"Π\"], [0, \"Ρ\"], [1, \"Σ\"], [0, \"Τ\"], [0, \"Υ\"], [0, \"Φ\"], [0, \"Χ\"], [0, \"Ψ\"], [0, \"Ω\"], [7, \"α\"], [0, \"β\"], [0, \"γ\"], [0, \"δ\"], [0, \"ε\"], [0, \"ζ\"], [0, \"η\"], [0, \"θ\"], [0, \"ι\"], [0, \"κ\"], [0, \"λ\"], [0, \"μ\"], [0, \"ν\"], [0, \"ξ\"], [0, \"ο\"], [0, \"π\"], [0, \"ρ\"], [0, \"ς\"], [0, \"σ\"], [0, \"τ\"], [0, \"υ\"], [0, \"φ\"], [0, \"χ\"], [0, \"ψ\"], [0, \"ω\"], [7, \"ϑ\"], [0, \"ϒ\"], [2, \"ϕ\"], [0, \"ϖ\"], [5, \"Ϝ\"], [0, \"ϝ\"], [18, \"ϰ\"], [0, \"ϱ\"], [3, \"ϵ\"], [0, \"϶\"], [10, \"Ё\"], [0, \"Ђ\"], [0, \"Ѓ\"], [0, \"Є\"], [0, \"Ѕ\"], [0, \"І\"], [0, \"Ї\"], [0, \"Ј\"], [0, \"Љ\"], [0, \"Њ\"], [0, \"Ћ\"], [0, \"Ќ\"], [1, \"Ў\"], [0, \"Џ\"], [0, \"А\"], [0, \"Б\"], [0, \"В\"], [0, \"Г\"], [0, \"Д\"], [0, \"Е\"], [0, \"Ж\"], [0, \"З\"], [0, \"И\"], [0, \"Й\"], [0, \"К\"], [0, \"Л\"], [0, \"М\"], [0, \"Н\"], [0, \"О\"], [0, \"П\"], [0, \"Р\"], [0, \"С\"], [0, \"Т\"], [0, \"У\"], [0, \"Ф\"], [0, \"Х\"], [0, \"Ц\"], [0, \"Ч\"], [0, \"Ш\"], [0, \"Щ\"], [0, \"Ъ\"], [0, \"Ы\"], [0, \"Ь\"], [0, \"Э\"], [0, \"Ю\"], [0, \"Я\"], [0, \"а\"], [0, \"б\"], [0, \"в\"], [0, \"г\"], [0, \"д\"], [0, \"е\"], [0, \"ж\"], [0, \"з\"], [0, \"и\"], [0, \"й\"], [0, \"к\"], [0, \"л\"], [0, \"м\"], [0, \"н\"], [0, \"о\"], [0, \"п\"], [0, \"р\"], [0, \"с\"], [0, \"т\"], [0, \"у\"], [0, \"ф\"], [0, \"х\"], [0, \"ц\"], [0, \"ч\"], [0, \"ш\"], [0, \"щ\"], [0, \"ъ\"], [0, \"ы\"], [0, \"ь\"], [0, \"э\"], [0, \"ю\"], [0, \"я\"], [1, \"ё\"], [0, \"ђ\"], [0, \"ѓ\"], [0, \"є\"], [0, \"ѕ\"], [0, \"і\"], [0, \"ї\"], [0, \"ј\"], [0, \"љ\"], [0, \"њ\"], [0, \"ћ\"], [0, \"ќ\"], [1, \"ў\"], [0, \"џ\"], [7074, \" \"], [0, \" \"], [0, \" \"], [0, \" \"], [1, \" \"], [0, \" \"], [0, \" \"], [0, \" \"], [0, \"​\"], [0, \"‌\"], [0, \"‍\"], [0, \"‎\"], [0, \"‏\"], [0, \"‐\"], [2, \"–\"], [0, \"—\"], [0, \"―\"], [0, \"‖\"], [1, \"‘\"], [0, \"’\"], [0, \"‚\"], [1, \"“\"], [0, \"”\"], [0, \"„\"], [1, \"†\"], [0, \"‡\"], [0, \"•\"], [2, \"‥\"], [0, \"…\"], [9, \"‰\"], [0, \"‱\"], [0, \"′\"], [0, \"″\"], [0, \"‴\"], [0, \"‵\"], [3, \"‹\"], [0, \"›\"], [3, \"‾\"], [2, \"⁁\"], [1, \"⁃\"], [0, \"⁄\"], [10, \"⁏\"], [7, \"⁗\"], [7, { v: \" \", n: 8202, o: \"  \" }], [0, \"⁠\"], [0, \"⁡\"], [0, \"⁢\"], [0, \"⁣\"], [72, \"€\"], [46, \"⃛\"], [0, \"⃜\"], [37, \"ℂ\"], [2, \"℅\"], [4, \"ℊ\"], [0, \"ℋ\"], [0, \"ℌ\"], [0, \"ℍ\"], [0, \"ℎ\"], [0, \"ℏ\"], [0, \"ℐ\"], [0, \"ℑ\"], [0, \"ℒ\"], [0, \"ℓ\"], [1, \"ℕ\"], [0, \"№\"], [0, \"℗\"], [0, \"℘\"], [0, \"ℙ\"], [0, \"ℚ\"], [0, \"ℛ\"], [0, \"ℜ\"], [0, \"ℝ\"], [0, \"℞\"], [3, \"™\"], [1, \"ℤ\"], [2, \"℧\"], [0, \"ℨ\"], [0, \"℩\"], [2, \"ℬ\"], [0, \"ℭ\"], [1, \"ℯ\"], [0, \"ℰ\"], [0, \"ℱ\"], [1, \"ℳ\"], [0, \"ℴ\"], [0, \"ℵ\"], [0, \"ℶ\"], [0, \"ℷ\"], [0, \"ℸ\"], [12, \"ⅅ\"], [0, \"ⅆ\"], [0, \"ⅇ\"], [0, \"ⅈ\"], [10, \"⅓\"], [0, \"⅔\"], [0, \"⅕\"], [0, \"⅖\"], [0, \"⅗\"], [0, \"⅘\"], [0, \"⅙\"], [0, \"⅚\"], [0, \"⅛\"], [0, \"⅜\"], [0, \"⅝\"], [0, \"⅞\"], [49, \"←\"], [0, \"↑\"], [0, \"→\"], [0, \"↓\"], [0, \"↔\"], [0, \"↕\"], [0, \"↖\"], [0, \"↗\"], [0, \"↘\"], [0, \"↙\"], [0, \"↚\"], [0, \"↛\"], [1, { v: \"↝\", n: 824, o: \"↝̸\" }], [0, \"↞\"], [0, \"↟\"], [0, \"↠\"], [0, \"↡\"], [0, \"↢\"], [0, \"↣\"], [0, \"↤\"], [0, \"↥\"], [0, \"↦\"], [0, \"↧\"], [1, \"↩\"], [0, \"↪\"], [0, \"↫\"], [0, \"↬\"], [0, \"↭\"], [0, \"↮\"], [1, \"↰\"], [0, \"↱\"], [0, \"↲\"], [0, \"↳\"], [1, \"↵\"], [0, \"↶\"], [0, \"↷\"], [2, \"↺\"], [0, \"↻\"], [0, \"↼\"], [0, \"↽\"], [0, \"↾\"], [0, \"↿\"], [0, \"⇀\"], [0, \"⇁\"], [0, \"⇂\"], [0, \"⇃\"], [0, \"⇄\"], [0, \"⇅\"], [0, \"⇆\"], [0, \"⇇\"], [0, \"⇈\"], [0, \"⇉\"], [0, \"⇊\"], [0, \"⇋\"], [0, \"⇌\"], [0, \"⇍\"], [0, \"⇎\"], [0, \"⇏\"], [0, \"⇐\"], [0, \"⇑\"], [0, \"⇒\"], [0, \"⇓\"], [0, \"⇔\"], [0, \"⇕\"], [0, \"⇖\"], [0, \"⇗\"], [0, \"⇘\"], [0, \"⇙\"], [0, \"⇚\"], [0, \"⇛\"], [1, \"⇝\"], [6, \"⇤\"], [0, \"⇥\"], [15, \"⇵\"], [7, \"⇽\"], [0, \"⇾\"], [0, \"⇿\"], [0, \"∀\"], [0, \"∁\"], [0, { v: \"∂\", n: 824, o: \"∂̸\" }], [0, \"∃\"], [0, \"∄\"], [0, \"∅\"], [1, \"∇\"], [0, \"∈\"], [0, \"∉\"], [1, \"∋\"], [0, \"∌\"], [2, \"∏\"], [0, \"∐\"], [0, \"∑\"], [0, \"−\"], [0, \"∓\"], [0, \"∔\"], [1, \"∖\"], [0, \"∗\"], [0, \"∘\"], [1, \"√\"], [2, \"∝\"], [0, \"∞\"], [0, \"∟\"], [0, { v: \"∠\", n: 8402, o: \"∠⃒\" }], [0, \"∡\"], [0, \"∢\"], [0, \"∣\"], [0, \"∤\"], [0, \"∥\"], [0, \"∦\"], [0, \"∧\"], [0, \"∨\"], [0, { v: \"∩\", n: 65024, o: \"∩︀\" }], [0, { v: \"∪\", n: 65024, o: \"∪︀\" }], [0, \"∫\"], [0, \"∬\"], [0, \"∭\"], [0, \"∮\"], [0, \"∯\"], [0, \"∰\"], [0, \"∱\"], [0, \"∲\"], [0, \"∳\"], [0, \"∴\"], [0, \"∵\"], [0, \"∶\"], [0, \"∷\"], [0, \"∸\"], [1, \"∺\"], [0, \"∻\"], [0, { v: \"∼\", n: 8402, o: \"∼⃒\" }], [0, { v: \"∽\", n: 817, o: \"∽̱\" }], [0, { v: \"∾\", n: 819, o: \"∾̳\" }], [0, \"∿\"], [0, \"≀\"], [0, \"≁\"], [0, { v: \"≂\", n: 824, o: \"≂̸\" }], [0, \"≃\"], [0, \"≄\"], [0, \"≅\"], [0, \"≆\"], [0, \"≇\"], [0, \"≈\"], [0, \"≉\"], [0, \"≊\"], [0, { v: \"≋\", n: 824, o: \"≋̸\" }], [0, \"≌\"], [0, { v: \"≍\", n: 8402, o: \"≍⃒\" }], [0, { v: \"≎\", n: 824, o: \"≎̸\" }], [0, { v: \"≏\", n: 824, o: \"≏̸\" }], [0, { v: \"≐\", n: 824, o: \"≐̸\" }], [0, \"≑\"], [0, \"≒\"], [0, \"≓\"], [0, \"≔\"], [0, \"≕\"], [0, \"≖\"], [0, \"≗\"], [1, \"≙\"], [0, \"≚\"], [1, \"≜\"], [2, \"≟\"], [0, \"≠\"], [0, { v: \"≡\", n: 8421, o: \"≡⃥\" }], [0, \"≢\"], [1, { v: \"≤\", n: 8402, o: \"≤⃒\" }], [0, { v: \"≥\", n: 8402, o: \"≥⃒\" }], [0, { v: \"≦\", n: 824, o: \"≦̸\" }], [0, { v: \"≧\", n: 824, o: \"≧̸\" }], [0, { v: \"≨\", n: 65024, o: \"≨︀\" }], [0, { v: \"≩\", n: 65024, o: \"≩︀\" }], [0, { v: \"≪\", n: new Map(/* #__PURE__ */ restoreDiff([[824, \"≪̸\"], [7577, \"≪⃒\"]])) }], [0, { v: \"≫\", n: new Map(/* #__PURE__ */ restoreDiff([[824, \"≫̸\"], [7577, \"≫⃒\"]])) }], [0, \"≬\"], [0, \"≭\"], [0, \"≮\"], [0, \"≯\"], [0, \"≰\"], [0, \"≱\"], [0, \"≲\"], [0, \"≳\"], [0, \"≴\"], [0, \"≵\"], [0, \"≶\"], [0, \"≷\"], [0, \"≸\"], [0, \"≹\"], [0, \"≺\"], [0, \"≻\"], [0, \"≼\"], [0, \"≽\"], [0, \"≾\"], [0, { v: \"≿\", n: 824, o: \"≿̸\" }], [0, \"⊀\"], [0, \"⊁\"], [0, { v: \"⊂\", n: 8402, o: \"⊂⃒\" }], [0, { v: \"⊃\", n: 8402, o: \"⊃⃒\" }], [0, \"⊄\"], [0, \"⊅\"], [0, \"⊆\"], [0, \"⊇\"], [0, \"⊈\"], [0, \"⊉\"], [0, { v: \"⊊\", n: 65024, o: \"⊊︀\" }], [0, { v: \"⊋\", n: 65024, o: \"⊋︀\" }], [1, \"⊍\"], [0, \"⊎\"], [0, { v: \"⊏\", n: 824, o: \"⊏̸\" }], [0, { v: \"⊐\", n: 824, o: \"⊐̸\" }], [0, \"⊑\"], [0, \"⊒\"], [0, { v: \"⊓\", n: 65024, o: \"⊓︀\" }], [0, { v: \"⊔\", n: 65024, o: \"⊔︀\" }], [0, \"⊕\"], [0, \"⊖\"], [0, \"⊗\"], [0, \"⊘\"], [0, \"⊙\"], [0, \"⊚\"], [0, \"⊛\"], [1, \"⊝\"], [0, \"⊞\"], [0, \"⊟\"], [0, \"⊠\"], [0, \"⊡\"], [0, \"⊢\"], [0, \"⊣\"], [0, \"⊤\"], [0, \"⊥\"], [1, \"⊧\"], [0, \"⊨\"], [0, \"⊩\"], [0, \"⊪\"], [0, \"⊫\"], [0, \"⊬\"], [0, \"⊭\"], [0, \"⊮\"], [0, \"⊯\"], [0, \"⊰\"], [1, \"⊲\"], [0, \"⊳\"], [0, { v: \"⊴\", n: 8402, o: \"⊴⃒\" }], [0, { v: \"⊵\", n: 8402, o: \"⊵⃒\" }], [0, \"⊶\"], [0, \"⊷\"], [0, \"⊸\"], [0, \"⊹\"], [0, \"⊺\"], [0, \"⊻\"], [1, \"⊽\"], [0, \"⊾\"], [0, \"⊿\"], [0, \"⋀\"], [0, \"⋁\"], [0, \"⋂\"], [0, \"⋃\"], [0, \"⋄\"], [0, \"⋅\"], [0, \"⋆\"], [0, \"⋇\"], [0, \"⋈\"], [0, \"⋉\"], [0, \"⋊\"], [0, \"⋋\"], [0, \"⋌\"], [0, \"⋍\"], [0, \"⋎\"], [0, \"⋏\"], [0, \"⋐\"], [0, \"⋑\"], [0, \"⋒\"], [0, \"⋓\"], [0, \"⋔\"], [0, \"⋕\"], [0, \"⋖\"], [0, \"⋗\"], [0, { v: \"⋘\", n: 824, o: \"⋘̸\" }], [0, { v: \"⋙\", n: 824, o: \"⋙̸\" }], [0, { v: \"⋚\", n: 65024, o: \"⋚︀\" }], [0, { v: \"⋛\", n: 65024, o: \"⋛︀\" }], [2, \"⋞\"], [0, \"⋟\"], [0, \"⋠\"], [0, \"⋡\"], [0, \"⋢\"], [0, \"⋣\"], [2, \"⋦\"], [0, \"⋧\"], [0, \"⋨\"], [0, \"⋩\"], [0, \"⋪\"], [0, \"⋫\"], [0, \"⋬\"], [0, \"⋭\"], [0, \"⋮\"], [0, \"⋯\"], [0, \"⋰\"], [0, \"⋱\"], [0, \"⋲\"], [0, \"⋳\"], [0, \"⋴\"], [0, { v: \"⋵\", n: 824, o: \"⋵̸\" }], [0, \"⋶\"], [0, \"⋷\"], [1, { v: \"⋹\", n: 824, o: \"⋹̸\" }], [0, \"⋺\"], [0, \"⋻\"], [0, \"⋼\"], [0, \"⋽\"], [0, \"⋾\"], [6, \"⌅\"], [0, \"⌆\"], [1, \"⌈\"], [0, \"⌉\"], [0, \"⌊\"], [0, \"⌋\"], [0, \"⌌\"], [0, \"⌍\"], [0, \"⌎\"], [0, \"⌏\"], [0, \"⌐\"], [1, \"⌒\"], [0, \"⌓\"], [1, \"⌕\"], [0, \"⌖\"], [5, \"⌜\"], [0, \"⌝\"], [0, \"⌞\"], [0, \"⌟\"], [2, \"⌢\"], [0, \"⌣\"], [9, \"⌭\"], [0, \"⌮\"], [7, \"⌶\"], [6, \"⌽\"], [1, \"⌿\"], [60, \"⍼\"], [51, \"⎰\"], [0, \"⎱\"], [2, \"⎴\"], [0, \"⎵\"], [0, \"⎶\"], [37, \"⏜\"], [0, \"⏝\"], [0, \"⏞\"], [0, \"⏟\"], [2, \"⏢\"], [4, \"⏧\"], [59, \"␣\"], [164, \"Ⓢ\"], [55, \"─\"], [1, \"│\"], [9, \"┌\"], [3, \"┐\"], [3, \"└\"], [3, \"┘\"], [3, \"├\"], [7, \"┤\"], [7, \"┬\"], [7, \"┴\"], [7, \"┼\"], [19, \"═\"], [0, \"║\"], [0, \"╒\"], [0, \"╓\"], [0, \"╔\"], [0, \"╕\"], [0, \"╖\"], [0, \"╗\"], [0, \"╘\"], [0, \"╙\"], [0, \"╚\"], [0, \"╛\"], [0, \"╜\"], [0, \"╝\"], [0, \"╞\"], [0, \"╟\"], [0, \"╠\"], [0, \"╡\"], [0, \"╢\"], [0, \"╣\"], [0, \"╤\"], [0, \"╥\"], [0, \"╦\"], [0, \"╧\"], [0, \"╨\"], [0, \"╩\"], [0, \"╪\"], [0, \"╫\"], [0, \"╬\"], [19, \"▀\"], [3, \"▄\"], [3, \"█\"], [8, \"░\"], [0, \"▒\"], [0, \"▓\"], [13, \"□\"], [8, \"▪\"], [0, \"▫\"], [1, \"▭\"], [0, \"▮\"], [2, \"▱\"], [1, \"△\"], [0, \"▴\"], [0, \"▵\"], [2, \"▸\"], [0, \"▹\"], [3, \"▽\"], [0, \"▾\"], [0, \"▿\"], [2, \"◂\"], [0, \"◃\"], [6, \"◊\"], [0, \"○\"], [32, \"◬\"], [2, \"◯\"], [8, \"◸\"], [0, \"◹\"], [0, \"◺\"], [0, \"◻\"], [0, \"◼\"], [8, \"★\"], [0, \"☆\"], [7, \"☎\"], [49, \"♀\"], [1, \"♂\"], [29, \"♠\"], [2, \"♣\"], [1, \"♥\"], [0, \"♦\"], [3, \"♪\"], [2, \"♭\"], [0, \"♮\"], [0, \"♯\"], [163, \"✓\"], [3, \"✗\"], [8, \"✠\"], [21, \"✶\"], [33, \"❘\"], [25, \"❲\"], [0, \"❳\"], [84, \"⟈\"], [0, \"⟉\"], [28, \"⟦\"], [0, \"⟧\"], [0, \"⟨\"], [0, \"⟩\"], [0, \"⟪\"], [0, \"⟫\"], [0, \"⟬\"], [0, \"⟭\"], [7, \"⟵\"], [0, \"⟶\"], [0, \"⟷\"], [0, \"⟸\"], [0, \"⟹\"], [0, \"⟺\"], [1, \"⟼\"], [2, \"⟿\"], [258, \"⤂\"], [0, \"⤃\"], [0, \"⤄\"], [0, \"⤅\"], [6, \"⤌\"], [0, \"⤍\"], [0, \"⤎\"], [0, \"⤏\"], [0, \"⤐\"], [0, \"⤑\"], [0, \"⤒\"], [0, \"⤓\"], [2, \"⤖\"], [2, \"⤙\"], [0, \"⤚\"], [0, \"⤛\"], [0, \"⤜\"], [0, \"⤝\"], [0, \"⤞\"], [0, \"⤟\"], [0, \"⤠\"], [2, \"⤣\"], [0, \"⤤\"], [0, \"⤥\"], [0, \"⤦\"], [0, \"⤧\"], [0, \"⤨\"], [0, \"⤩\"], [0, \"⤪\"], [8, { v: \"⤳\", n: 824, o: \"⤳̸\" }], [1, \"⤵\"], [0, \"⤶\"], [0, \"⤷\"], [0, \"⤸\"], [0, \"⤹\"], [2, \"⤼\"], [0, \"⤽\"], [7, \"⥅\"], [2, \"⥈\"], [0, \"⥉\"], [0, \"⥊\"], [0, \"⥋\"], [2, \"⥎\"], [0, \"⥏\"], [0, \"⥐\"], [0, \"⥑\"], [0, \"⥒\"], [0, \"⥓\"], [0, \"⥔\"], [0, \"⥕\"], [0, \"⥖\"], [0, \"⥗\"], [0, \"⥘\"], [0, \"⥙\"], [0, \"⥚\"], [0, \"⥛\"], [0, \"⥜\"], [0, \"⥝\"], [0, \"⥞\"], [0, \"⥟\"], [0, \"⥠\"], [0, \"⥡\"], [0, \"⥢\"], [0, \"⥣\"], [0, \"⥤\"], [0, \"⥥\"], [0, \"⥦\"], [0, \"⥧\"], [0, \"⥨\"], [0, \"⥩\"], [0, \"⥪\"], [0, \"⥫\"], [0, \"⥬\"], [0, \"⥭\"], [0, \"⥮\"], [0, \"⥯\"], [0, \"⥰\"], [0, \"⥱\"], [0, \"⥲\"], [0, \"⥳\"], [0, \"⥴\"], [0, \"⥵\"], [0, \"⥶\"], [1, \"⥸\"], [0, \"⥹\"], [1, \"⥻\"], [0, \"⥼\"], [0, \"⥽\"], [0, \"⥾\"], [0, \"⥿\"], [5, \"⦅\"], [0, \"⦆\"], [4, \"⦋\"], [0, \"⦌\"], [0, \"⦍\"], [0, \"⦎\"], [0, \"⦏\"], [0, \"⦐\"], [0, \"⦑\"], [0, \"⦒\"], [0, \"⦓\"], [0, \"⦔\"], [0, \"⦕\"], [0, \"⦖\"], [3, \"⦚\"], [1, \"⦜\"], [0, \"⦝\"], [6, \"⦤\"], [0, \"⦥\"], [0, \"⦦\"], [0, \"⦧\"], [0, \"⦨\"], [0, \"⦩\"], [0, \"⦪\"], [0, \"⦫\"], [0, \"⦬\"], [0, \"⦭\"], [0, \"⦮\"], [0, \"⦯\"], [0, \"⦰\"], [0, \"⦱\"], [0, \"⦲\"], [0, \"⦳\"], [0, \"⦴\"], [0, \"⦵\"], [0, \"⦶\"], [0, \"⦷\"], [1, \"⦹\"], [1, \"⦻\"], [0, \"⦼\"], [1, \"⦾\"], [0, \"⦿\"], [0, \"⧀\"], [0, \"⧁\"], [0, \"⧂\"], [0, \"⧃\"], [0, \"⧄\"], [0, \"⧅\"], [3, \"⧉\"], [3, \"⧍\"], [0, \"⧎\"], [0, { v: \"⧏\", n: 824, o: \"⧏̸\" }], [0, { v: \"⧐\", n: 824, o: \"⧐̸\" }], [11, \"⧜\"], [0, \"⧝\"], [0, \"⧞\"], [4, \"⧣\"], [0, \"⧤\"], [0, \"⧥\"], [5, \"⧫\"], [8, \"⧴\"], [1, \"⧶\"], [9, \"⨀\"], [0, \"⨁\"], [0, \"⨂\"], [1, \"⨄\"], [1, \"⨆\"], [5, \"⨌\"], [0, \"⨍\"], [2, \"⨐\"], [0, \"⨑\"], [0, \"⨒\"], [0, \"⨓\"], [0, \"⨔\"], [0, \"⨕\"], [0, \"⨖\"], [0, \"⨗\"], [10, \"⨢\"], [0, \"⨣\"], [0, \"⨤\"], [0, \"⨥\"], [0, \"⨦\"], [0, \"⨧\"], [1, \"⨩\"], [0, \"⨪\"], [2, \"⨭\"], [0, \"⨮\"], [0, \"⨯\"], [0, \"⨰\"], [0, \"⨱\"], [1, \"⨳\"], [0, \"⨴\"], [0, \"⨵\"], [0, \"⨶\"], [0, \"⨷\"], [0, \"⨸\"], [0, \"⨹\"], [0, \"⨺\"], [0, \"⨻\"], [0, \"⨼\"], [2, \"⨿\"], [0, \"⩀\"], [1, \"⩂\"], [0, \"⩃\"], [0, \"⩄\"], [0, \"⩅\"], [0, \"⩆\"], [0, \"⩇\"], [0, \"⩈\"], [0, \"⩉\"], [0, \"⩊\"], [0, \"⩋\"], [0, \"⩌\"], [0, \"⩍\"], [2, \"⩐\"], [2, \"⩓\"], [0, \"⩔\"], [0, \"⩕\"], [0, \"⩖\"], [0, \"⩗\"], [0, \"⩘\"], [1, \"⩚\"], [0, \"⩛\"], [0, \"⩜\"], [0, \"⩝\"], [1, \"⩟\"], [6, \"⩦\"], [3, \"⩪\"], [2, { v: \"⩭\", n: 824, o: \"⩭̸\" }], [0, \"⩮\"], [0, \"⩯\"], [0, { v: \"⩰\", n: 824, o: \"⩰̸\" }], [0, \"⩱\"], [0, \"⩲\"], [0, \"⩳\"], [0, \"⩴\"], [0, \"⩵\"], [1, \"⩷\"], [0, \"⩸\"], [0, \"⩹\"], [0, \"⩺\"], [0, \"⩻\"], [0, \"⩼\"], [0, { v: \"⩽\", n: 824, o: \"⩽̸\" }], [0, { v: \"⩾\", n: 824, o: \"⩾̸\" }], [0, \"⩿\"], [0, \"⪀\"], [0, \"⪁\"], [0, \"⪂\"], [0, \"⪃\"], [0, \"⪄\"], [0, \"⪅\"], [0, \"⪆\"], [0, \"⪇\"], [0, \"⪈\"], [0, \"⪉\"], [0, \"⪊\"], [0, \"⪋\"], [0, \"⪌\"], [0, \"⪍\"], [0, \"⪎\"], [0, \"⪏\"], [0, \"⪐\"], [0, \"⪑\"], [0, \"⪒\"], [0, \"⪓\"], [0, \"⪔\"], [0, \"⪕\"], [0, \"⪖\"], [0, \"⪗\"], [0, \"⪘\"], [0, \"⪙\"], [0, \"⪚\"], [2, \"⪝\"], [0, \"⪞\"], [0, \"⪟\"], [0, \"⪠\"], [0, { v: \"⪡\", n: 824, o: \"⪡̸\" }], [0, { v: \"⪢\", n: 824, o: \"⪢̸\" }], [1, \"⪤\"], [0, \"⪥\"], [0, \"⪦\"], [0, \"⪧\"], [0, \"⪨\"], [0, \"⪩\"], [0, \"⪪\"], [0, \"⪫\"], [0, { v: \"⪬\", n: 65024, o: \"⪬︀\" }], [0, { v: \"⪭\", n: 65024, o: \"⪭︀\" }], [0, \"⪮\"], [0, { v: \"⪯\", n: 824, o: \"⪯̸\" }], [0, { v: \"⪰\", n: 824, o: \"⪰̸\" }], [2, \"⪳\"], [0, \"⪴\"], [0, \"⪵\"], [0, \"⪶\"], [0, \"⪷\"], [0, \"⪸\"], [0, \"⪹\"], [0, \"⪺\"], [0, \"⪻\"], [0, \"⪼\"], [0, \"⪽\"], [0, \"⪾\"], [0, \"⪿\"], [0, \"⫀\"], [0, \"⫁\"], [0, \"⫂\"], [0, \"⫃\"], [0, \"⫄\"], [0, { v: \"⫅\", n: 824, o: \"⫅̸\" }], [0, { v: \"⫆\", n: 824, o: \"⫆̸\" }], [0, \"⫇\"], [0, \"⫈\"], [2, { v: \"⫋\", n: 65024, o: \"⫋︀\" }], [0, { v: \"⫌\", n: 65024, o: \"⫌︀\" }], [2, \"⫏\"], [0, \"⫐\"], [0, \"⫑\"], [0, \"⫒\"], [0, \"⫓\"], [0, \"⫔\"], [0, \"⫕\"], [0, \"⫖\"], [0, \"⫗\"], [0, \"⫘\"], [0, \"⫙\"], [0, \"⫚\"], [0, \"⫛\"], [8, \"⫤\"], [1, \"⫦\"], [0, \"⫧\"], [0, \"⫨\"], [0, \"⫩\"], [1, \"⫫\"], [0, \"⫬\"], [0, \"⫭\"], [0, \"⫮\"], [0, \"⫯\"], [0, \"⫰\"], [0, \"⫱\"], [0, \"⫲\"], [0, \"⫳\"], [9, { v: \"⫽\", n: 8421, o: \"⫽⃥\" }], [44343, { n: new Map(/* #__PURE__ */ restoreDiff([[56476, \"𝒜\"], [1, \"𝒞\"], [0, \"𝒟\"], [2, \"𝒢\"], [2, \"𝒥\"], [0, \"𝒦\"], [2, \"𝒩\"], [0, \"𝒪\"], [0, \"𝒫\"], [0, \"𝒬\"], [1, \"𝒮\"], [0, \"𝒯\"], [0, \"𝒰\"], [0, \"𝒱\"], [0, \"𝒲\"], [0, \"𝒳\"], [0, \"𝒴\"], [0, \"𝒵\"], [0, \"𝒶\"], [0, \"𝒷\"], [0, \"𝒸\"], [0, \"𝒹\"], [1, \"𝒻\"], [1, \"𝒽\"], [0, \"𝒾\"], [0, \"𝒿\"], [0, \"𝓀\"], [0, \"𝓁\"], [0, \"𝓂\"], [0, \"𝓃\"], [1, \"𝓅\"], [0, \"𝓆\"], [0, \"𝓇\"], [0, \"𝓈\"], [0, \"𝓉\"], [0, \"𝓊\"], [0, \"𝓋\"], [0, \"𝓌\"], [0, \"𝓍\"], [0, \"𝓎\"], [0, \"𝓏\"], [52, \"𝔄\"], [0, \"𝔅\"], [1, \"𝔇\"], [0, \"𝔈\"], [0, \"𝔉\"], [0, \"𝔊\"], [2, \"𝔍\"], [0, \"𝔎\"], [0, \"𝔏\"], [0, \"𝔐\"], [0, \"𝔑\"], [0, \"𝔒\"], [0, \"𝔓\"], [0, \"𝔔\"], [1, \"𝔖\"], [0, \"𝔗\"], [0, \"𝔘\"], [0, \"𝔙\"], [0, \"𝔚\"], [0, \"𝔛\"], [0, \"𝔜\"], [1, \"𝔞\"], [0, \"𝔟\"], [0, \"𝔠\"], [0, \"𝔡\"], [0, \"𝔢\"], [0, \"𝔣\"], [0, \"𝔤\"], [0, \"𝔥\"], [0, \"𝔦\"], [0, \"𝔧\"], [0, \"𝔨\"], [0, \"𝔩\"], [0, \"𝔪\"], [0, \"𝔫\"], [0, \"𝔬\"], [0, \"𝔭\"], [0, \"𝔮\"], [0, \"𝔯\"], [0, \"𝔰\"], [0, \"𝔱\"], [0, \"𝔲\"], [0, \"𝔳\"], [0, \"𝔴\"], [0, \"𝔵\"], [0, \"𝔶\"], [0, \"𝔷\"], [0, \"𝔸\"], [0, \"𝔹\"], [1, \"𝔻\"], [0, \"𝔼\"], [0, \"𝔽\"], [0, \"𝔾\"], [1, \"𝕀\"], [0, \"𝕁\"], [0, \"𝕂\"], [0, \"𝕃\"], [0, \"𝕄\"], [1, \"𝕆\"], [3, \"𝕊\"], [0, \"𝕋\"], [0, \"𝕌\"], [0, \"𝕍\"], [0, \"𝕎\"], [0, \"𝕏\"], [0, \"𝕐\"], [1, \"𝕒\"], [0, \"𝕓\"], [0, \"𝕔\"], [0, \"𝕕\"], [0, \"𝕖\"], [0, \"𝕗\"], [0, \"𝕘\"], [0, \"𝕙\"], [0, \"𝕚\"], [0, \"𝕛\"], [0, \"𝕜\"], [0, \"𝕝\"], [0, \"𝕞\"], [0, \"𝕟\"], [0, \"𝕠\"], [0, \"𝕡\"], [0, \"𝕢\"], [0, \"𝕣\"], [0, \"𝕤\"], [0, \"𝕥\"], [0, \"𝕦\"], [0, \"𝕧\"], [0, \"𝕨\"], [0, \"𝕩\"], [0, \"𝕪\"], [0, \"𝕫\"]])) }], [8906, \"ff\"], [0, \"fi\"], [0, \"fl\"], [0, \"ffi\"], [0, \"ffl\"]])));\n//# sourceMappingURL=encode-html.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9nZW5lcmF0ZWQvZW5jb2RlLWh0bWwuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBZSwrQ0FBK0Msa0JBQWtCLGdCQUFnQixlQUFlLGNBQWMsaUJBQWlCLGlCQUFpQixjQUFjLGVBQWUsZUFBZSxlQUFlLGNBQWMsZUFBZSxnQkFBZ0IsaUJBQWlCLGNBQWMsaUJBQWlCLGVBQWUsVUFBVSxRQUFRLHNCQUFzQixHQUFHLFNBQVMsWUFBWSxxQkFBcUIsR0FBRyxTQUFTLFFBQVEsc0JBQXNCLEdBQUcsZUFBZSxpQkFBaUIsa0JBQWtCLGVBQWUsaUJBQWlCLGNBQWMsaUJBQWlCLDJCQUEyQixVQUFVLG1CQUFtQixHQUFHLGlCQUFpQixpQkFBaUIsaUJBQWlCLGdCQUFnQixnQkFBZ0IsZUFBZSxnQkFBZ0IsaUJBQWlCLGNBQWMsaUJBQWlCLGVBQWUsY0FBYyxlQUFlLGVBQWUsZ0JBQWdCLGNBQWMsY0FBYyxtQkFBbUIsZUFBZSxjQUFjLG9CQUFvQixlQUFlLGVBQWUsZ0JBQWdCLGdCQUFnQixlQUFlLG9CQUFvQixnQkFBZ0IsZUFBZSxlQUFlLGdCQUFnQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsaUJBQWlCLGVBQWUsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZUFBZSxpQkFBaUIsaUJBQWlCLGdCQUFnQixlQUFlLGNBQWMsaUJBQWlCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixlQUFlLGdCQUFnQixpQkFBaUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZUFBZSxpQkFBaUIsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGdCQUFnQixpQkFBaUIsZUFBZSxnQkFBZ0IsZ0JBQWdCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGdCQUFnQixlQUFlLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGVBQWUsY0FBYyxpQkFBaUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsaUJBQWlCLGVBQWUsY0FBYyxpQkFBaUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZUFBZSxpQkFBaUIsZ0JBQWdCLGVBQWUsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGdCQUFnQixnQkFBZ0IsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZ0JBQWdCLGVBQWUsZUFBZSxpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZ0JBQWdCLGVBQWUsZUFBZSxnQkFBZ0IsZ0JBQWdCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGVBQWUsZUFBZSxpQkFBaUIsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGVBQWUsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGNBQWMsY0FBYyxnQkFBZ0IsZ0JBQWdCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGdCQUFnQixnQkFBZ0IsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGdCQUFnQixnQkFBZ0IsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixlQUFlLGlCQUFpQixpQkFBaUIsZUFBZSxlQUFlLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixrQkFBa0IsaUJBQWlCLGlCQUFpQixnQkFBZ0IsaUJBQWlCLHlCQUF5QixlQUFlLGVBQWUsMkJBQTJCLGdCQUFnQixxQkFBcUIsa0JBQWtCLGVBQWUsZ0JBQWdCLGdCQUFnQixrQkFBa0IsZUFBZSxjQUFjLGdCQUFnQixlQUFlLGdCQUFnQixpQkFBaUIsYUFBYSxhQUFhLGFBQWEsa0JBQWtCLGFBQWEsY0FBYyxnQkFBZ0IsY0FBYyxrQkFBa0IsY0FBYyxjQUFjLGNBQWMsY0FBYyxnQkFBZ0IsZUFBZSxnQkFBZ0IsZ0JBQWdCLGVBQWUsZUFBZSxjQUFjLGdCQUFnQixlQUFlLGdCQUFnQixpQkFBaUIsYUFBYSxhQUFhLGFBQWEsa0JBQWtCLGFBQWEsY0FBYyxpQkFBaUIsZ0JBQWdCLGNBQWMsZUFBZSxjQUFjLGNBQWMsY0FBYyxnQkFBZ0IsbUJBQW1CLGVBQWUsZUFBZSxjQUFjLGlCQUFpQixrQkFBa0Isa0JBQWtCLGVBQWUsZ0JBQWdCLHNCQUFzQixnQkFBZ0IsZUFBZSxlQUFlLGdCQUFnQixlQUFlLGdCQUFnQixlQUFlLGlCQUFpQixlQUFlLGVBQWUsZ0JBQWdCLGVBQWUsZ0JBQWdCLGVBQWUsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGVBQWUsZUFBZSxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsZUFBZSxlQUFlLGVBQWUsZUFBZSxpQkFBaUIsaUJBQWlCLGNBQWMsaUJBQWlCLGNBQWMsZUFBZSxlQUFlLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxlQUFlLGVBQWUsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGVBQWUsZUFBZSxlQUFlLGVBQWUsaUJBQWlCLGlCQUFpQixjQUFjLGlCQUFpQixjQUFjLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxnQkFBZ0IsZUFBZSxnQkFBZ0IsZUFBZSxpQkFBaUIsZUFBZSxlQUFlLGdCQUFnQixlQUFlLGdCQUFnQixlQUFlLGtCQUFrQixlQUFlLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixvQkFBb0IsaUJBQWlCLDhCQUE4QixlQUFlLGNBQWMsY0FBYyxjQUFjLGVBQWUsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLGdCQUFnQiwwQkFBMEIsaUJBQWlCLGdCQUFnQixnQ0FBZ0MsZ0JBQWdCLGlCQUFpQixpQkFBaUIsZUFBZSxlQUFlLGlCQUFpQixpQkFBaUIsa0JBQWtCLGdCQUFnQixnQkFBZ0IsaUJBQWlCLG9CQUFvQixpQkFBaUIsaUJBQWlCLGdCQUFnQixnQkFBZ0IsaUJBQWlCLGdCQUFnQixpQkFBaUIsaUJBQWlCLFVBQVUsaUJBQWlCLDRCQUE0QixHQUFHLGlCQUFpQixhQUFhLHlCQUF5QixhQUFhLGdCQUFnQixnQkFBZ0IsaUJBQWlCLHFCQUFxQixpQkFBaUIsZUFBZSxpQkFBaUIsY0FBYyxlQUFlLGtCQUFrQixlQUFlLG1CQUFtQixjQUFjLGlCQUFpQixjQUFjLG1CQUFtQixpQkFBaUIsaUJBQWlCLGlCQUFpQixlQUFlLGVBQWUsa0JBQWtCLGVBQWUsZ0JBQWdCLGFBQWEsZ0JBQWdCLG1CQUFtQixjQUFjLGlCQUFpQixnQkFBZ0IsaUJBQWlCLGtCQUFrQixlQUFlLGVBQWUscUJBQXFCLG9CQUFvQixnQkFBZ0Isa0JBQWtCLGVBQWUsZ0JBQWdCLGlCQUFpQixnQ0FBZ0MsYUFBYSxhQUFhLGFBQWEsa0JBQWtCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLHVCQUF1QixlQUFlLGVBQWUsZUFBZSxzQkFBc0IsZ0JBQWdCLGdCQUFnQiwwQkFBMEIseUJBQXlCLGdCQUFnQixnQkFBZ0IsVUFBVSxXQUFXLHVCQUF1QixHQUFHLGNBQWMsZUFBZSxlQUFlLGVBQWUsaUJBQWlCLGlCQUFpQix1QkFBdUIsbUJBQW1CLGNBQWMsdUJBQXVCLHdCQUF3Qix5QkFBeUIsaUJBQWlCLHlCQUF5QixnQkFBZ0IsZ0JBQWdCLGNBQWMsY0FBYyxlQUFlLGVBQWUsZ0JBQWdCLGlCQUFpQixpQkFBaUIsMEJBQTBCLDJCQUEyQix3QkFBd0IseUJBQXlCLHdCQUF3Qix1QkFBdUIsZ0JBQWdCLDBCQUEwQixnQkFBZ0IsZ0JBQWdCLDhCQUE4QixnQkFBZ0IsOEJBQThCLHlCQUF5QixxQkFBcUIsMkJBQTJCLGdCQUFnQiw0QkFBNEIsc0JBQXNCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLDBCQUEwQix3QkFBd0IsMkJBQTJCLGVBQWUsK0JBQStCLDRCQUE0QixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixrQkFBa0IsZ0JBQWdCLGdCQUFnQiw0QkFBNEIsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsaUJBQWlCLGVBQWUsVUFBVSxVQUFVLHNCQUFzQixHQUFHLGVBQWUsaUJBQWlCLGdCQUFnQixjQUFjLGtCQUFrQixxQkFBcUIsYUFBYSxnQkFBZ0IsZUFBZSxpQkFBaUIsY0FBYyxnQkFBZ0Isb0JBQW9CLGtCQUFrQixvQkFBb0IsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZUFBZSxnQkFBZ0IsZ0JBQWdCLFVBQVUsU0FBUyxzQkFBc0IsR0FBRyxnQkFBZ0IsaUJBQWlCLGNBQWMsZUFBZSw0QkFBNEIsK0JBQStCLGNBQWMsYUFBYSxVQUFVLFNBQVMsdUJBQXVCLEdBQUcsU0FBUyxTQUFTLHVCQUF1QixHQUFHLGFBQWEsY0FBYyxnQkFBZ0IsaUJBQWlCLGlCQUFpQixrQkFBa0IsZ0JBQWdCLG1DQUFtQyxtQkFBbUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZ0JBQWdCLG1CQUFtQixnQkFBZ0IsaUJBQWlCLFVBQVUsU0FBUyx1QkFBdUIsR0FBRyxTQUFTLGFBQWEscUJBQXFCLEdBQUcsU0FBUyxRQUFRLG9CQUFvQixHQUFHLGFBQWEsd0JBQXdCLG1CQUFtQixVQUFVLFdBQVcsc0JBQXNCLEdBQUcsY0FBYyx3QkFBd0IsZUFBZSxnQkFBZ0IsZ0JBQWdCLGFBQWEsY0FBYyxjQUFjLFVBQVUsVUFBVSxzQkFBc0IsR0FBRyxrQkFBa0IsVUFBVSxhQUFhLHNCQUFzQixHQUFHLFNBQVMsVUFBVSxzQkFBc0IsR0FBRyxTQUFTLFdBQVcsdUJBQXVCLEdBQUcsU0FBUyxXQUFXLHNCQUFzQixHQUFHLGtCQUFrQixnQkFBZ0IsZ0JBQWdCLGlCQUFpQixpQkFBaUIsZUFBZSxpQkFBaUIsaUJBQWlCLGdCQUFnQixvQkFBb0IsaUJBQWlCLGFBQWEsVUFBVSxlQUFlLHlCQUF5QixHQUFHLGdCQUFnQixVQUFVLFFBQVEsc0JBQXNCLEdBQUcsU0FBUyxRQUFRLHNCQUFzQixHQUFHLFNBQVMsUUFBUSxvQkFBb0IsR0FBRyxTQUFTLFFBQVEsb0JBQW9CLEdBQUcsU0FBUyxTQUFTLDRCQUE0QixHQUFHLFNBQVMsU0FBUyw0QkFBNEIsR0FBRyxTQUFTLFFBQVEsd0RBQXdELGlCQUFpQixPQUFPLFNBQVMsUUFBUSx3REFBd0QsaUJBQWlCLE9BQU8saUJBQWlCLG9CQUFvQixnQkFBZ0IsY0FBYyxjQUFjLGNBQWMsa0JBQWtCLHVCQUF1QixnQkFBZ0IsZ0JBQWdCLHNCQUFzQixhQUFhLHlCQUF5Qix5QkFBeUIsYUFBYSxhQUFhLGdCQUFnQixnQkFBZ0Isd0JBQXdCLFVBQVUsV0FBVyxpQ0FBaUMsR0FBRyxxQkFBcUIsc0JBQXNCLFVBQVUsU0FBUywyQkFBMkIsR0FBRyxTQUFTLFNBQVMsNkJBQTZCLEdBQUcsY0FBYyxlQUFlLGVBQWUsZUFBZSx5QkFBeUIsMkJBQTJCLFVBQVUsV0FBVywrQkFBK0IsR0FBRyxTQUFTLFdBQVcsK0JBQStCLEdBQUcsZ0JBQWdCLG9CQUFvQixVQUFVLFdBQVcsZ0NBQWdDLEdBQUcsU0FBUyxXQUFXLGtDQUFrQyxHQUFHLGdCQUFnQixpQkFBaUIsVUFBVSxXQUFXLHlCQUF5QixHQUFHLFNBQVMsV0FBVyx5QkFBeUIsR0FBRyxvQkFBb0Isc0JBQXNCLHNCQUFzQixlQUFlLG9CQUFvQixzQkFBc0IscUJBQXFCLHNCQUFzQixrQkFBa0IsbUJBQW1CLG1CQUFtQixvQkFBb0IsbUJBQW1CLGdCQUFnQixrQkFBa0IsY0FBYyxpQkFBaUIseUJBQXlCLGdCQUFnQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsdUJBQXVCLHdCQUF3QixVQUFVLHVCQUF1Qix5QkFBeUIsR0FBRyxTQUFTLHdCQUF3Qix5QkFBeUIsR0FBRyxnQkFBZ0IsZUFBZSxtQkFBbUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGtCQUFrQixnQkFBZ0IsbUJBQW1CLGlCQUFpQixpQkFBaUIsaUJBQWlCLGVBQWUsZUFBZSxpQkFBaUIsd0JBQXdCLGlCQUFpQixpQkFBaUIsaUJBQWlCLHlCQUF5QiwwQkFBMEIsb0JBQW9CLG1CQUFtQixxQkFBcUIsY0FBYyxjQUFjLGNBQWMsY0FBYyxlQUFlLGVBQWUsa0JBQWtCLGdCQUFnQixVQUFVLFFBQVEsb0JBQW9CLEdBQUcsU0FBUyxRQUFRLG9CQUFvQixHQUFHLFNBQVMsU0FBUyx1QkFBdUIsR0FBRyxTQUFTLFNBQVMsdUJBQXVCLEdBQUcsZUFBZSxnQkFBZ0IsZ0NBQWdDLGdDQUFnQywrQkFBK0IsaUNBQWlDLGdCQUFnQixnQkFBZ0IsbUJBQW1CLGlCQUFpQixnQkFBZ0IsMkJBQTJCLGlCQUFpQixnQ0FBZ0MsaUJBQWlCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixpQkFBaUIsZ0JBQWdCLFVBQVUsYUFBYSx5QkFBeUIsR0FBRyxpQkFBaUIsa0JBQWtCLFVBQVUsV0FBVyx1QkFBdUIsR0FBRyxjQUFjLGVBQWUsY0FBYyxrQkFBa0Isa0JBQWtCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixvQkFBb0IsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixlQUFlLG1CQUFtQixtQkFBbUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixpQkFBaUIsbUJBQW1CLGlCQUFpQixnQkFBZ0IsaUJBQWlCLG1CQUFtQixzQkFBc0IscUJBQXFCLHNCQUFzQixlQUFlLG1CQUFtQiwyQkFBMkIsMkJBQTJCLG9CQUFvQixxQkFBcUIsbUJBQW1CLG1CQUFtQixpQkFBaUIscUJBQXFCLGdCQUFnQixlQUFlLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixlQUFlLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGlCQUFpQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGtCQUFrQixzQkFBc0IsK0JBQStCLGVBQWUsaUJBQWlCLGdCQUFnQix3QkFBd0Isd0JBQXdCLG1CQUFtQiw2QkFBNkIsZUFBZSwwQkFBMEIsNEJBQTRCLGVBQWUsNEJBQTRCLGVBQWUsY0FBYyxjQUFjLGtCQUFrQixrQkFBa0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsMkJBQTJCLDRCQUE0QixrQkFBa0IsZUFBZSxnQkFBZ0Isa0JBQWtCLGVBQWUsa0JBQWtCLGdCQUFnQixpQkFBaUIsc0JBQXNCLGVBQWUsZUFBZSxrQkFBa0IsZ0JBQWdCLGtCQUFrQixnQkFBZ0IsZUFBZSxnQkFBZ0IsNkJBQTZCLGlCQUFpQixnQkFBZ0Isb0JBQW9CLGtCQUFrQiw2QkFBNkIsNkJBQTZCLGVBQWUsZUFBZSxlQUFlLGVBQWUsZ0JBQWdCLGdCQUFnQix3QkFBd0IseUJBQXlCLDZCQUE2Qiw4QkFBOEIsK0JBQStCLG1DQUFtQyxxQkFBcUIsbUJBQW1CLG1CQUFtQixpQkFBaUIsaUJBQWlCLGNBQWMsZ0JBQWdCLGlCQUFpQixnQkFBZ0Isa0JBQWtCLG1CQUFtQixtQkFBbUIscUJBQXFCLHVCQUF1QixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsa0JBQWtCLGtCQUFrQixpQkFBaUIsaUJBQWlCLG1CQUFtQixtQkFBbUIsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLFVBQVUsV0FBVyx1QkFBdUIsR0FBRyxpQkFBaUIsZUFBZSxlQUFlLGtCQUFrQixpQkFBaUIsa0JBQWtCLGtCQUFrQixpQkFBaUIsa0JBQWtCLG1CQUFtQixtQkFBbUIsbUJBQW1CLDBCQUEwQiw0QkFBNEIsOEJBQThCLDJCQUEyQix3QkFBd0IseUJBQXlCLDJCQUEyQiw2QkFBNkIsNEJBQTRCLDZCQUE2QiwwQkFBMEIsNEJBQTRCLHdCQUF3Qix5QkFBeUIsMkJBQTJCLDZCQUE2Qiw0QkFBNEIsNkJBQTZCLDBCQUEwQiw0QkFBNEIsZUFBZSxlQUFlLGVBQWUsZUFBZSxrQkFBa0Isa0JBQWtCLGtCQUFrQixrQkFBa0IsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGdCQUFnQixnQkFBZ0IsdUJBQXVCLGdCQUFnQixrQkFBa0Isa0JBQWtCLGtCQUFrQixpQkFBaUIsaUJBQWlCLGlCQUFpQixrQkFBa0Isa0JBQWtCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGlCQUFpQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixnQkFBZ0Isa0JBQWtCLGtCQUFrQixrQkFBa0Isa0JBQWtCLGdCQUFnQixnQkFBZ0IsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGtCQUFrQixpQkFBaUIsbUJBQW1CLGVBQWUsZ0JBQWdCLGtCQUFrQixrQkFBa0IsbUJBQW1CLG1CQUFtQixtQkFBbUIsbUJBQW1CLG1CQUFtQixtQkFBbUIsbUJBQW1CLG1CQUFtQixrQkFBa0Isa0JBQWtCLGtCQUFrQixtQkFBbUIsbUJBQW1CLGdCQUFnQixlQUFlLGVBQWUsZ0JBQWdCLGtCQUFrQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixjQUFjLGNBQWMsa0JBQWtCLGVBQWUsZUFBZSxnQkFBZ0IsaUJBQWlCLGdCQUFnQixtQkFBbUIsVUFBVSxxQkFBcUIsbUNBQW1DLEdBQUcsU0FBUyxzQkFBc0Isb0NBQW9DLEdBQUcsaUJBQWlCLG1CQUFtQixrQkFBa0IsaUJBQWlCLG1CQUFtQixtQkFBbUIsdUJBQXVCLHNCQUFzQixlQUFlLGtCQUFrQixtQkFBbUIsb0JBQW9CLG1CQUFtQixtQkFBbUIsaUJBQWlCLG1CQUFtQixtQkFBbUIsZ0JBQWdCLG1CQUFtQixtQkFBbUIsa0JBQWtCLG1CQUFtQixrQkFBa0IsbUJBQW1CLG1CQUFtQixtQkFBbUIsa0JBQWtCLGlCQUFpQixrQkFBa0Isa0JBQWtCLGlCQUFpQixrQkFBa0IsaUJBQWlCLGlCQUFpQixnQkFBZ0IsaUJBQWlCLG1CQUFtQixpQkFBaUIsa0JBQWtCLGtCQUFrQixtQkFBbUIsaUJBQWlCLGVBQWUsa0JBQWtCLG1CQUFtQixrQkFBa0Isa0JBQWtCLGdCQUFnQixpQkFBaUIsZUFBZSxlQUFlLGlCQUFpQixnQkFBZ0IsaUJBQWlCLGlCQUFpQixtQkFBbUIsbUJBQW1CLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGdCQUFnQixrQkFBa0IsY0FBYyxhQUFhLGlCQUFpQixlQUFlLGtCQUFrQixtQkFBbUIsZUFBZSxjQUFjLGVBQWUsY0FBYyxpQkFBaUIsZ0JBQWdCLGlCQUFpQixVQUFVLGFBQWEseUJBQXlCLEdBQUcsZ0JBQWdCLGlCQUFpQixVQUFVLFNBQVMscUJBQXFCLEdBQUcsZUFBZSxnQkFBZ0IsZUFBZSxpQkFBaUIsZ0JBQWdCLGtCQUFrQixrQkFBa0IsZ0JBQWdCLGdCQUFnQixrQkFBa0Isa0JBQWtCLFVBQVUsY0FBYywwQkFBMEIsR0FBRyxTQUFTLGNBQWMsMEJBQTBCLEdBQUcsZ0JBQWdCLGlCQUFpQixrQkFBa0Isa0JBQWtCLG1CQUFtQixtQkFBbUIsY0FBYyxjQUFjLGNBQWMsY0FBYyxlQUFlLGVBQWUsY0FBYyxjQUFjLGdCQUFnQixnQkFBZ0IsZ0JBQWdCLGdCQUFnQixjQUFjLGNBQWMsaUJBQWlCLGlCQUFpQixjQUFjLGNBQWMsaUJBQWlCLGlCQUFpQixhQUFhLGFBQWEsZUFBZSxlQUFlLGdCQUFnQixnQkFBZ0IsVUFBVSxjQUFjLGtDQUFrQyxHQUFHLFNBQVMsb0JBQW9CLHdDQUF3QyxHQUFHLGFBQWEsY0FBYyxlQUFlLGVBQWUsZ0JBQWdCLGdCQUFnQixjQUFjLGNBQWMsVUFBVSxVQUFVLHdCQUF3QixHQUFHLFNBQVMsVUFBVSx3QkFBd0IsR0FBRyxlQUFlLFVBQVUsbUJBQW1CLGlDQUFpQyxHQUFHLFNBQVMsU0FBUyxpQ0FBaUMsR0FBRyxhQUFhLGNBQWMsbUJBQW1CLGVBQWUsZUFBZSxlQUFlLHNCQUFzQixnQkFBZ0IsYUFBYSxhQUFhLGlCQUFpQixpQkFBaUIsa0JBQWtCLGtCQUFrQixrQkFBa0Isa0JBQWtCLGtCQUFrQixrQkFBa0IsVUFBVSxVQUFVLHNCQUFzQixHQUFHLFNBQVMsVUFBVSxzQkFBc0IsR0FBRyxnQkFBZ0IsaUJBQWlCLFVBQVUsV0FBVyxnQ0FBZ0MsR0FBRyxTQUFTLFdBQVcsZ0NBQWdDLEdBQUcsY0FBYyxlQUFlLGdCQUFnQixnQkFBZ0IsaUJBQWlCLGlCQUFpQixpQkFBaUIsaUJBQWlCLGtCQUFrQixrQkFBa0IsZ0JBQWdCLGtCQUFrQixlQUFlLGdCQUFnQixpQkFBaUIsZUFBZSxlQUFlLGdCQUFnQixlQUFlLGNBQWMsZUFBZSxnQkFBZ0IsaUJBQWlCLGlCQUFpQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixVQUFVLFdBQVcsd0JBQXdCLEdBQUcsYUFBYSx1REFBdUQsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsY0FBYyxjQUFjLGNBQWMsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsZUFBZSxlQUFlLGVBQWUsT0FBTyxrQkFBa0IsZ0JBQWdCLGdCQUFnQixpQkFBaUIsaUJBQWlCLEtBQUssRUFBQztBQUM5cTBCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNhc3Bpbmd1cy9sdC8uL25vZGVfbW9kdWxlcy9lbnRpdGllcy9saWIvZXNtL2dlbmVyYXRlZC9lbmNvZGUtaHRtbC5qcz8wMjZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCB1c2luZyBzY3JpcHRzL3dyaXRlLWVuY29kZS1tYXAudHNcbmZ1bmN0aW9uIHJlc3RvcmVEaWZmKGFycikge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycltpXVswXSArPSBhcnJbaSAtIDFdWzBdICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbn1cbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IGRlZmF1bHQgbmV3IE1hcCgvKiAjX19QVVJFX18gKi8gcmVzdG9yZURpZmYoW1s5LCBcIiZUYWI7XCJdLCBbMCwgXCImTmV3TGluZTtcIl0sIFsyMiwgXCImZXhjbDtcIl0sIFswLCBcIiZxdW90O1wiXSwgWzAsIFwiJm51bTtcIl0sIFswLCBcIiZkb2xsYXI7XCJdLCBbMCwgXCImcGVyY250O1wiXSwgWzAsIFwiJmFtcDtcIl0sIFswLCBcIiZhcG9zO1wiXSwgWzAsIFwiJmxwYXI7XCJdLCBbMCwgXCImcnBhcjtcIl0sIFswLCBcIiZhc3Q7XCJdLCBbMCwgXCImcGx1cztcIl0sIFswLCBcIiZjb21tYTtcIl0sIFsxLCBcIiZwZXJpb2Q7XCJdLCBbMCwgXCImc29sO1wiXSwgWzEwLCBcIiZjb2xvbjtcIl0sIFswLCBcIiZzZW1pO1wiXSwgWzAsIHsgdjogXCImbHQ7XCIsIG46IDg0MDIsIG86IFwiJm52bHQ7XCIgfV0sIFswLCB7IHY6IFwiJmVxdWFscztcIiwgbjogODQyMSwgbzogXCImYm5lO1wiIH1dLCBbMCwgeyB2OiBcIiZndDtcIiwgbjogODQwMiwgbzogXCImbnZndDtcIiB9XSwgWzAsIFwiJnF1ZXN0O1wiXSwgWzAsIFwiJmNvbW1hdDtcIl0sIFsyNiwgXCImbGJyYWNrO1wiXSwgWzAsIFwiJmJzb2w7XCJdLCBbMCwgXCImcmJyYWNrO1wiXSwgWzAsIFwiJkhhdDtcIl0sIFswLCBcIiZsb3diYXI7XCJdLCBbMCwgXCImRGlhY3JpdGljYWxHcmF2ZTtcIl0sIFs1LCB7IG46IDEwNiwgbzogXCImZmpsaWc7XCIgfV0sIFsyMCwgXCImbGJyYWNlO1wiXSwgWzAsIFwiJnZlcmJhcjtcIl0sIFswLCBcIiZyYnJhY2U7XCJdLCBbMzQsIFwiJm5ic3A7XCJdLCBbMCwgXCImaWV4Y2w7XCJdLCBbMCwgXCImY2VudDtcIl0sIFswLCBcIiZwb3VuZDtcIl0sIFswLCBcIiZjdXJyZW47XCJdLCBbMCwgXCImeWVuO1wiXSwgWzAsIFwiJmJydmJhcjtcIl0sIFswLCBcIiZzZWN0O1wiXSwgWzAsIFwiJmRpZTtcIl0sIFswLCBcIiZjb3B5O1wiXSwgWzAsIFwiJm9yZGY7XCJdLCBbMCwgXCImbGFxdW87XCJdLCBbMCwgXCImbm90O1wiXSwgWzAsIFwiJnNoeTtcIl0sIFswLCBcIiZjaXJjbGVkUjtcIl0sIFswLCBcIiZtYWNyO1wiXSwgWzAsIFwiJmRlZztcIl0sIFswLCBcIiZQbHVzTWludXM7XCJdLCBbMCwgXCImc3VwMjtcIl0sIFswLCBcIiZzdXAzO1wiXSwgWzAsIFwiJmFjdXRlO1wiXSwgWzAsIFwiJm1pY3JvO1wiXSwgWzAsIFwiJnBhcmE7XCJdLCBbMCwgXCImY2VudGVyZG90O1wiXSwgWzAsIFwiJmNlZGlsO1wiXSwgWzAsIFwiJnN1cDE7XCJdLCBbMCwgXCImb3JkbTtcIl0sIFswLCBcIiZyYXF1bztcIl0sIFswLCBcIiZmcmFjMTQ7XCJdLCBbMCwgXCImZnJhYzEyO1wiXSwgWzAsIFwiJmZyYWMzNDtcIl0sIFswLCBcIiZpcXVlc3Q7XCJdLCBbMCwgXCImQWdyYXZlO1wiXSwgWzAsIFwiJkFhY3V0ZTtcIl0sIFswLCBcIiZBY2lyYztcIl0sIFswLCBcIiZBdGlsZGU7XCJdLCBbMCwgXCImQXVtbDtcIl0sIFswLCBcIiZhbmdzdDtcIl0sIFswLCBcIiZBRWxpZztcIl0sIFswLCBcIiZDY2VkaWw7XCJdLCBbMCwgXCImRWdyYXZlO1wiXSwgWzAsIFwiJkVhY3V0ZTtcIl0sIFswLCBcIiZFY2lyYztcIl0sIFswLCBcIiZFdW1sO1wiXSwgWzAsIFwiJklncmF2ZTtcIl0sIFswLCBcIiZJYWN1dGU7XCJdLCBbMCwgXCImSWNpcmM7XCJdLCBbMCwgXCImSXVtbDtcIl0sIFswLCBcIiZFVEg7XCJdLCBbMCwgXCImTnRpbGRlO1wiXSwgWzAsIFwiJk9ncmF2ZTtcIl0sIFswLCBcIiZPYWN1dGU7XCJdLCBbMCwgXCImT2NpcmM7XCJdLCBbMCwgXCImT3RpbGRlO1wiXSwgWzAsIFwiJk91bWw7XCJdLCBbMCwgXCImdGltZXM7XCJdLCBbMCwgXCImT3NsYXNoO1wiXSwgWzAsIFwiJlVncmF2ZTtcIl0sIFswLCBcIiZVYWN1dGU7XCJdLCBbMCwgXCImVWNpcmM7XCJdLCBbMCwgXCImVXVtbDtcIl0sIFswLCBcIiZZYWN1dGU7XCJdLCBbMCwgXCImVEhPUk47XCJdLCBbMCwgXCImc3psaWc7XCJdLCBbMCwgXCImYWdyYXZlO1wiXSwgWzAsIFwiJmFhY3V0ZTtcIl0sIFswLCBcIiZhY2lyYztcIl0sIFswLCBcIiZhdGlsZGU7XCJdLCBbMCwgXCImYXVtbDtcIl0sIFswLCBcIiZhcmluZztcIl0sIFswLCBcIiZhZWxpZztcIl0sIFswLCBcIiZjY2VkaWw7XCJdLCBbMCwgXCImZWdyYXZlO1wiXSwgWzAsIFwiJmVhY3V0ZTtcIl0sIFswLCBcIiZlY2lyYztcIl0sIFswLCBcIiZldW1sO1wiXSwgWzAsIFwiJmlncmF2ZTtcIl0sIFswLCBcIiZpYWN1dGU7XCJdLCBbMCwgXCImaWNpcmM7XCJdLCBbMCwgXCImaXVtbDtcIl0sIFswLCBcIiZldGg7XCJdLCBbMCwgXCImbnRpbGRlO1wiXSwgWzAsIFwiJm9ncmF2ZTtcIl0sIFswLCBcIiZvYWN1dGU7XCJdLCBbMCwgXCImb2NpcmM7XCJdLCBbMCwgXCImb3RpbGRlO1wiXSwgWzAsIFwiJm91bWw7XCJdLCBbMCwgXCImZGl2O1wiXSwgWzAsIFwiJm9zbGFzaDtcIl0sIFswLCBcIiZ1Z3JhdmU7XCJdLCBbMCwgXCImdWFjdXRlO1wiXSwgWzAsIFwiJnVjaXJjO1wiXSwgWzAsIFwiJnV1bWw7XCJdLCBbMCwgXCImeWFjdXRlO1wiXSwgWzAsIFwiJnRob3JuO1wiXSwgWzAsIFwiJnl1bWw7XCJdLCBbMCwgXCImQW1hY3I7XCJdLCBbMCwgXCImYW1hY3I7XCJdLCBbMCwgXCImQWJyZXZlO1wiXSwgWzAsIFwiJmFicmV2ZTtcIl0sIFswLCBcIiZBb2dvbjtcIl0sIFswLCBcIiZhb2dvbjtcIl0sIFswLCBcIiZDYWN1dGU7XCJdLCBbMCwgXCImY2FjdXRlO1wiXSwgWzAsIFwiJkNjaXJjO1wiXSwgWzAsIFwiJmNjaXJjO1wiXSwgWzAsIFwiJkNkb3Q7XCJdLCBbMCwgXCImY2RvdDtcIl0sIFswLCBcIiZDY2Fyb247XCJdLCBbMCwgXCImY2Nhcm9uO1wiXSwgWzAsIFwiJkRjYXJvbjtcIl0sIFswLCBcIiZkY2Fyb247XCJdLCBbMCwgXCImRHN0cm9rO1wiXSwgWzAsIFwiJmRzdHJvaztcIl0sIFswLCBcIiZFbWFjcjtcIl0sIFswLCBcIiZlbWFjcjtcIl0sIFsyLCBcIiZFZG90O1wiXSwgWzAsIFwiJmVkb3Q7XCJdLCBbMCwgXCImRW9nb247XCJdLCBbMCwgXCImZW9nb247XCJdLCBbMCwgXCImRWNhcm9uO1wiXSwgWzAsIFwiJmVjYXJvbjtcIl0sIFswLCBcIiZHY2lyYztcIl0sIFswLCBcIiZnY2lyYztcIl0sIFswLCBcIiZHYnJldmU7XCJdLCBbMCwgXCImZ2JyZXZlO1wiXSwgWzAsIFwiJkdkb3Q7XCJdLCBbMCwgXCImZ2RvdDtcIl0sIFswLCBcIiZHY2VkaWw7XCJdLCBbMSwgXCImSGNpcmM7XCJdLCBbMCwgXCImaGNpcmM7XCJdLCBbMCwgXCImSHN0cm9rO1wiXSwgWzAsIFwiJmhzdHJvaztcIl0sIFswLCBcIiZJdGlsZGU7XCJdLCBbMCwgXCImaXRpbGRlO1wiXSwgWzAsIFwiJkltYWNyO1wiXSwgWzAsIFwiJmltYWNyO1wiXSwgWzIsIFwiJklvZ29uO1wiXSwgWzAsIFwiJmlvZ29uO1wiXSwgWzAsIFwiJklkb3Q7XCJdLCBbMCwgXCImaW1hdGg7XCJdLCBbMCwgXCImSUpsaWc7XCJdLCBbMCwgXCImaWpsaWc7XCJdLCBbMCwgXCImSmNpcmM7XCJdLCBbMCwgXCImamNpcmM7XCJdLCBbMCwgXCImS2NlZGlsO1wiXSwgWzAsIFwiJmtjZWRpbDtcIl0sIFswLCBcIiZrZ3JlZW47XCJdLCBbMCwgXCImTGFjdXRlO1wiXSwgWzAsIFwiJmxhY3V0ZTtcIl0sIFswLCBcIiZMY2VkaWw7XCJdLCBbMCwgXCImbGNlZGlsO1wiXSwgWzAsIFwiJkxjYXJvbjtcIl0sIFswLCBcIiZsY2Fyb247XCJdLCBbMCwgXCImTG1pZG90O1wiXSwgWzAsIFwiJmxtaWRvdDtcIl0sIFswLCBcIiZMc3Ryb2s7XCJdLCBbMCwgXCImbHN0cm9rO1wiXSwgWzAsIFwiJk5hY3V0ZTtcIl0sIFswLCBcIiZuYWN1dGU7XCJdLCBbMCwgXCImTmNlZGlsO1wiXSwgWzAsIFwiJm5jZWRpbDtcIl0sIFswLCBcIiZOY2Fyb247XCJdLCBbMCwgXCImbmNhcm9uO1wiXSwgWzAsIFwiJm5hcG9zO1wiXSwgWzAsIFwiJkVORztcIl0sIFswLCBcIiZlbmc7XCJdLCBbMCwgXCImT21hY3I7XCJdLCBbMCwgXCImb21hY3I7XCJdLCBbMiwgXCImT2RibGFjO1wiXSwgWzAsIFwiJm9kYmxhYztcIl0sIFswLCBcIiZPRWxpZztcIl0sIFswLCBcIiZvZWxpZztcIl0sIFswLCBcIiZSYWN1dGU7XCJdLCBbMCwgXCImcmFjdXRlO1wiXSwgWzAsIFwiJlJjZWRpbDtcIl0sIFswLCBcIiZyY2VkaWw7XCJdLCBbMCwgXCImUmNhcm9uO1wiXSwgWzAsIFwiJnJjYXJvbjtcIl0sIFswLCBcIiZTYWN1dGU7XCJdLCBbMCwgXCImc2FjdXRlO1wiXSwgWzAsIFwiJlNjaXJjO1wiXSwgWzAsIFwiJnNjaXJjO1wiXSwgWzAsIFwiJlNjZWRpbDtcIl0sIFswLCBcIiZzY2VkaWw7XCJdLCBbMCwgXCImU2Nhcm9uO1wiXSwgWzAsIFwiJnNjYXJvbjtcIl0sIFswLCBcIiZUY2VkaWw7XCJdLCBbMCwgXCImdGNlZGlsO1wiXSwgWzAsIFwiJlRjYXJvbjtcIl0sIFswLCBcIiZ0Y2Fyb247XCJdLCBbMCwgXCImVHN0cm9rO1wiXSwgWzAsIFwiJnRzdHJvaztcIl0sIFswLCBcIiZVdGlsZGU7XCJdLCBbMCwgXCImdXRpbGRlO1wiXSwgWzAsIFwiJlVtYWNyO1wiXSwgWzAsIFwiJnVtYWNyO1wiXSwgWzAsIFwiJlVicmV2ZTtcIl0sIFswLCBcIiZ1YnJldmU7XCJdLCBbMCwgXCImVXJpbmc7XCJdLCBbMCwgXCImdXJpbmc7XCJdLCBbMCwgXCImVWRibGFjO1wiXSwgWzAsIFwiJnVkYmxhYztcIl0sIFswLCBcIiZVb2dvbjtcIl0sIFswLCBcIiZ1b2dvbjtcIl0sIFswLCBcIiZXY2lyYztcIl0sIFswLCBcIiZ3Y2lyYztcIl0sIFswLCBcIiZZY2lyYztcIl0sIFswLCBcIiZ5Y2lyYztcIl0sIFswLCBcIiZZdW1sO1wiXSwgWzAsIFwiJlphY3V0ZTtcIl0sIFswLCBcIiZ6YWN1dGU7XCJdLCBbMCwgXCImWmRvdDtcIl0sIFswLCBcIiZ6ZG90O1wiXSwgWzAsIFwiJlpjYXJvbjtcIl0sIFswLCBcIiZ6Y2Fyb247XCJdLCBbMTksIFwiJmZub2Y7XCJdLCBbMzQsIFwiJmltcGVkO1wiXSwgWzYzLCBcIiZnYWN1dGU7XCJdLCBbNjUsIFwiJmptYXRoO1wiXSwgWzE0MiwgXCImY2lyYztcIl0sIFswLCBcIiZjYXJvbjtcIl0sIFsxNiwgXCImYnJldmU7XCJdLCBbMCwgXCImRGlhY3JpdGljYWxEb3Q7XCJdLCBbMCwgXCImcmluZztcIl0sIFswLCBcIiZvZ29uO1wiXSwgWzAsIFwiJkRpYWNyaXRpY2FsVGlsZGU7XCJdLCBbMCwgXCImZGJsYWM7XCJdLCBbNTEsIFwiJkRvd25CcmV2ZTtcIl0sIFsxMjcsIFwiJkFscGhhO1wiXSwgWzAsIFwiJkJldGE7XCJdLCBbMCwgXCImR2FtbWE7XCJdLCBbMCwgXCImRGVsdGE7XCJdLCBbMCwgXCImRXBzaWxvbjtcIl0sIFswLCBcIiZaZXRhO1wiXSwgWzAsIFwiJkV0YTtcIl0sIFswLCBcIiZUaGV0YTtcIl0sIFswLCBcIiZJb3RhO1wiXSwgWzAsIFwiJkthcHBhO1wiXSwgWzAsIFwiJkxhbWJkYTtcIl0sIFswLCBcIiZNdTtcIl0sIFswLCBcIiZOdTtcIl0sIFswLCBcIiZYaTtcIl0sIFswLCBcIiZPbWljcm9uO1wiXSwgWzAsIFwiJlBpO1wiXSwgWzAsIFwiJlJobztcIl0sIFsxLCBcIiZTaWdtYTtcIl0sIFswLCBcIiZUYXU7XCJdLCBbMCwgXCImVXBzaWxvbjtcIl0sIFswLCBcIiZQaGk7XCJdLCBbMCwgXCImQ2hpO1wiXSwgWzAsIFwiJlBzaTtcIl0sIFswLCBcIiZvaG07XCJdLCBbNywgXCImYWxwaGE7XCJdLCBbMCwgXCImYmV0YTtcIl0sIFswLCBcIiZnYW1tYTtcIl0sIFswLCBcIiZkZWx0YTtcIl0sIFswLCBcIiZlcHNpO1wiXSwgWzAsIFwiJnpldGE7XCJdLCBbMCwgXCImZXRhO1wiXSwgWzAsIFwiJnRoZXRhO1wiXSwgWzAsIFwiJmlvdGE7XCJdLCBbMCwgXCIma2FwcGE7XCJdLCBbMCwgXCImbGFtYmRhO1wiXSwgWzAsIFwiJm11O1wiXSwgWzAsIFwiJm51O1wiXSwgWzAsIFwiJnhpO1wiXSwgWzAsIFwiJm9taWNyb247XCJdLCBbMCwgXCImcGk7XCJdLCBbMCwgXCImcmhvO1wiXSwgWzAsIFwiJnNpZ21hZjtcIl0sIFswLCBcIiZzaWdtYTtcIl0sIFswLCBcIiZ0YXU7XCJdLCBbMCwgXCImdXBzaTtcIl0sIFswLCBcIiZwaGk7XCJdLCBbMCwgXCImY2hpO1wiXSwgWzAsIFwiJnBzaTtcIl0sIFswLCBcIiZvbWVnYTtcIl0sIFs3LCBcIiZ0aGV0YXN5bTtcIl0sIFswLCBcIiZVcHNpO1wiXSwgWzIsIFwiJnBoaXY7XCJdLCBbMCwgXCImcGl2O1wiXSwgWzUsIFwiJkdhbW1hZDtcIl0sIFswLCBcIiZkaWdhbW1hO1wiXSwgWzE4LCBcIiZrYXBwYXY7XCJdLCBbMCwgXCImcmhvdjtcIl0sIFszLCBcIiZlcHNpdjtcIl0sIFswLCBcIiZiYWNrZXBzaWxvbjtcIl0sIFsxMCwgXCImSU9jeTtcIl0sIFswLCBcIiZESmN5O1wiXSwgWzAsIFwiJkdKY3k7XCJdLCBbMCwgXCImSnVrY3k7XCJdLCBbMCwgXCImRFNjeTtcIl0sIFswLCBcIiZJdWtjeTtcIl0sIFswLCBcIiZZSWN5O1wiXSwgWzAsIFwiJkpzZXJjeTtcIl0sIFswLCBcIiZMSmN5O1wiXSwgWzAsIFwiJk5KY3k7XCJdLCBbMCwgXCImVFNIY3k7XCJdLCBbMCwgXCImS0pjeTtcIl0sIFsxLCBcIiZVYnJjeTtcIl0sIFswLCBcIiZEWmN5O1wiXSwgWzAsIFwiJkFjeTtcIl0sIFswLCBcIiZCY3k7XCJdLCBbMCwgXCImVmN5O1wiXSwgWzAsIFwiJkdjeTtcIl0sIFswLCBcIiZEY3k7XCJdLCBbMCwgXCImSUVjeTtcIl0sIFswLCBcIiZaSGN5O1wiXSwgWzAsIFwiJlpjeTtcIl0sIFswLCBcIiZJY3k7XCJdLCBbMCwgXCImSmN5O1wiXSwgWzAsIFwiJktjeTtcIl0sIFswLCBcIiZMY3k7XCJdLCBbMCwgXCImTWN5O1wiXSwgWzAsIFwiJk5jeTtcIl0sIFswLCBcIiZPY3k7XCJdLCBbMCwgXCImUGN5O1wiXSwgWzAsIFwiJlJjeTtcIl0sIFswLCBcIiZTY3k7XCJdLCBbMCwgXCImVGN5O1wiXSwgWzAsIFwiJlVjeTtcIl0sIFswLCBcIiZGY3k7XCJdLCBbMCwgXCImS0hjeTtcIl0sIFswLCBcIiZUU2N5O1wiXSwgWzAsIFwiJkNIY3k7XCJdLCBbMCwgXCImU0hjeTtcIl0sIFswLCBcIiZTSENIY3k7XCJdLCBbMCwgXCImSEFSRGN5O1wiXSwgWzAsIFwiJlljeTtcIl0sIFswLCBcIiZTT0ZUY3k7XCJdLCBbMCwgXCImRWN5O1wiXSwgWzAsIFwiJllVY3k7XCJdLCBbMCwgXCImWUFjeTtcIl0sIFswLCBcIiZhY3k7XCJdLCBbMCwgXCImYmN5O1wiXSwgWzAsIFwiJnZjeTtcIl0sIFswLCBcIiZnY3k7XCJdLCBbMCwgXCImZGN5O1wiXSwgWzAsIFwiJmllY3k7XCJdLCBbMCwgXCImemhjeTtcIl0sIFswLCBcIiZ6Y3k7XCJdLCBbMCwgXCImaWN5O1wiXSwgWzAsIFwiJmpjeTtcIl0sIFswLCBcIiZrY3k7XCJdLCBbMCwgXCImbGN5O1wiXSwgWzAsIFwiJm1jeTtcIl0sIFswLCBcIiZuY3k7XCJdLCBbMCwgXCImb2N5O1wiXSwgWzAsIFwiJnBjeTtcIl0sIFswLCBcIiZyY3k7XCJdLCBbMCwgXCImc2N5O1wiXSwgWzAsIFwiJnRjeTtcIl0sIFswLCBcIiZ1Y3k7XCJdLCBbMCwgXCImZmN5O1wiXSwgWzAsIFwiJmtoY3k7XCJdLCBbMCwgXCImdHNjeTtcIl0sIFswLCBcIiZjaGN5O1wiXSwgWzAsIFwiJnNoY3k7XCJdLCBbMCwgXCImc2hjaGN5O1wiXSwgWzAsIFwiJmhhcmRjeTtcIl0sIFswLCBcIiZ5Y3k7XCJdLCBbMCwgXCImc29mdGN5O1wiXSwgWzAsIFwiJmVjeTtcIl0sIFswLCBcIiZ5dWN5O1wiXSwgWzAsIFwiJnlhY3k7XCJdLCBbMSwgXCImaW9jeTtcIl0sIFswLCBcIiZkamN5O1wiXSwgWzAsIFwiJmdqY3k7XCJdLCBbMCwgXCImanVrY3k7XCJdLCBbMCwgXCImZHNjeTtcIl0sIFswLCBcIiZpdWtjeTtcIl0sIFswLCBcIiZ5aWN5O1wiXSwgWzAsIFwiJmpzZXJjeTtcIl0sIFswLCBcIiZsamN5O1wiXSwgWzAsIFwiJm5qY3k7XCJdLCBbMCwgXCImdHNoY3k7XCJdLCBbMCwgXCIma2pjeTtcIl0sIFsxLCBcIiZ1YnJjeTtcIl0sIFswLCBcIiZkemN5O1wiXSwgWzcwNzQsIFwiJmVuc3A7XCJdLCBbMCwgXCImZW1zcDtcIl0sIFswLCBcIiZlbXNwMTM7XCJdLCBbMCwgXCImZW1zcDE0O1wiXSwgWzEsIFwiJm51bXNwO1wiXSwgWzAsIFwiJnB1bmNzcDtcIl0sIFswLCBcIiZUaGluU3BhY2U7XCJdLCBbMCwgXCImaGFpcnNwO1wiXSwgWzAsIFwiJk5lZ2F0aXZlTWVkaXVtU3BhY2U7XCJdLCBbMCwgXCImenduajtcIl0sIFswLCBcIiZ6d2o7XCJdLCBbMCwgXCImbHJtO1wiXSwgWzAsIFwiJnJsbTtcIl0sIFswLCBcIiZkYXNoO1wiXSwgWzIsIFwiJm5kYXNoO1wiXSwgWzAsIFwiJm1kYXNoO1wiXSwgWzAsIFwiJmhvcmJhcjtcIl0sIFswLCBcIiZWZXJiYXI7XCJdLCBbMSwgXCImbHNxdW87XCJdLCBbMCwgXCImQ2xvc2VDdXJseVF1b3RlO1wiXSwgWzAsIFwiJmxzcXVvcjtcIl0sIFsxLCBcIiZsZHF1bztcIl0sIFswLCBcIiZDbG9zZUN1cmx5RG91YmxlUXVvdGU7XCJdLCBbMCwgXCImYmRxdW87XCJdLCBbMSwgXCImZGFnZ2VyO1wiXSwgWzAsIFwiJkRhZ2dlcjtcIl0sIFswLCBcIiZidWxsO1wiXSwgWzIsIFwiJm5sZHI7XCJdLCBbMCwgXCImaGVsbGlwO1wiXSwgWzksIFwiJnBlcm1pbDtcIl0sIFswLCBcIiZwZXJ0ZW5rO1wiXSwgWzAsIFwiJnByaW1lO1wiXSwgWzAsIFwiJlByaW1lO1wiXSwgWzAsIFwiJnRwcmltZTtcIl0sIFswLCBcIiZiYWNrcHJpbWU7XCJdLCBbMywgXCImbHNhcXVvO1wiXSwgWzAsIFwiJnJzYXF1bztcIl0sIFszLCBcIiZvbGluZTtcIl0sIFsyLCBcIiZjYXJldDtcIl0sIFsxLCBcIiZoeWJ1bGw7XCJdLCBbMCwgXCImZnJhc2w7XCJdLCBbMTAsIFwiJmJzZW1pO1wiXSwgWzcsIFwiJnFwcmltZTtcIl0sIFs3LCB7IHY6IFwiJk1lZGl1bVNwYWNlO1wiLCBuOiA4MjAyLCBvOiBcIiZUaGlja1NwYWNlO1wiIH1dLCBbMCwgXCImTm9CcmVhaztcIl0sIFswLCBcIiZhZjtcIl0sIFswLCBcIiZJbnZpc2libGVUaW1lcztcIl0sIFswLCBcIiZpYztcIl0sIFs3MiwgXCImZXVybztcIl0sIFs0NiwgXCImdGRvdDtcIl0sIFswLCBcIiZEb3REb3Q7XCJdLCBbMzcsIFwiJmNvbXBsZXhlcztcIl0sIFsyLCBcIiZpbmNhcmU7XCJdLCBbNCwgXCImZ3NjcjtcIl0sIFswLCBcIiZoYW1pbHQ7XCJdLCBbMCwgXCImSGZyO1wiXSwgWzAsIFwiJkhvcGY7XCJdLCBbMCwgXCImcGxhbmNraDtcIl0sIFswLCBcIiZoYmFyO1wiXSwgWzAsIFwiJmltYWdsaW5lO1wiXSwgWzAsIFwiJklmcjtcIl0sIFswLCBcIiZsYWdyYW47XCJdLCBbMCwgXCImZWxsO1wiXSwgWzEsIFwiJm5hdHVyYWxzO1wiXSwgWzAsIFwiJm51bWVybztcIl0sIFswLCBcIiZjb3B5c3I7XCJdLCBbMCwgXCImd2VpZXJwO1wiXSwgWzAsIFwiJlBvcGY7XCJdLCBbMCwgXCImUW9wZjtcIl0sIFswLCBcIiZyZWFsaW5lO1wiXSwgWzAsIFwiJnJlYWw7XCJdLCBbMCwgXCImcmVhbHM7XCJdLCBbMCwgXCImcng7XCJdLCBbMywgXCImdHJhZGU7XCJdLCBbMSwgXCImaW50ZWdlcnM7XCJdLCBbMiwgXCImbWhvO1wiXSwgWzAsIFwiJnplZXRyZjtcIl0sIFswLCBcIiZpaW90YTtcIl0sIFsyLCBcIiZiZXJub3U7XCJdLCBbMCwgXCImQ2F5bGV5cztcIl0sIFsxLCBcIiZlc2NyO1wiXSwgWzAsIFwiJkVzY3I7XCJdLCBbMCwgXCImRm91cmllcnRyZjtcIl0sIFsxLCBcIiZNZWxsaW50cmY7XCJdLCBbMCwgXCImb3JkZXI7XCJdLCBbMCwgXCImYWxlZnN5bTtcIl0sIFswLCBcIiZiZXRoO1wiXSwgWzAsIFwiJmdpbWVsO1wiXSwgWzAsIFwiJmRhbGV0aDtcIl0sIFsxMiwgXCImQ2FwaXRhbERpZmZlcmVudGlhbEQ7XCJdLCBbMCwgXCImZGQ7XCJdLCBbMCwgXCImZWU7XCJdLCBbMCwgXCImaWk7XCJdLCBbMTAsIFwiJmZyYWMxMztcIl0sIFswLCBcIiZmcmFjMjM7XCJdLCBbMCwgXCImZnJhYzE1O1wiXSwgWzAsIFwiJmZyYWMyNTtcIl0sIFswLCBcIiZmcmFjMzU7XCJdLCBbMCwgXCImZnJhYzQ1O1wiXSwgWzAsIFwiJmZyYWMxNjtcIl0sIFswLCBcIiZmcmFjNTY7XCJdLCBbMCwgXCImZnJhYzE4O1wiXSwgWzAsIFwiJmZyYWMzODtcIl0sIFswLCBcIiZmcmFjNTg7XCJdLCBbMCwgXCImZnJhYzc4O1wiXSwgWzQ5LCBcIiZsYXJyO1wiXSwgWzAsIFwiJlNob3J0VXBBcnJvdztcIl0sIFswLCBcIiZyYXJyO1wiXSwgWzAsIFwiJmRhcnI7XCJdLCBbMCwgXCImaGFycjtcIl0sIFswLCBcIiZ1cGRvd25hcnJvdztcIl0sIFswLCBcIiZud2FycjtcIl0sIFswLCBcIiZuZWFycjtcIl0sIFswLCBcIiZMb3dlclJpZ2h0QXJyb3c7XCJdLCBbMCwgXCImTG93ZXJMZWZ0QXJyb3c7XCJdLCBbMCwgXCImbmxhcnI7XCJdLCBbMCwgXCImbnJhcnI7XCJdLCBbMSwgeyB2OiBcIiZyYXJydztcIiwgbjogODI0LCBvOiBcIiZucmFycnc7XCIgfV0sIFswLCBcIiZMYXJyO1wiXSwgWzAsIFwiJlVhcnI7XCJdLCBbMCwgXCImUmFycjtcIl0sIFswLCBcIiZEYXJyO1wiXSwgWzAsIFwiJmxhcnJ0bDtcIl0sIFswLCBcIiZyYXJydGw7XCJdLCBbMCwgXCImTGVmdFRlZUFycm93O1wiXSwgWzAsIFwiJm1hcHN0b3VwO1wiXSwgWzAsIFwiJm1hcDtcIl0sIFswLCBcIiZEb3duVGVlQXJyb3c7XCJdLCBbMSwgXCImaG9va2xlZnRhcnJvdztcIl0sIFswLCBcIiZob29rcmlnaHRhcnJvdztcIl0sIFswLCBcIiZsYXJybHA7XCJdLCBbMCwgXCImbG9vcGFycm93cmlnaHQ7XCJdLCBbMCwgXCImaGFycnc7XCJdLCBbMCwgXCImbmhhcnI7XCJdLCBbMSwgXCImbHNoO1wiXSwgWzAsIFwiJnJzaDtcIl0sIFswLCBcIiZsZHNoO1wiXSwgWzAsIFwiJnJkc2g7XCJdLCBbMSwgXCImY3JhcnI7XCJdLCBbMCwgXCImY3VsYXJyO1wiXSwgWzAsIFwiJmN1cmFycjtcIl0sIFsyLCBcIiZjaXJjbGVhcnJvd2xlZnQ7XCJdLCBbMCwgXCImY2lyY2xlYXJyb3dyaWdodDtcIl0sIFswLCBcIiZsZWZ0aGFycG9vbnVwO1wiXSwgWzAsIFwiJkRvd25MZWZ0VmVjdG9yO1wiXSwgWzAsIFwiJlJpZ2h0VXBWZWN0b3I7XCJdLCBbMCwgXCImTGVmdFVwVmVjdG9yO1wiXSwgWzAsIFwiJnJoYXJ1O1wiXSwgWzAsIFwiJkRvd25SaWdodFZlY3RvcjtcIl0sIFswLCBcIiZkaGFycjtcIl0sIFswLCBcIiZkaGFybDtcIl0sIFswLCBcIiZSaWdodEFycm93TGVmdEFycm93O1wiXSwgWzAsIFwiJnVkYXJyO1wiXSwgWzAsIFwiJkxlZnRBcnJvd1JpZ2h0QXJyb3c7XCJdLCBbMCwgXCImbGVmdGxlZnRhcnJvd3M7XCJdLCBbMCwgXCImdXB1cGFycm93cztcIl0sIFswLCBcIiZyaWdodHJpZ2h0YXJyb3dzO1wiXSwgWzAsIFwiJmRkYXJyO1wiXSwgWzAsIFwiJmxlZnRyaWdodGhhcnBvb25zO1wiXSwgWzAsIFwiJkVxdWlsaWJyaXVtO1wiXSwgWzAsIFwiJm5sQXJyO1wiXSwgWzAsIFwiJm5oQXJyO1wiXSwgWzAsIFwiJm5yQXJyO1wiXSwgWzAsIFwiJkRvdWJsZUxlZnRBcnJvdztcIl0sIFswLCBcIiZEb3VibGVVcEFycm93O1wiXSwgWzAsIFwiJkRvdWJsZVJpZ2h0QXJyb3c7XCJdLCBbMCwgXCImZEFycjtcIl0sIFswLCBcIiZEb3VibGVMZWZ0UmlnaHRBcnJvdztcIl0sIFswLCBcIiZEb3VibGVVcERvd25BcnJvdztcIl0sIFswLCBcIiZud0FycjtcIl0sIFswLCBcIiZuZUFycjtcIl0sIFswLCBcIiZzZUFycjtcIl0sIFswLCBcIiZzd0FycjtcIl0sIFswLCBcIiZsQWFycjtcIl0sIFswLCBcIiZyQWFycjtcIl0sIFsxLCBcIiZ6aWdyYXJyO1wiXSwgWzYsIFwiJmxhcnJiO1wiXSwgWzAsIFwiJnJhcnJiO1wiXSwgWzE1LCBcIiZEb3duQXJyb3dVcEFycm93O1wiXSwgWzcsIFwiJmxvYXJyO1wiXSwgWzAsIFwiJnJvYXJyO1wiXSwgWzAsIFwiJmhvYXJyO1wiXSwgWzAsIFwiJmZvcmFsbDtcIl0sIFswLCBcIiZjb21wO1wiXSwgWzAsIHsgdjogXCImcGFydDtcIiwgbjogODI0LCBvOiBcIiZucGFydDtcIiB9XSwgWzAsIFwiJmV4aXN0O1wiXSwgWzAsIFwiJm5leGlzdDtcIl0sIFswLCBcIiZlbXB0eTtcIl0sIFsxLCBcIiZEZWw7XCJdLCBbMCwgXCImRWxlbWVudDtcIl0sIFswLCBcIiZOb3RFbGVtZW50O1wiXSwgWzEsIFwiJm5pO1wiXSwgWzAsIFwiJm5vdG5pO1wiXSwgWzIsIFwiJnByb2Q7XCJdLCBbMCwgXCImY29wcm9kO1wiXSwgWzAsIFwiJnN1bTtcIl0sIFswLCBcIiZtaW51cztcIl0sIFswLCBcIiZNaW51c1BsdXM7XCJdLCBbMCwgXCImZG90cGx1cztcIl0sIFsxLCBcIiZCYWNrc2xhc2g7XCJdLCBbMCwgXCImbG93YXN0O1wiXSwgWzAsIFwiJmNvbXBmbjtcIl0sIFsxLCBcIiZyYWRpYztcIl0sIFsyLCBcIiZwcm9wO1wiXSwgWzAsIFwiJmluZmluO1wiXSwgWzAsIFwiJmFuZ3J0O1wiXSwgWzAsIHsgdjogXCImYW5nO1wiLCBuOiA4NDAyLCBvOiBcIiZuYW5nO1wiIH1dLCBbMCwgXCImYW5nbXNkO1wiXSwgWzAsIFwiJmFuZ3NwaDtcIl0sIFswLCBcIiZtaWQ7XCJdLCBbMCwgXCImbm1pZDtcIl0sIFswLCBcIiZEb3VibGVWZXJ0aWNhbEJhcjtcIl0sIFswLCBcIiZOb3REb3VibGVWZXJ0aWNhbEJhcjtcIl0sIFswLCBcIiZhbmQ7XCJdLCBbMCwgXCImb3I7XCJdLCBbMCwgeyB2OiBcIiZjYXA7XCIsIG46IDY1MDI0LCBvOiBcIiZjYXBzO1wiIH1dLCBbMCwgeyB2OiBcIiZjdXA7XCIsIG46IDY1MDI0LCBvOiBcIiZjdXBzO1wiIH1dLCBbMCwgXCImaW50O1wiXSwgWzAsIFwiJkludDtcIl0sIFswLCBcIiZpaWludDtcIl0sIFswLCBcIiZjb25pbnQ7XCJdLCBbMCwgXCImQ29uaW50O1wiXSwgWzAsIFwiJkNjb25pbnQ7XCJdLCBbMCwgXCImY3dpbnQ7XCJdLCBbMCwgXCImQ2xvY2t3aXNlQ29udG91ckludGVncmFsO1wiXSwgWzAsIFwiJmF3Y29uaW50O1wiXSwgWzAsIFwiJnRoZXJlNDtcIl0sIFswLCBcIiZiZWNhdXM7XCJdLCBbMCwgXCImcmF0aW87XCJdLCBbMCwgXCImQ29sb247XCJdLCBbMCwgXCImZG90bWludXM7XCJdLCBbMSwgXCImbUREb3Q7XCJdLCBbMCwgXCImaG9tdGh0O1wiXSwgWzAsIHsgdjogXCImc2ltO1wiLCBuOiA4NDAyLCBvOiBcIiZudnNpbTtcIiB9XSwgWzAsIHsgdjogXCImYmFja3NpbTtcIiwgbjogODE3LCBvOiBcIiZyYWNlO1wiIH1dLCBbMCwgeyB2OiBcIiZhYztcIiwgbjogODE5LCBvOiBcIiZhY0U7XCIgfV0sIFswLCBcIiZhY2Q7XCJdLCBbMCwgXCImVmVydGljYWxUaWxkZTtcIl0sIFswLCBcIiZOb3RUaWxkZTtcIl0sIFswLCB7IHY6IFwiJmVxc2ltO1wiLCBuOiA4MjQsIG86IFwiJm5lc2ltO1wiIH1dLCBbMCwgXCImc2ltZTtcIl0sIFswLCBcIiZOb3RUaWxkZUVxdWFsO1wiXSwgWzAsIFwiJmNvbmc7XCJdLCBbMCwgXCImc2ltbmU7XCJdLCBbMCwgXCImbmNvbmc7XCJdLCBbMCwgXCImYXA7XCJdLCBbMCwgXCImbmFwO1wiXSwgWzAsIFwiJmFwZTtcIl0sIFswLCB7IHY6IFwiJmFwaWQ7XCIsIG46IDgyNCwgbzogXCImbmFwaWQ7XCIgfV0sIFswLCBcIiZiYWNrY29uZztcIl0sIFswLCB7IHY6IFwiJmFzeW1wZXE7XCIsIG46IDg0MDIsIG86IFwiJm52YXA7XCIgfV0sIFswLCB7IHY6IFwiJmJ1bXA7XCIsIG46IDgyNCwgbzogXCImbmJ1bXA7XCIgfV0sIFswLCB7IHY6IFwiJmJ1bXBlO1wiLCBuOiA4MjQsIG86IFwiJm5idW1wZTtcIiB9XSwgWzAsIHsgdjogXCImZG90ZXE7XCIsIG46IDgyNCwgbzogXCImbmVkb3Q7XCIgfV0sIFswLCBcIiZkb3RlcWRvdDtcIl0sIFswLCBcIiZlZkRvdDtcIl0sIFswLCBcIiZlckRvdDtcIl0sIFswLCBcIiZBc3NpZ247XCJdLCBbMCwgXCImZWNvbG9uO1wiXSwgWzAsIFwiJmVjaXI7XCJdLCBbMCwgXCImY2lyY2VxO1wiXSwgWzEsIFwiJndlZGdlcTtcIl0sIFswLCBcIiZ2ZWVlcTtcIl0sIFsxLCBcIiZ0cmlhbmdsZXE7XCJdLCBbMiwgXCImZXF1ZXN0O1wiXSwgWzAsIFwiJm5lO1wiXSwgWzAsIHsgdjogXCImQ29uZ3J1ZW50O1wiLCBuOiA4NDIxLCBvOiBcIiZibmVxdWl2O1wiIH1dLCBbMCwgXCImbmVxdWl2O1wiXSwgWzEsIHsgdjogXCImbGU7XCIsIG46IDg0MDIsIG86IFwiJm52bGU7XCIgfV0sIFswLCB7IHY6IFwiJmdlO1wiLCBuOiA4NDAyLCBvOiBcIiZudmdlO1wiIH1dLCBbMCwgeyB2OiBcIiZsRTtcIiwgbjogODI0LCBvOiBcIiZubEU7XCIgfV0sIFswLCB7IHY6IFwiJmdFO1wiLCBuOiA4MjQsIG86IFwiJm5nRTtcIiB9XSwgWzAsIHsgdjogXCImbG5FO1wiLCBuOiA2NTAyNCwgbzogXCImbHZlcnRuZXFxO1wiIH1dLCBbMCwgeyB2OiBcIiZnbkU7XCIsIG46IDY1MDI0LCBvOiBcIiZndmVydG5lcXE7XCIgfV0sIFswLCB7IHY6IFwiJmxsO1wiLCBuOiBuZXcgTWFwKC8qICNfX1BVUkVfXyAqLyByZXN0b3JlRGlmZihbWzgyNCwgXCImbkx0djtcIl0sIFs3NTc3LCBcIiZuTHQ7XCJdXSkpIH1dLCBbMCwgeyB2OiBcIiZnZztcIiwgbjogbmV3IE1hcCgvKiAjX19QVVJFX18gKi8gcmVzdG9yZURpZmYoW1s4MjQsIFwiJm5HdHY7XCJdLCBbNzU3NywgXCImbkd0O1wiXV0pKSB9XSwgWzAsIFwiJmJldHdlZW47XCJdLCBbMCwgXCImTm90Q3VwQ2FwO1wiXSwgWzAsIFwiJm5sZXNzO1wiXSwgWzAsIFwiJm5ndDtcIl0sIFswLCBcIiZubGU7XCJdLCBbMCwgXCImbmdlO1wiXSwgWzAsIFwiJmxlc3NzaW07XCJdLCBbMCwgXCImR3JlYXRlclRpbGRlO1wiXSwgWzAsIFwiJm5sc2ltO1wiXSwgWzAsIFwiJm5nc2ltO1wiXSwgWzAsIFwiJkxlc3NHcmVhdGVyO1wiXSwgWzAsIFwiJmdsO1wiXSwgWzAsIFwiJk5vdExlc3NHcmVhdGVyO1wiXSwgWzAsIFwiJk5vdEdyZWF0ZXJMZXNzO1wiXSwgWzAsIFwiJnByO1wiXSwgWzAsIFwiJnNjO1wiXSwgWzAsIFwiJnByY3VlO1wiXSwgWzAsIFwiJnNjY3VlO1wiXSwgWzAsIFwiJlByZWNlZGVzVGlsZGU7XCJdLCBbMCwgeyB2OiBcIiZzY3NpbTtcIiwgbjogODI0LCBvOiBcIiZOb3RTdWNjZWVkc1RpbGRlO1wiIH1dLCBbMCwgXCImTm90UHJlY2VkZXM7XCJdLCBbMCwgXCImTm90U3VjY2VlZHM7XCJdLCBbMCwgeyB2OiBcIiZzdWI7XCIsIG46IDg0MDIsIG86IFwiJk5vdFN1YnNldDtcIiB9XSwgWzAsIHsgdjogXCImc3VwO1wiLCBuOiA4NDAyLCBvOiBcIiZOb3RTdXBlcnNldDtcIiB9XSwgWzAsIFwiJm5zdWI7XCJdLCBbMCwgXCImbnN1cDtcIl0sIFswLCBcIiZzdWJlO1wiXSwgWzAsIFwiJnN1cGU7XCJdLCBbMCwgXCImTm90U3Vic2V0RXF1YWw7XCJdLCBbMCwgXCImTm90U3VwZXJzZXRFcXVhbDtcIl0sIFswLCB7IHY6IFwiJnN1Ym5lO1wiLCBuOiA2NTAyNCwgbzogXCImdmFyc3Vic2V0bmVxO1wiIH1dLCBbMCwgeyB2OiBcIiZzdXBuZTtcIiwgbjogNjUwMjQsIG86IFwiJnZhcnN1cHNldG5lcTtcIiB9XSwgWzEsIFwiJmN1cGRvdDtcIl0sIFswLCBcIiZVbmlvblBsdXM7XCJdLCBbMCwgeyB2OiBcIiZzcXN1YjtcIiwgbjogODI0LCBvOiBcIiZOb3RTcXVhcmVTdWJzZXQ7XCIgfV0sIFswLCB7IHY6IFwiJnNxc3VwO1wiLCBuOiA4MjQsIG86IFwiJk5vdFNxdWFyZVN1cGVyc2V0O1wiIH1dLCBbMCwgXCImc3FzdWJlO1wiXSwgWzAsIFwiJnNxc3VwZTtcIl0sIFswLCB7IHY6IFwiJnNxY2FwO1wiLCBuOiA2NTAyNCwgbzogXCImc3FjYXBzO1wiIH1dLCBbMCwgeyB2OiBcIiZzcWN1cDtcIiwgbjogNjUwMjQsIG86IFwiJnNxY3VwcztcIiB9XSwgWzAsIFwiJkNpcmNsZVBsdXM7XCJdLCBbMCwgXCImQ2lyY2xlTWludXM7XCJdLCBbMCwgXCImQ2lyY2xlVGltZXM7XCJdLCBbMCwgXCImb3NvbDtcIl0sIFswLCBcIiZDaXJjbGVEb3Q7XCJdLCBbMCwgXCImY2lyY2xlZGNpcmM7XCJdLCBbMCwgXCImY2lyY2xlZGFzdDtcIl0sIFsxLCBcIiZjaXJjbGVkZGFzaDtcIl0sIFswLCBcIiZib3hwbHVzO1wiXSwgWzAsIFwiJmJveG1pbnVzO1wiXSwgWzAsIFwiJmJveHRpbWVzO1wiXSwgWzAsIFwiJmRvdHNxdWFyZTtcIl0sIFswLCBcIiZSaWdodFRlZTtcIl0sIFswLCBcIiZkYXNodjtcIl0sIFswLCBcIiZEb3duVGVlO1wiXSwgWzAsIFwiJmJvdDtcIl0sIFsxLCBcIiZtb2RlbHM7XCJdLCBbMCwgXCImRG91YmxlUmlnaHRUZWU7XCJdLCBbMCwgXCImVmRhc2g7XCJdLCBbMCwgXCImVnZkYXNoO1wiXSwgWzAsIFwiJlZEYXNoO1wiXSwgWzAsIFwiJm52ZGFzaDtcIl0sIFswLCBcIiZudkRhc2g7XCJdLCBbMCwgXCImblZkYXNoO1wiXSwgWzAsIFwiJm5WRGFzaDtcIl0sIFswLCBcIiZwcnVyZWw7XCJdLCBbMSwgXCImTGVmdFRyaWFuZ2xlO1wiXSwgWzAsIFwiJlJpZ2h0VHJpYW5nbGU7XCJdLCBbMCwgeyB2OiBcIiZMZWZ0VHJpYW5nbGVFcXVhbDtcIiwgbjogODQwMiwgbzogXCImbnZsdHJpZTtcIiB9XSwgWzAsIHsgdjogXCImUmlnaHRUcmlhbmdsZUVxdWFsO1wiLCBuOiA4NDAyLCBvOiBcIiZudnJ0cmllO1wiIH1dLCBbMCwgXCImb3JpZ29mO1wiXSwgWzAsIFwiJmltb2Y7XCJdLCBbMCwgXCImbXVsdGltYXA7XCJdLCBbMCwgXCImaGVyY29uO1wiXSwgWzAsIFwiJmludGNhbDtcIl0sIFswLCBcIiZ2ZWViYXI7XCJdLCBbMSwgXCImYmFydmVlO1wiXSwgWzAsIFwiJmFuZ3J0dmI7XCJdLCBbMCwgXCImbHJ0cmk7XCJdLCBbMCwgXCImYmlnd2VkZ2U7XCJdLCBbMCwgXCImYmlndmVlO1wiXSwgWzAsIFwiJmJpZ2NhcDtcIl0sIFswLCBcIiZiaWdjdXA7XCJdLCBbMCwgXCImZGlhbTtcIl0sIFswLCBcIiZzZG90O1wiXSwgWzAsIFwiJnNzdGFyZjtcIl0sIFswLCBcIiZkaXZpZGVvbnRpbWVzO1wiXSwgWzAsIFwiJmJvd3RpZTtcIl0sIFswLCBcIiZsdGltZXM7XCJdLCBbMCwgXCImcnRpbWVzO1wiXSwgWzAsIFwiJmxlZnR0aHJlZXRpbWVzO1wiXSwgWzAsIFwiJnJpZ2h0dGhyZWV0aW1lcztcIl0sIFswLCBcIiZiYWNrc2ltZXE7XCJdLCBbMCwgXCImY3VybHl2ZWU7XCJdLCBbMCwgXCImY3VybHl3ZWRnZTtcIl0sIFswLCBcIiZTdWI7XCJdLCBbMCwgXCImU3VwO1wiXSwgWzAsIFwiJkNhcDtcIl0sIFswLCBcIiZDdXA7XCJdLCBbMCwgXCImZm9yaztcIl0sIFswLCBcIiZlcGFyO1wiXSwgWzAsIFwiJmxlc3Nkb3Q7XCJdLCBbMCwgXCImZ3Rkb3Q7XCJdLCBbMCwgeyB2OiBcIiZMbDtcIiwgbjogODI0LCBvOiBcIiZuTGw7XCIgfV0sIFswLCB7IHY6IFwiJkdnO1wiLCBuOiA4MjQsIG86IFwiJm5HZztcIiB9XSwgWzAsIHsgdjogXCImbGVnO1wiLCBuOiA2NTAyNCwgbzogXCImbGVzZztcIiB9XSwgWzAsIHsgdjogXCImZ2VsO1wiLCBuOiA2NTAyNCwgbzogXCImZ2VzbDtcIiB9XSwgWzIsIFwiJmN1ZXByO1wiXSwgWzAsIFwiJmN1ZXNjO1wiXSwgWzAsIFwiJk5vdFByZWNlZGVzU2xhbnRFcXVhbDtcIl0sIFswLCBcIiZOb3RTdWNjZWVkc1NsYW50RXF1YWw7XCJdLCBbMCwgXCImTm90U3F1YXJlU3Vic2V0RXF1YWw7XCJdLCBbMCwgXCImTm90U3F1YXJlU3VwZXJzZXRFcXVhbDtcIl0sIFsyLCBcIiZsbnNpbTtcIl0sIFswLCBcIiZnbnNpbTtcIl0sIFswLCBcIiZwcmVjbnNpbTtcIl0sIFswLCBcIiZzY25zaW07XCJdLCBbMCwgXCImbmx0cmk7XCJdLCBbMCwgXCImTm90UmlnaHRUcmlhbmdsZTtcIl0sIFswLCBcIiZubHRyaWU7XCJdLCBbMCwgXCImTm90UmlnaHRUcmlhbmdsZUVxdWFsO1wiXSwgWzAsIFwiJnZlbGxpcDtcIl0sIFswLCBcIiZjdGRvdDtcIl0sIFswLCBcIiZ1dGRvdDtcIl0sIFswLCBcIiZkdGRvdDtcIl0sIFswLCBcIiZkaXNpbjtcIl0sIFswLCBcIiZpc2luc3Y7XCJdLCBbMCwgXCImaXNpbnM7XCJdLCBbMCwgeyB2OiBcIiZpc2luZG90O1wiLCBuOiA4MjQsIG86IFwiJm5vdGluZG90O1wiIH1dLCBbMCwgXCImbm90aW52YztcIl0sIFswLCBcIiZub3RpbnZiO1wiXSwgWzEsIHsgdjogXCImaXNpbkU7XCIsIG46IDgyNCwgbzogXCImbm90aW5FO1wiIH1dLCBbMCwgXCImbmlzZDtcIl0sIFswLCBcIiZ4bmlzO1wiXSwgWzAsIFwiJm5pcztcIl0sIFswLCBcIiZub3RuaXZjO1wiXSwgWzAsIFwiJm5vdG5pdmI7XCJdLCBbNiwgXCImYmFyd2VkO1wiXSwgWzAsIFwiJkJhcndlZDtcIl0sIFsxLCBcIiZsY2VpbDtcIl0sIFswLCBcIiZyY2VpbDtcIl0sIFswLCBcIiZMZWZ0Rmxvb3I7XCJdLCBbMCwgXCImcmZsb29yO1wiXSwgWzAsIFwiJmRyY3JvcDtcIl0sIFswLCBcIiZkbGNyb3A7XCJdLCBbMCwgXCImdXJjcm9wO1wiXSwgWzAsIFwiJnVsY3JvcDtcIl0sIFswLCBcIiZibm90O1wiXSwgWzEsIFwiJnByb2ZsaW5lO1wiXSwgWzAsIFwiJnByb2ZzdXJmO1wiXSwgWzEsIFwiJnRlbHJlYztcIl0sIFswLCBcIiZ0YXJnZXQ7XCJdLCBbNSwgXCImdWxjb3JuO1wiXSwgWzAsIFwiJnVyY29ybjtcIl0sIFswLCBcIiZkbGNvcm47XCJdLCBbMCwgXCImZHJjb3JuO1wiXSwgWzIsIFwiJmZyb3duO1wiXSwgWzAsIFwiJnNtaWxlO1wiXSwgWzksIFwiJmN5bGN0eTtcIl0sIFswLCBcIiZwcm9mYWxhcjtcIl0sIFs3LCBcIiZ0b3Bib3Q7XCJdLCBbNiwgXCImb3ZiYXI7XCJdLCBbMSwgXCImc29sYmFyO1wiXSwgWzYwLCBcIiZhbmd6YXJyO1wiXSwgWzUxLCBcIiZsbW91c3RhY2hlO1wiXSwgWzAsIFwiJnJtb3VzdGFjaGU7XCJdLCBbMiwgXCImT3ZlckJyYWNrZXQ7XCJdLCBbMCwgXCImYmJyaztcIl0sIFswLCBcIiZiYnJrdGJyaztcIl0sIFszNywgXCImT3ZlclBhcmVudGhlc2lzO1wiXSwgWzAsIFwiJlVuZGVyUGFyZW50aGVzaXM7XCJdLCBbMCwgXCImT3ZlckJyYWNlO1wiXSwgWzAsIFwiJlVuZGVyQnJhY2U7XCJdLCBbMiwgXCImdHJwZXppdW07XCJdLCBbNCwgXCImZWxpbnRlcnM7XCJdLCBbNTksIFwiJmJsYW5rO1wiXSwgWzE2NCwgXCImY2lyY2xlZFM7XCJdLCBbNTUsIFwiJmJveGg7XCJdLCBbMSwgXCImYm94djtcIl0sIFs5LCBcIiZib3hkcjtcIl0sIFszLCBcIiZib3hkbDtcIl0sIFszLCBcIiZib3h1cjtcIl0sIFszLCBcIiZib3h1bDtcIl0sIFszLCBcIiZib3h2cjtcIl0sIFs3LCBcIiZib3h2bDtcIl0sIFs3LCBcIiZib3hoZDtcIl0sIFs3LCBcIiZib3hodTtcIl0sIFs3LCBcIiZib3h2aDtcIl0sIFsxOSwgXCImYm94SDtcIl0sIFswLCBcIiZib3hWO1wiXSwgWzAsIFwiJmJveGRSO1wiXSwgWzAsIFwiJmJveERyO1wiXSwgWzAsIFwiJmJveERSO1wiXSwgWzAsIFwiJmJveGRMO1wiXSwgWzAsIFwiJmJveERsO1wiXSwgWzAsIFwiJmJveERMO1wiXSwgWzAsIFwiJmJveHVSO1wiXSwgWzAsIFwiJmJveFVyO1wiXSwgWzAsIFwiJmJveFVSO1wiXSwgWzAsIFwiJmJveHVMO1wiXSwgWzAsIFwiJmJveFVsO1wiXSwgWzAsIFwiJmJveFVMO1wiXSwgWzAsIFwiJmJveHZSO1wiXSwgWzAsIFwiJmJveFZyO1wiXSwgWzAsIFwiJmJveFZSO1wiXSwgWzAsIFwiJmJveHZMO1wiXSwgWzAsIFwiJmJveFZsO1wiXSwgWzAsIFwiJmJveFZMO1wiXSwgWzAsIFwiJmJveEhkO1wiXSwgWzAsIFwiJmJveGhEO1wiXSwgWzAsIFwiJmJveEhEO1wiXSwgWzAsIFwiJmJveEh1O1wiXSwgWzAsIFwiJmJveGhVO1wiXSwgWzAsIFwiJmJveEhVO1wiXSwgWzAsIFwiJmJveHZIO1wiXSwgWzAsIFwiJmJveFZoO1wiXSwgWzAsIFwiJmJveFZIO1wiXSwgWzE5LCBcIiZ1aGJsaztcIl0sIFszLCBcIiZsaGJsaztcIl0sIFszLCBcIiZibG9jaztcIl0sIFs4LCBcIiZibGsxNDtcIl0sIFswLCBcIiZibGsxMjtcIl0sIFswLCBcIiZibGszNDtcIl0sIFsxMywgXCImc3F1YXJlO1wiXSwgWzgsIFwiJmJsYWNrc3F1YXJlO1wiXSwgWzAsIFwiJkVtcHR5VmVyeVNtYWxsU3F1YXJlO1wiXSwgWzEsIFwiJnJlY3Q7XCJdLCBbMCwgXCImbWFya2VyO1wiXSwgWzIsIFwiJmZsdG5zO1wiXSwgWzEsIFwiJmJpZ3RyaWFuZ2xldXA7XCJdLCBbMCwgXCImYmxhY2t0cmlhbmdsZTtcIl0sIFswLCBcIiZ0cmlhbmdsZTtcIl0sIFsyLCBcIiZibGFja3RyaWFuZ2xlcmlnaHQ7XCJdLCBbMCwgXCImcnRyaTtcIl0sIFszLCBcIiZiaWd0cmlhbmdsZWRvd247XCJdLCBbMCwgXCImYmxhY2t0cmlhbmdsZWRvd247XCJdLCBbMCwgXCImZHRyaTtcIl0sIFsyLCBcIiZibGFja3RyaWFuZ2xlbGVmdDtcIl0sIFswLCBcIiZsdHJpO1wiXSwgWzYsIFwiJmxvejtcIl0sIFswLCBcIiZjaXI7XCJdLCBbMzIsIFwiJnRyaWRvdDtcIl0sIFsyLCBcIiZiaWdjaXJjO1wiXSwgWzgsIFwiJnVsdHJpO1wiXSwgWzAsIFwiJnVydHJpO1wiXSwgWzAsIFwiJmxsdHJpO1wiXSwgWzAsIFwiJkVtcHR5U21hbGxTcXVhcmU7XCJdLCBbMCwgXCImRmlsbGVkU21hbGxTcXVhcmU7XCJdLCBbOCwgXCImYmlnc3RhcjtcIl0sIFswLCBcIiZzdGFyO1wiXSwgWzcsIFwiJnBob25lO1wiXSwgWzQ5LCBcIiZmZW1hbGU7XCJdLCBbMSwgXCImbWFsZTtcIl0sIFsyOSwgXCImc3BhZGVzO1wiXSwgWzIsIFwiJmNsdWJzO1wiXSwgWzEsIFwiJmhlYXJ0cztcIl0sIFswLCBcIiZkaWFtb25kc3VpdDtcIl0sIFszLCBcIiZzdW5nO1wiXSwgWzIsIFwiJmZsYXQ7XCJdLCBbMCwgXCImbmF0dXJhbDtcIl0sIFswLCBcIiZzaGFycDtcIl0sIFsxNjMsIFwiJmNoZWNrO1wiXSwgWzMsIFwiJmNyb3NzO1wiXSwgWzgsIFwiJm1hbHQ7XCJdLCBbMjEsIFwiJnNleHQ7XCJdLCBbMzMsIFwiJlZlcnRpY2FsU2VwYXJhdG9yO1wiXSwgWzI1LCBcIiZsYmJyaztcIl0sIFswLCBcIiZyYmJyaztcIl0sIFs4NCwgXCImYnNvbGhzdWI7XCJdLCBbMCwgXCImc3VwaHNvbDtcIl0sIFsyOCwgXCImTGVmdERvdWJsZUJyYWNrZXQ7XCJdLCBbMCwgXCImUmlnaHREb3VibGVCcmFja2V0O1wiXSwgWzAsIFwiJmxhbmc7XCJdLCBbMCwgXCImcmFuZztcIl0sIFswLCBcIiZMYW5nO1wiXSwgWzAsIFwiJlJhbmc7XCJdLCBbMCwgXCImbG9hbmc7XCJdLCBbMCwgXCImcm9hbmc7XCJdLCBbNywgXCImbG9uZ2xlZnRhcnJvdztcIl0sIFswLCBcIiZsb25ncmlnaHRhcnJvdztcIl0sIFswLCBcIiZsb25nbGVmdHJpZ2h0YXJyb3c7XCJdLCBbMCwgXCImRG91YmxlTG9uZ0xlZnRBcnJvdztcIl0sIFswLCBcIiZEb3VibGVMb25nUmlnaHRBcnJvdztcIl0sIFswLCBcIiZEb3VibGVMb25nTGVmdFJpZ2h0QXJyb3c7XCJdLCBbMSwgXCImbG9uZ21hcHN0bztcIl0sIFsyLCBcIiZkemlncmFycjtcIl0sIFsyNTgsIFwiJm52bEFycjtcIl0sIFswLCBcIiZudnJBcnI7XCJdLCBbMCwgXCImbnZIYXJyO1wiXSwgWzAsIFwiJk1hcDtcIl0sIFs2LCBcIiZsYmFycjtcIl0sIFswLCBcIiZia2Fyb3c7XCJdLCBbMCwgXCImbEJhcnI7XCJdLCBbMCwgXCImZGJrYXJvdztcIl0sIFswLCBcIiZkcmJrYXJvdztcIl0sIFswLCBcIiZERG90cmFoZDtcIl0sIFswLCBcIiZVcEFycm93QmFyO1wiXSwgWzAsIFwiJkRvd25BcnJvd0JhcjtcIl0sIFsyLCBcIiZSYXJydGw7XCJdLCBbMiwgXCImbGF0YWlsO1wiXSwgWzAsIFwiJnJhdGFpbDtcIl0sIFswLCBcIiZsQXRhaWw7XCJdLCBbMCwgXCImckF0YWlsO1wiXSwgWzAsIFwiJmxhcnJmcztcIl0sIFswLCBcIiZyYXJyZnM7XCJdLCBbMCwgXCImbGFycmJmcztcIl0sIFswLCBcIiZyYXJyYmZzO1wiXSwgWzIsIFwiJm53YXJoaztcIl0sIFswLCBcIiZuZWFyaGs7XCJdLCBbMCwgXCImaGtzZWFyb3c7XCJdLCBbMCwgXCImaGtzd2Fyb3c7XCJdLCBbMCwgXCImbnduZWFyO1wiXSwgWzAsIFwiJm5lc2VhcjtcIl0sIFswLCBcIiZzZXN3YXI7XCJdLCBbMCwgXCImc3dud2FyO1wiXSwgWzgsIHsgdjogXCImcmFycmM7XCIsIG46IDgyNCwgbzogXCImbnJhcnJjO1wiIH1dLCBbMSwgXCImY3VkYXJycjtcIl0sIFswLCBcIiZsZGNhO1wiXSwgWzAsIFwiJnJkY2E7XCJdLCBbMCwgXCImY3VkYXJybDtcIl0sIFswLCBcIiZsYXJycGw7XCJdLCBbMiwgXCImY3VyYXJybTtcIl0sIFswLCBcIiZjdWxhcnJwO1wiXSwgWzcsIFwiJnJhcnJwbDtcIl0sIFsyLCBcIiZoYXJyY2lyO1wiXSwgWzAsIFwiJlVhcnJvY2lyO1wiXSwgWzAsIFwiJmx1cmRzaGFyO1wiXSwgWzAsIFwiJmxkcnVzaGFyO1wiXSwgWzIsIFwiJkxlZnRSaWdodFZlY3RvcjtcIl0sIFswLCBcIiZSaWdodFVwRG93blZlY3RvcjtcIl0sIFswLCBcIiZEb3duTGVmdFJpZ2h0VmVjdG9yO1wiXSwgWzAsIFwiJkxlZnRVcERvd25WZWN0b3I7XCJdLCBbMCwgXCImTGVmdFZlY3RvckJhcjtcIl0sIFswLCBcIiZSaWdodFZlY3RvckJhcjtcIl0sIFswLCBcIiZSaWdodFVwVmVjdG9yQmFyO1wiXSwgWzAsIFwiJlJpZ2h0RG93blZlY3RvckJhcjtcIl0sIFswLCBcIiZEb3duTGVmdFZlY3RvckJhcjtcIl0sIFswLCBcIiZEb3duUmlnaHRWZWN0b3JCYXI7XCJdLCBbMCwgXCImTGVmdFVwVmVjdG9yQmFyO1wiXSwgWzAsIFwiJkxlZnREb3duVmVjdG9yQmFyO1wiXSwgWzAsIFwiJkxlZnRUZWVWZWN0b3I7XCJdLCBbMCwgXCImUmlnaHRUZWVWZWN0b3I7XCJdLCBbMCwgXCImUmlnaHRVcFRlZVZlY3RvcjtcIl0sIFswLCBcIiZSaWdodERvd25UZWVWZWN0b3I7XCJdLCBbMCwgXCImRG93bkxlZnRUZWVWZWN0b3I7XCJdLCBbMCwgXCImRG93blJpZ2h0VGVlVmVjdG9yO1wiXSwgWzAsIFwiJkxlZnRVcFRlZVZlY3RvcjtcIl0sIFswLCBcIiZMZWZ0RG93blRlZVZlY3RvcjtcIl0sIFswLCBcIiZsSGFyO1wiXSwgWzAsIFwiJnVIYXI7XCJdLCBbMCwgXCImckhhcjtcIl0sIFswLCBcIiZkSGFyO1wiXSwgWzAsIFwiJmx1cnVoYXI7XCJdLCBbMCwgXCImbGRyZGhhcjtcIl0sIFswLCBcIiZydWx1aGFyO1wiXSwgWzAsIFwiJnJkbGRoYXI7XCJdLCBbMCwgXCImbGhhcnVsO1wiXSwgWzAsIFwiJmxsaGFyZDtcIl0sIFswLCBcIiZyaGFydWw7XCJdLCBbMCwgXCImbHJoYXJkO1wiXSwgWzAsIFwiJnVkaGFyO1wiXSwgWzAsIFwiJmR1aGFyO1wiXSwgWzAsIFwiJlJvdW5kSW1wbGllcztcIl0sIFswLCBcIiZlcmFycjtcIl0sIFswLCBcIiZzaW1yYXJyO1wiXSwgWzAsIFwiJmxhcnJzaW07XCJdLCBbMCwgXCImcmFycnNpbTtcIl0sIFswLCBcIiZyYXJyYXA7XCJdLCBbMCwgXCImbHRsYXJyO1wiXSwgWzEsIFwiJmd0cmFycjtcIl0sIFswLCBcIiZzdWJyYXJyO1wiXSwgWzEsIFwiJnN1cGxhcnI7XCJdLCBbMCwgXCImbGZpc2h0O1wiXSwgWzAsIFwiJnJmaXNodDtcIl0sIFswLCBcIiZ1ZmlzaHQ7XCJdLCBbMCwgXCImZGZpc2h0O1wiXSwgWzUsIFwiJmxvcGFyO1wiXSwgWzAsIFwiJnJvcGFyO1wiXSwgWzQsIFwiJmxicmtlO1wiXSwgWzAsIFwiJnJicmtlO1wiXSwgWzAsIFwiJmxicmtzbHU7XCJdLCBbMCwgXCImcmJya3NsZDtcIl0sIFswLCBcIiZsYnJrc2xkO1wiXSwgWzAsIFwiJnJicmtzbHU7XCJdLCBbMCwgXCImbGFuZ2Q7XCJdLCBbMCwgXCImcmFuZ2Q7XCJdLCBbMCwgXCImbHBhcmx0O1wiXSwgWzAsIFwiJnJwYXJndDtcIl0sIFswLCBcIiZndGxQYXI7XCJdLCBbMCwgXCImbHRyUGFyO1wiXSwgWzMsIFwiJnZ6aWd6YWc7XCJdLCBbMSwgXCImdmFuZ3J0O1wiXSwgWzAsIFwiJmFuZ3J0dmJkO1wiXSwgWzYsIFwiJmFuZ2U7XCJdLCBbMCwgXCImcmFuZ2U7XCJdLCBbMCwgXCImZHdhbmdsZTtcIl0sIFswLCBcIiZ1d2FuZ2xlO1wiXSwgWzAsIFwiJmFuZ21zZGFhO1wiXSwgWzAsIFwiJmFuZ21zZGFiO1wiXSwgWzAsIFwiJmFuZ21zZGFjO1wiXSwgWzAsIFwiJmFuZ21zZGFkO1wiXSwgWzAsIFwiJmFuZ21zZGFlO1wiXSwgWzAsIFwiJmFuZ21zZGFmO1wiXSwgWzAsIFwiJmFuZ21zZGFnO1wiXSwgWzAsIFwiJmFuZ21zZGFoO1wiXSwgWzAsIFwiJmJlbXB0eXY7XCJdLCBbMCwgXCImZGVtcHR5djtcIl0sIFswLCBcIiZjZW1wdHl2O1wiXSwgWzAsIFwiJnJhZW1wdHl2O1wiXSwgWzAsIFwiJmxhZW1wdHl2O1wiXSwgWzAsIFwiJm9oYmFyO1wiXSwgWzAsIFwiJm9taWQ7XCJdLCBbMCwgXCImb3BhcjtcIl0sIFsxLCBcIiZvcGVycDtcIl0sIFsxLCBcIiZvbGNyb3NzO1wiXSwgWzAsIFwiJm9kc29sZDtcIl0sIFsxLCBcIiZvbGNpcjtcIl0sIFswLCBcIiZvZmNpcjtcIl0sIFswLCBcIiZvbHQ7XCJdLCBbMCwgXCImb2d0O1wiXSwgWzAsIFwiJmNpcnNjaXI7XCJdLCBbMCwgXCImY2lyRTtcIl0sIFswLCBcIiZzb2xiO1wiXSwgWzAsIFwiJmJzb2xiO1wiXSwgWzMsIFwiJmJveGJveDtcIl0sIFszLCBcIiZ0cmlzYjtcIl0sIFswLCBcIiZydHJpbHRyaTtcIl0sIFswLCB7IHY6IFwiJkxlZnRUcmlhbmdsZUJhcjtcIiwgbjogODI0LCBvOiBcIiZOb3RMZWZ0VHJpYW5nbGVCYXI7XCIgfV0sIFswLCB7IHY6IFwiJlJpZ2h0VHJpYW5nbGVCYXI7XCIsIG46IDgyNCwgbzogXCImTm90UmlnaHRUcmlhbmdsZUJhcjtcIiB9XSwgWzExLCBcIiZpaW5maW47XCJdLCBbMCwgXCImaW5maW50aWU7XCJdLCBbMCwgXCImbnZpbmZpbjtcIl0sIFs0LCBcIiZlcGFyc2w7XCJdLCBbMCwgXCImc21lcGFyc2w7XCJdLCBbMCwgXCImZXF2cGFyc2w7XCJdLCBbNSwgXCImYmxhY2tsb3plbmdlO1wiXSwgWzgsIFwiJlJ1bGVEZWxheWVkO1wiXSwgWzEsIFwiJmRzb2w7XCJdLCBbOSwgXCImYmlnb2RvdDtcIl0sIFswLCBcIiZiaWdvcGx1cztcIl0sIFswLCBcIiZiaWdvdGltZXM7XCJdLCBbMSwgXCImYmlndXBsdXM7XCJdLCBbMSwgXCImYmlnc3FjdXA7XCJdLCBbNSwgXCImaWlpaW50O1wiXSwgWzAsIFwiJmZwYXJ0aW50O1wiXSwgWzIsIFwiJmNpcmZuaW50O1wiXSwgWzAsIFwiJmF3aW50O1wiXSwgWzAsIFwiJnJwcG9saW50O1wiXSwgWzAsIFwiJnNjcG9saW50O1wiXSwgWzAsIFwiJm5wb2xpbnQ7XCJdLCBbMCwgXCImcG9pbnRpbnQ7XCJdLCBbMCwgXCImcXVhdGludDtcIl0sIFswLCBcIiZpbnRsYXJoaztcIl0sIFsxMCwgXCImcGx1c2NpcjtcIl0sIFswLCBcIiZwbHVzYWNpcjtcIl0sIFswLCBcIiZzaW1wbHVzO1wiXSwgWzAsIFwiJnBsdXNkdTtcIl0sIFswLCBcIiZwbHVzc2ltO1wiXSwgWzAsIFwiJnBsdXN0d287XCJdLCBbMSwgXCImbWNvbW1hO1wiXSwgWzAsIFwiJm1pbnVzZHU7XCJdLCBbMiwgXCImbG9wbHVzO1wiXSwgWzAsIFwiJnJvcGx1cztcIl0sIFswLCBcIiZDcm9zcztcIl0sIFswLCBcIiZ0aW1lc2Q7XCJdLCBbMCwgXCImdGltZXNiYXI7XCJdLCBbMSwgXCImc21hc2hwO1wiXSwgWzAsIFwiJmxvdGltZXM7XCJdLCBbMCwgXCImcm90aW1lcztcIl0sIFswLCBcIiZvdGltZXNhcztcIl0sIFswLCBcIiZPdGltZXM7XCJdLCBbMCwgXCImb2RpdjtcIl0sIFswLCBcIiZ0cmlwbHVzO1wiXSwgWzAsIFwiJnRyaW1pbnVzO1wiXSwgWzAsIFwiJnRyaXRpbWU7XCJdLCBbMCwgXCImaW50cHJvZDtcIl0sIFsyLCBcIiZhbWFsZztcIl0sIFswLCBcIiZjYXBkb3Q7XCJdLCBbMSwgXCImbmN1cDtcIl0sIFswLCBcIiZuY2FwO1wiXSwgWzAsIFwiJmNhcGFuZDtcIl0sIFswLCBcIiZjdXBvcjtcIl0sIFswLCBcIiZjdXBjYXA7XCJdLCBbMCwgXCImY2FwY3VwO1wiXSwgWzAsIFwiJmN1cGJyY2FwO1wiXSwgWzAsIFwiJmNhcGJyY3VwO1wiXSwgWzAsIFwiJmN1cGN1cDtcIl0sIFswLCBcIiZjYXBjYXA7XCJdLCBbMCwgXCImY2N1cHM7XCJdLCBbMCwgXCImY2NhcHM7XCJdLCBbMiwgXCImY2N1cHNzbTtcIl0sIFsyLCBcIiZBbmQ7XCJdLCBbMCwgXCImT3I7XCJdLCBbMCwgXCImYW5kYW5kO1wiXSwgWzAsIFwiJm9yb3I7XCJdLCBbMCwgXCImb3JzbG9wZTtcIl0sIFswLCBcIiZhbmRzbG9wZTtcIl0sIFsxLCBcIiZhbmR2O1wiXSwgWzAsIFwiJm9ydjtcIl0sIFswLCBcIiZhbmRkO1wiXSwgWzAsIFwiJm9yZDtcIl0sIFsxLCBcIiZ3ZWRiYXI7XCJdLCBbNiwgXCImc2RvdGU7XCJdLCBbMywgXCImc2ltZG90O1wiXSwgWzIsIHsgdjogXCImY29uZ2RvdDtcIiwgbjogODI0LCBvOiBcIiZuY29uZ2RvdDtcIiB9XSwgWzAsIFwiJmVhc3RlcjtcIl0sIFswLCBcIiZhcGFjaXI7XCJdLCBbMCwgeyB2OiBcIiZhcEU7XCIsIG46IDgyNCwgbzogXCImbmFwRTtcIiB9XSwgWzAsIFwiJmVwbHVzO1wiXSwgWzAsIFwiJnBsdXNlO1wiXSwgWzAsIFwiJkVzaW07XCJdLCBbMCwgXCImQ29sb25lO1wiXSwgWzAsIFwiJkVxdWFsO1wiXSwgWzEsIFwiJmRkb3RzZXE7XCJdLCBbMCwgXCImZXF1aXZERDtcIl0sIFswLCBcIiZsdGNpcjtcIl0sIFswLCBcIiZndGNpcjtcIl0sIFswLCBcIiZsdHF1ZXN0O1wiXSwgWzAsIFwiJmd0cXVlc3Q7XCJdLCBbMCwgeyB2OiBcIiZsZXFzbGFudDtcIiwgbjogODI0LCBvOiBcIiZubGVxc2xhbnQ7XCIgfV0sIFswLCB7IHY6IFwiJmdlcXNsYW50O1wiLCBuOiA4MjQsIG86IFwiJm5nZXFzbGFudDtcIiB9XSwgWzAsIFwiJmxlc2RvdDtcIl0sIFswLCBcIiZnZXNkb3Q7XCJdLCBbMCwgXCImbGVzZG90bztcIl0sIFswLCBcIiZnZXNkb3RvO1wiXSwgWzAsIFwiJmxlc2RvdG9yO1wiXSwgWzAsIFwiJmdlc2RvdG9sO1wiXSwgWzAsIFwiJmxhcDtcIl0sIFswLCBcIiZnYXA7XCJdLCBbMCwgXCImbG5lO1wiXSwgWzAsIFwiJmduZTtcIl0sIFswLCBcIiZsbmFwO1wiXSwgWzAsIFwiJmduYXA7XCJdLCBbMCwgXCImbEVnO1wiXSwgWzAsIFwiJmdFbDtcIl0sIFswLCBcIiZsc2ltZTtcIl0sIFswLCBcIiZnc2ltZTtcIl0sIFswLCBcIiZsc2ltZztcIl0sIFswLCBcIiZnc2ltbDtcIl0sIFswLCBcIiZsZ0U7XCJdLCBbMCwgXCImZ2xFO1wiXSwgWzAsIFwiJmxlc2dlcztcIl0sIFswLCBcIiZnZXNsZXM7XCJdLCBbMCwgXCImZWxzO1wiXSwgWzAsIFwiJmVncztcIl0sIFswLCBcIiZlbHNkb3Q7XCJdLCBbMCwgXCImZWdzZG90O1wiXSwgWzAsIFwiJmVsO1wiXSwgWzAsIFwiJmVnO1wiXSwgWzIsIFwiJnNpbWw7XCJdLCBbMCwgXCImc2ltZztcIl0sIFswLCBcIiZzaW1sRTtcIl0sIFswLCBcIiZzaW1nRTtcIl0sIFswLCB7IHY6IFwiJkxlc3NMZXNzO1wiLCBuOiA4MjQsIG86IFwiJk5vdE5lc3RlZExlc3NMZXNzO1wiIH1dLCBbMCwgeyB2OiBcIiZHcmVhdGVyR3JlYXRlcjtcIiwgbjogODI0LCBvOiBcIiZOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlcjtcIiB9XSwgWzEsIFwiJmdsajtcIl0sIFswLCBcIiZnbGE7XCJdLCBbMCwgXCImbHRjYztcIl0sIFswLCBcIiZndGNjO1wiXSwgWzAsIFwiJmxlc2NjO1wiXSwgWzAsIFwiJmdlc2NjO1wiXSwgWzAsIFwiJnNtdDtcIl0sIFswLCBcIiZsYXQ7XCJdLCBbMCwgeyB2OiBcIiZzbXRlO1wiLCBuOiA2NTAyNCwgbzogXCImc210ZXM7XCIgfV0sIFswLCB7IHY6IFwiJmxhdGU7XCIsIG46IDY1MDI0LCBvOiBcIiZsYXRlcztcIiB9XSwgWzAsIFwiJmJ1bXBFO1wiXSwgWzAsIHsgdjogXCImUHJlY2VkZXNFcXVhbDtcIiwgbjogODI0LCBvOiBcIiZOb3RQcmVjZWRlc0VxdWFsO1wiIH1dLCBbMCwgeyB2OiBcIiZzY2U7XCIsIG46IDgyNCwgbzogXCImTm90U3VjY2VlZHNFcXVhbDtcIiB9XSwgWzIsIFwiJnByRTtcIl0sIFswLCBcIiZzY0U7XCJdLCBbMCwgXCImcHJlY25lcXE7XCJdLCBbMCwgXCImc2NuRTtcIl0sIFswLCBcIiZwcmFwO1wiXSwgWzAsIFwiJnNjYXA7XCJdLCBbMCwgXCImcHJlY25hcHByb3g7XCJdLCBbMCwgXCImc2NuYXA7XCJdLCBbMCwgXCImUHI7XCJdLCBbMCwgXCImU2M7XCJdLCBbMCwgXCImc3ViZG90O1wiXSwgWzAsIFwiJnN1cGRvdDtcIl0sIFswLCBcIiZzdWJwbHVzO1wiXSwgWzAsIFwiJnN1cHBsdXM7XCJdLCBbMCwgXCImc3VibXVsdDtcIl0sIFswLCBcIiZzdXBtdWx0O1wiXSwgWzAsIFwiJnN1YmVkb3Q7XCJdLCBbMCwgXCImc3VwZWRvdDtcIl0sIFswLCB7IHY6IFwiJnN1YkU7XCIsIG46IDgyNCwgbzogXCImbnN1YkU7XCIgfV0sIFswLCB7IHY6IFwiJnN1cEU7XCIsIG46IDgyNCwgbzogXCImbnN1cEU7XCIgfV0sIFswLCBcIiZzdWJzaW07XCJdLCBbMCwgXCImc3Vwc2ltO1wiXSwgWzIsIHsgdjogXCImc3VibkU7XCIsIG46IDY1MDI0LCBvOiBcIiZ2YXJzdWJzZXRuZXFxO1wiIH1dLCBbMCwgeyB2OiBcIiZzdXBuRTtcIiwgbjogNjUwMjQsIG86IFwiJnZhcnN1cHNldG5lcXE7XCIgfV0sIFsyLCBcIiZjc3ViO1wiXSwgWzAsIFwiJmNzdXA7XCJdLCBbMCwgXCImY3N1YmU7XCJdLCBbMCwgXCImY3N1cGU7XCJdLCBbMCwgXCImc3Vic3VwO1wiXSwgWzAsIFwiJnN1cHN1YjtcIl0sIFswLCBcIiZzdWJzdWI7XCJdLCBbMCwgXCImc3Vwc3VwO1wiXSwgWzAsIFwiJnN1cGhzdWI7XCJdLCBbMCwgXCImc3VwZHN1YjtcIl0sIFswLCBcIiZmb3JrdjtcIl0sIFswLCBcIiZ0b3Bmb3JrO1wiXSwgWzAsIFwiJm1sY3A7XCJdLCBbOCwgXCImRGFzaHY7XCJdLCBbMSwgXCImVmRhc2hsO1wiXSwgWzAsIFwiJkJhcnY7XCJdLCBbMCwgXCImdkJhcjtcIl0sIFswLCBcIiZ2QmFydjtcIl0sIFsxLCBcIiZWYmFyO1wiXSwgWzAsIFwiJk5vdDtcIl0sIFswLCBcIiZiTm90O1wiXSwgWzAsIFwiJnJubWlkO1wiXSwgWzAsIFwiJmNpcm1pZDtcIl0sIFswLCBcIiZtaWRjaXI7XCJdLCBbMCwgXCImdG9wY2lyO1wiXSwgWzAsIFwiJm5ocGFyO1wiXSwgWzAsIFwiJnBhcnNpbTtcIl0sIFs5LCB7IHY6IFwiJnBhcnNsO1wiLCBuOiA4NDIxLCBvOiBcIiZucGFyc2w7XCIgfV0sIFs0NDM0MywgeyBuOiBuZXcgTWFwKC8qICNfX1BVUkVfXyAqLyByZXN0b3JlRGlmZihbWzU2NDc2LCBcIiZBc2NyO1wiXSwgWzEsIFwiJkNzY3I7XCJdLCBbMCwgXCImRHNjcjtcIl0sIFsyLCBcIiZHc2NyO1wiXSwgWzIsIFwiJkpzY3I7XCJdLCBbMCwgXCImS3NjcjtcIl0sIFsyLCBcIiZOc2NyO1wiXSwgWzAsIFwiJk9zY3I7XCJdLCBbMCwgXCImUHNjcjtcIl0sIFswLCBcIiZRc2NyO1wiXSwgWzEsIFwiJlNzY3I7XCJdLCBbMCwgXCImVHNjcjtcIl0sIFswLCBcIiZVc2NyO1wiXSwgWzAsIFwiJlZzY3I7XCJdLCBbMCwgXCImV3NjcjtcIl0sIFswLCBcIiZYc2NyO1wiXSwgWzAsIFwiJllzY3I7XCJdLCBbMCwgXCImWnNjcjtcIl0sIFswLCBcIiZhc2NyO1wiXSwgWzAsIFwiJmJzY3I7XCJdLCBbMCwgXCImY3NjcjtcIl0sIFswLCBcIiZkc2NyO1wiXSwgWzEsIFwiJmZzY3I7XCJdLCBbMSwgXCImaHNjcjtcIl0sIFswLCBcIiZpc2NyO1wiXSwgWzAsIFwiJmpzY3I7XCJdLCBbMCwgXCIma3NjcjtcIl0sIFswLCBcIiZsc2NyO1wiXSwgWzAsIFwiJm1zY3I7XCJdLCBbMCwgXCImbnNjcjtcIl0sIFsxLCBcIiZwc2NyO1wiXSwgWzAsIFwiJnFzY3I7XCJdLCBbMCwgXCImcnNjcjtcIl0sIFswLCBcIiZzc2NyO1wiXSwgWzAsIFwiJnRzY3I7XCJdLCBbMCwgXCImdXNjcjtcIl0sIFswLCBcIiZ2c2NyO1wiXSwgWzAsIFwiJndzY3I7XCJdLCBbMCwgXCImeHNjcjtcIl0sIFswLCBcIiZ5c2NyO1wiXSwgWzAsIFwiJnpzY3I7XCJdLCBbNTIsIFwiJkFmcjtcIl0sIFswLCBcIiZCZnI7XCJdLCBbMSwgXCImRGZyO1wiXSwgWzAsIFwiJkVmcjtcIl0sIFswLCBcIiZGZnI7XCJdLCBbMCwgXCImR2ZyO1wiXSwgWzIsIFwiJkpmcjtcIl0sIFswLCBcIiZLZnI7XCJdLCBbMCwgXCImTGZyO1wiXSwgWzAsIFwiJk1mcjtcIl0sIFswLCBcIiZOZnI7XCJdLCBbMCwgXCImT2ZyO1wiXSwgWzAsIFwiJlBmcjtcIl0sIFswLCBcIiZRZnI7XCJdLCBbMSwgXCImU2ZyO1wiXSwgWzAsIFwiJlRmcjtcIl0sIFswLCBcIiZVZnI7XCJdLCBbMCwgXCImVmZyO1wiXSwgWzAsIFwiJldmcjtcIl0sIFswLCBcIiZYZnI7XCJdLCBbMCwgXCImWWZyO1wiXSwgWzEsIFwiJmFmcjtcIl0sIFswLCBcIiZiZnI7XCJdLCBbMCwgXCImY2ZyO1wiXSwgWzAsIFwiJmRmcjtcIl0sIFswLCBcIiZlZnI7XCJdLCBbMCwgXCImZmZyO1wiXSwgWzAsIFwiJmdmcjtcIl0sIFswLCBcIiZoZnI7XCJdLCBbMCwgXCImaWZyO1wiXSwgWzAsIFwiJmpmcjtcIl0sIFswLCBcIiZrZnI7XCJdLCBbMCwgXCImbGZyO1wiXSwgWzAsIFwiJm1mcjtcIl0sIFswLCBcIiZuZnI7XCJdLCBbMCwgXCImb2ZyO1wiXSwgWzAsIFwiJnBmcjtcIl0sIFswLCBcIiZxZnI7XCJdLCBbMCwgXCImcmZyO1wiXSwgWzAsIFwiJnNmcjtcIl0sIFswLCBcIiZ0ZnI7XCJdLCBbMCwgXCImdWZyO1wiXSwgWzAsIFwiJnZmcjtcIl0sIFswLCBcIiZ3ZnI7XCJdLCBbMCwgXCImeGZyO1wiXSwgWzAsIFwiJnlmcjtcIl0sIFswLCBcIiZ6ZnI7XCJdLCBbMCwgXCImQW9wZjtcIl0sIFswLCBcIiZCb3BmO1wiXSwgWzEsIFwiJkRvcGY7XCJdLCBbMCwgXCImRW9wZjtcIl0sIFswLCBcIiZGb3BmO1wiXSwgWzAsIFwiJkdvcGY7XCJdLCBbMSwgXCImSW9wZjtcIl0sIFswLCBcIiZKb3BmO1wiXSwgWzAsIFwiJktvcGY7XCJdLCBbMCwgXCImTG9wZjtcIl0sIFswLCBcIiZNb3BmO1wiXSwgWzEsIFwiJk9vcGY7XCJdLCBbMywgXCImU29wZjtcIl0sIFswLCBcIiZUb3BmO1wiXSwgWzAsIFwiJlVvcGY7XCJdLCBbMCwgXCImVm9wZjtcIl0sIFswLCBcIiZXb3BmO1wiXSwgWzAsIFwiJlhvcGY7XCJdLCBbMCwgXCImWW9wZjtcIl0sIFsxLCBcIiZhb3BmO1wiXSwgWzAsIFwiJmJvcGY7XCJdLCBbMCwgXCImY29wZjtcIl0sIFswLCBcIiZkb3BmO1wiXSwgWzAsIFwiJmVvcGY7XCJdLCBbMCwgXCImZm9wZjtcIl0sIFswLCBcIiZnb3BmO1wiXSwgWzAsIFwiJmhvcGY7XCJdLCBbMCwgXCImaW9wZjtcIl0sIFswLCBcIiZqb3BmO1wiXSwgWzAsIFwiJmtvcGY7XCJdLCBbMCwgXCImbG9wZjtcIl0sIFswLCBcIiZtb3BmO1wiXSwgWzAsIFwiJm5vcGY7XCJdLCBbMCwgXCImb29wZjtcIl0sIFswLCBcIiZwb3BmO1wiXSwgWzAsIFwiJnFvcGY7XCJdLCBbMCwgXCImcm9wZjtcIl0sIFswLCBcIiZzb3BmO1wiXSwgWzAsIFwiJnRvcGY7XCJdLCBbMCwgXCImdW9wZjtcIl0sIFswLCBcIiZ2b3BmO1wiXSwgWzAsIFwiJndvcGY7XCJdLCBbMCwgXCImeG9wZjtcIl0sIFswLCBcIiZ5b3BmO1wiXSwgWzAsIFwiJnpvcGY7XCJdXSkpIH1dLCBbODkwNiwgXCImZmZsaWc7XCJdLCBbMCwgXCImZmlsaWc7XCJdLCBbMCwgXCImZmxsaWc7XCJdLCBbMCwgXCImZmZpbGlnO1wiXSwgWzAsIFwiJmZmbGxpZztcIl1dKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbmNvZGUtaHRtbC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/generated/encode-html.js\n"); - -/***/ }), - -/***/ "./node_modules/entities/lib/esm/index.js": -/*!************************************************!*\ - !*** ./node_modules/entities/lib/esm/index.js ***! - \************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DecodingMode: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.DecodingMode),\n/* harmony export */ EncodingMode: () => (/* binding */ EncodingMode),\n/* harmony export */ EntityDecoder: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.EntityDecoder),\n/* harmony export */ EntityLevel: () => (/* binding */ EntityLevel),\n/* harmony export */ decode: () => (/* binding */ decode),\n/* harmony export */ decodeHTML: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTML),\n/* harmony export */ decodeHTML4: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTML),\n/* harmony export */ decodeHTML4Strict: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTMLStrict),\n/* harmony export */ decodeHTML5: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTML),\n/* harmony export */ decodeHTML5Strict: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTMLStrict),\n/* harmony export */ decodeHTMLAttribute: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTMLAttribute),\n/* harmony export */ decodeHTMLStrict: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTMLStrict),\n/* harmony export */ decodeStrict: () => (/* binding */ decodeStrict),\n/* harmony export */ decodeXML: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeXML),\n/* harmony export */ decodeXMLStrict: () => (/* reexport safe */ _decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeXML),\n/* harmony export */ encode: () => (/* binding */ encode),\n/* harmony export */ encodeHTML: () => (/* reexport safe */ _encode_js__WEBPACK_IMPORTED_MODULE_1__.encodeHTML),\n/* harmony export */ encodeHTML4: () => (/* reexport safe */ _encode_js__WEBPACK_IMPORTED_MODULE_1__.encodeHTML),\n/* harmony export */ encodeHTML5: () => (/* reexport safe */ _encode_js__WEBPACK_IMPORTED_MODULE_1__.encodeHTML),\n/* harmony export */ encodeNonAsciiHTML: () => (/* reexport safe */ _encode_js__WEBPACK_IMPORTED_MODULE_1__.encodeNonAsciiHTML),\n/* harmony export */ encodeXML: () => (/* reexport safe */ _escape_js__WEBPACK_IMPORTED_MODULE_2__.encodeXML),\n/* harmony export */ escape: () => (/* reexport safe */ _escape_js__WEBPACK_IMPORTED_MODULE_2__.escape),\n/* harmony export */ escapeAttribute: () => (/* reexport safe */ _escape_js__WEBPACK_IMPORTED_MODULE_2__.escapeAttribute),\n/* harmony export */ escapeText: () => (/* reexport safe */ _escape_js__WEBPACK_IMPORTED_MODULE_2__.escapeText),\n/* harmony export */ escapeUTF8: () => (/* reexport safe */ _escape_js__WEBPACK_IMPORTED_MODULE_2__.escapeUTF8)\n/* harmony export */ });\n/* harmony import */ var _decode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./decode.js */ \"./node_modules/entities/lib/esm/decode.js\");\n/* harmony import */ var _encode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./encode.js */ \"./node_modules/entities/lib/esm/encode.js\");\n/* harmony import */ var _escape_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./escape.js */ \"./node_modules/entities/lib/esm/escape.js\");\n\n\n\n/** The level of entities to support. */\nvar EntityLevel;\n(function (EntityLevel) {\n /** Support only XML entities. */\n EntityLevel[EntityLevel[\"XML\"] = 0] = \"XML\";\n /** Support HTML entities, which are a superset of XML entities. */\n EntityLevel[EntityLevel[\"HTML\"] = 1] = \"HTML\";\n})(EntityLevel || (EntityLevel = {}));\nvar EncodingMode;\n(function (EncodingMode) {\n /**\n * The output is UTF-8 encoded. Only characters that need escaping within\n * XML will be escaped.\n */\n EncodingMode[EncodingMode[\"UTF8\"] = 0] = \"UTF8\";\n /**\n * The output consists only of ASCII characters. Characters that need\n * escaping within HTML, and characters that aren't ASCII characters will\n * be escaped.\n */\n EncodingMode[EncodingMode[\"ASCII\"] = 1] = \"ASCII\";\n /**\n * Encode all characters that have an equivalent entity, as well as all\n * characters that are not ASCII characters.\n */\n EncodingMode[EncodingMode[\"Extensive\"] = 2] = \"Extensive\";\n /**\n * Encode all characters that have to be escaped in HTML attributes,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n */\n EncodingMode[EncodingMode[\"Attribute\"] = 3] = \"Attribute\";\n /**\n * Encode all characters that have to be escaped in HTML text,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n */\n EncodingMode[EncodingMode[\"Text\"] = 4] = \"Text\";\n})(EncodingMode || (EncodingMode = {}));\n/**\n * Decodes a string with entities.\n *\n * @param data String to decode.\n * @param options Decoding options.\n */\nfunction decode(data, options = EntityLevel.XML) {\n const level = typeof options === \"number\" ? options : options.level;\n if (level === EntityLevel.HTML) {\n const mode = typeof options === \"object\" ? options.mode : undefined;\n return (0,_decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeHTML)(data, mode);\n }\n return (0,_decode_js__WEBPACK_IMPORTED_MODULE_0__.decodeXML)(data);\n}\n/**\n * Decodes a string with entities. Does not allow missing trailing semicolons for entities.\n *\n * @param data String to decode.\n * @param options Decoding options.\n * @deprecated Use `decode` with the `mode` set to `Strict`.\n */\nfunction decodeStrict(data, options = EntityLevel.XML) {\n var _a;\n const opts = typeof options === \"number\" ? { level: options } : options;\n (_a = opts.mode) !== null && _a !== void 0 ? _a : (opts.mode = _decode_js__WEBPACK_IMPORTED_MODULE_0__.DecodingMode.Strict);\n return decode(data, opts);\n}\n/**\n * Encodes a string with entities.\n *\n * @param data String to encode.\n * @param options Encoding options.\n */\nfunction encode(data, options = EntityLevel.XML) {\n const opts = typeof options === \"number\" ? { level: options } : options;\n // Mode `UTF8` just escapes XML entities\n if (opts.mode === EncodingMode.UTF8)\n return (0,_escape_js__WEBPACK_IMPORTED_MODULE_2__.escapeUTF8)(data);\n if (opts.mode === EncodingMode.Attribute)\n return (0,_escape_js__WEBPACK_IMPORTED_MODULE_2__.escapeAttribute)(data);\n if (opts.mode === EncodingMode.Text)\n return (0,_escape_js__WEBPACK_IMPORTED_MODULE_2__.escapeText)(data);\n if (opts.level === EntityLevel.HTML) {\n if (opts.mode === EncodingMode.ASCII) {\n return (0,_encode_js__WEBPACK_IMPORTED_MODULE_1__.encodeNonAsciiHTML)(data);\n }\n return (0,_encode_js__WEBPACK_IMPORTED_MODULE_1__.encodeHTML)(data);\n }\n // ASCII and Extensive are equivalent\n return (0,_escape_js__WEBPACK_IMPORTED_MODULE_2__.encodeXML)(data);\n}\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2VzbS9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQWtFO0FBQ0w7QUFDcUI7QUFDbEY7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtDQUFrQztBQUM1QjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlFQUF5RTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5RUFBeUU7QUFDM0Y7QUFDQTtBQUNBLENBQUMsb0NBQW9DO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzREFBVTtBQUN6QjtBQUNBLFdBQVcscURBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxpREFBaUQsaUJBQWlCO0FBQ2xFLG1FQUFtRSxvREFBWTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxpREFBaUQsaUJBQWlCO0FBQ2xFO0FBQ0E7QUFDQSxlQUFlLHNEQUFVO0FBQ3pCO0FBQ0EsZUFBZSwyREFBZTtBQUM5QjtBQUNBLGVBQWUsc0RBQVU7QUFDekI7QUFDQTtBQUNBLG1CQUFtQiw4REFBa0I7QUFDckM7QUFDQSxlQUFlLHNEQUFVO0FBQ3pCO0FBQ0E7QUFDQSxXQUFXLHFEQUFTO0FBQ3BCO0FBQzBGO0FBR2Y7QUFHNEc7QUFDdkwiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY2FzcGluZ3VzL2x0Ly4vbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9lc20vaW5kZXguanM/Zjk3NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWNvZGVYTUwsIGRlY29kZUhUTUwsIERlY29kaW5nTW9kZSB9IGZyb20gXCIuL2RlY29kZS5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlSFRNTCwgZW5jb2RlTm9uQXNjaWlIVE1MIH0gZnJvbSBcIi4vZW5jb2RlLmpzXCI7XG5pbXBvcnQgeyBlbmNvZGVYTUwsIGVzY2FwZVVURjgsIGVzY2FwZUF0dHJpYnV0ZSwgZXNjYXBlVGV4dCwgfSBmcm9tIFwiLi9lc2NhcGUuanNcIjtcbi8qKiBUaGUgbGV2ZWwgb2YgZW50aXRpZXMgdG8gc3VwcG9ydC4gKi9cbmV4cG9ydCB2YXIgRW50aXR5TGV2ZWw7XG4oZnVuY3Rpb24gKEVudGl0eUxldmVsKSB7XG4gICAgLyoqIFN1cHBvcnQgb25seSBYTUwgZW50aXRpZXMuICovXG4gICAgRW50aXR5TGV2ZWxbRW50aXR5TGV2ZWxbXCJYTUxcIl0gPSAwXSA9IFwiWE1MXCI7XG4gICAgLyoqIFN1cHBvcnQgSFRNTCBlbnRpdGllcywgd2hpY2ggYXJlIGEgc3VwZXJzZXQgb2YgWE1MIGVudGl0aWVzLiAqL1xuICAgIEVudGl0eUxldmVsW0VudGl0eUxldmVsW1wiSFRNTFwiXSA9IDFdID0gXCJIVE1MXCI7XG59KShFbnRpdHlMZXZlbCB8fCAoRW50aXR5TGV2ZWwgPSB7fSkpO1xuZXhwb3J0IHZhciBFbmNvZGluZ01vZGU7XG4oZnVuY3Rpb24gKEVuY29kaW5nTW9kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgaXMgVVRGLTggZW5jb2RlZC4gT25seSBjaGFyYWN0ZXJzIHRoYXQgbmVlZCBlc2NhcGluZyB3aXRoaW5cbiAgICAgKiBYTUwgd2lsbCBiZSBlc2NhcGVkLlxuICAgICAqL1xuICAgIEVuY29kaW5nTW9kZVtFbmNvZGluZ01vZGVbXCJVVEY4XCJdID0gMF0gPSBcIlVURjhcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IGNvbnNpc3RzIG9ubHkgb2YgQVNDSUkgY2hhcmFjdGVycy4gQ2hhcmFjdGVycyB0aGF0IG5lZWRcbiAgICAgKiBlc2NhcGluZyB3aXRoaW4gSFRNTCwgYW5kIGNoYXJhY3RlcnMgdGhhdCBhcmVuJ3QgQVNDSUkgY2hhcmFjdGVycyB3aWxsXG4gICAgICogYmUgZXNjYXBlZC5cbiAgICAgKi9cbiAgICBFbmNvZGluZ01vZGVbRW5jb2RpbmdNb2RlW1wiQVNDSUlcIl0gPSAxXSA9IFwiQVNDSUlcIjtcbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGFuIGVxdWl2YWxlbnQgZW50aXR5LCBhcyB3ZWxsIGFzIGFsbFxuICAgICAqIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEFTQ0lJIGNoYXJhY3RlcnMuXG4gICAgICovXG4gICAgRW5jb2RpbmdNb2RlW0VuY29kaW5nTW9kZVtcIkV4dGVuc2l2ZVwiXSA9IDJdID0gXCJFeHRlbnNpdmVcIjtcbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRvIGJlIGVzY2FwZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLFxuICAgICAqIGZvbGxvd2luZyB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvcGFyc2luZy5odG1sI2VzY2FwaW5nU3RyaW5nfS5cbiAgICAgKi9cbiAgICBFbmNvZGluZ01vZGVbRW5jb2RpbmdNb2RlW1wiQXR0cmlidXRlXCJdID0gM10gPSBcIkF0dHJpYnV0ZVwiO1xuICAgIC8qKlxuICAgICAqIEVuY29kZSBhbGwgY2hhcmFjdGVycyB0aGF0IGhhdmUgdG8gYmUgZXNjYXBlZCBpbiBIVE1MIHRleHQsXG4gICAgICogZm9sbG93aW5nIHtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjZXNjYXBpbmdTdHJpbmd9LlxuICAgICAqL1xuICAgIEVuY29kaW5nTW9kZVtFbmNvZGluZ01vZGVbXCJUZXh0XCJdID0gNF0gPSBcIlRleHRcIjtcbn0pKEVuY29kaW5nTW9kZSB8fCAoRW5jb2RpbmdNb2RlID0ge30pKTtcbi8qKlxuICogRGVjb2RlcyBhIHN0cmluZyB3aXRoIGVudGl0aWVzLlxuICpcbiAqIEBwYXJhbSBkYXRhIFN0cmluZyB0byBkZWNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyBEZWNvZGluZyBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMgPSBFbnRpdHlMZXZlbC5YTUwpIHtcbiAgICBjb25zdCBsZXZlbCA9IHR5cGVvZiBvcHRpb25zID09PSBcIm51bWJlclwiID8gb3B0aW9ucyA6IG9wdGlvbnMubGV2ZWw7XG4gICAgaWYgKGxldmVsID09PSBFbnRpdHlMZXZlbC5IVE1MKSB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIiA/IG9wdGlvbnMubW9kZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGRlY29kZUhUTUwoZGF0YSwgbW9kZSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVYTUwoZGF0YSk7XG59XG4vKipcbiAqIERlY29kZXMgYSBzdHJpbmcgd2l0aCBlbnRpdGllcy4gRG9lcyBub3QgYWxsb3cgbWlzc2luZyB0cmFpbGluZyBzZW1pY29sb25zIGZvciBlbnRpdGllcy5cbiAqXG4gKiBAcGFyYW0gZGF0YSBTdHJpbmcgdG8gZGVjb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgRGVjb2Rpbmcgb3B0aW9ucy5cbiAqIEBkZXByZWNhdGVkIFVzZSBgZGVjb2RlYCB3aXRoIHRoZSBgbW9kZWAgc2V0IHRvIGBTdHJpY3RgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU3RyaWN0KGRhdGEsIG9wdGlvbnMgPSBFbnRpdHlMZXZlbC5YTUwpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qgb3B0cyA9IHR5cGVvZiBvcHRpb25zID09PSBcIm51bWJlclwiID8geyBsZXZlbDogb3B0aW9ucyB9IDogb3B0aW9ucztcbiAgICAoX2EgPSBvcHRzLm1vZGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChvcHRzLm1vZGUgPSBEZWNvZGluZ01vZGUuU3RyaWN0KTtcbiAgICByZXR1cm4gZGVjb2RlKGRhdGEsIG9wdHMpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHdpdGggZW50aXRpZXMuXG4gKlxuICogQHBhcmFtIGRhdGEgU3RyaW5nIHRvIGVuY29kZS5cbiAqIEBwYXJhbSBvcHRpb25zIEVuY29kaW5nIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgb3B0aW9ucyA9IEVudGl0eUxldmVsLlhNTCkge1xuICAgIGNvbnN0IG9wdHMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiA/IHsgbGV2ZWw6IG9wdGlvbnMgfSA6IG9wdGlvbnM7XG4gICAgLy8gTW9kZSBgVVRGOGAganVzdCBlc2NhcGVzIFhNTCBlbnRpdGllc1xuICAgIGlmIChvcHRzLm1vZGUgPT09IEVuY29kaW5nTW9kZS5VVEY4KVxuICAgICAgICByZXR1cm4gZXNjYXBlVVRGOChkYXRhKTtcbiAgICBpZiAob3B0cy5tb2RlID09PSBFbmNvZGluZ01vZGUuQXR0cmlidXRlKVxuICAgICAgICByZXR1cm4gZXNjYXBlQXR0cmlidXRlKGRhdGEpO1xuICAgIGlmIChvcHRzLm1vZGUgPT09IEVuY29kaW5nTW9kZS5UZXh0KVxuICAgICAgICByZXR1cm4gZXNjYXBlVGV4dChkYXRhKTtcbiAgICBpZiAob3B0cy5sZXZlbCA9PT0gRW50aXR5TGV2ZWwuSFRNTCkge1xuICAgICAgICBpZiAob3B0cy5tb2RlID09PSBFbmNvZGluZ01vZGUuQVNDSUkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVOb25Bc2NpaUhUTUwoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuY29kZUhUTUwoZGF0YSk7XG4gICAgfVxuICAgIC8vIEFTQ0lJIGFuZCBFeHRlbnNpdmUgYXJlIGVxdWl2YWxlbnRcbiAgICByZXR1cm4gZW5jb2RlWE1MKGRhdGEpO1xufVxuZXhwb3J0IHsgZW5jb2RlWE1MLCBlc2NhcGUsIGVzY2FwZVVURjgsIGVzY2FwZUF0dHJpYnV0ZSwgZXNjYXBlVGV4dCwgfSBmcm9tIFwiLi9lc2NhcGUuanNcIjtcbmV4cG9ydCB7IGVuY29kZUhUTUwsIGVuY29kZU5vbkFzY2lpSFRNTCwgXG4vLyBMZWdhY3kgYWxpYXNlcyAoZGVwcmVjYXRlZClcbmVuY29kZUhUTUwgYXMgZW5jb2RlSFRNTDQsIGVuY29kZUhUTUwgYXMgZW5jb2RlSFRNTDUsIH0gZnJvbSBcIi4vZW5jb2RlLmpzXCI7XG5leHBvcnQgeyBFbnRpdHlEZWNvZGVyLCBEZWNvZGluZ01vZGUsIGRlY29kZVhNTCwgZGVjb2RlSFRNTCwgZGVjb2RlSFRNTFN0cmljdCwgZGVjb2RlSFRNTEF0dHJpYnV0ZSwgXG4vLyBMZWdhY3kgYWxpYXNlcyAoZGVwcmVjYXRlZClcbmRlY29kZUhUTUwgYXMgZGVjb2RlSFRNTDQsIGRlY29kZUhUTUwgYXMgZGVjb2RlSFRNTDUsIGRlY29kZUhUTUxTdHJpY3QgYXMgZGVjb2RlSFRNTDRTdHJpY3QsIGRlY29kZUhUTUxTdHJpY3QgYXMgZGVjb2RlSFRNTDVTdHJpY3QsIGRlY29kZVhNTCBhcyBkZWNvZGVYTUxTdHJpY3QsIH0gZnJvbSBcIi4vZGVjb2RlLmpzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/entities/lib/esm/index.js\n"); - -/***/ }), - -/***/ "./src/vendor/pdfjs-4.0.379-legacy-dist/build/pdf.mjs": -/*!************************************************************!*\ - !*** ./src/vendor/pdfjs-4.0.379-legacy-dist/build/pdf.mjs ***! - \************************************************************/ -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbortException: () => (/* binding */ __webpack_exports__AbortException),\n/* harmony export */ AnnotationEditorLayer: () => (/* binding */ __webpack_exports__AnnotationEditorLayer),\n/* harmony export */ AnnotationEditorParamsType: () => (/* binding */ __webpack_exports__AnnotationEditorParamsType),\n/* harmony export */ AnnotationEditorType: () => (/* binding */ __webpack_exports__AnnotationEditorType),\n/* harmony export */ AnnotationEditorUIManager: () => (/* binding */ __webpack_exports__AnnotationEditorUIManager),\n/* harmony export */ AnnotationLayer: () => (/* binding */ __webpack_exports__AnnotationLayer),\n/* harmony export */ AnnotationMode: () => (/* binding */ __webpack_exports__AnnotationMode),\n/* harmony export */ CMapCompressionType: () => (/* binding */ __webpack_exports__CMapCompressionType),\n/* harmony export */ ColorPicker: () => (/* binding */ __webpack_exports__ColorPicker),\n/* harmony export */ DOMSVGFactory: () => (/* binding */ __webpack_exports__DOMSVGFactory),\n/* harmony export */ DrawLayer: () => (/* binding */ __webpack_exports__DrawLayer),\n/* harmony export */ FeatureTest: () => (/* binding */ __webpack_exports__FeatureTest),\n/* harmony export */ GlobalWorkerOptions: () => (/* binding */ __webpack_exports__GlobalWorkerOptions),\n/* harmony export */ ImageKind: () => (/* binding */ __webpack_exports__ImageKind),\n/* harmony export */ InvalidPDFException: () => (/* binding */ __webpack_exports__InvalidPDFException),\n/* harmony export */ MissingPDFException: () => (/* binding */ __webpack_exports__MissingPDFException),\n/* harmony export */ OPS: () => (/* binding */ __webpack_exports__OPS),\n/* harmony export */ Outliner: () => (/* binding */ __webpack_exports__Outliner),\n/* harmony export */ PDFDataRangeTransport: () => (/* binding */ __webpack_exports__PDFDataRangeTransport),\n/* harmony export */ PDFDateString: () => (/* binding */ __webpack_exports__PDFDateString),\n/* harmony export */ PDFWorker: () => (/* binding */ __webpack_exports__PDFWorker),\n/* harmony export */ PasswordResponses: () => (/* binding */ __webpack_exports__PasswordResponses),\n/* harmony export */ PermissionFlag: () => (/* binding */ __webpack_exports__PermissionFlag),\n/* harmony export */ PixelsPerInch: () => (/* binding */ __webpack_exports__PixelsPerInch),\n/* harmony export */ PromiseCapability: () => (/* binding */ __webpack_exports__PromiseCapability),\n/* harmony export */ RenderingCancelledException: () => (/* binding */ __webpack_exports__RenderingCancelledException),\n/* harmony export */ UnexpectedResponseException: () => (/* binding */ __webpack_exports__UnexpectedResponseException),\n/* harmony export */ Util: () => (/* binding */ __webpack_exports__Util),\n/* harmony export */ VerbosityLevel: () => (/* binding */ __webpack_exports__VerbosityLevel),\n/* harmony export */ XfaLayer: () => (/* binding */ __webpack_exports__XfaLayer),\n/* harmony export */ build: () => (/* binding */ __webpack_exports__build),\n/* harmony export */ createValidAbsoluteUrl: () => (/* binding */ __webpack_exports__createValidAbsoluteUrl),\n/* harmony export */ fetchData: () => (/* binding */ __webpack_exports__fetchData),\n/* harmony export */ getDocument: () => (/* binding */ __webpack_exports__getDocument),\n/* harmony export */ getFilenameFromUrl: () => (/* binding */ __webpack_exports__getFilenameFromUrl),\n/* harmony export */ getPdfFilenameFromUrl: () => (/* binding */ __webpack_exports__getPdfFilenameFromUrl),\n/* harmony export */ getXfaPageViewport: () => (/* binding */ __webpack_exports__getXfaPageViewport),\n/* harmony export */ isDataScheme: () => (/* binding */ __webpack_exports__isDataScheme),\n/* harmony export */ isPdfFile: () => (/* binding */ __webpack_exports__isPdfFile),\n/* harmony export */ noContextMenu: () => (/* binding */ __webpack_exports__noContextMenu),\n/* harmony export */ normalizeUnicode: () => (/* binding */ __webpack_exports__normalizeUnicode),\n/* harmony export */ renderTextLayer: () => (/* binding */ __webpack_exports__renderTextLayer),\n/* harmony export */ setLayerDimensions: () => (/* binding */ __webpack_exports__setLayerDimensions),\n/* harmony export */ shadow: () => (/* binding */ __webpack_exports__shadow),\n/* harmony export */ updateTextLayer: () => (/* binding */ __webpack_exports__updateTextLayer),\n/* harmony export */ version: () => (/* binding */ __webpack_exports__version)\n/* harmony export */ });\n/**\n * @licstart The following is the entire license notice for the\n * JavaScript code in this page\n *\n * Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @licend The above is the entire license notice for the\n * JavaScript code in this page\n */\n\n/******/ var __webpack_modules__ = ({\n\n/***/ 1782:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_889__) => {\n\n\nvar isCallable = __nested_webpack_require_889__(7316);\nvar tryToString = __nested_webpack_require_889__(9762);\nvar $TypeError = TypeError;\nmodule.exports = function (argument) {\n if (isCallable(argument))\n return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n\n/***/ }),\n\n/***/ 4958:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_1257__) => {\n\n\nvar isCallable = __nested_webpack_require_1257__(7316);\nvar $String = String;\nvar $TypeError = TypeError;\nmodule.exports = function (argument) {\n if (typeof argument == 'object' || isCallable(argument))\n return argument;\n throw new $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n\n/***/ }),\n\n/***/ 5690:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_1641__) => {\n\n\nvar has = (__nested_webpack_require_1641__(23).has);\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n\n/***/ }),\n\n/***/ 5834:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_1834__) => {\n\n\nvar isPrototypeOf = __nested_webpack_require_1834__(2658);\nvar $TypeError = TypeError;\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it))\n return it;\n throw new $TypeError('Incorrect invocation');\n};\n\n/***/ }),\n\n/***/ 4719:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_2145__) => {\n\n\nvar isObject = __nested_webpack_require_2145__(7633);\nvar $String = String;\nvar $TypeError = TypeError;\nmodule.exports = function (argument) {\n if (isObject(argument))\n return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n\n/***/ }),\n\n/***/ 5115:\n/***/ ((module) => {\n\n\nmodule.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';\n\n/***/ }),\n\n/***/ 7585:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_2614__) => {\n\n\nvar uncurryThisAccessor = __nested_webpack_require_2614__(1299);\nvar classof = __nested_webpack_require_2614__(8374);\nvar $TypeError = TypeError;\nmodule.exports = uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) {\n if (classof(O) !== 'ArrayBuffer')\n throw new $TypeError('ArrayBuffer expected');\n return O.byteLength;\n};\n\n/***/ }),\n\n/***/ 582:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_3036__) => {\n\n\nvar uncurryThis = __nested_webpack_require_3036__(8403);\nvar arrayBufferByteLength = __nested_webpack_require_3036__(7585);\nvar slice = uncurryThis(ArrayBuffer.prototype.slice);\nmodule.exports = function (O) {\n if (arrayBufferByteLength(O) !== 0)\n return false;\n try {\n slice(O, 0, 0);\n return false;\n } catch (error) {\n return true;\n }\n};\n\n/***/ }),\n\n/***/ 4358:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_3450__) => {\n\n\nvar global = __nested_webpack_require_3450__(9298);\nvar uncurryThis = __nested_webpack_require_3450__(8403);\nvar uncurryThisAccessor = __nested_webpack_require_3450__(1299);\nvar toIndex = __nested_webpack_require_3450__(9548);\nvar isDetached = __nested_webpack_require_3450__(582);\nvar arrayBufferByteLength = __nested_webpack_require_3450__(7585);\nvar detachTransferable = __nested_webpack_require_3450__(8126);\nvar PROPER_STRUCTURED_CLONE_TRANSFER = __nested_webpack_require_3450__(4837);\nvar structuredClone = global.structuredClone;\nvar ArrayBuffer = global.ArrayBuffer;\nvar DataView = global.DataView;\nvar TypeError = global.TypeError;\nvar min = Math.min;\nvar ArrayBufferPrototype = ArrayBuffer.prototype;\nvar DataViewPrototype = DataView.prototype;\nvar slice = uncurryThis(ArrayBufferPrototype.slice);\nvar isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get');\nvar maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get');\nvar getInt8 = uncurryThis(DataViewPrototype.getInt8);\nvar setInt8 = uncurryThis(DataViewPrototype.setInt8);\nmodule.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) {\n var byteLength = arrayBufferByteLength(arrayBuffer);\n var newByteLength = newLength === undefined ? byteLength : toIndex(newLength);\n var fixedLength = !isResizable || !isResizable(arrayBuffer);\n var newBuffer;\n if (isDetached(arrayBuffer))\n throw new TypeError('ArrayBuffer is detached');\n if (PROPER_STRUCTURED_CLONE_TRANSFER) {\n arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] });\n if (byteLength === newByteLength && (preserveResizability || fixedLength))\n return arrayBuffer;\n }\n if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) {\n newBuffer = slice(arrayBuffer, 0, newByteLength);\n } else {\n var options = preserveResizability && !fixedLength && maxByteLength ? { maxByteLength: maxByteLength(arrayBuffer) } : undefined;\n newBuffer = new ArrayBuffer(newByteLength, options);\n var a = new DataView(arrayBuffer);\n var b = new DataView(newBuffer);\n var copyLength = min(newByteLength, byteLength);\n for (var i = 0; i < copyLength; i++)\n setInt8(b, i, getInt8(a, i));\n }\n if (!PROPER_STRUCTURED_CLONE_TRANSFER)\n detachTransferable(arrayBuffer);\n return newBuffer;\n};\n\n/***/ }),\n\n/***/ 5861:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_5799__) => {\n\n\nvar NATIVE_ARRAY_BUFFER = __nested_webpack_require_5799__(5115);\nvar DESCRIPTORS = __nested_webpack_require_5799__(940);\nvar global = __nested_webpack_require_5799__(9298);\nvar isCallable = __nested_webpack_require_5799__(7316);\nvar isObject = __nested_webpack_require_5799__(7633);\nvar hasOwn = __nested_webpack_require_5799__(936);\nvar classof = __nested_webpack_require_5799__(8329);\nvar tryToString = __nested_webpack_require_5799__(9762);\nvar createNonEnumerableProperty = __nested_webpack_require_5799__(9293);\nvar defineBuiltIn = __nested_webpack_require_5799__(7041);\nvar defineBuiltInAccessor = __nested_webpack_require_5799__(9691);\nvar isPrototypeOf = __nested_webpack_require_5799__(2658);\nvar getPrototypeOf = __nested_webpack_require_5799__(2176);\nvar setPrototypeOf = __nested_webpack_require_5799__(9763);\nvar wellKnownSymbol = __nested_webpack_require_5799__(2292);\nvar uid = __nested_webpack_require_5799__(7561);\nvar InternalStateModule = __nested_webpack_require_5799__(1649);\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar TypeError = global.TypeError;\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\nvar TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor';\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQUIRED = false;\nvar NAME, Constructor, Prototype;\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\nvar isView = function isView(it) {\n if (!isObject(it))\n return false;\n var klass = classof(it);\n return klass === 'DataView' || hasOwn(TypedArrayConstructorsList, klass) || hasOwn(BigIntArrayConstructorsList, klass);\n};\nvar getTypedArrayConstructor = function (it) {\n var proto = getPrototypeOf(it);\n if (!isObject(proto))\n return;\n var state = getInternalState(proto);\n return state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto);\n};\nvar isTypedArray = function (it) {\n if (!isObject(it))\n return false;\n var klass = classof(it);\n return hasOwn(TypedArrayConstructorsList, klass) || hasOwn(BigIntArrayConstructorsList, klass);\n};\nvar aTypedArray = function (it) {\n if (isTypedArray(it))\n return it;\n throw new TypeError('Target is not a typed array');\n};\nvar aTypedArrayConstructor = function (C) {\n if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C)))\n return C;\n throw new TypeError(tryToString(C) + ' is not a typed array constructor');\n};\nvar exportTypedArrayMethod = function (KEY, property, forced, options) {\n if (!DESCRIPTORS)\n return;\n if (forced)\n for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY))\n try {\n delete TypedArrayConstructor.prototype[KEY];\n } catch (error) {\n try {\n TypedArrayConstructor.prototype[KEY] = property;\n } catch (error2) {\n }\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n defineBuiltIn(TypedArrayPrototype, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);\n }\n};\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS)\n return;\n if (setPrototypeOf) {\n if (forced)\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY))\n try {\n delete TypedArrayConstructor[KEY];\n } catch (error) {\n }\n }\n if (!TypedArray[KEY] || forced) {\n try {\n return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);\n } catch (error) {\n }\n } else\n return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n defineBuiltIn(TypedArrayConstructor, KEY, property);\n }\n }\n};\nfor (NAME in TypedArrayConstructorsList) {\n Constructor = global[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype)\n enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n else\n NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\nfor (NAME in BigIntArrayConstructorsList) {\n Constructor = global[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype)\n enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n}\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) {\n TypedArray = function TypedArray() {\n throw new TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS)\n for (NAME in TypedArrayConstructorsList) {\n if (global[NAME])\n setPrototypeOf(global[NAME], TypedArray);\n }\n}\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS)\n for (NAME in TypedArrayConstructorsList) {\n if (global[NAME])\n setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\nif (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQUIRED = true;\n defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, {\n configurable: true,\n get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n }\n });\n for (NAME in TypedArrayConstructorsList)\n if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n getTypedArrayConstructor: getTypedArrayConstructor,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n\n/***/ }),\n\n/***/ 7003:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_12593__) => {\n\n\nvar lengthOfArrayLike = __nested_webpack_require_12593__(451);\nmodule.exports = function (Constructor, list, $length) {\n var index = 0;\n var length = arguments.length > 2 ? $length : lengthOfArrayLike(list);\n var result = new Constructor(length);\n while (length > index)\n result[index] = list[index++];\n return result;\n};\n\n/***/ }),\n\n/***/ 9773:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_12997__) => {\n\n\nvar toIndexedObject = __nested_webpack_require_12997__(4115);\nvar toAbsoluteIndex = __nested_webpack_require_12997__(6985);\nvar lengthOfArrayLike = __nested_webpack_require_12997__(451);\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n if (IS_INCLUDES && el !== el)\n while (length > index) {\n value = O[index++];\n if (value !== value)\n return true;\n }\n else\n for (; length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el)\n return IS_INCLUDES || index || 0;\n }\n return !IS_INCLUDES && -1;\n };\n};\nmodule.exports = {\n includes: createMethod(true),\n indexOf: createMethod(false)\n};\n\n/***/ }),\n\n/***/ 4026:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_13854__) => {\n\n\nvar bind = __nested_webpack_require_13854__(7789);\nvar IndexedObject = __nested_webpack_require_13854__(3622);\nvar toObject = __nested_webpack_require_13854__(2007);\nvar lengthOfArrayLike = __nested_webpack_require_13854__(451);\nvar createMethod = function (TYPE) {\n var IS_FIND_LAST_INDEX = TYPE === 1;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var index = lengthOfArrayLike(self);\n var boundFunction = bind(callbackfn, that);\n var value, result;\n while (index-- > 0) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (result)\n switch (TYPE) {\n case 0:\n return value;\n case 1:\n return index;\n }\n }\n return IS_FIND_LAST_INDEX ? -1 : undefined;\n };\n};\nmodule.exports = {\n findLast: createMethod(0),\n findLastIndex: createMethod(1)\n};\n\n/***/ }),\n\n/***/ 6661:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_14743__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_14743__(940);\nvar isArray = __nested_webpack_require_14743__(6998);\nvar $TypeError = TypeError;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !(function () {\n if (this !== undefined)\n return true;\n try {\n Object.defineProperty([], 'length', { writable: false }).length = 1;\n } catch (error) {\n return error instanceof TypeError;\n }\n}());\nmodule.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {\n if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {\n throw new $TypeError('Cannot set read only .length');\n }\n return O.length = length;\n} : function (O, length) {\n return O.length = length;\n};\n\n/***/ }),\n\n/***/ 2304:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_15557__) => {\n\n\nvar lengthOfArrayLike = __nested_webpack_require_15557__(451);\nmodule.exports = function (O, C) {\n var len = lengthOfArrayLike(O);\n var A = new C(len);\n var k = 0;\n for (; k < len; k++)\n A[k] = O[len - k - 1];\n return A;\n};\n\n/***/ }),\n\n/***/ 5886:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_15863__) => {\n\n\nvar lengthOfArrayLike = __nested_webpack_require_15863__(451);\nvar toIntegerOrInfinity = __nested_webpack_require_15863__(1003);\nvar $RangeError = RangeError;\nmodule.exports = function (O, C, index, value) {\n var len = lengthOfArrayLike(O);\n var relativeIndex = toIntegerOrInfinity(index);\n var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex;\n if (actualIndex >= len || actualIndex < 0)\n throw new $RangeError('Incorrect index');\n var A = new C(len);\n var k = 0;\n for (; k < len; k++)\n A[k] = k === actualIndex ? value : O[k];\n return A;\n};\n\n/***/ }),\n\n/***/ 5723:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_16497__) => {\n\n\nvar anObject = __nested_webpack_require_16497__(4719);\nvar iteratorClose = __nested_webpack_require_16497__(3316);\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n\n/***/ }),\n\n/***/ 8374:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_16879__) => {\n\n\nvar uncurryThis = __nested_webpack_require_16879__(8403);\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n\n/***/ }),\n\n/***/ 8329:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_17178__) => {\n\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_17178__(3077);\nvar isCallable = __nested_webpack_require_17178__(7316);\nvar classofRaw = __nested_webpack_require_17178__(8374);\nvar wellKnownSymbol = __nested_webpack_require_17178__(2292);\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\nvar CORRECT_ARGUMENTS = classofRaw((function () {\n return arguments;\n}())) === 'Arguments';\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) {\n }\n};\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null' : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag : CORRECT_ARGUMENTS ? classofRaw(O) : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n\n/***/ }),\n\n/***/ 1425:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_18068__) => {\n\n\nvar hasOwn = __nested_webpack_require_18068__(936);\nvar ownKeys = __nested_webpack_require_18068__(8953);\nvar getOwnPropertyDescriptorModule = __nested_webpack_require_18068__(5764);\nvar definePropertyModule = __nested_webpack_require_18068__(7744);\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n\n/***/ }),\n\n/***/ 7888:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_18775__) => {\n\n\nvar fails = __nested_webpack_require_18775__(8154);\nmodule.exports = !fails(function () {\n function F() {\n }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\n/***/ }),\n\n/***/ 1111:\n/***/ ((module) => {\n\n\nmodule.exports = function (value, done) {\n return {\n value: value,\n done: done\n };\n};\n\n/***/ }),\n\n/***/ 9293:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_19193__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_19193__(940);\nvar definePropertyModule = __nested_webpack_require_19193__(7744);\nvar createPropertyDescriptor = __nested_webpack_require_19193__(1198);\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n/***/ }),\n\n/***/ 1198:\n/***/ ((module) => {\n\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n/***/ }),\n\n/***/ 8947:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_19874__) => {\n\n\nvar toPropertyKey = __nested_webpack_require_19874__(4871);\nvar definePropertyModule = __nested_webpack_require_19874__(7744);\nvar createPropertyDescriptor = __nested_webpack_require_19874__(1198);\nmodule.exports = function (object, key, value) {\n var propertyKey = toPropertyKey(key);\n if (propertyKey in object)\n definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else\n object[propertyKey] = value;\n};\n\n/***/ }),\n\n/***/ 9691:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_20366__) => {\n\n\nvar makeBuiltIn = __nested_webpack_require_20366__(9687);\nvar defineProperty = __nested_webpack_require_20366__(7744);\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get)\n makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set)\n makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n\n/***/ }),\n\n/***/ 7041:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_20815__) => {\n\n\nvar isCallable = __nested_webpack_require_20815__(7316);\nvar definePropertyModule = __nested_webpack_require_20815__(7744);\nvar makeBuiltIn = __nested_webpack_require_20815__(9687);\nvar defineGlobalProperty = __nested_webpack_require_20815__(6000);\nmodule.exports = function (O, key, value, options) {\n if (!options)\n options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value))\n makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple)\n O[key] = value;\n else\n defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe)\n delete O[key];\n else if (O[key])\n simple = true;\n } catch (error) {\n }\n if (simple)\n O[key] = value;\n else\n definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n }\n return O;\n};\n\n/***/ }),\n\n/***/ 6880:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_21790__) => {\n\n\nvar defineBuiltIn = __nested_webpack_require_21790__(7041);\nmodule.exports = function (target, src, options) {\n for (var key in src)\n defineBuiltIn(target, key, src[key], options);\n return target;\n};\n\n/***/ }),\n\n/***/ 6000:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_22072__) => {\n\n\nvar global = __nested_webpack_require_22072__(9298);\nvar defineProperty = Object.defineProperty;\nmodule.exports = function (key, value) {\n try {\n defineProperty(global, key, {\n value: value,\n configurable: true,\n writable: true\n });\n } catch (error) {\n global[key] = value;\n }\n return value;\n};\n\n/***/ }),\n\n/***/ 940:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_22456__) => {\n\n\nvar fails = __nested_webpack_require_22456__(8154);\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, {\n get: function () {\n return 7;\n }\n })[1] !== 7;\n});\n\n/***/ }),\n\n/***/ 8126:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_22722__) => {\n\n\nvar global = __nested_webpack_require_22722__(9298);\nvar tryNodeRequire = __nested_webpack_require_22722__(2276);\nvar PROPER_STRUCTURED_CLONE_TRANSFER = __nested_webpack_require_22722__(4837);\nvar structuredClone = global.structuredClone;\nvar $ArrayBuffer = global.ArrayBuffer;\nvar $MessageChannel = global.MessageChannel;\nvar detach = false;\nvar WorkerThreads, channel, buffer, $detach;\nif (PROPER_STRUCTURED_CLONE_TRANSFER) {\n detach = function (transferable) {\n structuredClone(transferable, { transfer: [transferable] });\n };\n} else if ($ArrayBuffer)\n try {\n if (!$MessageChannel) {\n WorkerThreads = tryNodeRequire('worker_threads');\n if (WorkerThreads)\n $MessageChannel = WorkerThreads.MessageChannel;\n }\n if ($MessageChannel) {\n channel = new $MessageChannel();\n buffer = new $ArrayBuffer(2);\n $detach = function (transferable) {\n channel.port1.postMessage(null, [transferable]);\n };\n if (buffer.byteLength === 2) {\n $detach(buffer);\n if (buffer.byteLength === 0)\n detach = $detach;\n }\n }\n } catch (error) {\n }\nmodule.exports = detach;\n\n/***/ }),\n\n/***/ 1558:\n/***/ ((module) => {\n\n\nvar documentAll = typeof document == 'object' && document.all;\nvar IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined;\nmodule.exports = {\n all: documentAll,\n IS_HTMLDDA: IS_HTMLDDA\n};\n\n/***/ }),\n\n/***/ 5584:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_24112__) => {\n\n\nvar global = __nested_webpack_require_24112__(9298);\nvar isObject = __nested_webpack_require_24112__(7633);\nvar document = global.document;\nvar EXISTS = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n\n/***/ }),\n\n/***/ 4287:\n/***/ ((module) => {\n\n\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER)\n throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n\n/***/ }),\n\n/***/ 5050:\n/***/ ((module) => {\n\n\nmodule.exports = {\n IndexSizeError: {\n s: 'INDEX_SIZE_ERR',\n c: 1,\n m: 1\n },\n DOMStringSizeError: {\n s: 'DOMSTRING_SIZE_ERR',\n c: 2,\n m: 0\n },\n HierarchyRequestError: {\n s: 'HIERARCHY_REQUEST_ERR',\n c: 3,\n m: 1\n },\n WrongDocumentError: {\n s: 'WRONG_DOCUMENT_ERR',\n c: 4,\n m: 1\n },\n InvalidCharacterError: {\n s: 'INVALID_CHARACTER_ERR',\n c: 5,\n m: 1\n },\n NoDataAllowedError: {\n s: 'NO_DATA_ALLOWED_ERR',\n c: 6,\n m: 0\n },\n NoModificationAllowedError: {\n s: 'NO_MODIFICATION_ALLOWED_ERR',\n c: 7,\n m: 1\n },\n NotFoundError: {\n s: 'NOT_FOUND_ERR',\n c: 8,\n m: 1\n },\n NotSupportedError: {\n s: 'NOT_SUPPORTED_ERR',\n c: 9,\n m: 1\n },\n InUseAttributeError: {\n s: 'INUSE_ATTRIBUTE_ERR',\n c: 10,\n m: 1\n },\n InvalidStateError: {\n s: 'INVALID_STATE_ERR',\n c: 11,\n m: 1\n },\n SyntaxError: {\n s: 'SYNTAX_ERR',\n c: 12,\n m: 1\n },\n InvalidModificationError: {\n s: 'INVALID_MODIFICATION_ERR',\n c: 13,\n m: 1\n },\n NamespaceError: {\n s: 'NAMESPACE_ERR',\n c: 14,\n m: 1\n },\n InvalidAccessError: {\n s: 'INVALID_ACCESS_ERR',\n c: 15,\n m: 1\n },\n ValidationError: {\n s: 'VALIDATION_ERR',\n c: 16,\n m: 0\n },\n TypeMismatchError: {\n s: 'TYPE_MISMATCH_ERR',\n c: 17,\n m: 1\n },\n SecurityError: {\n s: 'SECURITY_ERR',\n c: 18,\n m: 1\n },\n NetworkError: {\n s: 'NETWORK_ERR',\n c: 19,\n m: 1\n },\n AbortError: {\n s: 'ABORT_ERR',\n c: 20,\n m: 1\n },\n URLMismatchError: {\n s: 'URL_MISMATCH_ERR',\n c: 21,\n m: 1\n },\n QuotaExceededError: {\n s: 'QUOTA_EXCEEDED_ERR',\n c: 22,\n m: 1\n },\n TimeoutError: {\n s: 'TIMEOUT_ERR',\n c: 23,\n m: 1\n },\n InvalidNodeTypeError: {\n s: 'INVALID_NODE_TYPE_ERR',\n c: 24,\n m: 1\n },\n DataCloneError: {\n s: 'DATA_CLONE_ERR',\n c: 25,\n m: 1\n }\n};\n\n/***/ }),\n\n/***/ 3413:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_26458__) => {\n\n\nvar IS_DENO = __nested_webpack_require_26458__(8471);\nvar IS_NODE = __nested_webpack_require_26458__(4864);\nmodule.exports = !IS_DENO && !IS_NODE && typeof window == 'object' && typeof document == 'object';\n\n/***/ }),\n\n/***/ 8471:\n/***/ ((module) => {\n\n\nmodule.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'object';\n\n/***/ }),\n\n/***/ 4864:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_26865__) => {\n\n\nvar global = __nested_webpack_require_26865__(9298);\nvar classof = __nested_webpack_require_26865__(8374);\nmodule.exports = classof(global.process) === 'process';\n\n/***/ }),\n\n/***/ 234:\n/***/ ((module) => {\n\n\nmodule.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || '';\n\n/***/ }),\n\n/***/ 2171:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_27229__) => {\n\n\nvar global = __nested_webpack_require_27229__(9298);\nvar userAgent = __nested_webpack_require_27229__(234);\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\nif (v8) {\n match = v8.split('.');\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match)\n version = +match[1];\n }\n}\nmodule.exports = version;\n\n/***/ }),\n\n/***/ 298:\n/***/ ((module) => {\n\n\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\n/***/ }),\n\n/***/ 34:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_28089__) => {\n\n\nvar uncurryThis = __nested_webpack_require_28089__(8403);\nvar $Error = Error;\nvar replace = uncurryThis(''.replace);\nvar TEST = function (arg) {\n return String(new $Error(arg).stack);\n}('zxcasd');\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\nmodule.exports = function (stack, dropEntries) {\n if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {\n while (dropEntries--)\n stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n }\n return stack;\n};\n\n/***/ }),\n\n/***/ 1931:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_28725__) => {\n\n\nvar createNonEnumerableProperty = __nested_webpack_require_28725__(9293);\nvar clearErrorStack = __nested_webpack_require_28725__(34);\nvar ERROR_STACK_INSTALLABLE = __nested_webpack_require_28725__(3437);\nvar captureStackTrace = Error.captureStackTrace;\nmodule.exports = function (error, C, stack, dropEntries) {\n if (ERROR_STACK_INSTALLABLE) {\n if (captureStackTrace)\n captureStackTrace(error, C);\n else\n createNonEnumerableProperty(error, 'stack', clearErrorStack(stack, dropEntries));\n }\n};\n\n/***/ }),\n\n/***/ 3437:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_29279__) => {\n\n\nvar fails = __nested_webpack_require_29279__(8154);\nvar createPropertyDescriptor = __nested_webpack_require_29279__(1198);\nmodule.exports = !fails(function () {\n var error = new Error('a');\n if (!('stack' in error))\n return true;\n Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));\n return error.stack !== 7;\n});\n\n/***/ }),\n\n/***/ 4978:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_29681__) => {\n\n\nvar global = __nested_webpack_require_29681__(9298);\nvar getOwnPropertyDescriptor = (__nested_webpack_require_29681__(5764).f);\nvar createNonEnumerableProperty = __nested_webpack_require_29681__(9293);\nvar defineBuiltIn = __nested_webpack_require_29681__(7041);\nvar defineGlobalProperty = __nested_webpack_require_29681__(6000);\nvar copyConstructorProperties = __nested_webpack_require_29681__(1425);\nvar isForced = __nested_webpack_require_29681__(7007);\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target)\n for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else\n targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty)\n continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n if (options.sham || targetProperty && targetProperty.sham) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n\n/***/ }),\n\n/***/ 8154:\n/***/ ((module) => {\n\n\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n\n/***/ }),\n\n/***/ 7294:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_31399__) => {\n\n\nvar NATIVE_BIND = __nested_webpack_require_31399__(2486);\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n\n/***/ }),\n\n/***/ 7789:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_31808__) => {\n\n\nvar uncurryThis = __nested_webpack_require_31808__(6218);\nvar aCallable = __nested_webpack_require_31808__(1782);\nvar NATIVE_BIND = __nested_webpack_require_31808__(2486);\nvar bind = uncurryThis(uncurryThis.bind);\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function () {\n return fn.apply(that, arguments);\n };\n};\n\n/***/ }),\n\n/***/ 2486:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_32254__) => {\n\n\nvar fails = __nested_webpack_require_32254__(8154);\nmodule.exports = !fails(function () {\n var test = function () {\n }.bind();\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n\n/***/ }),\n\n/***/ 2026:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_32537__) => {\n\n\nvar NATIVE_BIND = __nested_webpack_require_32537__(2486);\nvar call = Function.prototype.call;\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n\n/***/ }),\n\n/***/ 5145:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_32815__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_32815__(940);\nvar hasOwn = __nested_webpack_require_32815__(936);\nvar FunctionPrototype = Function.prototype;\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\nvar PROPER = EXISTS && function something() {\n}.name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable);\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n\n/***/ }),\n\n/***/ 1299:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_33423__) => {\n\n\nvar uncurryThis = __nested_webpack_require_33423__(8403);\nvar aCallable = __nested_webpack_require_33423__(1782);\nmodule.exports = function (object, key, method) {\n try {\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) {\n }\n};\n\n/***/ }),\n\n/***/ 6218:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_33774__) => {\n\n\nvar classofRaw = __nested_webpack_require_33774__(8374);\nvar uncurryThis = __nested_webpack_require_33774__(8403);\nmodule.exports = function (fn) {\n if (classofRaw(fn) === 'Function')\n return uncurryThis(fn);\n};\n\n/***/ }),\n\n/***/ 8403:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_34055__) => {\n\n\nvar NATIVE_BIND = __nested_webpack_require_34055__(2486);\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n\n/***/ }),\n\n/***/ 7187:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_34489__) => {\n\n\nvar global = __nested_webpack_require_34489__(9298);\nvar isCallable = __nested_webpack_require_34489__(7316);\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n\n/***/ }),\n\n/***/ 9235:\n/***/ ((module) => {\n\n\nmodule.exports = function (obj) {\n return {\n iterator: obj,\n next: obj.next,\n done: false\n };\n};\n\n/***/ }),\n\n/***/ 907:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_35068__) => {\n\n\nvar call = __nested_webpack_require_35068__(2026);\nvar anObject = __nested_webpack_require_35068__(4719);\nvar getIteratorDirect = __nested_webpack_require_35068__(9235);\nvar getIteratorMethod = __nested_webpack_require_35068__(273);\nmodule.exports = function (obj, stringHandling) {\n if (!stringHandling || typeof obj !== 'string')\n anObject(obj);\n var method = getIteratorMethod(obj);\n return getIteratorDirect(anObject(method !== undefined ? call(method, obj) : obj));\n};\n\n/***/ }),\n\n/***/ 273:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_35584__) => {\n\n\nvar classof = __nested_webpack_require_35584__(8329);\nvar getMethod = __nested_webpack_require_35584__(8486);\nvar isNullOrUndefined = __nested_webpack_require_35584__(3734);\nvar Iterators = __nested_webpack_require_35584__(6596);\nvar wellKnownSymbol = __nested_webpack_require_35584__(2292);\nvar ITERATOR = wellKnownSymbol('iterator');\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it))\n return getMethod(it, ITERATOR) || getMethod(it, '@@iterator') || Iterators[classof(it)];\n};\n\n/***/ }),\n\n/***/ 7612:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_36105__) => {\n\n\nvar call = __nested_webpack_require_36105__(2026);\nvar aCallable = __nested_webpack_require_36105__(1782);\nvar anObject = __nested_webpack_require_36105__(4719);\nvar tryToString = __nested_webpack_require_36105__(9762);\nvar getIteratorMethod = __nested_webpack_require_36105__(273);\nvar $TypeError = TypeError;\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod))\n return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n\n/***/ }),\n\n/***/ 8486:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_36742__) => {\n\n\nvar aCallable = __nested_webpack_require_36742__(1782);\nvar isNullOrUndefined = __nested_webpack_require_36742__(3734);\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n\n/***/ }),\n\n/***/ 1096:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_37049__) => {\n\n\nvar aCallable = __nested_webpack_require_37049__(1782);\nvar anObject = __nested_webpack_require_37049__(4719);\nvar call = __nested_webpack_require_37049__(2026);\nvar toIntegerOrInfinity = __nested_webpack_require_37049__(1003);\nvar getIteratorDirect = __nested_webpack_require_37049__(9235);\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\nvar SetRecord = function (set, size, has, keys) {\n this.set = set;\n this.size = size;\n this.has = has;\n this.keys = keys;\n};\nSetRecord.prototype = {\n getIterator: function () {\n return getIteratorDirect(anObject(call(this.keys, this.set)));\n },\n includes: function (it) {\n return call(this.has, this.set, it);\n }\n};\nmodule.exports = function (obj) {\n anObject(obj);\n var numSize = +obj.size;\n if (numSize !== numSize)\n throw new $TypeError(INVALID_SIZE);\n var intSize = toIntegerOrInfinity(numSize);\n if (intSize < 0)\n throw new $RangeError(INVALID_SIZE);\n return new SetRecord(obj, max(intSize, 0), aCallable(obj.has), aCallable(obj.keys));\n};\n\n/***/ }),\n\n/***/ 9298:\n/***/ (function(module) {\n\n\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\nmodule.exports = check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || check(typeof self == 'object' && self) || check(typeof global == 'object' && global) || check(typeof this == 'object' && this) || (function () {\n return this;\n}()) || Function('return this')();\n\n/***/ }),\n\n/***/ 936:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_38563__) => {\n\n\nvar uncurryThis = __nested_webpack_require_38563__(8403);\nvar toObject = __nested_webpack_require_38563__(2007);\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n\n/***/ }),\n\n/***/ 6010:\n/***/ ((module) => {\n\n\nmodule.exports = {};\n\n/***/ }),\n\n/***/ 519:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_38971__) => {\n\n\nvar getBuiltIn = __nested_webpack_require_38971__(7187);\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n/***/ }),\n\n/***/ 9394:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_39169__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_39169__(940);\nvar fails = __nested_webpack_require_39169__(8154);\nvar createElement = __nested_webpack_require_39169__(5584);\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () {\n return 7;\n }\n }).a !== 7;\n});\n\n/***/ }),\n\n/***/ 3622:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_39561__) => {\n\n\nvar uncurryThis = __nested_webpack_require_39561__(8403);\nvar fails = __nested_webpack_require_39561__(8154);\nvar classof = __nested_webpack_require_39561__(8374);\nvar $Object = Object;\nvar split = uncurryThis(''.split);\nmodule.exports = fails(function () {\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n\n/***/ }),\n\n/***/ 7523:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_40019__) => {\n\n\nvar isCallable = __nested_webpack_require_40019__(7316);\nvar isObject = __nested_webpack_require_40019__(7633);\nvar setPrototypeOf = __nested_webpack_require_40019__(9763);\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (setPrototypeOf && isCallable(NewTarget = dummy.constructor) && NewTarget !== Wrapper && isObject(NewTargetPrototype = NewTarget.prototype) && NewTargetPrototype !== Wrapper.prototype)\n setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n\n/***/ }),\n\n/***/ 4993:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_40587__) => {\n\n\nvar uncurryThis = __nested_webpack_require_40587__(8403);\nvar isCallable = __nested_webpack_require_40587__(7316);\nvar store = __nested_webpack_require_40587__(7542);\nvar functionToString = uncurryThis(Function.toString);\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\nmodule.exports = store.inspectSource;\n\n/***/ }),\n\n/***/ 8422:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_41018__) => {\n\n\nvar isObject = __nested_webpack_require_41018__(7633);\nvar createNonEnumerableProperty = __nested_webpack_require_41018__(9293);\nmodule.exports = function (O, options) {\n if (isObject(options) && 'cause' in options) {\n createNonEnumerableProperty(O, 'cause', options.cause);\n }\n};\n\n/***/ }),\n\n/***/ 1649:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_41368__) => {\n\n\nvar NATIVE_WEAK_MAP = __nested_webpack_require_41368__(8443);\nvar global = __nested_webpack_require_41368__(9298);\nvar isObject = __nested_webpack_require_41368__(7633);\nvar createNonEnumerableProperty = __nested_webpack_require_41368__(9293);\nvar hasOwn = __nested_webpack_require_41368__(936);\nvar shared = __nested_webpack_require_41368__(7542);\nvar sharedKey = __nested_webpack_require_41368__(3727);\nvar hiddenKeys = __nested_webpack_require_41368__(6010);\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n }\n return state;\n };\n};\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n set = function (it, metadata) {\n if (store.has(it))\n throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE))\n throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n\n/***/ }),\n\n/***/ 5191:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_43231__) => {\n\n\nvar wellKnownSymbol = __nested_webpack_require_43231__(2292);\nvar Iterators = __nested_webpack_require_43231__(6596);\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n\n/***/ }),\n\n/***/ 6998:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_43624__) => {\n\n\nvar classof = __nested_webpack_require_43624__(8374);\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n\n/***/ }),\n\n/***/ 5986:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_43864__) => {\n\n\nvar classof = __nested_webpack_require_43864__(8329);\nmodule.exports = function (it) {\n var klass = classof(it);\n return klass === 'BigInt64Array' || klass === 'BigUint64Array';\n};\n\n/***/ }),\n\n/***/ 7316:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_44126__) => {\n\n\nvar $documentAll = __nested_webpack_require_44126__(1558);\nvar documentAll = $documentAll.all;\nmodule.exports = $documentAll.IS_HTMLDDA ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n\n/***/ }),\n\n/***/ 7007:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_44502__) => {\n\n\nvar fails = __nested_webpack_require_44502__(8154);\nvar isCallable = __nested_webpack_require_44502__(7316);\nvar replacement = /#|\\.prototype\\./;\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true : value === NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection;\n};\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\nmodule.exports = isForced;\n\n/***/ }),\n\n/***/ 3734:\n/***/ ((module) => {\n\n\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n\n/***/ }),\n\n/***/ 7633:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_45306__) => {\n\n\nvar isCallable = __nested_webpack_require_45306__(7316);\nvar $documentAll = __nested_webpack_require_45306__(1558);\nvar documentAll = $documentAll.all;\nmodule.exports = $documentAll.IS_HTMLDDA ? function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll;\n} : function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n\n/***/ }),\n\n/***/ 2554:\n/***/ ((module) => {\n\n\nmodule.exports = false;\n\n/***/ }),\n\n/***/ 7814:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_45825__) => {\n\n\nvar getBuiltIn = __nested_webpack_require_45825__(7187);\nvar isCallable = __nested_webpack_require_45825__(7316);\nvar isPrototypeOf = __nested_webpack_require_45825__(2658);\nvar USE_SYMBOL_AS_UID = __nested_webpack_require_45825__(7960);\nvar $Object = Object;\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n\n/***/ }),\n\n/***/ 5504:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_46349__) => {\n\n\nvar call = __nested_webpack_require_46349__(2026);\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n var next = record.next;\n var step, result;\n while (!(step = call(next, iterator)).done) {\n result = fn(step.value);\n if (result !== undefined)\n return result;\n }\n};\n\n/***/ }),\n\n/***/ 6837:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_46791__) => {\n\n\nvar bind = __nested_webpack_require_46791__(7789);\nvar call = __nested_webpack_require_46791__(2026);\nvar anObject = __nested_webpack_require_46791__(4719);\nvar tryToString = __nested_webpack_require_46791__(9762);\nvar isArrayIteratorMethod = __nested_webpack_require_46791__(5191);\nvar lengthOfArrayLike = __nested_webpack_require_46791__(451);\nvar isPrototypeOf = __nested_webpack_require_46791__(2658);\nvar getIterator = __nested_webpack_require_46791__(7612);\nvar getIteratorMethod = __nested_webpack_require_46791__(273);\nvar iteratorClose = __nested_webpack_require_46791__(3316);\nvar $TypeError = TypeError;\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\nvar ResultPrototype = Result.prototype;\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n var stop = function (condition) {\n if (iterator)\n iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n }\n return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn)\n throw new $TypeError(tryToString(iterable) + ' is not iterable');\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result))\n return result;\n }\n return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result))\n return result;\n }\n return new Result(false);\n};\n\n/***/ }),\n\n/***/ 3316:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_49170__) => {\n\n\nvar call = __nested_webpack_require_49170__(2026);\nvar anObject = __nested_webpack_require_49170__(4719);\nvar getMethod = __nested_webpack_require_49170__(8486);\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw')\n throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw')\n throw value;\n if (innerError)\n throw innerResult;\n anObject(innerResult);\n return value;\n};\n\n/***/ }),\n\n/***/ 375:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_49857__) => {\n\n\nvar call = __nested_webpack_require_49857__(2026);\nvar create = __nested_webpack_require_49857__(6941);\nvar createNonEnumerableProperty = __nested_webpack_require_49857__(9293);\nvar defineBuiltIns = __nested_webpack_require_49857__(6880);\nvar wellKnownSymbol = __nested_webpack_require_49857__(2292);\nvar InternalStateModule = __nested_webpack_require_49857__(1649);\nvar getMethod = __nested_webpack_require_49857__(8486);\nvar IteratorPrototype = (__nested_webpack_require_49857__(5238).IteratorPrototype);\nvar createIterResultObject = __nested_webpack_require_49857__(1111);\nvar iteratorClose = __nested_webpack_require_49857__(3316);\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ITERATOR_HELPER = 'IteratorHelper';\nvar WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator';\nvar setInternalState = InternalStateModule.set;\nvar createIteratorProxyPrototype = function (IS_ITERATOR) {\n var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER);\n return defineBuiltIns(create(IteratorPrototype), {\n next: function next() {\n var state = getInternalState(this);\n if (IS_ITERATOR)\n return state.nextHandler();\n try {\n var result = state.done ? undefined : state.nextHandler();\n return createIterResultObject(result, state.done);\n } catch (error) {\n state.done = true;\n throw error;\n }\n },\n 'return': function () {\n var state = getInternalState(this);\n var iterator = state.iterator;\n state.done = true;\n if (IS_ITERATOR) {\n var returnMethod = getMethod(iterator, 'return');\n return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true);\n }\n if (state.inner)\n try {\n iteratorClose(state.inner.iterator, 'normal');\n } catch (error) {\n return iteratorClose(iterator, 'throw', error);\n }\n iteratorClose(iterator, 'normal');\n return createIterResultObject(undefined, true);\n }\n });\n};\nvar WrapForValidIteratorPrototype = createIteratorProxyPrototype(true);\nvar IteratorHelperPrototype = createIteratorProxyPrototype(false);\ncreateNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper');\nmodule.exports = function (nextHandler, IS_ITERATOR) {\n var IteratorProxy = function Iterator(record, state) {\n if (state) {\n state.iterator = record.iterator;\n state.next = record.next;\n } else\n state = record;\n state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;\n state.nextHandler = nextHandler;\n state.counter = 0;\n state.done = false;\n setInternalState(this, state);\n };\n IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype;\n return IteratorProxy;\n};\n\n/***/ }),\n\n/***/ 8142:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_52512__) => {\n\n\nvar call = __nested_webpack_require_52512__(2026);\nvar aCallable = __nested_webpack_require_52512__(1782);\nvar anObject = __nested_webpack_require_52512__(4719);\nvar getIteratorDirect = __nested_webpack_require_52512__(9235);\nvar createIteratorProxy = __nested_webpack_require_52512__(375);\nvar callWithSafeIterationClosing = __nested_webpack_require_52512__(5723);\nvar IteratorProxy = createIteratorProxy(function () {\n var iterator = this.iterator;\n var result = anObject(call(this.next, iterator));\n var done = this.done = !!result.done;\n if (!done)\n return callWithSafeIterationClosing(iterator, this.mapper, [\n result.value,\n this.counter++\n ], true);\n});\nmodule.exports = function map(mapper) {\n anObject(this);\n aCallable(mapper);\n return new IteratorProxy(getIteratorDirect(this), { mapper: mapper });\n};\n\n/***/ }),\n\n/***/ 5238:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_53347__) => {\n\n\nvar fails = __nested_webpack_require_53347__(8154);\nvar isCallable = __nested_webpack_require_53347__(7316);\nvar isObject = __nested_webpack_require_53347__(7633);\nvar create = __nested_webpack_require_53347__(6941);\nvar getPrototypeOf = __nested_webpack_require_53347__(2176);\nvar defineBuiltIn = __nested_webpack_require_53347__(7041);\nvar wellKnownSymbol = __nested_webpack_require_53347__(2292);\nvar IS_PURE = __nested_webpack_require_53347__(2554);\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\nif ([].keys) {\n arrayIterator = [].keys();\n if (!('next' in arrayIterator))\n BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype)\n IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\nif (NEW_ITERATOR_PROTOTYPE)\n IteratorPrototype = {};\nelse if (IS_PURE)\n IteratorPrototype = create(IteratorPrototype);\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\n/***/ }),\n\n/***/ 6596:\n/***/ ((module) => {\n\n\nmodule.exports = {};\n\n/***/ }),\n\n/***/ 451:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_54852__) => {\n\n\nvar toLength = __nested_webpack_require_54852__(8293);\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n\n/***/ }),\n\n/***/ 9687:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_55055__) => {\n\n\nvar uncurryThis = __nested_webpack_require_55055__(8403);\nvar fails = __nested_webpack_require_55055__(8154);\nvar isCallable = __nested_webpack_require_55055__(7316);\nvar hasOwn = __nested_webpack_require_55055__(936);\nvar DESCRIPTORS = __nested_webpack_require_55055__(940);\nvar CONFIGURABLE_FUNCTION_NAME = (__nested_webpack_require_55055__(5145).CONFIGURABLE);\nvar inspectSource = __nested_webpack_require_55055__(4993);\nvar InternalStateModule = __nested_webpack_require_55055__(1649);\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () {\n }, 'length', { value: 8 }).length !== 8;\n});\nvar TEMPLATE = String(String).split('String');\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (options && options.getter)\n name = 'get ' + name;\n if (options && options.setter)\n name = 'set ' + name;\n if (!hasOwn(value, 'name') || CONFIGURABLE_FUNCTION_NAME && value.name !== name) {\n if (DESCRIPTORS)\n defineProperty(value, 'name', {\n value: name,\n configurable: true\n });\n else\n value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS)\n defineProperty(value, 'prototype', { writable: false });\n } else if (value.prototype)\n value.prototype = undefined;\n } catch (error) {\n }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n }\n return value;\n};\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n\n/***/ }),\n\n/***/ 8537:\n/***/ ((module) => {\n\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n\n/***/ }),\n\n/***/ 1264:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_57473__) => {\n\n\nvar toString = __nested_webpack_require_57473__(5730);\nmodule.exports = function (argument, $default) {\n return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n\n/***/ }),\n\n/***/ 6941:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_57753__) => {\n\n\nvar anObject = __nested_webpack_require_57753__(4719);\nvar definePropertiesModule = __nested_webpack_require_57753__(6617);\nvar enumBugKeys = __nested_webpack_require_57753__(298);\nvar hiddenKeys = __nested_webpack_require_57753__(6010);\nvar html = __nested_webpack_require_57753__(519);\nvar documentCreateElement = __nested_webpack_require_57753__(5584);\nvar sharedKey = __nested_webpack_require_57753__(3727);\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar EmptyConstructor = function () {\n};\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null;\n return temp;\n};\nvar NullProtoObjectViaIFrame = function () {\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) {\n }\n NullProtoObject = typeof document != 'undefined' ? document.domain && activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame() : NullProtoObjectViaActiveX(activeXDocument);\n var length = enumBugKeys.length;\n while (length--)\n delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\nhiddenKeys[IE_PROTO] = true;\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n result[IE_PROTO] = O;\n } else\n result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n\n/***/ }),\n\n/***/ 6617:\n/***/ ((__unused_webpack_module, exports, __nested_webpack_require_59942__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_59942__(940);\nvar V8_PROTOTYPE_DEFINE_BUG = __nested_webpack_require_59942__(9610);\nvar definePropertyModule = __nested_webpack_require_59942__(7744);\nvar anObject = __nested_webpack_require_59942__(4719);\nvar toIndexedObject = __nested_webpack_require_59942__(4115);\nvar objectKeys = __nested_webpack_require_59942__(1706);\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index)\n definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n\n/***/ }),\n\n/***/ 7744:\n/***/ ((__unused_webpack_module, exports, __nested_webpack_require_60694__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_60694__(940);\nvar IE8_DOM_DEFINE = __nested_webpack_require_60694__(9394);\nvar V8_PROTOTYPE_DEFINE_BUG = __nested_webpack_require_60694__(9610);\nvar anObject = __nested_webpack_require_60694__(4719);\nvar toPropertyKey = __nested_webpack_require_60694__(4871);\nvar $TypeError = TypeError;\nvar $defineProperty = Object.defineProperty;\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n }\n return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE)\n try {\n return $defineProperty(O, P, Attributes);\n } catch (error) {\n }\n if ('get' in Attributes || 'set' in Attributes)\n throw new $TypeError('Accessors not supported');\n if ('value' in Attributes)\n O[P] = Attributes.value;\n return O;\n};\n\n/***/ }),\n\n/***/ 5764:\n/***/ ((__unused_webpack_module, exports, __nested_webpack_require_62330__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_62330__(940);\nvar call = __nested_webpack_require_62330__(2026);\nvar propertyIsEnumerableModule = __nested_webpack_require_62330__(1879);\nvar createPropertyDescriptor = __nested_webpack_require_62330__(1198);\nvar toIndexedObject = __nested_webpack_require_62330__(4115);\nvar toPropertyKey = __nested_webpack_require_62330__(4871);\nvar hasOwn = __nested_webpack_require_62330__(936);\nvar IE8_DOM_DEFINE = __nested_webpack_require_62330__(9394);\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE)\n try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) {\n }\n if (hasOwn(O, P))\n return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n\n/***/ }),\n\n/***/ 5455:\n/***/ ((__unused_webpack_module, exports, __nested_webpack_require_63218__) => {\n\n\nvar internalObjectKeys = __nested_webpack_require_63218__(9138);\nvar enumBugKeys = __nested_webpack_require_63218__(298);\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n\n/***/ }),\n\n/***/ 1963:\n/***/ ((__unused_webpack_module, exports) => {\n\n\nexports.f = Object.getOwnPropertySymbols;\n\n/***/ }),\n\n/***/ 2176:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_63705__) => {\n\n\nvar hasOwn = __nested_webpack_require_63705__(936);\nvar isCallable = __nested_webpack_require_63705__(7316);\nvar toObject = __nested_webpack_require_63705__(2007);\nvar sharedKey = __nested_webpack_require_63705__(3727);\nvar CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_63705__(7888);\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO))\n return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n }\n return object instanceof $Object ? ObjectPrototype : null;\n};\n\n/***/ }),\n\n/***/ 2658:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_64497__) => {\n\n\nvar uncurryThis = __nested_webpack_require_64497__(8403);\nmodule.exports = uncurryThis({}.isPrototypeOf);\n\n/***/ }),\n\n/***/ 9138:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_64684__) => {\n\n\nvar uncurryThis = __nested_webpack_require_64684__(8403);\nvar hasOwn = __nested_webpack_require_64684__(936);\nvar toIndexedObject = __nested_webpack_require_64684__(4115);\nvar indexOf = (__nested_webpack_require_64684__(9773).indexOf);\nvar hiddenKeys = __nested_webpack_require_64684__(6010);\nvar push = uncurryThis([].push);\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O)\n !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n while (names.length > i)\n if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n\n/***/ }),\n\n/***/ 1706:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_65373__) => {\n\n\nvar internalObjectKeys = __nested_webpack_require_65373__(9138);\nvar enumBugKeys = __nested_webpack_require_65373__(298);\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n\n/***/ }),\n\n/***/ 1879:\n/***/ ((__unused_webpack_module, exports) => {\n\n\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n\n/***/ }),\n\n/***/ 9763:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_66127__) => {\n\n\nvar uncurryThisAccessor = __nested_webpack_require_66127__(1299);\nvar anObject = __nested_webpack_require_66127__(4719);\nvar aPossiblePrototype = __nested_webpack_require_66127__(4958);\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? (function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) {\n }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER)\n setter(O, proto);\n else\n O.__proto__ = proto;\n return O;\n };\n}()) : undefined);\n\n/***/ }),\n\n/***/ 2923:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_66862__) => {\n\n\nvar call = __nested_webpack_require_66862__(2026);\nvar isCallable = __nested_webpack_require_66862__(7316);\nvar isObject = __nested_webpack_require_66862__(7633);\nvar $TypeError = TypeError;\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input)))\n return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input)))\n return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input)))\n return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n\n/***/ }),\n\n/***/ 8953:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_67538__) => {\n\n\nvar getBuiltIn = __nested_webpack_require_67538__(7187);\nvar uncurryThis = __nested_webpack_require_67538__(8403);\nvar getOwnPropertyNamesModule = __nested_webpack_require_67538__(5455);\nvar getOwnPropertySymbolsModule = __nested_webpack_require_67538__(1963);\nvar anObject = __nested_webpack_require_67538__(4719);\nvar concat = uncurryThis([].concat);\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n\n/***/ }),\n\n/***/ 3713:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_68194__) => {\n\n\nvar uncurryThis = __nested_webpack_require_68194__(8403);\nvar hasOwn = __nested_webpack_require_68194__(936);\nvar $SyntaxError = SyntaxError;\nvar $parseInt = parseInt;\nvar fromCharCode = String.fromCharCode;\nvar at = uncurryThis(''.charAt);\nvar slice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\nvar codePoints = {\n '\\\\\"': '\"',\n '\\\\\\\\': '\\\\',\n '\\\\/': '/',\n '\\\\b': '\\b',\n '\\\\f': '\\f',\n '\\\\n': '\\n',\n '\\\\r': '\\r',\n '\\\\t': '\\t'\n};\nvar IS_4_HEX_DIGITS = /^[\\da-f]{4}$/i;\nvar IS_C0_CONTROL_CODE = /^[\\u0000-\\u001F]$/;\nmodule.exports = function (source, i) {\n var unterminated = true;\n var value = '';\n while (i < source.length) {\n var chr = at(source, i);\n if (chr === '\\\\') {\n var twoChars = slice(source, i, i + 2);\n if (hasOwn(codePoints, twoChars)) {\n value += codePoints[twoChars];\n i += 2;\n } else if (twoChars === '\\\\u') {\n i += 2;\n var fourHexDigits = slice(source, i, i + 4);\n if (!exec(IS_4_HEX_DIGITS, fourHexDigits))\n throw new $SyntaxError('Bad Unicode escape at: ' + i);\n value += fromCharCode($parseInt(fourHexDigits, 16));\n i += 4;\n } else\n throw new $SyntaxError('Unknown escape sequence: \"' + twoChars + '\"');\n } else if (chr === '\"') {\n unterminated = false;\n i++;\n break;\n } else {\n if (exec(IS_C0_CONTROL_CODE, chr))\n throw new $SyntaxError('Bad control character in string literal at: ' + i);\n value += chr;\n i++;\n }\n }\n if (unterminated)\n throw new $SyntaxError('Unterminated string at: ' + i);\n return {\n value: value,\n end: i\n };\n};\n\n/***/ }),\n\n/***/ 6085:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_69788__) => {\n\n\nvar defineProperty = (__nested_webpack_require_69788__(7744).f);\nmodule.exports = function (Target, Source, key) {\n key in Target || defineProperty(Target, key, {\n configurable: true,\n get: function () {\n return Source[key];\n },\n set: function (it) {\n Source[key] = it;\n }\n });\n};\n\n/***/ }),\n\n/***/ 5645:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_70159__) => {\n\n\nvar isNullOrUndefined = __nested_webpack_require_70159__(3734);\nvar $TypeError = TypeError;\nmodule.exports = function (it) {\n if (isNullOrUndefined(it))\n throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n/***/ }),\n\n/***/ 4057:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_70462__) => {\n\n\nvar SetHelpers = __nested_webpack_require_70462__(23);\nvar iterate = __nested_webpack_require_70462__(8848);\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nmodule.exports = function (set) {\n var result = new Set();\n iterate(set, function (it) {\n add(result, it);\n });\n return result;\n};\n\n/***/ }),\n\n/***/ 5656:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_70823__) => {\n\n\nvar aSet = __nested_webpack_require_70823__(5690);\nvar SetHelpers = __nested_webpack_require_70823__(23);\nvar clone = __nested_webpack_require_70823__(4057);\nvar size = __nested_webpack_require_70823__(6098);\nvar getSetRecord = __nested_webpack_require_70823__(1096);\nvar iterateSet = __nested_webpack_require_70823__(8848);\nvar iterateSimple = __nested_webpack_require_70823__(5504);\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\nmodule.exports = function difference(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = clone(O);\n if (size(O) <= otherRec.size)\n iterateSet(O, function (e) {\n if (otherRec.includes(e))\n remove(result, e);\n });\n else\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e))\n remove(result, e);\n });\n return result;\n};\n\n/***/ }),\n\n/***/ 23:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_71642__) => {\n\n\nvar uncurryThis = __nested_webpack_require_71642__(8403);\nvar SetPrototype = Set.prototype;\nmodule.exports = {\n Set: Set,\n add: uncurryThis(SetPrototype.add),\n has: uncurryThis(SetPrototype.has),\n remove: uncurryThis(SetPrototype['delete']),\n proto: SetPrototype\n};\n\n/***/ }),\n\n/***/ 8461:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_71989__) => {\n\n\nvar aSet = __nested_webpack_require_71989__(5690);\nvar SetHelpers = __nested_webpack_require_71989__(23);\nvar size = __nested_webpack_require_71989__(6098);\nvar getSetRecord = __nested_webpack_require_71989__(1096);\nvar iterateSet = __nested_webpack_require_71989__(8848);\nvar iterateSimple = __nested_webpack_require_71989__(5504);\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nmodule.exports = function intersection(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = new Set();\n if (size(O) > otherRec.size) {\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e))\n add(result, e);\n });\n } else {\n iterateSet(O, function (e) {\n if (otherRec.includes(e))\n add(result, e);\n });\n }\n return result;\n};\n\n/***/ }),\n\n/***/ 8550:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_72796__) => {\n\n\nvar aSet = __nested_webpack_require_72796__(5690);\nvar has = (__nested_webpack_require_72796__(23).has);\nvar size = __nested_webpack_require_72796__(6098);\nvar getSetRecord = __nested_webpack_require_72796__(1096);\nvar iterateSet = __nested_webpack_require_72796__(8848);\nvar iterateSimple = __nested_webpack_require_72796__(5504);\nvar iteratorClose = __nested_webpack_require_72796__(3316);\nmodule.exports = function isDisjointFrom(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) <= otherRec.size)\n return iterateSet(O, function (e) {\n if (otherRec.includes(e))\n return false;\n }, true) !== false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (has(O, e))\n return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n\n/***/ }),\n\n/***/ 990:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_73610__) => {\n\n\nvar aSet = __nested_webpack_require_73610__(5690);\nvar size = __nested_webpack_require_73610__(6098);\nvar iterate = __nested_webpack_require_73610__(8848);\nvar getSetRecord = __nested_webpack_require_73610__(1096);\nmodule.exports = function isSubsetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) > otherRec.size)\n return false;\n return iterate(O, function (e) {\n if (!otherRec.includes(e))\n return false;\n }, true) !== false;\n};\n\n/***/ }),\n\n/***/ 194:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_74120__) => {\n\n\nvar aSet = __nested_webpack_require_74120__(5690);\nvar has = (__nested_webpack_require_74120__(23).has);\nvar size = __nested_webpack_require_74120__(6098);\nvar getSetRecord = __nested_webpack_require_74120__(1096);\nvar iterateSimple = __nested_webpack_require_74120__(5504);\nvar iteratorClose = __nested_webpack_require_74120__(3316);\nmodule.exports = function isSupersetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) < otherRec.size)\n return false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (!has(O, e))\n return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n\n/***/ }),\n\n/***/ 8848:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_74798__) => {\n\n\nvar uncurryThis = __nested_webpack_require_74798__(8403);\nvar iterateSimple = __nested_webpack_require_74798__(5504);\nvar SetHelpers = __nested_webpack_require_74798__(23);\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\nmodule.exports = function (set, fn, interruptible) {\n return interruptible ? iterateSimple({\n iterator: keys(set),\n next: next\n }, fn) : forEach(set, fn);\n};\n\n/***/ }),\n\n/***/ 507:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_75373__) => {\n\n\nvar getBuiltIn = __nested_webpack_require_75373__(7187);\nvar createSetLike = function (size) {\n return {\n size: size,\n has: function () {\n return false;\n },\n keys: function () {\n return {\n next: function () {\n return { done: true };\n }\n };\n }\n };\n};\nmodule.exports = function (name) {\n var Set = getBuiltIn('Set');\n try {\n new Set()[name](createSetLike(0));\n try {\n new Set()[name](createSetLike(-1));\n return false;\n } catch (error2) {\n return true;\n }\n } catch (error) {\n return false;\n }\n};\n\n/***/ }),\n\n/***/ 6098:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_75980__) => {\n\n\nvar uncurryThisAccessor = __nested_webpack_require_75980__(1299);\nvar SetHelpers = __nested_webpack_require_75980__(23);\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n return set.size;\n};\n\n/***/ }),\n\n/***/ 3194:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_76280__) => {\n\n\nvar aSet = __nested_webpack_require_76280__(5690);\nvar SetHelpers = __nested_webpack_require_76280__(23);\nvar clone = __nested_webpack_require_76280__(4057);\nvar getSetRecord = __nested_webpack_require_76280__(1096);\nvar iterateSimple = __nested_webpack_require_76280__(5504);\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\nmodule.exports = function symmetricDifference(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (e) {\n if (has(O, e))\n remove(result, e);\n else\n add(result, e);\n });\n return result;\n};\n\n/***/ }),\n\n/***/ 5703:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_76950__) => {\n\n\nvar aSet = __nested_webpack_require_76950__(5690);\nvar add = (__nested_webpack_require_76950__(23).add);\nvar clone = __nested_webpack_require_76950__(4057);\nvar getSetRecord = __nested_webpack_require_76950__(1096);\nvar iterateSimple = __nested_webpack_require_76950__(5504);\nmodule.exports = function union(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (it) {\n add(result, it);\n });\n return result;\n};\n\n/***/ }),\n\n/***/ 3727:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_77476__) => {\n\n\nvar shared = __nested_webpack_require_77476__(6807);\nvar uid = __nested_webpack_require_77476__(7561);\nvar keys = shared('keys');\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n\n/***/ }),\n\n/***/ 7542:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_77756__) => {\n\n\nvar global = __nested_webpack_require_77756__(9298);\nvar defineGlobalProperty = __nested_webpack_require_77756__(6000);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || defineGlobalProperty(SHARED, {});\nmodule.exports = store;\n\n/***/ }),\n\n/***/ 6807:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_78067__) => {\n\n\nvar IS_PURE = __nested_webpack_require_78067__(2554);\nvar store = __nested_webpack_require_78067__(7542);\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.34.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.34.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n\n/***/ }),\n\n/***/ 4837:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_78614__) => {\n\n\nvar global = __nested_webpack_require_78614__(9298);\nvar fails = __nested_webpack_require_78614__(8154);\nvar V8 = __nested_webpack_require_78614__(2171);\nvar IS_BROWSER = __nested_webpack_require_78614__(3413);\nvar IS_DENO = __nested_webpack_require_78614__(8471);\nvar IS_NODE = __nested_webpack_require_78614__(4864);\nvar structuredClone = global.structuredClone;\nmodule.exports = !!structuredClone && !fails(function () {\n if (IS_DENO && V8 > 92 || IS_NODE && V8 > 94 || IS_BROWSER && V8 > 97)\n return false;\n var buffer = new ArrayBuffer(8);\n var clone = structuredClone(buffer, { transfer: [buffer] });\n return buffer.byteLength !== 0 || clone.byteLength !== 8;\n});\n\n/***/ }),\n\n/***/ 3663:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_79301__) => {\n\n\nvar V8_VERSION = __nested_webpack_require_79301__(2171);\nvar fails = __nested_webpack_require_79301__(8154);\nvar global = __nested_webpack_require_79301__(9298);\nvar $String = global.String;\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) || !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n\n/***/ }),\n\n/***/ 6985:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_79779__) => {\n\n\nvar toIntegerOrInfinity = __nested_webpack_require_79779__(1003);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n/***/ }),\n\n/***/ 212:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_80126__) => {\n\n\nvar toPrimitive = __nested_webpack_require_80126__(4151);\nvar $TypeError = TypeError;\nmodule.exports = function (argument) {\n var prim = toPrimitive(argument, 'number');\n if (typeof prim == 'number')\n throw new $TypeError(\"Can't convert number to bigint\");\n return BigInt(prim);\n};\n\n/***/ }),\n\n/***/ 9548:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_80490__) => {\n\n\nvar toIntegerOrInfinity = __nested_webpack_require_80490__(1003);\nvar toLength = __nested_webpack_require_80490__(8293);\nvar $RangeError = RangeError;\nmodule.exports = function (it) {\n if (it === undefined)\n return 0;\n var number = toIntegerOrInfinity(it);\n var length = toLength(number);\n if (number !== length)\n throw new $RangeError('Wrong length or index');\n return length;\n};\n\n/***/ }),\n\n/***/ 4115:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_80941__) => {\n\n\nvar IndexedObject = __nested_webpack_require_80941__(3622);\nvar requireObjectCoercible = __nested_webpack_require_80941__(5645);\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n\n/***/ }),\n\n/***/ 1003:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_81225__) => {\n\n\nvar trunc = __nested_webpack_require_81225__(8537);\nmodule.exports = function (argument) {\n var number = +argument;\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n\n/***/ }),\n\n/***/ 8293:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_81488__) => {\n\n\nvar toIntegerOrInfinity = __nested_webpack_require_81488__(1003);\nvar min = Math.min;\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0;\n};\n\n/***/ }),\n\n/***/ 2007:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_81778__) => {\n\n\nvar requireObjectCoercible = __nested_webpack_require_81778__(5645);\nvar $Object = Object;\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n\n/***/ }),\n\n/***/ 9892:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_82043__) => {\n\n\nvar toPositiveInteger = __nested_webpack_require_82043__(9817);\nvar $RangeError = RangeError;\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES)\n throw new $RangeError('Wrong offset');\n return offset;\n};\n\n/***/ }),\n\n/***/ 9817:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_82376__) => {\n\n\nvar toIntegerOrInfinity = __nested_webpack_require_82376__(1003);\nvar $RangeError = RangeError;\nmodule.exports = function (it) {\n var result = toIntegerOrInfinity(it);\n if (result < 0)\n throw new $RangeError(\"The argument can't be less than 0\");\n return result;\n};\n\n/***/ }),\n\n/***/ 4151:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_82723__) => {\n\n\nvar call = __nested_webpack_require_82723__(2026);\nvar isObject = __nested_webpack_require_82723__(7633);\nvar isSymbol = __nested_webpack_require_82723__(7814);\nvar getMethod = __nested_webpack_require_82723__(8486);\nvar ordinaryToPrimitive = __nested_webpack_require_82723__(2923);\nvar wellKnownSymbol = __nested_webpack_require_82723__(2292);\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input))\n return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined)\n pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result))\n return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined)\n pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n\n/***/ }),\n\n/***/ 4871:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_83662__) => {\n\n\nvar toPrimitive = __nested_webpack_require_83662__(4151);\nvar isSymbol = __nested_webpack_require_83662__(7814);\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n\n/***/ }),\n\n/***/ 3077:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_83969__) => {\n\n\nvar wellKnownSymbol = __nested_webpack_require_83969__(2292);\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\ntest[TO_STRING_TAG] = 'z';\nmodule.exports = String(test) === '[object z]';\n\n/***/ }),\n\n/***/ 5730:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_84254__) => {\n\n\nvar classof = __nested_webpack_require_84254__(8329);\nvar $String = String;\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol')\n throw new TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n\n/***/ }),\n\n/***/ 2276:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_84585__) => {\n\n\nvar IS_NODE = __nested_webpack_require_84585__(4864);\nmodule.exports = function (name) {\n try {\n if (IS_NODE)\n return Function('return require(\"' + name + '\")')();\n } catch (error) {\n }\n};\n\n/***/ }),\n\n/***/ 9762:\n/***/ ((module) => {\n\n\nvar $String = String;\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n\n/***/ }),\n\n/***/ 7561:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_85045__) => {\n\n\nvar uncurryThis = __nested_webpack_require_85045__(8403);\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n\n/***/ }),\n\n/***/ 7960:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_85394__) => {\n\n\nvar NATIVE_SYMBOL = __nested_webpack_require_85394__(3663);\nmodule.exports = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == 'symbol';\n\n/***/ }),\n\n/***/ 9610:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_85621__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_85621__(940);\nvar fails = __nested_webpack_require_85621__(8154);\nmodule.exports = DESCRIPTORS && fails(function () {\n return Object.defineProperty(function () {\n }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n\n/***/ }),\n\n/***/ 2743:\n/***/ ((module) => {\n\n\nvar $TypeError = TypeError;\nmodule.exports = function (passed, required) {\n if (passed < required)\n throw new $TypeError('Not enough arguments');\n return passed;\n};\n\n/***/ }),\n\n/***/ 8443:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_86183__) => {\n\n\nvar global = __nested_webpack_require_86183__(9298);\nvar isCallable = __nested_webpack_require_86183__(7316);\nvar WeakMap = global.WeakMap;\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n\n/***/ }),\n\n/***/ 2292:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_86468__) => {\n\n\nvar global = __nested_webpack_require_86468__(9298);\nvar shared = __nested_webpack_require_86468__(6807);\nvar hasOwn = __nested_webpack_require_86468__(936);\nvar uid = __nested_webpack_require_86468__(7561);\nvar NATIVE_SYMBOL = __nested_webpack_require_86468__(3663);\nvar USE_SYMBOL_AS_UID = __nested_webpack_require_86468__(7960);\nvar Symbol = global.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) ? Symbol[name] : createWellKnownSymbol('Symbol.' + name);\n }\n return WellKnownSymbolsStore[name];\n};\n\n/***/ }),\n\n/***/ 7342:\n/***/ ((module, __unused_webpack_exports, __nested_webpack_require_87251__) => {\n\n\nvar getBuiltIn = __nested_webpack_require_87251__(7187);\nvar hasOwn = __nested_webpack_require_87251__(936);\nvar createNonEnumerableProperty = __nested_webpack_require_87251__(9293);\nvar isPrototypeOf = __nested_webpack_require_87251__(2658);\nvar setPrototypeOf = __nested_webpack_require_87251__(9763);\nvar copyConstructorProperties = __nested_webpack_require_87251__(1425);\nvar proxyAccessor = __nested_webpack_require_87251__(6085);\nvar inheritIfRequired = __nested_webpack_require_87251__(7523);\nvar normalizeStringArgument = __nested_webpack_require_87251__(1264);\nvar installErrorCause = __nested_webpack_require_87251__(8422);\nvar installErrorStack = __nested_webpack_require_87251__(1931);\nvar DESCRIPTORS = __nested_webpack_require_87251__(940);\nvar IS_PURE = __nested_webpack_require_87251__(2554);\nmodule.exports = function (FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) {\n var STACK_TRACE_LIMIT = 'stackTraceLimit';\n var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1;\n var path = FULL_NAME.split('.');\n var ERROR_NAME = path[path.length - 1];\n var OriginalError = getBuiltIn.apply(null, path);\n if (!OriginalError)\n return;\n var OriginalErrorPrototype = OriginalError.prototype;\n if (!IS_PURE && hasOwn(OriginalErrorPrototype, 'cause'))\n delete OriginalErrorPrototype.cause;\n if (!FORCED)\n return OriginalError;\n var BaseError = getBuiltIn('Error');\n var WrappedError = wrapper(function (a, b) {\n var message = normalizeStringArgument(IS_AGGREGATE_ERROR ? b : a, undefined);\n var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError();\n if (message !== undefined)\n createNonEnumerableProperty(result, 'message', message);\n installErrorStack(result, WrappedError, result.stack, 2);\n if (this && isPrototypeOf(OriginalErrorPrototype, this))\n inheritIfRequired(result, this, WrappedError);\n if (arguments.length > OPTIONS_POSITION)\n installErrorCause(result, arguments[OPTIONS_POSITION]);\n return result;\n });\n WrappedError.prototype = OriginalErrorPrototype;\n if (ERROR_NAME !== 'Error') {\n if (setPrototypeOf)\n setPrototypeOf(WrappedError, BaseError);\n else\n copyConstructorProperties(WrappedError, BaseError, { name: true });\n } else if (DESCRIPTORS && STACK_TRACE_LIMIT in OriginalError) {\n proxyAccessor(WrappedError, OriginalError, STACK_TRACE_LIMIT);\n proxyAccessor(WrappedError, OriginalError, 'prepareStackTrace');\n }\n copyConstructorProperties(WrappedError, OriginalError);\n if (!IS_PURE)\n try {\n if (OriginalErrorPrototype.name !== ERROR_NAME) {\n createNonEnumerableProperty(OriginalErrorPrototype, 'name', ERROR_NAME);\n }\n OriginalErrorPrototype.constructor = WrappedError;\n } catch (error) {\n }\n return WrappedError;\n};\n\n/***/ }),\n\n/***/ 4226:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_89891__) => {\n\n\nvar $ = __nested_webpack_require_89891__(4978);\nvar toObject = __nested_webpack_require_89891__(2007);\nvar lengthOfArrayLike = __nested_webpack_require_89891__(451);\nvar setArrayLength = __nested_webpack_require_89891__(6661);\nvar doesNotExceedSafeInteger = __nested_webpack_require_89891__(4287);\nvar fails = __nested_webpack_require_89891__(8154);\nvar INCORRECT_TO_LENGTH = fails(function () {\n return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;\n});\nvar properErrorOnNonWritableLength = function () {\n try {\n Object.defineProperty([], 'length', { writable: false }).push();\n } catch (error) {\n return error instanceof TypeError;\n }\n};\nvar FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();\n$({\n target: 'Array',\n proto: true,\n arity: 1,\n forced: FORCED\n}, {\n push: function push(item) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var argCount = arguments.length;\n doesNotExceedSafeInteger(len + argCount);\n for (var i = 0; i < argCount; i++) {\n O[len] = arguments[i];\n len++;\n }\n setArrayLength(O, len);\n return len;\n }\n});\n\n/***/ }),\n\n/***/ 3352:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_91009__) => {\n\n\nvar $ = __nested_webpack_require_91009__(4978);\nvar global = __nested_webpack_require_91009__(9298);\nvar apply = __nested_webpack_require_91009__(7294);\nvar wrapErrorConstructorWithCause = __nested_webpack_require_91009__(7342);\nvar WEB_ASSEMBLY = 'WebAssembly';\nvar WebAssembly = global[WEB_ASSEMBLY];\nvar FORCED = new Error('e', { cause: 7 }).cause !== 7;\nvar exportGlobalErrorCauseWrapper = function (ERROR_NAME, wrapper) {\n var O = {};\n O[ERROR_NAME] = wrapErrorConstructorWithCause(ERROR_NAME, wrapper, FORCED);\n $({\n global: true,\n constructor: true,\n arity: 1,\n forced: FORCED\n }, O);\n};\nvar exportWebAssemblyErrorCauseWrapper = function (ERROR_NAME, wrapper) {\n if (WebAssembly && WebAssembly[ERROR_NAME]) {\n var O = {};\n O[ERROR_NAME] = wrapErrorConstructorWithCause(WEB_ASSEMBLY + '.' + ERROR_NAME, wrapper, FORCED);\n $({\n target: WEB_ASSEMBLY,\n stat: true,\n constructor: true,\n arity: 1,\n forced: FORCED\n }, O);\n }\n};\nexportGlobalErrorCauseWrapper('Error', function (init) {\n return function Error(message) {\n return apply(init, this, arguments);\n };\n});\nexportGlobalErrorCauseWrapper('EvalError', function (init) {\n return function EvalError(message) {\n return apply(init, this, arguments);\n };\n});\nexportGlobalErrorCauseWrapper('RangeError', function (init) {\n return function RangeError(message) {\n return apply(init, this, arguments);\n };\n});\nexportGlobalErrorCauseWrapper('ReferenceError', function (init) {\n return function ReferenceError(message) {\n return apply(init, this, arguments);\n };\n});\nexportGlobalErrorCauseWrapper('SyntaxError', function (init) {\n return function SyntaxError(message) {\n return apply(init, this, arguments);\n };\n});\nexportGlobalErrorCauseWrapper('TypeError', function (init) {\n return function TypeError(message) {\n return apply(init, this, arguments);\n };\n});\nexportGlobalErrorCauseWrapper('URIError', function (init) {\n return function URIError(message) {\n return apply(init, this, arguments);\n };\n});\nexportWebAssemblyErrorCauseWrapper('CompileError', function (init) {\n return function CompileError(message) {\n return apply(init, this, arguments);\n };\n});\nexportWebAssemblyErrorCauseWrapper('LinkError', function (init) {\n return function LinkError(message) {\n return apply(init, this, arguments);\n };\n});\nexportWebAssemblyErrorCauseWrapper('RuntimeError', function (init) {\n return function RuntimeError(message) {\n return apply(init, this, arguments);\n };\n});\n\n/***/ }),\n\n/***/ 9803:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_93508__) => {\n\n\nvar ArrayBufferViewCore = __nested_webpack_require_93508__(5861);\nvar $findLastIndex = (__nested_webpack_require_93508__(4026).findLastIndex);\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nexportTypedArrayMethod('findLastIndex', function findLastIndex(predicate) {\n return $findLastIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n/***/ }),\n\n/***/ 8837:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_94043__) => {\n\n\nvar ArrayBufferViewCore = __nested_webpack_require_94043__(5861);\nvar $findLast = (__nested_webpack_require_94043__(4026).findLast);\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nexportTypedArrayMethod('findLast', function findLast(predicate) {\n return $findLast(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n/***/ }),\n\n/***/ 8347:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_94553__) => {\n\n\nvar global = __nested_webpack_require_94553__(9298);\nvar call = __nested_webpack_require_94553__(2026);\nvar ArrayBufferViewCore = __nested_webpack_require_94553__(5861);\nvar lengthOfArrayLike = __nested_webpack_require_94553__(451);\nvar toOffset = __nested_webpack_require_94553__(9892);\nvar toIndexedObject = __nested_webpack_require_94553__(2007);\nvar fails = __nested_webpack_require_94553__(8154);\nvar RangeError = global.RangeError;\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar $set = Int8ArrayPrototype && Int8ArrayPrototype.set;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS = !fails(function () {\n var array = new Uint8ClampedArray(2);\n call($set, array, {\n length: 1,\n 0: 3\n }, 1);\n return array[1] !== 3;\n});\nvar TO_OBJECT_BUG = WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS && ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS && fails(function () {\n var array = new Int8Array(2);\n array.set(1);\n array.set('2', 1);\n return array[0] !== 0 || array[1] !== 2;\n});\nexportTypedArrayMethod('set', function set(arrayLike) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var src = toIndexedObject(arrayLike);\n if (WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS)\n return call($set, this, src, offset);\n var length = this.length;\n var len = lengthOfArrayLike(src);\n var index = 0;\n if (len + offset > length)\n throw new RangeError('Wrong length');\n while (index < len)\n this[offset + index] = src[index++];\n}, !WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS || TO_OBJECT_BUG);\n\n/***/ }),\n\n/***/ 7995:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_96286__) => {\n\n\nvar arrayToReversed = __nested_webpack_require_96286__(2304);\nvar ArrayBufferViewCore = __nested_webpack_require_96286__(5861);\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor;\nexportTypedArrayMethod('toReversed', function toReversed() {\n return arrayToReversed(aTypedArray(this), getTypedArrayConstructor(this));\n});\n\n/***/ }),\n\n/***/ 62:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_96839__) => {\n\n\nvar ArrayBufferViewCore = __nested_webpack_require_96839__(5861);\nvar uncurryThis = __nested_webpack_require_96839__(8403);\nvar aCallable = __nested_webpack_require_96839__(1782);\nvar arrayFromConstructorAndList = __nested_webpack_require_96839__(7003);\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar sort = uncurryThis(ArrayBufferViewCore.TypedArrayPrototype.sort);\nexportTypedArrayMethod('toSorted', function toSorted(compareFn) {\n if (compareFn !== undefined)\n aCallable(compareFn);\n var O = aTypedArray(this);\n var A = arrayFromConstructorAndList(getTypedArrayConstructor(O), O);\n return sort(A, compareFn);\n});\n\n/***/ }),\n\n/***/ 4602:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_97673__) => {\n\n\nvar arrayWith = __nested_webpack_require_97673__(5886);\nvar ArrayBufferViewCore = __nested_webpack_require_97673__(5861);\nvar isBigIntArray = __nested_webpack_require_97673__(5986);\nvar toIntegerOrInfinity = __nested_webpack_require_97673__(1003);\nvar toBigInt = __nested_webpack_require_97673__(212);\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar PROPER_ORDER = !!(function () {\n try {\n new Int8Array(1)['with'](2, {\n valueOf: function () {\n throw 8;\n }\n });\n } catch (error) {\n return error === 8;\n }\n}());\nexportTypedArrayMethod('with', {\n 'with': function (index, value) {\n var O = aTypedArray(this);\n var relativeIndex = toIntegerOrInfinity(index);\n var actualValue = isBigIntArray(O) ? toBigInt(value) : +value;\n return arrayWith(O, getTypedArrayConstructor(O), relativeIndex, actualValue);\n }\n}['with'], !PROPER_ORDER);\n\n/***/ }),\n\n/***/ 344:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_98718__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_98718__(940);\nvar defineBuiltInAccessor = __nested_webpack_require_98718__(9691);\nvar isDetached = __nested_webpack_require_98718__(582);\nvar ArrayBufferPrototype = ArrayBuffer.prototype;\nif (DESCRIPTORS && !('detached' in ArrayBufferPrototype)) {\n defineBuiltInAccessor(ArrayBufferPrototype, 'detached', {\n configurable: true,\n get: function detached() {\n return isDetached(this);\n }\n });\n}\n\n/***/ }),\n\n/***/ 7583:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_99230__) => {\n\n\nvar $ = __nested_webpack_require_99230__(4978);\nvar $transfer = __nested_webpack_require_99230__(4358);\nif ($transfer)\n $({\n target: 'ArrayBuffer',\n proto: true\n }, {\n transferToFixedLength: function transferToFixedLength() {\n return $transfer(this, arguments.length ? arguments[0] : undefined, false);\n }\n });\n\n/***/ }),\n\n/***/ 4305:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_99632__) => {\n\n\nvar $ = __nested_webpack_require_99632__(4978);\nvar $transfer = __nested_webpack_require_99632__(4358);\nif ($transfer)\n $({\n target: 'ArrayBuffer',\n proto: true\n }, {\n transfer: function transfer() {\n return $transfer(this, arguments.length ? arguments[0] : undefined, true);\n }\n });\n\n/***/ }),\n\n/***/ 7121:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_100007__) => {\n\n\nvar $ = __nested_webpack_require_100007__(4978);\nvar global = __nested_webpack_require_100007__(9298);\nvar anInstance = __nested_webpack_require_100007__(5834);\nvar anObject = __nested_webpack_require_100007__(4719);\nvar isCallable = __nested_webpack_require_100007__(7316);\nvar getPrototypeOf = __nested_webpack_require_100007__(2176);\nvar defineBuiltInAccessor = __nested_webpack_require_100007__(9691);\nvar createProperty = __nested_webpack_require_100007__(8947);\nvar fails = __nested_webpack_require_100007__(8154);\nvar hasOwn = __nested_webpack_require_100007__(936);\nvar wellKnownSymbol = __nested_webpack_require_100007__(2292);\nvar IteratorPrototype = (__nested_webpack_require_100007__(5238).IteratorPrototype);\nvar DESCRIPTORS = __nested_webpack_require_100007__(940);\nvar IS_PURE = __nested_webpack_require_100007__(2554);\nvar CONSTRUCTOR = 'constructor';\nvar ITERATOR = 'Iterator';\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $TypeError = TypeError;\nvar NativeIterator = global[ITERATOR];\nvar FORCED = IS_PURE || !isCallable(NativeIterator) || NativeIterator.prototype !== IteratorPrototype || !fails(function () {\n NativeIterator({});\n});\nvar IteratorConstructor = function Iterator() {\n anInstance(this, IteratorPrototype);\n if (getPrototypeOf(this) === IteratorPrototype)\n throw new $TypeError('Abstract class Iterator not directly constructable');\n};\nvar defineIteratorPrototypeAccessor = function (key, value) {\n if (DESCRIPTORS) {\n defineBuiltInAccessor(IteratorPrototype, key, {\n configurable: true,\n get: function () {\n return value;\n },\n set: function (replacement) {\n anObject(this);\n if (this === IteratorPrototype)\n throw new $TypeError(\"You can't redefine this property\");\n if (hasOwn(this, key))\n this[key] = replacement;\n else\n createProperty(this, key, replacement);\n }\n });\n } else\n IteratorPrototype[key] = value;\n};\nif (!hasOwn(IteratorPrototype, TO_STRING_TAG))\n defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR);\nif (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) {\n defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor);\n}\nIteratorConstructor.prototype = IteratorPrototype;\n$({\n global: true,\n constructor: true,\n forced: FORCED\n}, { Iterator: IteratorConstructor });\n\n/***/ }),\n\n/***/ 385:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_102245__) => {\n\n\nvar $ = __nested_webpack_require_102245__(4978);\nvar iterate = __nested_webpack_require_102245__(6837);\nvar aCallable = __nested_webpack_require_102245__(1782);\nvar anObject = __nested_webpack_require_102245__(4719);\nvar getIteratorDirect = __nested_webpack_require_102245__(9235);\n$({\n target: 'Iterator',\n proto: true,\n real: true\n}, {\n every: function every(predicate) {\n anObject(this);\n aCallable(predicate);\n var record = getIteratorDirect(this);\n var counter = 0;\n return !iterate(record, function (value, stop) {\n if (!predicate(value, counter++))\n return stop();\n }, {\n IS_RECORD: true,\n INTERRUPTED: true\n }).stopped;\n }\n});\n\n/***/ }),\n\n/***/ 2993:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_102937__) => {\n\n\nvar $ = __nested_webpack_require_102937__(4978);\nvar call = __nested_webpack_require_102937__(2026);\nvar aCallable = __nested_webpack_require_102937__(1782);\nvar anObject = __nested_webpack_require_102937__(4719);\nvar getIteratorDirect = __nested_webpack_require_102937__(9235);\nvar createIteratorProxy = __nested_webpack_require_102937__(375);\nvar callWithSafeIterationClosing = __nested_webpack_require_102937__(5723);\nvar IS_PURE = __nested_webpack_require_102937__(2554);\nvar IteratorProxy = createIteratorProxy(function () {\n var iterator = this.iterator;\n var predicate = this.predicate;\n var next = this.next;\n var result, done, value;\n while (true) {\n result = anObject(call(next, iterator));\n done = this.done = !!result.done;\n if (done)\n return;\n value = result.value;\n if (callWithSafeIterationClosing(iterator, predicate, [\n value,\n this.counter++\n ], true))\n return value;\n }\n});\n$({\n target: 'Iterator',\n proto: true,\n real: true,\n forced: IS_PURE\n}, {\n filter: function filter(predicate) {\n anObject(this);\n aCallable(predicate);\n return new IteratorProxy(getIteratorDirect(this), { predicate: predicate });\n }\n});\n\n/***/ }),\n\n/***/ 8497:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_104086__) => {\n\n\nvar $ = __nested_webpack_require_104086__(4978);\nvar call = __nested_webpack_require_104086__(2026);\nvar aCallable = __nested_webpack_require_104086__(1782);\nvar anObject = __nested_webpack_require_104086__(4719);\nvar getIteratorDirect = __nested_webpack_require_104086__(9235);\nvar getIteratorFlattenable = __nested_webpack_require_104086__(907);\nvar createIteratorProxy = __nested_webpack_require_104086__(375);\nvar iteratorClose = __nested_webpack_require_104086__(3316);\nvar IS_PURE = __nested_webpack_require_104086__(2554);\nvar IteratorProxy = createIteratorProxy(function () {\n var iterator = this.iterator;\n var mapper = this.mapper;\n var result, inner;\n while (true) {\n if (inner = this.inner)\n try {\n result = anObject(call(inner.next, inner.iterator));\n if (!result.done)\n return result.value;\n this.inner = null;\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n result = anObject(call(this.next, iterator));\n if (this.done = !!result.done)\n return;\n try {\n this.inner = getIteratorFlattenable(mapper(result.value, this.counter++), false);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n }\n});\n$({\n target: 'Iterator',\n proto: true,\n real: true,\n forced: IS_PURE\n}, {\n flatMap: function flatMap(mapper) {\n anObject(this);\n aCallable(mapper);\n return new IteratorProxy(getIteratorDirect(this), {\n mapper: mapper,\n inner: null\n });\n }\n});\n\n/***/ }),\n\n/***/ 7944:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_105494__) => {\n\n\nvar $ = __nested_webpack_require_105494__(4978);\nvar map = __nested_webpack_require_105494__(8142);\nvar IS_PURE = __nested_webpack_require_105494__(2554);\n$({\n target: 'Iterator',\n proto: true,\n real: true,\n forced: IS_PURE\n}, { map: map });\n\n/***/ }),\n\n/***/ 8518:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_105805__) => {\n\n\nvar $ = __nested_webpack_require_105805__(4978);\nvar iterate = __nested_webpack_require_105805__(6837);\nvar aCallable = __nested_webpack_require_105805__(1782);\nvar anObject = __nested_webpack_require_105805__(4719);\nvar getIteratorDirect = __nested_webpack_require_105805__(9235);\n$({\n target: 'Iterator',\n proto: true,\n real: true\n}, {\n some: function some(predicate) {\n anObject(this);\n aCallable(predicate);\n var record = getIteratorDirect(this);\n var counter = 0;\n return iterate(record, function (value, stop) {\n if (predicate(value, counter++))\n return stop();\n }, {\n IS_RECORD: true,\n INTERRUPTED: true\n }).stopped;\n }\n});\n\n/***/ }),\n\n/***/ 2808:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_106493__) => {\n\n\nvar $ = __nested_webpack_require_106493__(4978);\nvar DESCRIPTORS = __nested_webpack_require_106493__(940);\nvar global = __nested_webpack_require_106493__(9298);\nvar getBuiltIn = __nested_webpack_require_106493__(7187);\nvar uncurryThis = __nested_webpack_require_106493__(8403);\nvar call = __nested_webpack_require_106493__(2026);\nvar isCallable = __nested_webpack_require_106493__(7316);\nvar isObject = __nested_webpack_require_106493__(7633);\nvar isArray = __nested_webpack_require_106493__(6998);\nvar hasOwn = __nested_webpack_require_106493__(936);\nvar toString = __nested_webpack_require_106493__(5730);\nvar lengthOfArrayLike = __nested_webpack_require_106493__(451);\nvar createProperty = __nested_webpack_require_106493__(8947);\nvar fails = __nested_webpack_require_106493__(8154);\nvar parseJSONString = __nested_webpack_require_106493__(3713);\nvar NATIVE_SYMBOL = __nested_webpack_require_106493__(3663);\nvar JSON = global.JSON;\nvar Number = global.Number;\nvar SyntaxError = global.SyntaxError;\nvar nativeParse = JSON && JSON.parse;\nvar enumerableOwnProperties = getBuiltIn('Object', 'keys');\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar at = uncurryThis(''.charAt);\nvar slice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\nvar push = uncurryThis([].push);\nvar IS_DIGIT = /^\\d$/;\nvar IS_NON_ZERO_DIGIT = /^[1-9]$/;\nvar IS_NUMBER_START = /^(?:-|\\d)$/;\nvar IS_WHITESPACE = /^[\\t\\n\\r ]$/;\nvar PRIMITIVE = 0;\nvar OBJECT = 1;\nvar $parse = function (source, reviver) {\n source = toString(source);\n var context = new Context(source, 0, '');\n var root = context.parse();\n var value = root.value;\n var endIndex = context.skip(IS_WHITESPACE, root.end);\n if (endIndex < source.length) {\n throw new SyntaxError('Unexpected extra character: \"' + at(source, endIndex) + '\" after the parsed data at: ' + endIndex);\n }\n return isCallable(reviver) ? internalize({ '': value }, '', reviver, root) : value;\n};\nvar internalize = function (holder, name, reviver, node) {\n var val = holder[name];\n var unmodified = node && val === node.value;\n var context = unmodified && typeof node.source == 'string' ? { source: node.source } : {};\n var elementRecordsLen, keys, len, i, P;\n if (isObject(val)) {\n var nodeIsArray = isArray(val);\n var nodes = unmodified ? node.nodes : nodeIsArray ? [] : {};\n if (nodeIsArray) {\n elementRecordsLen = nodes.length;\n len = lengthOfArrayLike(val);\n for (i = 0; i < len; i++) {\n internalizeProperty(val, i, internalize(val, '' + i, reviver, i < elementRecordsLen ? nodes[i] : undefined));\n }\n } else {\n keys = enumerableOwnProperties(val);\n len = lengthOfArrayLike(keys);\n for (i = 0; i < len; i++) {\n P = keys[i];\n internalizeProperty(val, P, internalize(val, P, reviver, hasOwn(nodes, P) ? nodes[P] : undefined));\n }\n }\n }\n return call(reviver, holder, name, val, context);\n};\nvar internalizeProperty = function (object, key, value) {\n if (DESCRIPTORS) {\n var descriptor = getOwnPropertyDescriptor(object, key);\n if (descriptor && !descriptor.configurable)\n return;\n }\n if (value === undefined)\n delete object[key];\n else\n createProperty(object, key, value);\n};\nvar Node = function (value, end, source, nodes) {\n this.value = value;\n this.end = end;\n this.source = source;\n this.nodes = nodes;\n};\nvar Context = function (source, index) {\n this.source = source;\n this.index = index;\n};\nContext.prototype = {\n fork: function (nextIndex) {\n return new Context(this.source, nextIndex);\n },\n parse: function () {\n var source = this.source;\n var i = this.skip(IS_WHITESPACE, this.index);\n var fork = this.fork(i);\n var chr = at(source, i);\n if (exec(IS_NUMBER_START, chr))\n return fork.number();\n switch (chr) {\n case '{':\n return fork.object();\n case '[':\n return fork.array();\n case '\"':\n return fork.string();\n case 't':\n return fork.keyword(true);\n case 'f':\n return fork.keyword(false);\n case 'n':\n return fork.keyword(null);\n }\n throw new SyntaxError('Unexpected character: \"' + chr + '\" at: ' + i);\n },\n node: function (type, value, start, end, nodes) {\n return new Node(value, end, type ? null : slice(this.source, start, end), nodes);\n },\n object: function () {\n var source = this.source;\n var i = this.index + 1;\n var expectKeypair = false;\n var object = {};\n var nodes = {};\n while (i < source.length) {\n i = this.until([\n '\"',\n '}'\n ], i);\n if (at(source, i) === '}' && !expectKeypair) {\n i++;\n break;\n }\n var result = this.fork(i).string();\n var key = result.value;\n i = result.end;\n i = this.until([':'], i) + 1;\n i = this.skip(IS_WHITESPACE, i);\n result = this.fork(i).parse();\n createProperty(nodes, key, result);\n createProperty(object, key, result.value);\n i = this.until([\n ',',\n '}'\n ], result.end);\n var chr = at(source, i);\n if (chr === ',') {\n expectKeypair = true;\n i++;\n } else if (chr === '}') {\n i++;\n break;\n }\n }\n return this.node(OBJECT, object, this.index, i, nodes);\n },\n array: function () {\n var source = this.source;\n var i = this.index + 1;\n var expectElement = false;\n var array = [];\n var nodes = [];\n while (i < source.length) {\n i = this.skip(IS_WHITESPACE, i);\n if (at(source, i) === ']' && !expectElement) {\n i++;\n break;\n }\n var result = this.fork(i).parse();\n push(nodes, result);\n push(array, result.value);\n i = this.until([\n ',',\n ']'\n ], result.end);\n if (at(source, i) === ',') {\n expectElement = true;\n i++;\n } else if (at(source, i) === ']') {\n i++;\n break;\n }\n }\n return this.node(OBJECT, array, this.index, i, nodes);\n },\n string: function () {\n var index = this.index;\n var parsed = parseJSONString(this.source, this.index + 1);\n return this.node(PRIMITIVE, parsed.value, index, parsed.end);\n },\n number: function () {\n var source = this.source;\n var startIndex = this.index;\n var i = startIndex;\n if (at(source, i) === '-')\n i++;\n if (at(source, i) === '0')\n i++;\n else if (exec(IS_NON_ZERO_DIGIT, at(source, i)))\n i = this.skip(IS_DIGIT, ++i);\n else\n throw new SyntaxError('Failed to parse number at: ' + i);\n if (at(source, i) === '.')\n i = this.skip(IS_DIGIT, ++i);\n if (at(source, i) === 'e' || at(source, i) === 'E') {\n i++;\n if (at(source, i) === '+' || at(source, i) === '-')\n i++;\n var exponentStartIndex = i;\n i = this.skip(IS_DIGIT, i);\n if (exponentStartIndex === i)\n throw new SyntaxError(\"Failed to parse number's exponent value at: \" + i);\n }\n return this.node(PRIMITIVE, Number(slice(source, startIndex, i)), startIndex, i);\n },\n keyword: function (value) {\n var keyword = '' + value;\n var index = this.index;\n var endIndex = index + keyword.length;\n if (slice(this.source, index, endIndex) !== keyword)\n throw new SyntaxError('Failed to parse value at: ' + index);\n return this.node(PRIMITIVE, value, index, endIndex);\n },\n skip: function (regex, i) {\n var source = this.source;\n for (; i < source.length; i++)\n if (!exec(regex, at(source, i)))\n break;\n return i;\n },\n until: function (array, i) {\n i = this.skip(IS_WHITESPACE, i);\n var chr = at(this.source, i);\n for (var j = 0; j < array.length; j++)\n if (array[j] === chr)\n return i;\n throw new SyntaxError('Unexpected character: \"' + chr + '\" at: ' + i);\n }\n};\nvar NO_SOURCE_SUPPORT = fails(function () {\n var unsafeInt = '9007199254740993';\n var source;\n nativeParse(unsafeInt, function (key, value, context) {\n source = context.source;\n });\n return source !== unsafeInt;\n});\nvar PROPER_BASE_PARSE = NATIVE_SYMBOL && !fails(function () {\n return 1 / nativeParse('-0 \\t') !== -Infinity;\n});\n$({\n target: 'JSON',\n stat: true,\n forced: NO_SOURCE_SUPPORT\n}, {\n parse: function parse(text, reviver) {\n return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(text) : $parse(text, reviver);\n }\n});\n\n/***/ }),\n\n/***/ 5561:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_114210__) => {\n\n\nvar $ = __nested_webpack_require_114210__(4978);\nvar difference = __nested_webpack_require_114210__(5656);\nvar setMethodAcceptSetLike = __nested_webpack_require_114210__(507);\n$({\n target: 'Set',\n proto: true,\n real: true,\n forced: !setMethodAcceptSetLike('difference')\n}, { difference: difference });\n\n/***/ }),\n\n/***/ 8587:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_114581__) => {\n\n\nvar $ = __nested_webpack_require_114581__(4978);\nvar fails = __nested_webpack_require_114581__(8154);\nvar intersection = __nested_webpack_require_114581__(8461);\nvar setMethodAcceptSetLike = __nested_webpack_require_114581__(507);\nvar INCORRECT = !setMethodAcceptSetLike('intersection') || fails(function () {\n return Array.from(new Set([\n 1,\n 2,\n 3\n ]).intersection(new Set([\n 3,\n 2\n ]))) !== '3,2';\n});\n$({\n target: 'Set',\n proto: true,\n real: true,\n forced: INCORRECT\n}, { intersection: intersection });\n\n/***/ }),\n\n/***/ 3247:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_115148__) => {\n\n\nvar $ = __nested_webpack_require_115148__(4978);\nvar isDisjointFrom = __nested_webpack_require_115148__(8550);\nvar setMethodAcceptSetLike = __nested_webpack_require_115148__(507);\n$({\n target: 'Set',\n proto: true,\n real: true,\n forced: !setMethodAcceptSetLike('isDisjointFrom')\n}, { isDisjointFrom: isDisjointFrom });\n\n/***/ }),\n\n/***/ 3302:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_115535__) => {\n\n\nvar $ = __nested_webpack_require_115535__(4978);\nvar isSubsetOf = __nested_webpack_require_115535__(990);\nvar setMethodAcceptSetLike = __nested_webpack_require_115535__(507);\n$({\n target: 'Set',\n proto: true,\n real: true,\n forced: !setMethodAcceptSetLike('isSubsetOf')\n}, { isSubsetOf: isSubsetOf });\n\n/***/ }),\n\n/***/ 9490:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_115905__) => {\n\n\nvar $ = __nested_webpack_require_115905__(4978);\nvar isSupersetOf = __nested_webpack_require_115905__(194);\nvar setMethodAcceptSetLike = __nested_webpack_require_115905__(507);\n$({\n target: 'Set',\n proto: true,\n real: true,\n forced: !setMethodAcceptSetLike('isSupersetOf')\n}, { isSupersetOf: isSupersetOf });\n\n/***/ }),\n\n/***/ 5438:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_116283__) => {\n\n\nvar $ = __nested_webpack_require_116283__(4978);\nvar symmetricDifference = __nested_webpack_require_116283__(3194);\nvar setMethodAcceptSetLike = __nested_webpack_require_116283__(507);\n$({\n target: 'Set',\n proto: true,\n real: true,\n forced: !setMethodAcceptSetLike('symmetricDifference')\n}, { symmetricDifference: symmetricDifference });\n\n/***/ }),\n\n/***/ 7914:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_116690__) => {\n\n\nvar $ = __nested_webpack_require_116690__(4978);\nvar union = __nested_webpack_require_116690__(5703);\nvar setMethodAcceptSetLike = __nested_webpack_require_116690__(507);\n$({\n target: 'Set',\n proto: true,\n real: true,\n forced: !setMethodAcceptSetLike('union')\n}, { union: union });\n\n/***/ }),\n\n/***/ 9709:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_117041__) => {\n\n\nvar $ = __nested_webpack_require_117041__(4978);\nvar global = __nested_webpack_require_117041__(9298);\nvar getBuiltIn = __nested_webpack_require_117041__(7187);\nvar createPropertyDescriptor = __nested_webpack_require_117041__(1198);\nvar defineProperty = (__nested_webpack_require_117041__(7744).f);\nvar hasOwn = __nested_webpack_require_117041__(936);\nvar anInstance = __nested_webpack_require_117041__(5834);\nvar inheritIfRequired = __nested_webpack_require_117041__(7523);\nvar normalizeStringArgument = __nested_webpack_require_117041__(1264);\nvar DOMExceptionConstants = __nested_webpack_require_117041__(5050);\nvar clearErrorStack = __nested_webpack_require_117041__(34);\nvar DESCRIPTORS = __nested_webpack_require_117041__(940);\nvar IS_PURE = __nested_webpack_require_117041__(2554);\nvar DOM_EXCEPTION = 'DOMException';\nvar Error = getBuiltIn('Error');\nvar NativeDOMException = getBuiltIn(DOM_EXCEPTION);\nvar $DOMException = function DOMException() {\n anInstance(this, DOMExceptionPrototype);\n var argumentsLength = arguments.length;\n var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]);\n var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error');\n var that = new NativeDOMException(message, name);\n var error = new Error(message);\n error.name = DOM_EXCEPTION;\n defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1)));\n inheritIfRequired(that, this, $DOMException);\n return that;\n};\nvar DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype;\nvar ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION);\nvar DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2);\nvar descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(global, DOM_EXCEPTION);\nvar BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable);\nvar FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK;\n$({\n global: true,\n constructor: true,\n forced: IS_PURE || FORCED_CONSTRUCTOR\n}, { DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException });\nvar PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION);\nvar PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype;\nif (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) {\n if (!IS_PURE) {\n defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException));\n }\n for (var key in DOMExceptionConstants)\n if (hasOwn(DOMExceptionConstants, key)) {\n var constant = DOMExceptionConstants[key];\n var constantName = constant.s;\n if (!hasOwn(PolyfilledDOMException, constantName)) {\n defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c));\n }\n }\n}\n\n/***/ }),\n\n/***/ 3655:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_119799__) => {\n\n\nvar defineBuiltIn = __nested_webpack_require_119799__(7041);\nvar uncurryThis = __nested_webpack_require_119799__(8403);\nvar toString = __nested_webpack_require_119799__(5730);\nvar validateArgumentsLength = __nested_webpack_require_119799__(2743);\nvar $URLSearchParams = URLSearchParams;\nvar URLSearchParamsPrototype = $URLSearchParams.prototype;\nvar append = uncurryThis(URLSearchParamsPrototype.append);\nvar $delete = uncurryThis(URLSearchParamsPrototype['delete']);\nvar forEach = uncurryThis(URLSearchParamsPrototype.forEach);\nvar push = uncurryThis([].push);\nvar params = new $URLSearchParams('a=1&a=2&b=3');\nparams['delete']('a', 1);\nparams['delete']('b', undefined);\nif (params + '' !== 'a=2') {\n defineBuiltIn(URLSearchParamsPrototype, 'delete', function (name) {\n var length = arguments.length;\n var $value = length < 2 ? undefined : arguments[1];\n if (length && $value === undefined)\n return $delete(this, name);\n var entries = [];\n forEach(this, function (v, k) {\n push(entries, {\n key: k,\n value: v\n });\n });\n validateArgumentsLength(length, 1);\n var key = toString(name);\n var value = toString($value);\n var index = 0;\n var dindex = 0;\n var found = false;\n var entriesLength = entries.length;\n var entry;\n while (index < entriesLength) {\n entry = entries[index++];\n if (found || entry.key === key) {\n found = true;\n $delete(this, entry.key);\n } else\n dindex++;\n }\n while (dindex < entriesLength) {\n entry = entries[dindex++];\n if (!(entry.key === key && entry.value === value))\n append(this, entry.key, entry.value);\n }\n }, {\n enumerable: true,\n unsafe: true\n });\n}\n\n/***/ }),\n\n/***/ 2555:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_121485__) => {\n\n\nvar defineBuiltIn = __nested_webpack_require_121485__(7041);\nvar uncurryThis = __nested_webpack_require_121485__(8403);\nvar toString = __nested_webpack_require_121485__(5730);\nvar validateArgumentsLength = __nested_webpack_require_121485__(2743);\nvar $URLSearchParams = URLSearchParams;\nvar URLSearchParamsPrototype = $URLSearchParams.prototype;\nvar getAll = uncurryThis(URLSearchParamsPrototype.getAll);\nvar $has = uncurryThis(URLSearchParamsPrototype.has);\nvar params = new $URLSearchParams('a=1');\nif (params.has('a', 2) || !params.has('a', undefined)) {\n defineBuiltIn(URLSearchParamsPrototype, 'has', function has(name) {\n var length = arguments.length;\n var $value = length < 2 ? undefined : arguments[1];\n if (length && $value === undefined)\n return $has(this, name);\n var values = getAll(this, name);\n validateArgumentsLength(length, 1);\n var value = toString($value);\n var index = 0;\n while (index < values.length) {\n if (values[index++] === value)\n return true;\n }\n return false;\n }, {\n enumerable: true,\n unsafe: true\n });\n}\n\n/***/ }),\n\n/***/ 2202:\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_122595__) => {\n\n\nvar DESCRIPTORS = __nested_webpack_require_122595__(940);\nvar uncurryThis = __nested_webpack_require_122595__(8403);\nvar defineBuiltInAccessor = __nested_webpack_require_122595__(9691);\nvar URLSearchParamsPrototype = URLSearchParams.prototype;\nvar forEach = uncurryThis(URLSearchParamsPrototype.forEach);\nif (DESCRIPTORS && !('size' in URLSearchParamsPrototype)) {\n defineBuiltInAccessor(URLSearchParamsPrototype, 'size', {\n get: function size() {\n var count = 0;\n forEach(this, function () {\n count++;\n });\n return count;\n },\n configurable: true,\n enumerable: true\n });\n}\n\n/***/ }),\n\n/***/ 7640:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_123259__) => {\n\n\n// EXPORTS\n__nested_webpack_require_123259__.d(__nested_webpack_exports__, {\n AnnotationLayer: () => (/* binding */ AnnotationLayer),\n FreeTextAnnotationElement: () => (/* binding */ FreeTextAnnotationElement),\n InkAnnotationElement: () => (/* binding */ InkAnnotationElement),\n StampAnnotationElement: () => (/* binding */ StampAnnotationElement)\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push = __nested_webpack_require_123259__(4226);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.difference.v2.js\nvar esnext_set_difference_v2 = __nested_webpack_require_123259__(5561);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.intersection.v2.js\nvar esnext_set_intersection_v2 = __nested_webpack_require_123259__(8587);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-disjoint-from.v2.js\nvar esnext_set_is_disjoint_from_v2 = __nested_webpack_require_123259__(3247);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-subset-of.v2.js\nvar esnext_set_is_subset_of_v2 = __nested_webpack_require_123259__(3302);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-superset-of.v2.js\nvar esnext_set_is_superset_of_v2 = __nested_webpack_require_123259__(9490);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.symmetric-difference.v2.js\nvar esnext_set_symmetric_difference_v2 = __nested_webpack_require_123259__(5438);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.union.v2.js\nvar esnext_set_union_v2 = __nested_webpack_require_123259__(7914);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.map.js\nvar esnext_iterator_map = __nested_webpack_require_123259__(7944);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js\nvar esnext_iterator_constructor = __nested_webpack_require_123259__(7121);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.flat-map.js\nvar esnext_iterator_flat_map = __nested_webpack_require_123259__(8497);\n// EXTERNAL MODULE: ./src/shared/util.js\nvar util = __nested_webpack_require_123259__(3266);\n// EXTERNAL MODULE: ./src/display/display_utils.js\nvar display_utils = __nested_webpack_require_123259__(473);\n// EXTERNAL MODULE: ./src/display/annotation_storage.js\nvar annotation_storage = __nested_webpack_require_123259__(4780);\n;// CONCATENATED MODULE: ./src/shared/scripting_utils.js\n\nfunction makeColorComp(n) {\n return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, \"0\");\n}\nfunction scaleAndClamp(x) {\n return Math.max(0, Math.min(255, 255 * x));\n}\nclass ColorConverters {\n static CMYK_G(_ref) {\n let [c, y, m, k] = _ref;\n return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n }\n static G_CMYK(_ref2) {\n let [g] = _ref2;\n return [\"CMYK\", 0, 0, 0, 1 - g];\n }\n static G_RGB(_ref3) {\n let [g] = _ref3;\n return [\"RGB\", g, g, g];\n }\n static G_rgb(_ref4) {\n let [g] = _ref4;\n g = scaleAndClamp(g);\n return [g, g, g];\n }\n static G_HTML(_ref5) {\n let [g] = _ref5;\n const G = makeColorComp(g);\n return `#${G}${G}${G}`;\n }\n static RGB_G(_ref6) {\n let [r, g, b] = _ref6;\n return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n }\n static RGB_rgb(color) {\n return color.map(scaleAndClamp);\n }\n static RGB_HTML(color) {\n return `#${color.map(makeColorComp).join(\"\")}`;\n }\n static T_HTML() {\n return \"#00000000\";\n }\n static T_rgb() {\n return [null];\n }\n static CMYK_RGB(_ref7) {\n let [c, y, m, k] = _ref7;\n return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n }\n static CMYK_rgb(_ref8) {\n let [c, y, m, k] = _ref8;\n return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];\n }\n static CMYK_HTML(components) {\n const rgb = this.CMYK_RGB(components).slice(1);\n return this.RGB_HTML(rgb);\n }\n static RGB_CMYK(_ref9) {\n let [r, g, b] = _ref9;\n const c = 1 - r;\n const m = 1 - g;\n const y = 1 - b;\n const k = Math.min(c, m, y);\n return [\"CMYK\", c, m, y, k];\n }\n}\n\n// EXTERNAL MODULE: ./src/display/xfa_layer.js\nvar xfa_layer = __nested_webpack_require_123259__(8266);\n;// CONCATENATED MODULE: ./src/display/annotation_layer.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst DEFAULT_TAB_INDEX = 1000;\nconst DEFAULT_FONT_SIZE = 9;\nconst GetElementsByNameSet = new WeakSet();\nfunction getRectDims(rect) {\n return {\n width: rect[2] - rect[0],\n height: rect[3] - rect[1]\n };\n}\nclass AnnotationElementFactory {\n static create(parameters) {\n const subtype = parameters.data.annotationType;\n switch (subtype) {\n case util.AnnotationType.LINK:\n return new LinkAnnotationElement(parameters);\n case util.AnnotationType.TEXT:\n return new TextAnnotationElement(parameters);\n case util.AnnotationType.WIDGET:\n const fieldType = parameters.data.fieldType;\n switch (fieldType) {\n case \"Tx\":\n return new TextWidgetAnnotationElement(parameters);\n case \"Btn\":\n if (parameters.data.radioButton) {\n return new RadioButtonWidgetAnnotationElement(parameters);\n } else if (parameters.data.checkBox) {\n return new CheckboxWidgetAnnotationElement(parameters);\n }\n return new PushButtonWidgetAnnotationElement(parameters);\n case \"Ch\":\n return new ChoiceWidgetAnnotationElement(parameters);\n case \"Sig\":\n return new SignatureWidgetAnnotationElement(parameters);\n }\n return new WidgetAnnotationElement(parameters);\n case util.AnnotationType.POPUP:\n return new PopupAnnotationElement(parameters);\n case util.AnnotationType.FREETEXT:\n return new FreeTextAnnotationElement(parameters);\n case util.AnnotationType.LINE:\n return new LineAnnotationElement(parameters);\n case util.AnnotationType.SQUARE:\n return new SquareAnnotationElement(parameters);\n case util.AnnotationType.CIRCLE:\n return new CircleAnnotationElement(parameters);\n case util.AnnotationType.POLYLINE:\n return new PolylineAnnotationElement(parameters);\n case util.AnnotationType.CARET:\n return new CaretAnnotationElement(parameters);\n case util.AnnotationType.INK:\n return new InkAnnotationElement(parameters);\n case util.AnnotationType.POLYGON:\n return new PolygonAnnotationElement(parameters);\n case util.AnnotationType.HIGHLIGHT:\n return new HighlightAnnotationElement(parameters);\n case util.AnnotationType.UNDERLINE:\n return new UnderlineAnnotationElement(parameters);\n case util.AnnotationType.SQUIGGLY:\n return new SquigglyAnnotationElement(parameters);\n case util.AnnotationType.STRIKEOUT:\n return new StrikeOutAnnotationElement(parameters);\n case util.AnnotationType.STAMP:\n return new StampAnnotationElement(parameters);\n case util.AnnotationType.FILEATTACHMENT:\n return new FileAttachmentAnnotationElement(parameters);\n default:\n return new AnnotationElement(parameters);\n }\n }\n}\nclass AnnotationElement {\n #hasBorder = false;\n constructor(parameters) {\n let {\n isRenderable = false,\n ignoreBorder = false,\n createQuadrilaterals = false\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.isRenderable = isRenderable;\n this.data = parameters.data;\n this.layer = parameters.layer;\n this.linkService = parameters.linkService;\n this.downloadManager = parameters.downloadManager;\n this.imageResourcesPath = parameters.imageResourcesPath;\n this.renderForms = parameters.renderForms;\n this.svgFactory = parameters.svgFactory;\n this.annotationStorage = parameters.annotationStorage;\n this.enableScripting = parameters.enableScripting;\n this.hasJSActions = parameters.hasJSActions;\n this._fieldObjects = parameters.fieldObjects;\n this.parent = parameters.parent;\n if (isRenderable) {\n this.container = this._createContainer(ignoreBorder);\n }\n if (createQuadrilaterals) {\n this._createQuadrilaterals();\n }\n }\n static _hasPopupData(_ref) {\n let {\n titleObj,\n contentsObj,\n richText\n } = _ref;\n return !!(titleObj?.str || contentsObj?.str || richText?.str);\n }\n get hasPopupData() {\n return AnnotationElement._hasPopupData(this.data);\n }\n _createContainer(ignoreBorder) {\n const {\n data,\n parent: {\n page,\n viewport\n }\n } = this;\n const container = document.createElement(\"section\");\n container.setAttribute(\"data-annotation-id\", data.id);\n if (!(this instanceof WidgetAnnotationElement)) {\n container.tabIndex = DEFAULT_TAB_INDEX;\n }\n container.style.zIndex = this.parent.zIndex++;\n if (this.data.popupRef) {\n container.setAttribute(\"aria-haspopup\", \"dialog\");\n }\n if (data.noRotate) {\n container.classList.add(\"norotate\");\n }\n const {\n pageWidth,\n pageHeight,\n pageX,\n pageY\n } = viewport.rawDims;\n if (!data.rect || this instanceof PopupAnnotationElement) {\n const {\n rotation\n } = data;\n if (!data.hasOwnCanvas && rotation !== 0) {\n this.setRotation(rotation, container);\n }\n return container;\n }\n const {\n width,\n height\n } = getRectDims(data.rect);\n const rect = util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);\n if (!ignoreBorder && data.borderStyle.width > 0) {\n container.style.borderWidth = `${data.borderStyle.width}px`;\n const horizontalRadius = data.borderStyle.horizontalCornerRadius;\n const verticalRadius = data.borderStyle.verticalCornerRadius;\n if (horizontalRadius > 0 || verticalRadius > 0) {\n const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`;\n container.style.borderRadius = radius;\n } else if (this instanceof RadioButtonWidgetAnnotationElement) {\n const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`;\n container.style.borderRadius = radius;\n }\n switch (data.borderStyle.style) {\n case util.AnnotationBorderStyleType.SOLID:\n container.style.borderStyle = \"solid\";\n break;\n case util.AnnotationBorderStyleType.DASHED:\n container.style.borderStyle = \"dashed\";\n break;\n case util.AnnotationBorderStyleType.BEVELED:\n (0,util.warn)(\"Unimplemented border style: beveled\");\n break;\n case util.AnnotationBorderStyleType.INSET:\n (0,util.warn)(\"Unimplemented border style: inset\");\n break;\n case util.AnnotationBorderStyleType.UNDERLINE:\n container.style.borderBottomStyle = \"solid\";\n break;\n default:\n break;\n }\n const borderColor = data.borderColor || null;\n if (borderColor) {\n this.#hasBorder = true;\n container.style.borderColor = util.Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0);\n } else {\n container.style.borderWidth = 0;\n }\n }\n container.style.left = `${100 * (rect[0] - pageX) / pageWidth}%`;\n container.style.top = `${100 * (rect[1] - pageY) / pageHeight}%`;\n const {\n rotation\n } = data;\n if (data.hasOwnCanvas || rotation === 0) {\n container.style.width = `${100 * width / pageWidth}%`;\n container.style.height = `${100 * height / pageHeight}%`;\n } else {\n this.setRotation(rotation, container);\n }\n return container;\n }\n setRotation(angle) {\n let container = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.container;\n if (!this.data.rect) {\n return;\n }\n const {\n pageWidth,\n pageHeight\n } = this.parent.viewport.rawDims;\n const {\n width,\n height\n } = getRectDims(this.data.rect);\n let elementWidth, elementHeight;\n if (angle % 180 === 0) {\n elementWidth = 100 * width / pageWidth;\n elementHeight = 100 * height / pageHeight;\n } else {\n elementWidth = 100 * height / pageWidth;\n elementHeight = 100 * width / pageHeight;\n }\n container.style.width = `${elementWidth}%`;\n container.style.height = `${elementHeight}%`;\n container.setAttribute(\"data-main-rotation\", (360 - angle) % 360);\n }\n get _commonActions() {\n const setColor = (jsName, styleName, event) => {\n const color = event.detail[jsName];\n const colorType = color[0];\n const colorArray = color.slice(1);\n event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray);\n this.annotationStorage.setValue(this.data.id, {\n [styleName]: ColorConverters[`${colorType}_rgb`](colorArray)\n });\n };\n return (0,util.shadow)(this, \"_commonActions\", {\n display: event => {\n const {\n display\n } = event.detail;\n const hidden = display % 2 === 1;\n this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n this.annotationStorage.setValue(this.data.id, {\n noView: hidden,\n noPrint: display === 1 || display === 2\n });\n },\n print: event => {\n this.annotationStorage.setValue(this.data.id, {\n noPrint: !event.detail.print\n });\n },\n hidden: event => {\n const {\n hidden\n } = event.detail;\n this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n this.annotationStorage.setValue(this.data.id, {\n noPrint: hidden,\n noView: hidden\n });\n },\n focus: event => {\n setTimeout(() => event.target.focus({\n preventScroll: false\n }), 0);\n },\n userName: event => {\n event.target.title = event.detail.userName;\n },\n readonly: event => {\n event.target.disabled = event.detail.readonly;\n },\n required: event => {\n this._setRequired(event.target, event.detail.required);\n },\n bgColor: event => {\n setColor(\"bgColor\", \"backgroundColor\", event);\n },\n fillColor: event => {\n setColor(\"fillColor\", \"backgroundColor\", event);\n },\n fgColor: event => {\n setColor(\"fgColor\", \"color\", event);\n },\n textColor: event => {\n setColor(\"textColor\", \"color\", event);\n },\n borderColor: event => {\n setColor(\"borderColor\", \"borderColor\", event);\n },\n strokeColor: event => {\n setColor(\"strokeColor\", \"borderColor\", event);\n },\n rotation: event => {\n const angle = event.detail.rotation;\n this.setRotation(angle);\n this.annotationStorage.setValue(this.data.id, {\n rotation: angle\n });\n }\n });\n }\n _dispatchEventFromSandbox(actions, jsEvent) {\n const commonActions = this._commonActions;\n for (const name of Object.keys(jsEvent.detail)) {\n const action = actions[name] || commonActions[name];\n action?.(jsEvent);\n }\n }\n _setDefaultPropertiesFromJS(element) {\n if (!this.enableScripting) {\n return;\n }\n const storedData = this.annotationStorage.getRawValue(this.data.id);\n if (!storedData) {\n return;\n }\n const commonActions = this._commonActions;\n for (const [actionName, detail] of Object.entries(storedData)) {\n const action = commonActions[actionName];\n if (action) {\n const eventProxy = {\n detail: {\n [actionName]: detail\n },\n target: element\n };\n action(eventProxy);\n delete storedData[actionName];\n }\n }\n }\n _createQuadrilaterals() {\n if (!this.container) {\n return;\n }\n const {\n quadPoints\n } = this.data;\n if (!quadPoints) {\n return;\n }\n const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect;\n if (quadPoints.length === 1) {\n const [, {\n x: trX,\n y: trY\n }, {\n x: blX,\n y: blY\n }] = quadPoints[0];\n if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) {\n return;\n }\n }\n const {\n style\n } = this.container;\n let svgBuffer;\n if (this.#hasBorder) {\n const {\n borderColor,\n borderWidth\n } = style;\n style.borderWidth = 0;\n svgBuffer = [\"url('data:image/svg+xml;utf8,\", ``, ``];\n this.container.classList.add(\"hasBorder\");\n }\n const width = rectTrX - rectBlX;\n const height = rectTrY - rectBlY;\n const {\n svgFactory\n } = this;\n const svg = svgFactory.createElement(\"svg\");\n svg.classList.add(\"quadrilateralsContainer\");\n svg.setAttribute(\"width\", 0);\n svg.setAttribute(\"height\", 0);\n const defs = svgFactory.createElement(\"defs\");\n svg.append(defs);\n const clipPath = svgFactory.createElement(\"clipPath\");\n const id = `clippath_${this.data.id}`;\n clipPath.setAttribute(\"id\", id);\n clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n defs.append(clipPath);\n for (const [, {\n x: trX,\n y: trY\n }, {\n x: blX,\n y: blY\n }] of quadPoints) {\n const rect = svgFactory.createElement(\"rect\");\n const x = (blX - rectBlX) / width;\n const y = (rectTrY - trY) / height;\n const rectWidth = (trX - blX) / width;\n const rectHeight = (trY - blY) / height;\n rect.setAttribute(\"x\", x);\n rect.setAttribute(\"y\", y);\n rect.setAttribute(\"width\", rectWidth);\n rect.setAttribute(\"height\", rectHeight);\n clipPath.append(rect);\n svgBuffer?.push(``);\n }\n if (this.#hasBorder) {\n svgBuffer.push(`')`);\n style.backgroundImage = svgBuffer.join(\"\");\n }\n this.container.append(svg);\n this.container.style.clipPath = `url(#${id})`;\n }\n _createPopup() {\n const {\n container,\n data\n } = this;\n container.setAttribute(\"aria-haspopup\", \"dialog\");\n const popup = new PopupAnnotationElement({\n data: {\n color: data.color,\n titleObj: data.titleObj,\n modificationDate: data.modificationDate,\n contentsObj: data.contentsObj,\n richText: data.richText,\n parentRect: data.rect,\n borderStyle: 0,\n id: `popup_${data.id}`,\n rotation: data.rotation\n },\n parent: this.parent,\n elements: [this]\n });\n this.parent.div.append(popup.render());\n }\n render() {\n (0,util.unreachable)(\"Abstract method `AnnotationElement.render` called\");\n }\n _getElementsByName(name) {\n let skipId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n const fields = [];\n if (this._fieldObjects) {\n const fieldObj = this._fieldObjects[name];\n if (fieldObj) {\n for (const {\n page,\n id,\n exportValues\n } of fieldObj) {\n if (page === -1) {\n continue;\n }\n if (id === skipId) {\n continue;\n }\n const exportValue = typeof exportValues === \"string\" ? exportValues : null;\n const domElement = document.querySelector(`[data-element-id=\"${id}\"]`);\n if (domElement && !GetElementsByNameSet.has(domElement)) {\n (0,util.warn)(`_getElementsByName - element not allowed: ${id}`);\n continue;\n }\n fields.push({\n id,\n exportValue,\n domElement\n });\n }\n }\n return fields;\n }\n for (const domElement of document.getElementsByName(name)) {\n const {\n exportValue\n } = domElement;\n const id = domElement.getAttribute(\"data-element-id\");\n if (id === skipId) {\n continue;\n }\n if (!GetElementsByNameSet.has(domElement)) {\n continue;\n }\n fields.push({\n id,\n exportValue,\n domElement\n });\n }\n return fields;\n }\n show() {\n if (this.container) {\n this.container.hidden = false;\n }\n this.popup?.maybeShow();\n }\n hide() {\n if (this.container) {\n this.container.hidden = true;\n }\n this.popup?.forceHide();\n }\n getElementsToTriggerPopup() {\n return this.container;\n }\n addHighlightArea() {\n const triggers = this.getElementsToTriggerPopup();\n if (Array.isArray(triggers)) {\n for (const element of triggers) {\n element.classList.add(\"highlightArea\");\n }\n } else {\n triggers.classList.add(\"highlightArea\");\n }\n }\n get _isEditable() {\n return false;\n }\n _editOnDoubleClick() {\n if (!this._isEditable) {\n return;\n }\n const {\n annotationEditorType: mode,\n data: {\n id: editId\n }\n } = this;\n this.container.addEventListener(\"dblclick\", () => {\n this.linkService.eventBus?.dispatch(\"switchannotationeditormode\", {\n source: this,\n mode,\n editId\n });\n });\n }\n}\nclass LinkAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n super(parameters, {\n isRenderable: true,\n ignoreBorder: !!options?.ignoreBorder,\n createQuadrilaterals: true\n });\n this.isTooltipOnly = parameters.data.isTooltipOnly;\n }\n render() {\n const {\n data,\n linkService\n } = this;\n const link = document.createElement(\"a\");\n link.setAttribute(\"data-element-id\", data.id);\n let isBound = false;\n if (data.url) {\n linkService.addLinkAttributes(link, data.url, data.newWindow);\n isBound = true;\n } else if (data.action) {\n this._bindNamedAction(link, data.action);\n isBound = true;\n } else if (data.attachment) {\n this.#bindAttachment(link, data.attachment, data.attachmentDest);\n isBound = true;\n } else if (data.setOCGState) {\n this.#bindSetOCGState(link, data.setOCGState);\n isBound = true;\n } else if (data.dest) {\n this._bindLink(link, data.dest);\n isBound = true;\n } else {\n if (data.actions && (data.actions.Action || data.actions[\"Mouse Up\"] || data.actions[\"Mouse Down\"]) && this.enableScripting && this.hasJSActions) {\n this._bindJSAction(link, data);\n isBound = true;\n }\n if (data.resetForm) {\n this._bindResetFormAction(link, data.resetForm);\n isBound = true;\n } else if (this.isTooltipOnly && !isBound) {\n this._bindLink(link, \"\");\n isBound = true;\n }\n }\n this.container.classList.add(\"linkAnnotation\");\n if (isBound) {\n this.container.append(link);\n }\n return this.container;\n }\n #setInternalLink() {\n this.container.setAttribute(\"data-internal-link\", \"\");\n }\n _bindLink(link, destination) {\n link.href = this.linkService.getDestinationHash(destination);\n link.onclick = () => {\n if (destination) {\n this.linkService.goToDestination(destination);\n }\n return false;\n };\n if (destination || destination === \"\") {\n this.#setInternalLink();\n }\n }\n _bindNamedAction(link, action) {\n link.href = this.linkService.getAnchorUrl(\"\");\n link.onclick = () => {\n this.linkService.executeNamedAction(action);\n return false;\n };\n this.#setInternalLink();\n }\n #bindAttachment(link, attachment) {\n let dest = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n link.href = this.linkService.getAnchorUrl(\"\");\n link.onclick = () => {\n this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest);\n return false;\n };\n this.#setInternalLink();\n }\n #bindSetOCGState(link, action) {\n link.href = this.linkService.getAnchorUrl(\"\");\n link.onclick = () => {\n this.linkService.executeSetOCGState(action);\n return false;\n };\n this.#setInternalLink();\n }\n _bindJSAction(link, data) {\n link.href = this.linkService.getAnchorUrl(\"\");\n const map = new Map([[\"Action\", \"onclick\"], [\"Mouse Up\", \"onmouseup\"], [\"Mouse Down\", \"onmousedown\"]]);\n for (const name of Object.keys(data.actions)) {\n const jsName = map.get(name);\n if (!jsName) {\n continue;\n }\n link[jsName] = () => {\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id: data.id,\n name\n }\n });\n return false;\n };\n }\n if (!link.onclick) {\n link.onclick = () => false;\n }\n this.#setInternalLink();\n }\n _bindResetFormAction(link, resetForm) {\n const otherClickAction = link.onclick;\n if (!otherClickAction) {\n link.href = this.linkService.getAnchorUrl(\"\");\n }\n this.#setInternalLink();\n if (!this._fieldObjects) {\n (0,util.warn)(`_bindResetFormAction - \"resetForm\" action not supported, ` + \"ensure that the `fieldObjects` parameter is provided.\");\n if (!otherClickAction) {\n link.onclick = () => false;\n }\n return;\n }\n link.onclick = () => {\n otherClickAction?.();\n const {\n fields: resetFormFields,\n refs: resetFormRefs,\n include\n } = resetForm;\n const allFields = [];\n if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) {\n const fieldIds = new Set(resetFormRefs);\n for (const fieldName of resetFormFields) {\n const fields = this._fieldObjects[fieldName] || [];\n for (const {\n id\n } of fields) {\n fieldIds.add(id);\n }\n }\n for (const fields of Object.values(this._fieldObjects)) {\n for (const field of fields) {\n if (fieldIds.has(field.id) === include) {\n allFields.push(field);\n }\n }\n }\n } else {\n for (const fields of Object.values(this._fieldObjects)) {\n allFields.push(...fields);\n }\n }\n const storage = this.annotationStorage;\n const allIds = [];\n for (const field of allFields) {\n const {\n id\n } = field;\n allIds.push(id);\n switch (field.type) {\n case \"text\":\n {\n const value = field.defaultValue || \"\";\n storage.setValue(id, {\n value\n });\n break;\n }\n case \"checkbox\":\n case \"radiobutton\":\n {\n const value = field.defaultValue === field.exportValues;\n storage.setValue(id, {\n value\n });\n break;\n }\n case \"combobox\":\n case \"listbox\":\n {\n const value = field.defaultValue || \"\";\n storage.setValue(id, {\n value\n });\n break;\n }\n default:\n continue;\n }\n const domElement = document.querySelector(`[data-element-id=\"${id}\"]`);\n if (!domElement) {\n continue;\n } else if (!GetElementsByNameSet.has(domElement)) {\n (0,util.warn)(`_bindResetFormAction - element not allowed: ${id}`);\n continue;\n }\n domElement.dispatchEvent(new Event(\"resetform\"));\n }\n if (this.enableScripting) {\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id: \"app\",\n ids: allIds,\n name: \"ResetForm\"\n }\n });\n }\n return false;\n };\n }\n}\nclass TextAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true\n });\n }\n render() {\n this.container.classList.add(\"textAnnotation\");\n const image = document.createElement(\"img\");\n image.src = this.imageResourcesPath + \"annotation-\" + this.data.name.toLowerCase() + \".svg\";\n image.setAttribute(\"data-l10n-id\", \"pdfjs-text-annotation-type\");\n image.setAttribute(\"data-l10n-args\", JSON.stringify({\n type: this.data.name\n }));\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n this.container.append(image);\n return this.container;\n }\n}\nclass WidgetAnnotationElement extends AnnotationElement {\n render() {\n if (this.data.alternativeText) {\n this.container.title = this.data.alternativeText;\n }\n return this.container;\n }\n showElementAndHideCanvas(element) {\n if (this.data.hasOwnCanvas) {\n if (element.previousSibling?.nodeName === \"CANVAS\") {\n element.previousSibling.hidden = true;\n }\n element.hidden = false;\n }\n }\n _getKeyModifier(event) {\n return util.FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey;\n }\n _setEventListener(element, elementData, baseName, eventName, valueGetter) {\n if (baseName.includes(\"mouse\")) {\n element.addEventListener(baseName, event => {\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id: this.data.id,\n name: eventName,\n value: valueGetter(event),\n shift: event.shiftKey,\n modifier: this._getKeyModifier(event)\n }\n });\n });\n } else {\n element.addEventListener(baseName, event => {\n if (baseName === \"blur\") {\n if (!elementData.focused || !event.relatedTarget) {\n return;\n }\n elementData.focused = false;\n } else if (baseName === \"focus\") {\n if (elementData.focused) {\n return;\n }\n elementData.focused = true;\n }\n if (!valueGetter) {\n return;\n }\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id: this.data.id,\n name: eventName,\n value: valueGetter(event)\n }\n });\n });\n }\n }\n _setEventListeners(element, elementData, names, getter) {\n for (const [baseName, eventName] of names) {\n if (eventName === \"Action\" || this.data.actions?.[eventName]) {\n if (eventName === \"Focus\" || eventName === \"Blur\") {\n elementData ||= {\n focused: false\n };\n }\n this._setEventListener(element, elementData, baseName, eventName, getter);\n if (eventName === \"Focus\" && !this.data.actions?.Blur) {\n this._setEventListener(element, elementData, \"blur\", \"Blur\", null);\n } else if (eventName === \"Blur\" && !this.data.actions?.Focus) {\n this._setEventListener(element, elementData, \"focus\", \"Focus\", null);\n }\n }\n }\n }\n _setBackgroundColor(element) {\n const color = this.data.backgroundColor || null;\n element.style.backgroundColor = color === null ? \"transparent\" : util.Util.makeHexColor(color[0], color[1], color[2]);\n }\n _setTextStyle(element) {\n const TEXT_ALIGNMENT = [\"left\", \"center\", \"right\"];\n const {\n fontColor\n } = this.data.defaultAppearanceData;\n const fontSize = this.data.defaultAppearanceData.fontSize || DEFAULT_FONT_SIZE;\n const style = element.style;\n let computedFontSize;\n const BORDER_SIZE = 2;\n const roundToOneDecimal = x => Math.round(10 * x) / 10;\n if (this.data.multiLine) {\n const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);\n const numberOfLines = Math.round(height / (util.LINE_FACTOR * fontSize)) || 1;\n const lineHeight = height / numberOfLines;\n computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / util.LINE_FACTOR));\n } else {\n const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);\n computedFontSize = Math.min(fontSize, roundToOneDecimal(height / util.LINE_FACTOR));\n }\n style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`;\n style.color = util.Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]);\n if (this.data.textAlignment !== null) {\n style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n }\n }\n _setRequired(element, isRequired) {\n if (isRequired) {\n element.setAttribute(\"required\", true);\n } else {\n element.removeAttribute(\"required\");\n }\n element.setAttribute(\"aria-required\", isRequired);\n }\n}\nclass TextWidgetAnnotationElement extends WidgetAnnotationElement {\n constructor(parameters) {\n const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue;\n super(parameters, {\n isRenderable\n });\n }\n setPropertyOnSiblings(base, key, value, keyInStorage) {\n const storage = this.annotationStorage;\n for (const element of this._getElementsByName(base.name, base.id)) {\n if (element.domElement) {\n element.domElement[key] = value;\n }\n storage.setValue(element.id, {\n [keyInStorage]: value\n });\n }\n }\n render() {\n const storage = this.annotationStorage;\n const id = this.data.id;\n this.container.classList.add(\"textWidgetAnnotation\");\n let element = null;\n if (this.renderForms) {\n const storedData = storage.getValue(id, {\n value: this.data.fieldValue\n });\n let textContent = storedData.value || \"\";\n const maxLen = storage.getValue(id, {\n charLimit: this.data.maxLen\n }).charLimit;\n if (maxLen && textContent.length > maxLen) {\n textContent = textContent.slice(0, maxLen);\n }\n let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join(\"\\n\") || null;\n if (fieldFormattedValues && this.data.comb) {\n fieldFormattedValues = fieldFormattedValues.replaceAll(/\\s+/g, \"\");\n }\n const elementData = {\n userValue: textContent,\n formattedValue: fieldFormattedValues,\n lastCommittedValue: null,\n commitKey: 1,\n focused: false\n };\n if (this.data.multiLine) {\n element = document.createElement(\"textarea\");\n element.textContent = fieldFormattedValues ?? textContent;\n if (this.data.doNotScroll) {\n element.style.overflowY = \"hidden\";\n }\n } else {\n element = document.createElement(\"input\");\n element.type = \"text\";\n element.setAttribute(\"value\", fieldFormattedValues ?? textContent);\n if (this.data.doNotScroll) {\n element.style.overflowX = \"hidden\";\n }\n }\n if (this.data.hasOwnCanvas) {\n element.hidden = true;\n }\n GetElementsByNameSet.add(element);\n element.setAttribute(\"data-element-id\", id);\n element.disabled = this.data.readOnly;\n element.name = this.data.fieldName;\n element.tabIndex = DEFAULT_TAB_INDEX;\n this._setRequired(element, this.data.required);\n if (maxLen) {\n element.maxLength = maxLen;\n }\n element.addEventListener(\"input\", event => {\n storage.setValue(id, {\n value: event.target.value\n });\n this.setPropertyOnSiblings(element, \"value\", event.target.value, \"value\");\n elementData.formattedValue = null;\n });\n element.addEventListener(\"resetform\", event => {\n const defaultValue = this.data.defaultFieldValue ?? \"\";\n element.value = elementData.userValue = defaultValue;\n elementData.formattedValue = null;\n });\n let blurListener = event => {\n const {\n formattedValue\n } = elementData;\n if (formattedValue !== null && formattedValue !== undefined) {\n event.target.value = formattedValue;\n }\n event.target.scrollLeft = 0;\n };\n if (this.enableScripting && this.hasJSActions) {\n element.addEventListener(\"focus\", event => {\n if (elementData.focused) {\n return;\n }\n const {\n target\n } = event;\n if (elementData.userValue) {\n target.value = elementData.userValue;\n }\n elementData.lastCommittedValue = target.value;\n elementData.commitKey = 1;\n if (!this.data.actions?.Focus) {\n elementData.focused = true;\n }\n });\n element.addEventListener(\"updatefromsandbox\", jsEvent => {\n this.showElementAndHideCanvas(jsEvent.target);\n const actions = {\n value(event) {\n elementData.userValue = event.detail.value ?? \"\";\n storage.setValue(id, {\n value: elementData.userValue.toString()\n });\n event.target.value = elementData.userValue;\n },\n formattedValue(event) {\n const {\n formattedValue\n } = event.detail;\n elementData.formattedValue = formattedValue;\n if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) {\n event.target.value = formattedValue;\n }\n storage.setValue(id, {\n formattedValue\n });\n },\n selRange(event) {\n event.target.setSelectionRange(...event.detail.selRange);\n },\n charLimit: event => {\n const {\n charLimit\n } = event.detail;\n const {\n target\n } = event;\n if (charLimit === 0) {\n target.removeAttribute(\"maxLength\");\n return;\n }\n target.setAttribute(\"maxLength\", charLimit);\n let value = elementData.userValue;\n if (!value || value.length <= charLimit) {\n return;\n }\n value = value.slice(0, charLimit);\n target.value = elementData.userValue = value;\n storage.setValue(id, {\n value\n });\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id,\n name: \"Keystroke\",\n value,\n willCommit: true,\n commitKey: 1,\n selStart: target.selectionStart,\n selEnd: target.selectionEnd\n }\n });\n }\n };\n this._dispatchEventFromSandbox(actions, jsEvent);\n });\n element.addEventListener(\"keydown\", event => {\n elementData.commitKey = 1;\n let commitKey = -1;\n if (event.key === \"Escape\") {\n commitKey = 0;\n } else if (event.key === \"Enter\" && !this.data.multiLine) {\n commitKey = 2;\n } else if (event.key === \"Tab\") {\n elementData.commitKey = 3;\n }\n if (commitKey === -1) {\n return;\n }\n const {\n value\n } = event.target;\n if (elementData.lastCommittedValue === value) {\n return;\n }\n elementData.lastCommittedValue = value;\n elementData.userValue = value;\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id,\n name: \"Keystroke\",\n value,\n willCommit: true,\n commitKey,\n selStart: event.target.selectionStart,\n selEnd: event.target.selectionEnd\n }\n });\n });\n const _blurListener = blurListener;\n blurListener = null;\n element.addEventListener(\"blur\", event => {\n if (!elementData.focused || !event.relatedTarget) {\n return;\n }\n if (!this.data.actions?.Blur) {\n elementData.focused = false;\n }\n const {\n value\n } = event.target;\n elementData.userValue = value;\n if (elementData.lastCommittedValue !== value) {\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id,\n name: \"Keystroke\",\n value,\n willCommit: true,\n commitKey: elementData.commitKey,\n selStart: event.target.selectionStart,\n selEnd: event.target.selectionEnd\n }\n });\n }\n _blurListener(event);\n });\n if (this.data.actions?.Keystroke) {\n element.addEventListener(\"beforeinput\", event => {\n elementData.lastCommittedValue = null;\n const {\n data,\n target\n } = event;\n const {\n value,\n selectionStart,\n selectionEnd\n } = target;\n let selStart = selectionStart,\n selEnd = selectionEnd;\n switch (event.inputType) {\n case \"deleteWordBackward\":\n {\n const match = value.substring(0, selectionStart).match(/\\w*[^\\w]*$/);\n if (match) {\n selStart -= match[0].length;\n }\n break;\n }\n case \"deleteWordForward\":\n {\n const match = value.substring(selectionStart).match(/^[^\\w]*\\w*/);\n if (match) {\n selEnd += match[0].length;\n }\n break;\n }\n case \"deleteContentBackward\":\n if (selectionStart === selectionEnd) {\n selStart -= 1;\n }\n break;\n case \"deleteContentForward\":\n if (selectionStart === selectionEnd) {\n selEnd += 1;\n }\n break;\n }\n event.preventDefault();\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id,\n name: \"Keystroke\",\n value,\n change: data || \"\",\n willCommit: false,\n selStart,\n selEnd\n }\n });\n });\n }\n this._setEventListeners(element, elementData, [[\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.value);\n }\n if (blurListener) {\n element.addEventListener(\"blur\", blurListener);\n }\n if (this.data.comb) {\n const fieldWidth = this.data.rect[2] - this.data.rect[0];\n const combWidth = fieldWidth / maxLen;\n element.classList.add(\"comb\");\n element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`;\n }\n } else {\n element = document.createElement(\"div\");\n element.textContent = this.data.fieldValue;\n element.style.verticalAlign = \"middle\";\n element.style.display = \"table-cell\";\n if (this.data.hasOwnCanvas) {\n element.hidden = true;\n }\n }\n this._setTextStyle(element);\n this._setBackgroundColor(element);\n this._setDefaultPropertiesFromJS(element);\n this.container.append(element);\n return this.container;\n }\n}\nclass SignatureWidgetAnnotationElement extends WidgetAnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: !!parameters.data.hasOwnCanvas\n });\n }\n}\nclass CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: parameters.renderForms\n });\n }\n render() {\n const storage = this.annotationStorage;\n const data = this.data;\n const id = data.id;\n let value = storage.getValue(id, {\n value: data.exportValue === data.fieldValue\n }).value;\n if (typeof value === \"string\") {\n value = value !== \"Off\";\n storage.setValue(id, {\n value\n });\n }\n this.container.classList.add(\"buttonWidgetAnnotation\", \"checkBox\");\n const element = document.createElement(\"input\");\n GetElementsByNameSet.add(element);\n element.setAttribute(\"data-element-id\", id);\n element.disabled = data.readOnly;\n this._setRequired(element, this.data.required);\n element.type = \"checkbox\";\n element.name = data.fieldName;\n if (value) {\n element.setAttribute(\"checked\", true);\n }\n element.setAttribute(\"exportValue\", data.exportValue);\n element.tabIndex = DEFAULT_TAB_INDEX;\n element.addEventListener(\"change\", event => {\n const {\n name,\n checked\n } = event.target;\n for (const checkbox of this._getElementsByName(name, id)) {\n const curChecked = checked && checkbox.exportValue === data.exportValue;\n if (checkbox.domElement) {\n checkbox.domElement.checked = curChecked;\n }\n storage.setValue(checkbox.id, {\n value: curChecked\n });\n }\n storage.setValue(id, {\n value: checked\n });\n });\n element.addEventListener(\"resetform\", event => {\n const defaultValue = data.defaultFieldValue || \"Off\";\n event.target.checked = defaultValue === data.exportValue;\n });\n if (this.enableScripting && this.hasJSActions) {\n element.addEventListener(\"updatefromsandbox\", jsEvent => {\n const actions = {\n value(event) {\n event.target.checked = event.detail.value !== \"Off\";\n storage.setValue(id, {\n value: event.target.checked\n });\n }\n };\n this._dispatchEventFromSandbox(actions, jsEvent);\n });\n this._setEventListeners(element, null, [[\"change\", \"Validate\"], [\"change\", \"Action\"], [\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.checked);\n }\n this._setBackgroundColor(element);\n this._setDefaultPropertiesFromJS(element);\n this.container.append(element);\n return this.container;\n }\n}\nclass RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: parameters.renderForms\n });\n }\n render() {\n this.container.classList.add(\"buttonWidgetAnnotation\", \"radioButton\");\n const storage = this.annotationStorage;\n const data = this.data;\n const id = data.id;\n let value = storage.getValue(id, {\n value: data.fieldValue === data.buttonValue\n }).value;\n if (typeof value === \"string\") {\n value = value !== data.buttonValue;\n storage.setValue(id, {\n value\n });\n }\n if (value) {\n for (const radio of this._getElementsByName(data.fieldName, id)) {\n storage.setValue(radio.id, {\n value: false\n });\n }\n }\n const element = document.createElement(\"input\");\n GetElementsByNameSet.add(element);\n element.setAttribute(\"data-element-id\", id);\n element.disabled = data.readOnly;\n this._setRequired(element, this.data.required);\n element.type = \"radio\";\n element.name = data.fieldName;\n if (value) {\n element.setAttribute(\"checked\", true);\n }\n element.tabIndex = DEFAULT_TAB_INDEX;\n element.addEventListener(\"change\", event => {\n const {\n name,\n checked\n } = event.target;\n for (const radio of this._getElementsByName(name, id)) {\n storage.setValue(radio.id, {\n value: false\n });\n }\n storage.setValue(id, {\n value: checked\n });\n });\n element.addEventListener(\"resetform\", event => {\n const defaultValue = data.defaultFieldValue;\n event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue;\n });\n if (this.enableScripting && this.hasJSActions) {\n const pdfButtonValue = data.buttonValue;\n element.addEventListener(\"updatefromsandbox\", jsEvent => {\n const actions = {\n value: event => {\n const checked = pdfButtonValue === event.detail.value;\n for (const radio of this._getElementsByName(event.target.name)) {\n const curChecked = checked && radio.id === id;\n if (radio.domElement) {\n radio.domElement.checked = curChecked;\n }\n storage.setValue(radio.id, {\n value: curChecked\n });\n }\n }\n };\n this._dispatchEventFromSandbox(actions, jsEvent);\n });\n this._setEventListeners(element, null, [[\"change\", \"Validate\"], [\"change\", \"Action\"], [\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"]], event => event.target.checked);\n }\n this._setBackgroundColor(element);\n this._setDefaultPropertiesFromJS(element);\n this.container.append(element);\n return this.container;\n }\n}\nclass PushButtonWidgetAnnotationElement extends LinkAnnotationElement {\n constructor(parameters) {\n super(parameters, {\n ignoreBorder: parameters.data.hasAppearance\n });\n }\n render() {\n const container = super.render();\n container.classList.add(\"buttonWidgetAnnotation\", \"pushButton\");\n if (this.data.alternativeText) {\n container.title = this.data.alternativeText;\n }\n const linkElement = container.lastChild;\n if (this.enableScripting && this.hasJSActions && linkElement) {\n this._setDefaultPropertiesFromJS(linkElement);\n linkElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n this._dispatchEventFromSandbox({}, jsEvent);\n });\n }\n return container;\n }\n}\nclass ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: parameters.renderForms\n });\n }\n render() {\n this.container.classList.add(\"choiceWidgetAnnotation\");\n const storage = this.annotationStorage;\n const id = this.data.id;\n const storedData = storage.getValue(id, {\n value: this.data.fieldValue\n });\n const selectElement = document.createElement(\"select\");\n GetElementsByNameSet.add(selectElement);\n selectElement.setAttribute(\"data-element-id\", id);\n selectElement.disabled = this.data.readOnly;\n this._setRequired(selectElement, this.data.required);\n selectElement.name = this.data.fieldName;\n selectElement.tabIndex = DEFAULT_TAB_INDEX;\n let addAnEmptyEntry = this.data.combo && this.data.options.length > 0;\n if (!this.data.combo) {\n selectElement.size = this.data.options.length;\n if (this.data.multiSelect) {\n selectElement.multiple = true;\n }\n }\n selectElement.addEventListener(\"resetform\", event => {\n const defaultValue = this.data.defaultFieldValue;\n for (const option of selectElement.options) {\n option.selected = option.value === defaultValue;\n }\n });\n for (const option of this.data.options) {\n const optionElement = document.createElement(\"option\");\n optionElement.textContent = option.displayValue;\n optionElement.value = option.exportValue;\n if (storedData.value.includes(option.exportValue)) {\n optionElement.setAttribute(\"selected\", true);\n addAnEmptyEntry = false;\n }\n selectElement.append(optionElement);\n }\n let removeEmptyEntry = null;\n if (addAnEmptyEntry) {\n const noneOptionElement = document.createElement(\"option\");\n noneOptionElement.value = \" \";\n noneOptionElement.setAttribute(\"hidden\", true);\n noneOptionElement.setAttribute(\"selected\", true);\n selectElement.prepend(noneOptionElement);\n removeEmptyEntry = () => {\n noneOptionElement.remove();\n selectElement.removeEventListener(\"input\", removeEmptyEntry);\n removeEmptyEntry = null;\n };\n selectElement.addEventListener(\"input\", removeEmptyEntry);\n }\n const getValue = isExport => {\n const name = isExport ? \"value\" : \"textContent\";\n const {\n options,\n multiple\n } = selectElement;\n if (!multiple) {\n return options.selectedIndex === -1 ? null : options[options.selectedIndex][name];\n }\n return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]);\n };\n let selectedValues = getValue(false);\n const getItems = event => {\n const options = event.target.options;\n return Array.prototype.map.call(options, option => {\n return {\n displayValue: option.textContent,\n exportValue: option.value\n };\n });\n };\n if (this.enableScripting && this.hasJSActions) {\n selectElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n const actions = {\n value(event) {\n removeEmptyEntry?.();\n const value = event.detail.value;\n const values = new Set(Array.isArray(value) ? value : [value]);\n for (const option of selectElement.options) {\n option.selected = values.has(option.value);\n }\n storage.setValue(id, {\n value: getValue(true)\n });\n selectedValues = getValue(false);\n },\n multipleSelection(event) {\n selectElement.multiple = true;\n },\n remove(event) {\n const options = selectElement.options;\n const index = event.detail.remove;\n options[index].selected = false;\n selectElement.remove(index);\n if (options.length > 0) {\n const i = Array.prototype.findIndex.call(options, option => option.selected);\n if (i === -1) {\n options[0].selected = true;\n }\n }\n storage.setValue(id, {\n value: getValue(true),\n items: getItems(event)\n });\n selectedValues = getValue(false);\n },\n clear(event) {\n while (selectElement.length !== 0) {\n selectElement.remove(0);\n }\n storage.setValue(id, {\n value: null,\n items: []\n });\n selectedValues = getValue(false);\n },\n insert(event) {\n const {\n index,\n displayValue,\n exportValue\n } = event.detail.insert;\n const selectChild = selectElement.children[index];\n const optionElement = document.createElement(\"option\");\n optionElement.textContent = displayValue;\n optionElement.value = exportValue;\n if (selectChild) {\n selectChild.before(optionElement);\n } else {\n selectElement.append(optionElement);\n }\n storage.setValue(id, {\n value: getValue(true),\n items: getItems(event)\n });\n selectedValues = getValue(false);\n },\n items(event) {\n const {\n items\n } = event.detail;\n while (selectElement.length !== 0) {\n selectElement.remove(0);\n }\n for (const item of items) {\n const {\n displayValue,\n exportValue\n } = item;\n const optionElement = document.createElement(\"option\");\n optionElement.textContent = displayValue;\n optionElement.value = exportValue;\n selectElement.append(optionElement);\n }\n if (selectElement.options.length > 0) {\n selectElement.options[0].selected = true;\n }\n storage.setValue(id, {\n value: getValue(true),\n items: getItems(event)\n });\n selectedValues = getValue(false);\n },\n indices(event) {\n const indices = new Set(event.detail.indices);\n for (const option of event.target.options) {\n option.selected = indices.has(option.index);\n }\n storage.setValue(id, {\n value: getValue(true)\n });\n selectedValues = getValue(false);\n },\n editable(event) {\n event.target.disabled = !event.detail.editable;\n }\n };\n this._dispatchEventFromSandbox(actions, jsEvent);\n });\n selectElement.addEventListener(\"input\", event => {\n const exportValue = getValue(true);\n storage.setValue(id, {\n value: exportValue\n });\n event.preventDefault();\n this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n source: this,\n detail: {\n id,\n name: \"Keystroke\",\n value: selectedValues,\n changeEx: exportValue,\n willCommit: false,\n commitKey: 1,\n keyDown: false\n }\n });\n });\n this._setEventListeners(selectElement, null, [[\"focus\", \"Focus\"], [\"blur\", \"Blur\"], [\"mousedown\", \"Mouse Down\"], [\"mouseenter\", \"Mouse Enter\"], [\"mouseleave\", \"Mouse Exit\"], [\"mouseup\", \"Mouse Up\"], [\"input\", \"Action\"], [\"input\", \"Validate\"]], event => event.target.value);\n } else {\n selectElement.addEventListener(\"input\", function (event) {\n storage.setValue(id, {\n value: getValue(true)\n });\n });\n }\n if (this.data.combo) {\n this._setTextStyle(selectElement);\n } else {}\n this._setBackgroundColor(selectElement);\n this._setDefaultPropertiesFromJS(selectElement);\n this.container.append(selectElement);\n return this.container;\n }\n}\nclass PopupAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n const {\n data,\n elements\n } = parameters;\n super(parameters, {\n isRenderable: AnnotationElement._hasPopupData(data)\n });\n this.elements = elements;\n }\n render() {\n this.container.classList.add(\"popupAnnotation\");\n const popup = new PopupElement({\n container: this.container,\n color: this.data.color,\n titleObj: this.data.titleObj,\n modificationDate: this.data.modificationDate,\n contentsObj: this.data.contentsObj,\n richText: this.data.richText,\n rect: this.data.rect,\n parentRect: this.data.parentRect || null,\n parent: this.parent,\n elements: this.elements,\n open: this.data.open\n });\n const elementIds = [];\n for (const element of this.elements) {\n element.popup = popup;\n elementIds.push(element.data.id);\n element.addHighlightArea();\n }\n this.container.setAttribute(\"aria-controls\", elementIds.map(id => `${util.AnnotationPrefix}${id}`).join(\",\"));\n return this.container;\n }\n}\nclass PopupElement {\n #boundKeyDown = this.#keyDown.bind(this);\n #boundHide = this.#hide.bind(this);\n #boundShow = this.#show.bind(this);\n #boundToggle = this.#toggle.bind(this);\n #color = null;\n #container = null;\n #contentsObj = null;\n #dateObj = null;\n #elements = null;\n #parent = null;\n #parentRect = null;\n #pinned = false;\n #popup = null;\n #rect = null;\n #richText = null;\n #titleObj = null;\n #wasVisible = false;\n constructor(_ref2) {\n let {\n container,\n color,\n elements,\n titleObj,\n modificationDate,\n contentsObj,\n richText,\n parent,\n rect,\n parentRect,\n open\n } = _ref2;\n this.#container = container;\n this.#titleObj = titleObj;\n this.#contentsObj = contentsObj;\n this.#richText = richText;\n this.#parent = parent;\n this.#color = color;\n this.#rect = rect;\n this.#parentRect = parentRect;\n this.#elements = elements;\n this.#dateObj = display_utils.PDFDateString.toDateObject(modificationDate);\n this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup());\n for (const element of this.trigger) {\n element.addEventListener(\"click\", this.#boundToggle);\n element.addEventListener(\"mouseenter\", this.#boundShow);\n element.addEventListener(\"mouseleave\", this.#boundHide);\n element.classList.add(\"popupTriggerArea\");\n }\n for (const element of elements) {\n element.container?.addEventListener(\"keydown\", this.#boundKeyDown);\n }\n this.#container.hidden = true;\n if (open) {\n this.#toggle();\n }\n }\n render() {\n if (this.#popup) {\n return;\n }\n const {\n page: {\n view\n },\n viewport: {\n rawDims: {\n pageWidth,\n pageHeight,\n pageX,\n pageY\n }\n }\n } = this.#parent;\n const popup = this.#popup = document.createElement(\"div\");\n popup.className = \"popup\";\n if (this.#color) {\n const baseColor = popup.style.outlineColor = util.Util.makeHexColor(...this.#color);\n if (CSS.supports(\"background-color\", \"color-mix(in srgb, red 30%, white)\")) {\n popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`;\n } else {\n const BACKGROUND_ENLIGHT = 0.7;\n popup.style.backgroundColor = util.Util.makeHexColor(...this.#color.map(c => Math.floor(BACKGROUND_ENLIGHT * (255 - c) + c)));\n }\n }\n const header = document.createElement(\"span\");\n header.className = \"header\";\n const title = document.createElement(\"h1\");\n header.append(title);\n ({\n dir: title.dir,\n str: title.textContent\n } = this.#titleObj);\n popup.append(header);\n if (this.#dateObj) {\n const modificationDate = document.createElement(\"span\");\n modificationDate.classList.add(\"popupDate\");\n modificationDate.setAttribute(\"data-l10n-id\", \"pdfjs-annotation-date-string\");\n modificationDate.setAttribute(\"data-l10n-args\", JSON.stringify({\n date: this.#dateObj.toLocaleDateString(),\n time: this.#dateObj.toLocaleTimeString()\n }));\n header.append(modificationDate);\n }\n const contentsObj = this.#contentsObj;\n const richText = this.#richText;\n if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) {\n xfa_layer.XfaLayer.render({\n xfaHtml: richText.html,\n intent: \"richText\",\n div: popup\n });\n popup.lastChild.classList.add(\"richText\", \"popupContent\");\n } else {\n const contents = this._formatContents(contentsObj);\n popup.append(contents);\n }\n let useParentRect = !!this.#parentRect;\n let rect = useParentRect ? this.#parentRect : this.#rect;\n for (const element of this.#elements) {\n if (!rect || util.Util.intersect(element.data.rect, rect) !== null) {\n rect = element.data.rect;\n useParentRect = true;\n break;\n }\n }\n const normalizedRect = util.Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]);\n const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5;\n const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0;\n const popupLeft = normalizedRect[0] + parentWidth;\n const popupTop = normalizedRect[1];\n const {\n style\n } = this.#container;\n style.left = `${100 * (popupLeft - pageX) / pageWidth}%`;\n style.top = `${100 * (popupTop - pageY) / pageHeight}%`;\n this.#container.append(popup);\n }\n _formatContents(_ref3) {\n let {\n str,\n dir\n } = _ref3;\n const p = document.createElement(\"p\");\n p.classList.add(\"popupContent\");\n p.dir = dir;\n const lines = str.split(/(?:\\r\\n?|\\n)/);\n for (let i = 0, ii = lines.length; i < ii; ++i) {\n const line = lines[i];\n p.append(document.createTextNode(line));\n if (i < ii - 1) {\n p.append(document.createElement(\"br\"));\n }\n }\n return p;\n }\n #keyDown(event) {\n if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {\n return;\n }\n if (event.key === \"Enter\" || event.key === \"Escape\" && this.#pinned) {\n this.#toggle();\n }\n }\n #toggle() {\n this.#pinned = !this.#pinned;\n if (this.#pinned) {\n this.#show();\n this.#container.addEventListener(\"click\", this.#boundToggle);\n this.#container.addEventListener(\"keydown\", this.#boundKeyDown);\n } else {\n this.#hide();\n this.#container.removeEventListener(\"click\", this.#boundToggle);\n this.#container.removeEventListener(\"keydown\", this.#boundKeyDown);\n }\n }\n #show() {\n if (!this.#popup) {\n this.render();\n }\n if (!this.isVisible) {\n this.#container.hidden = false;\n this.#container.style.zIndex = parseInt(this.#container.style.zIndex) + 1000;\n } else if (this.#pinned) {\n this.#container.classList.add(\"focused\");\n }\n }\n #hide() {\n this.#container.classList.remove(\"focused\");\n if (this.#pinned || !this.isVisible) {\n return;\n }\n this.#container.hidden = true;\n this.#container.style.zIndex = parseInt(this.#container.style.zIndex) - 1000;\n }\n forceHide() {\n this.#wasVisible = this.isVisible;\n if (!this.#wasVisible) {\n return;\n }\n this.#container.hidden = true;\n }\n maybeShow() {\n if (!this.#wasVisible) {\n return;\n }\n this.#wasVisible = false;\n this.#container.hidden = false;\n }\n get isVisible() {\n return this.#container.hidden === false;\n }\n}\nclass FreeTextAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n this.textContent = parameters.data.textContent;\n this.textPosition = parameters.data.textPosition;\n this.annotationEditorType = util.AnnotationEditorType.FREETEXT;\n }\n render() {\n this.container.classList.add(\"freeTextAnnotation\");\n if (this.textContent) {\n const content = document.createElement(\"div\");\n content.classList.add(\"annotationTextContent\");\n content.setAttribute(\"role\", \"comment\");\n for (const line of this.textContent) {\n const lineSpan = document.createElement(\"span\");\n lineSpan.textContent = line;\n content.append(lineSpan);\n }\n this.container.append(content);\n }\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n this._editOnDoubleClick();\n return this.container;\n }\n get _isEditable() {\n return this.data.hasOwnCanvas;\n }\n}\nclass LineAnnotationElement extends AnnotationElement {\n #line = null;\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n }\n render() {\n this.container.classList.add(\"lineAnnotation\");\n const data = this.data;\n const {\n width,\n height\n } = getRectDims(data.rect);\n const svg = this.svgFactory.create(width, height, true);\n const line = this.#line = this.svgFactory.createElement(\"svg:line\");\n line.setAttribute(\"x1\", data.rect[2] - data.lineCoordinates[0]);\n line.setAttribute(\"y1\", data.rect[3] - data.lineCoordinates[1]);\n line.setAttribute(\"x2\", data.rect[2] - data.lineCoordinates[2]);\n line.setAttribute(\"y2\", data.rect[3] - data.lineCoordinates[3]);\n line.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n line.setAttribute(\"stroke\", \"transparent\");\n line.setAttribute(\"fill\", \"transparent\");\n svg.append(line);\n this.container.append(svg);\n if (!data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n return this.container;\n }\n getElementsToTriggerPopup() {\n return this.#line;\n }\n addHighlightArea() {\n this.container.classList.add(\"highlightArea\");\n }\n}\nclass SquareAnnotationElement extends AnnotationElement {\n #square = null;\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n }\n render() {\n this.container.classList.add(\"squareAnnotation\");\n const data = this.data;\n const {\n width,\n height\n } = getRectDims(data.rect);\n const svg = this.svgFactory.create(width, height, true);\n const borderWidth = data.borderStyle.width;\n const square = this.#square = this.svgFactory.createElement(\"svg:rect\");\n square.setAttribute(\"x\", borderWidth / 2);\n square.setAttribute(\"y\", borderWidth / 2);\n square.setAttribute(\"width\", width - borderWidth);\n square.setAttribute(\"height\", height - borderWidth);\n square.setAttribute(\"stroke-width\", borderWidth || 1);\n square.setAttribute(\"stroke\", \"transparent\");\n square.setAttribute(\"fill\", \"transparent\");\n svg.append(square);\n this.container.append(svg);\n if (!data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n return this.container;\n }\n getElementsToTriggerPopup() {\n return this.#square;\n }\n addHighlightArea() {\n this.container.classList.add(\"highlightArea\");\n }\n}\nclass CircleAnnotationElement extends AnnotationElement {\n #circle = null;\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n }\n render() {\n this.container.classList.add(\"circleAnnotation\");\n const data = this.data;\n const {\n width,\n height\n } = getRectDims(data.rect);\n const svg = this.svgFactory.create(width, height, true);\n const borderWidth = data.borderStyle.width;\n const circle = this.#circle = this.svgFactory.createElement(\"svg:ellipse\");\n circle.setAttribute(\"cx\", width / 2);\n circle.setAttribute(\"cy\", height / 2);\n circle.setAttribute(\"rx\", width / 2 - borderWidth / 2);\n circle.setAttribute(\"ry\", height / 2 - borderWidth / 2);\n circle.setAttribute(\"stroke-width\", borderWidth || 1);\n circle.setAttribute(\"stroke\", \"transparent\");\n circle.setAttribute(\"fill\", \"transparent\");\n svg.append(circle);\n this.container.append(svg);\n if (!data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n return this.container;\n }\n getElementsToTriggerPopup() {\n return this.#circle;\n }\n addHighlightArea() {\n this.container.classList.add(\"highlightArea\");\n }\n}\nclass PolylineAnnotationElement extends AnnotationElement {\n #polyline = null;\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n this.containerClassName = \"polylineAnnotation\";\n this.svgElementName = \"svg:polyline\";\n }\n render() {\n this.container.classList.add(this.containerClassName);\n const data = this.data;\n const {\n width,\n height\n } = getRectDims(data.rect);\n const svg = this.svgFactory.create(width, height, true);\n let points = [];\n for (const coordinate of data.vertices) {\n const x = coordinate.x - data.rect[0];\n const y = data.rect[3] - coordinate.y;\n points.push(x + \",\" + y);\n }\n points = points.join(\" \");\n const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName);\n polyline.setAttribute(\"points\", points);\n polyline.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n polyline.setAttribute(\"stroke\", \"transparent\");\n polyline.setAttribute(\"fill\", \"transparent\");\n svg.append(polyline);\n this.container.append(svg);\n if (!data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n return this.container;\n }\n getElementsToTriggerPopup() {\n return this.#polyline;\n }\n addHighlightArea() {\n this.container.classList.add(\"highlightArea\");\n }\n}\nclass PolygonAnnotationElement extends PolylineAnnotationElement {\n constructor(parameters) {\n super(parameters);\n this.containerClassName = \"polygonAnnotation\";\n this.svgElementName = \"svg:polygon\";\n }\n}\nclass CaretAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n }\n render() {\n this.container.classList.add(\"caretAnnotation\");\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n return this.container;\n }\n}\nclass InkAnnotationElement extends AnnotationElement {\n #polylines = [];\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n this.containerClassName = \"inkAnnotation\";\n this.svgElementName = \"svg:polyline\";\n this.annotationEditorType = util.AnnotationEditorType.INK;\n }\n render() {\n this.container.classList.add(this.containerClassName);\n const data = this.data;\n const {\n width,\n height\n } = getRectDims(data.rect);\n const svg = this.svgFactory.create(width, height, true);\n for (const inkList of data.inkLists) {\n let points = [];\n for (const coordinate of inkList) {\n const x = coordinate.x - data.rect[0];\n const y = data.rect[3] - coordinate.y;\n points.push(`${x},${y}`);\n }\n points = points.join(\" \");\n const polyline = this.svgFactory.createElement(this.svgElementName);\n this.#polylines.push(polyline);\n polyline.setAttribute(\"points\", points);\n polyline.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n polyline.setAttribute(\"stroke\", \"transparent\");\n polyline.setAttribute(\"fill\", \"transparent\");\n if (!data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n svg.append(polyline);\n }\n this.container.append(svg);\n return this.container;\n }\n getElementsToTriggerPopup() {\n return this.#polylines;\n }\n addHighlightArea() {\n this.container.classList.add(\"highlightArea\");\n }\n}\nclass HighlightAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true,\n createQuadrilaterals: true\n });\n }\n render() {\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n this.container.classList.add(\"highlightAnnotation\");\n return this.container;\n }\n}\nclass UnderlineAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true,\n createQuadrilaterals: true\n });\n }\n render() {\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n this.container.classList.add(\"underlineAnnotation\");\n return this.container;\n }\n}\nclass SquigglyAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true,\n createQuadrilaterals: true\n });\n }\n render() {\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n this.container.classList.add(\"squigglyAnnotation\");\n return this.container;\n }\n}\nclass StrikeOutAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true,\n createQuadrilaterals: true\n });\n }\n render() {\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n this.container.classList.add(\"strikeoutAnnotation\");\n return this.container;\n }\n}\nclass StampAnnotationElement extends AnnotationElement {\n constructor(parameters) {\n super(parameters, {\n isRenderable: true,\n ignoreBorder: true\n });\n }\n render() {\n this.container.classList.add(\"stampAnnotation\");\n if (!this.data.popupRef && this.hasPopupData) {\n this._createPopup();\n }\n return this.container;\n }\n}\nclass FileAttachmentAnnotationElement extends AnnotationElement {\n #trigger = null;\n constructor(parameters) {\n super(parameters, {\n isRenderable: true\n });\n const {\n filename,\n content\n } = this.data.file;\n this.filename = (0,display_utils.getFilenameFromUrl)(filename, true);\n this.content = content;\n this.linkService.eventBus?.dispatch(\"fileattachmentannotation\", {\n source: this,\n filename,\n content\n });\n }\n render() {\n this.container.classList.add(\"fileAttachmentAnnotation\");\n const {\n container,\n data\n } = this;\n let trigger;\n if (data.hasAppearance || data.fillAlpha === 0) {\n trigger = document.createElement(\"div\");\n } else {\n trigger = document.createElement(\"img\");\n trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? \"paperclip\" : \"pushpin\"}.svg`;\n if (data.fillAlpha && data.fillAlpha < 1) {\n trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`;\n }\n }\n trigger.addEventListener(\"dblclick\", this.#download.bind(this));\n this.#trigger = trigger;\n const {\n isMac\n } = util.FeatureTest.platform;\n container.addEventListener(\"keydown\", evt => {\n if (evt.key === \"Enter\" && (isMac ? evt.metaKey : evt.ctrlKey)) {\n this.#download();\n }\n });\n if (!data.popupRef && this.hasPopupData) {\n this._createPopup();\n } else {\n trigger.classList.add(\"popupTriggerArea\");\n }\n container.append(trigger);\n return container;\n }\n getElementsToTriggerPopup() {\n return this.#trigger;\n }\n addHighlightArea() {\n this.container.classList.add(\"highlightArea\");\n }\n #download() {\n this.downloadManager?.openOrDownloadData(this.content, this.filename);\n }\n}\nclass AnnotationLayer {\n #accessibilityManager = null;\n #annotationCanvasMap = null;\n #editableAnnotations = new Map();\n constructor(_ref4) {\n let {\n div,\n accessibilityManager,\n annotationCanvasMap,\n page,\n viewport\n } = _ref4;\n this.div = div;\n this.#accessibilityManager = accessibilityManager;\n this.#annotationCanvasMap = annotationCanvasMap;\n this.page = page;\n this.viewport = viewport;\n this.zIndex = 0;\n }\n #appendElement(element, id) {\n const contentElement = element.firstChild || element;\n contentElement.id = `${util.AnnotationPrefix}${id}`;\n this.div.append(element);\n this.#accessibilityManager?.moveElementInDOM(this.div, element, contentElement, false);\n }\n async render(params) {\n const {\n annotations\n } = params;\n const layer = this.div;\n (0,display_utils.setLayerDimensions)(layer, this.viewport);\n const popupToElements = new Map();\n const elementParams = {\n data: null,\n layer,\n linkService: params.linkService,\n downloadManager: params.downloadManager,\n imageResourcesPath: params.imageResourcesPath || \"\",\n renderForms: params.renderForms !== false,\n svgFactory: new display_utils.DOMSVGFactory(),\n annotationStorage: params.annotationStorage || new annotation_storage.AnnotationStorage(),\n enableScripting: params.enableScripting === true,\n hasJSActions: params.hasJSActions,\n fieldObjects: params.fieldObjects,\n parent: this,\n elements: null\n };\n for (const data of annotations) {\n if (data.noHTML) {\n continue;\n }\n const isPopupAnnotation = data.annotationType === util.AnnotationType.POPUP;\n if (!isPopupAnnotation) {\n const {\n width,\n height\n } = getRectDims(data.rect);\n if (width <= 0 || height <= 0) {\n continue;\n }\n } else {\n const elements = popupToElements.get(data.id);\n if (!elements) {\n continue;\n }\n elementParams.elements = elements;\n }\n elementParams.data = data;\n const element = AnnotationElementFactory.create(elementParams);\n if (!element.isRenderable) {\n continue;\n }\n if (!isPopupAnnotation && data.popupRef) {\n const elements = popupToElements.get(data.popupRef);\n if (!elements) {\n popupToElements.set(data.popupRef, [element]);\n } else {\n elements.push(element);\n }\n }\n if (element.annotationEditorType > 0) {\n this.#editableAnnotations.set(element.data.id, element);\n }\n const rendered = element.render();\n if (data.hidden) {\n rendered.style.visibility = \"hidden\";\n }\n this.#appendElement(rendered, data.id);\n }\n this.#setAnnotationCanvasMap();\n }\n update(_ref5) {\n let {\n viewport\n } = _ref5;\n const layer = this.div;\n this.viewport = viewport;\n (0,display_utils.setLayerDimensions)(layer, {\n rotation: viewport.rotation\n });\n this.#setAnnotationCanvasMap();\n layer.hidden = false;\n }\n #setAnnotationCanvasMap() {\n if (!this.#annotationCanvasMap) {\n return;\n }\n const layer = this.div;\n for (const [id, canvas] of this.#annotationCanvasMap) {\n const element = layer.querySelector(`[data-annotation-id=\"${id}\"]`);\n if (!element) {\n continue;\n }\n const {\n firstChild\n } = element;\n if (!firstChild) {\n element.append(canvas);\n } else if (firstChild.nodeName === \"CANVAS\") {\n firstChild.replaceWith(canvas);\n } else {\n firstChild.before(canvas);\n }\n }\n this.#annotationCanvasMap.clear();\n }\n getEditableAnnotations() {\n return Array.from(this.#editableAnnotations.values());\n }\n getEditableAnnotation(id) {\n return this.#editableAnnotations.get(id);\n }\n}\n\n\n/***/ }),\n\n/***/ 4780:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_204731__) => {\n\n/* harmony export */ __nested_webpack_require_204731__.d(__nested_webpack_exports__, {\n/* harmony export */ AnnotationStorage: () => (/* binding */ AnnotationStorage),\n/* harmony export */ PrintAnnotationStorage: () => (/* binding */ PrintAnnotationStorage),\n/* harmony export */ SerializableEmpty: () => (/* binding */ SerializableEmpty)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_204731__(4226);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_204731__(7944);\n/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_204731__(9709);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_204731__(3266);\n/* harmony import */ var _editor_editor_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_204731__(9115);\n/* harmony import */ var _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_204731__(2825);\n\n\n\n\n\n\nconst SerializableEmpty = Object.freeze({\n map: null,\n hash: \"\",\n transfer: undefined\n});\nclass AnnotationStorage {\n #modified = false;\n #storage = new Map();\n constructor() {\n this.onSetModified = null;\n this.onResetModified = null;\n this.onAnnotationEditor = null;\n }\n getValue(key, defaultValue) {\n const value = this.#storage.get(key);\n if (value === undefined) {\n return defaultValue;\n }\n return Object.assign(defaultValue, value);\n }\n getRawValue(key) {\n return this.#storage.get(key);\n }\n remove(key) {\n this.#storage.delete(key);\n if (this.#storage.size === 0) {\n this.resetModified();\n }\n if (typeof this.onAnnotationEditor === \"function\") {\n for (const value of this.#storage.values()) {\n if (value instanceof _editor_editor_js__WEBPACK_IMPORTED_MODULE_4__.AnnotationEditor) {\n return;\n }\n }\n this.onAnnotationEditor(null);\n }\n }\n setValue(key, value) {\n const obj = this.#storage.get(key);\n let modified = false;\n if (obj !== undefined) {\n for (const [entry, val] of Object.entries(value)) {\n if (obj[entry] !== val) {\n modified = true;\n obj[entry] = val;\n }\n }\n } else {\n modified = true;\n this.#storage.set(key, value);\n }\n if (modified) {\n this.#setModified();\n }\n if (value instanceof _editor_editor_js__WEBPACK_IMPORTED_MODULE_4__.AnnotationEditor && typeof this.onAnnotationEditor === \"function\") {\n this.onAnnotationEditor(value.constructor._type);\n }\n }\n has(key) {\n return this.#storage.has(key);\n }\n getAll() {\n return this.#storage.size > 0 ? (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_3__.objectFromMap)(this.#storage) : null;\n }\n setAll(obj) {\n for (const [key, val] of Object.entries(obj)) {\n this.setValue(key, val);\n }\n }\n get size() {\n return this.#storage.size;\n }\n #setModified() {\n if (!this.#modified) {\n this.#modified = true;\n if (typeof this.onSetModified === \"function\") {\n this.onSetModified();\n }\n }\n }\n resetModified() {\n if (this.#modified) {\n this.#modified = false;\n if (typeof this.onResetModified === \"function\") {\n this.onResetModified();\n }\n }\n }\n get print() {\n return new PrintAnnotationStorage(this);\n }\n get serializable() {\n if (this.#storage.size === 0) {\n return SerializableEmpty;\n }\n const map = new Map(),\n hash = new _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_5__.MurmurHash3_64(),\n transfer = [];\n const context = Object.create(null);\n let hasBitmap = false;\n for (const [key, val] of this.#storage) {\n const serialized = val instanceof _editor_editor_js__WEBPACK_IMPORTED_MODULE_4__.AnnotationEditor ? val.serialize(false, context) : val;\n if (serialized) {\n map.set(key, serialized);\n hash.update(`${key}:${JSON.stringify(serialized)}`);\n hasBitmap ||= !!serialized.bitmap;\n }\n }\n if (hasBitmap) {\n for (const value of map.values()) {\n if (value.bitmap) {\n transfer.push(value.bitmap);\n }\n }\n }\n return map.size > 0 ? {\n map,\n hash: hash.hexdigest(),\n transfer\n } : SerializableEmpty;\n }\n}\nclass PrintAnnotationStorage extends AnnotationStorage {\n #serializable;\n constructor(parent) {\n super();\n const {\n map,\n hash,\n transfer\n } = parent.serializable;\n const clone = structuredClone(map, transfer ? {\n transfer\n } : null);\n this.#serializable = {\n map: clone,\n hash,\n transfer\n };\n }\n get print() {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_3__.unreachable)(\"Should not call PrintAnnotationStorage.print\");\n }\n get serializable() {\n return this.#serializable;\n }\n}\n\n\n/***/ }),\n\n/***/ 9406:\n/***/ ((__webpack_module__, __nested_webpack_exports__, __nested_webpack_require_209680__) => {\n\n__nested_webpack_require_209680__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n/* harmony export */ __nested_webpack_require_209680__.d(__nested_webpack_exports__, {\n/* harmony export */ PDFDataRangeTransport: () => (/* binding */ PDFDataRangeTransport),\n/* harmony export */ PDFWorker: () => (/* binding */ PDFWorker),\n/* harmony export */ build: () => (/* binding */ build),\n/* harmony export */ getDocument: () => (/* binding */ getDocument),\n/* harmony export */ version: () => (/* binding */ version)\n/* harmony export */ });\n/* unused harmony exports DefaultCanvasFactory, DefaultCMapReaderFactory, DefaultFilterFactory, DefaultStandardFontDataFactory, LoopbackPort, PDFDocumentLoadingTask, PDFDocumentProxy, PDFPageProxy, PDFWorkerUtil, RenderTask */\n/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_209680__(3655);\n/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_209680__(2555);\n/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_209680__(2202);\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_209680__(3352);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_209680__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_209680__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_209680__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_209680__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_209680__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_209680__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_209680__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_209680__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_12__ = __nested_webpack_require_209680__(7583);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_13__ = __nested_webpack_require_209680__(4226);\n/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __nested_webpack_require_209680__(5561);\n/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __nested_webpack_require_209680__(8587);\n/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_16__ = __nested_webpack_require_209680__(3247);\n/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_17__ = __nested_webpack_require_209680__(3302);\n/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_18__ = __nested_webpack_require_209680__(9490);\n/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_19__ = __nested_webpack_require_209680__(5438);\n/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_20__ = __nested_webpack_require_209680__(7914);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_21__ = __nested_webpack_require_209680__(7944);\n/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_22__ = __nested_webpack_require_209680__(9709);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_23__ = __nested_webpack_require_209680__(3266);\n/* harmony import */ var _annotation_storage_js__WEBPACK_IMPORTED_MODULE_24__ = __nested_webpack_require_209680__(4780);\n/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_25__ = __nested_webpack_require_209680__(473);\n/* harmony import */ var _font_loader_js__WEBPACK_IMPORTED_MODULE_26__ = __nested_webpack_require_209680__(3742);\n/* harmony import */ var display_node_utils__WEBPACK_IMPORTED_MODULE_27__ = __nested_webpack_require_209680__(7738);\n/* harmony import */ var _canvas_js__WEBPACK_IMPORTED_MODULE_28__ = __nested_webpack_require_209680__(1250);\n/* harmony import */ var _worker_options_js__WEBPACK_IMPORTED_MODULE_29__ = __nested_webpack_require_209680__(1368);\n/* harmony import */ var _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_30__ = __nested_webpack_require_209680__(6694);\n/* harmony import */ var _metadata_js__WEBPACK_IMPORTED_MODULE_31__ = __nested_webpack_require_209680__(3472);\n/* harmony import */ var _optional_content_config_js__WEBPACK_IMPORTED_MODULE_32__ = __nested_webpack_require_209680__(3890);\n/* harmony import */ var _transport_stream_js__WEBPACK_IMPORTED_MODULE_33__ = __nested_webpack_require_209680__(4092);\n/* harmony import */ var display_fetch_stream__WEBPACK_IMPORTED_MODULE_34__ = __nested_webpack_require_209680__(5171);\n/* harmony import */ var display_network__WEBPACK_IMPORTED_MODULE_35__ = __nested_webpack_require_209680__(3474);\n/* harmony import */ var display_node_stream__WEBPACK_IMPORTED_MODULE_36__ = __nested_webpack_require_209680__(3498);\n/* harmony import */ var _xfa_text_js__WEBPACK_IMPORTED_MODULE_37__ = __nested_webpack_require_209680__(1521);\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([display_node_utils__WEBPACK_IMPORTED_MODULE_27__, display_node_stream__WEBPACK_IMPORTED_MODULE_36__]);\n([display_node_utils__WEBPACK_IMPORTED_MODULE_27__, display_node_stream__WEBPACK_IMPORTED_MODULE_36__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst DEFAULT_RANGE_CHUNK_SIZE = 65536;\nconst RENDERING_CANCELLED_TIMEOUT = 100;\nconst DELAYED_CLEANUP_TIMEOUT = 5000;\nconst DefaultCanvasFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_27__.NodeCanvasFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.DOMCanvasFactory;\nconst DefaultCMapReaderFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_27__.NodeCMapReaderFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.DOMCMapReaderFactory;\nconst DefaultFilterFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_27__.NodeFilterFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.DOMFilterFactory;\nconst DefaultStandardFontDataFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_27__.NodeStandardFontDataFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.DOMStandardFontDataFactory;\nfunction getDocument(src) {\n if (typeof src === \"string\" || src instanceof URL) {\n src = {\n url: src\n };\n } else if ((0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isArrayBuffer)(src)) {\n src = {\n data: src\n };\n }\n if (typeof src !== \"object\") {\n throw new Error(\"Invalid parameter in getDocument, need parameter object.\");\n }\n if (!src.url && !src.data && !src.range) {\n throw new Error(\"Invalid parameter object: need either .data, .range or .url\");\n }\n const task = new PDFDocumentLoadingTask();\n const {\n docId\n } = task;\n const url = src.url ? getUrlProp(src.url) : null;\n const data = src.data ? getDataProp(src.data) : null;\n const httpHeaders = src.httpHeaders || null;\n const withCredentials = src.withCredentials === true;\n const password = src.password ?? null;\n const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null;\n const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : DEFAULT_RANGE_CHUNK_SIZE;\n let worker = src.worker instanceof PDFWorker ? src.worker : null;\n const verbosity = src.verbosity;\n const docBaseUrl = typeof src.docBaseUrl === \"string\" && !(0,_display_utils_js__WEBPACK_IMPORTED_MODULE_25__.isDataScheme)(src.docBaseUrl) ? src.docBaseUrl : null;\n const cMapUrl = typeof src.cMapUrl === \"string\" ? src.cMapUrl : null;\n const cMapPacked = src.cMapPacked !== false;\n const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory;\n const standardFontDataUrl = typeof src.standardFontDataUrl === \"string\" ? src.standardFontDataUrl : null;\n const StandardFontDataFactory = src.StandardFontDataFactory || DefaultStandardFontDataFactory;\n const ignoreErrors = src.stopAtErrors !== true;\n const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1;\n const isEvalSupported = src.isEvalSupported !== false;\n const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === \"boolean\" ? src.isOffscreenCanvasSupported : !_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS;\n const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1;\n const disableFontFace = typeof src.disableFontFace === \"boolean\" ? src.disableFontFace : _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS;\n const fontExtraProperties = src.fontExtraProperties === true;\n const enableXfa = src.enableXfa === true;\n const ownerDocument = src.ownerDocument || globalThis.document;\n const disableRange = src.disableRange === true;\n const disableStream = src.disableStream === true;\n const disableAutoFetch = src.disableAutoFetch === true;\n const pdfBug = src.pdfBug === true;\n const length = rangeTransport ? rangeTransport.length : src.length ?? NaN;\n const useSystemFonts = typeof src.useSystemFonts === \"boolean\" ? src.useSystemFonts : !_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS && !disableFontFace;\n const useWorkerFetch = typeof src.useWorkerFetch === \"boolean\" ? src.useWorkerFetch : CMapReaderFactory === _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.DOMCMapReaderFactory && StandardFontDataFactory === _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.DOMStandardFontDataFactory && cMapUrl && standardFontDataUrl && (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_25__.isValidFetchUrl)(cMapUrl, document.baseURI) && (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_25__.isValidFetchUrl)(standardFontDataUrl, document.baseURI);\n const canvasFactory = src.canvasFactory || new DefaultCanvasFactory({\n ownerDocument\n });\n const filterFactory = src.filterFactory || new DefaultFilterFactory({\n docId,\n ownerDocument\n });\n const styleElement = null;\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.setVerbosityLevel)(verbosity);\n const transportFactory = {\n canvasFactory,\n filterFactory\n };\n if (!useWorkerFetch) {\n transportFactory.cMapReaderFactory = new CMapReaderFactory({\n baseUrl: cMapUrl,\n isCompressed: cMapPacked\n });\n transportFactory.standardFontDataFactory = new StandardFontDataFactory({\n baseUrl: standardFontDataUrl\n });\n }\n if (!worker) {\n const workerParams = {\n verbosity,\n port: _worker_options_js__WEBPACK_IMPORTED_MODULE_29__.GlobalWorkerOptions.workerPort\n };\n worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams);\n task._worker = worker;\n }\n const fetchDocParams = {\n docId,\n apiVersion: '4.0.379',\n data,\n password,\n disableAutoFetch,\n rangeChunkSize,\n length,\n docBaseUrl,\n enableXfa,\n evaluatorOptions: {\n maxImageSize,\n disableFontFace,\n ignoreErrors,\n isEvalSupported,\n isOffscreenCanvasSupported,\n canvasMaxAreaInBytes,\n fontExtraProperties,\n useSystemFonts,\n cMapUrl: useWorkerFetch ? cMapUrl : null,\n standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null\n }\n };\n const transportParams = {\n ignoreErrors,\n isEvalSupported,\n disableFontFace,\n fontExtraProperties,\n enableXfa,\n ownerDocument,\n disableAutoFetch,\n pdfBug,\n styleElement\n };\n worker.promise.then(function () {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n const workerIdPromise = _fetchDocument(worker, fetchDocParams);\n const networkStreamPromise = new Promise(function (resolve) {\n let networkStream;\n if (rangeTransport) {\n networkStream = new _transport_stream_js__WEBPACK_IMPORTED_MODULE_33__.PDFDataTransportStream({\n length,\n initialData: rangeTransport.initialData,\n progressiveDone: rangeTransport.progressiveDone,\n contentDispositionFilename: rangeTransport.contentDispositionFilename,\n disableRange,\n disableStream\n }, rangeTransport);\n } else if (!data) {\n const createPDFNetworkStream = params => {\n if (_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS) {\n return new display_node_stream__WEBPACK_IMPORTED_MODULE_36__.PDFNodeStream(params);\n }\n return (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_25__.isValidFetchUrl)(params.url) ? new display_fetch_stream__WEBPACK_IMPORTED_MODULE_34__.PDFFetchStream(params) : new display_network__WEBPACK_IMPORTED_MODULE_35__.PDFNetworkStream(params);\n };\n networkStream = createPDFNetworkStream({\n url,\n length,\n httpHeaders,\n withCredentials,\n rangeChunkSize,\n disableRange,\n disableStream\n });\n }\n resolve(networkStream);\n });\n return Promise.all([workerIdPromise, networkStreamPromise]).then(function (_ref) {\n let [workerId, networkStream] = _ref;\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n const messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_30__.MessageHandler(docId, workerId, worker.port);\n const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory);\n task._transport = transport;\n messageHandler.send(\"Ready\", null);\n });\n }).catch(task._capability.reject);\n return task;\n}\nasync function _fetchDocument(worker, source) {\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n const workerId = await worker.messageHandler.sendWithPromise(\"GetDocRequest\", source, source.data ? [source.data.buffer] : null);\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n return workerId;\n}\nfunction getUrlProp(val) {\n if (val instanceof URL) {\n return val.href;\n }\n try {\n return new URL(val, window.location).href;\n } catch {\n if (_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS && typeof val === \"string\") {\n return val;\n }\n }\n throw new Error(\"Invalid PDF url data: \" + \"either string or URL-object is expected in the url property.\");\n}\nfunction getDataProp(val) {\n if (_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS && typeof Buffer !== \"undefined\" && val instanceof Buffer) {\n throw new Error(\"Please provide binary data as `Uint8Array`, rather than `Buffer`.\");\n }\n if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {\n return val;\n }\n if (typeof val === \"string\") {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.stringToBytes)(val);\n }\n if (typeof val === \"object\" && !isNaN(val?.length) || (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isArrayBuffer)(val)) {\n return new Uint8Array(val);\n }\n throw new Error(\"Invalid PDF binary data: either TypedArray, \" + \"string, or array-like object is expected in the data property.\");\n}\nclass PDFDocumentLoadingTask {\n static #docId = 0;\n constructor() {\n this._capability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n this._transport = null;\n this._worker = null;\n this.docId = `d${PDFDocumentLoadingTask.#docId++}`;\n this.destroyed = false;\n this.onPassword = null;\n this.onProgress = null;\n }\n get promise() {\n return this._capability.promise;\n }\n async destroy() {\n this.destroyed = true;\n try {\n if (this._worker?.port) {\n this._worker._pendingDestroy = true;\n }\n await this._transport?.destroy();\n } catch (ex) {\n if (this._worker?.port) {\n delete this._worker._pendingDestroy;\n }\n throw ex;\n }\n this._transport = null;\n if (this._worker) {\n this._worker.destroy();\n this._worker = null;\n }\n }\n}\nclass PDFDataRangeTransport {\n constructor(length, initialData) {\n let progressiveDone = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let contentDispositionFilename = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n this.length = length;\n this.initialData = initialData;\n this.progressiveDone = progressiveDone;\n this.contentDispositionFilename = contentDispositionFilename;\n this._rangeListeners = [];\n this._progressListeners = [];\n this._progressiveReadListeners = [];\n this._progressiveDoneListeners = [];\n this._readyCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n }\n addRangeListener(listener) {\n this._rangeListeners.push(listener);\n }\n addProgressListener(listener) {\n this._progressListeners.push(listener);\n }\n addProgressiveReadListener(listener) {\n this._progressiveReadListeners.push(listener);\n }\n addProgressiveDoneListener(listener) {\n this._progressiveDoneListeners.push(listener);\n }\n onDataRange(begin, chunk) {\n for (const listener of this._rangeListeners) {\n listener(begin, chunk);\n }\n }\n onDataProgress(loaded, total) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressListeners) {\n listener(loaded, total);\n }\n });\n }\n onDataProgressiveRead(chunk) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveReadListeners) {\n listener(chunk);\n }\n });\n }\n onDataProgressiveDone() {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveDoneListeners) {\n listener();\n }\n });\n }\n transportReady() {\n this._readyCapability.resolve();\n }\n requestDataRange(begin, end) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.unreachable)(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n }\n abort() {}\n}\nclass PDFDocumentProxy {\n constructor(pdfInfo, transport) {\n this._pdfInfo = pdfInfo;\n this._transport = transport;\n }\n get annotationStorage() {\n return this._transport.annotationStorage;\n }\n get filterFactory() {\n return this._transport.filterFactory;\n }\n get numPages() {\n return this._pdfInfo.numPages;\n }\n get fingerprints() {\n return this._pdfInfo.fingerprints;\n }\n get isPureXfa() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.shadow)(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n get allXfaHtml() {\n return this._transport._htmlForXfa;\n }\n getPage(pageNumber) {\n return this._transport.getPage(pageNumber);\n }\n getPageIndex(ref) {\n return this._transport.getPageIndex(ref);\n }\n getDestinations() {\n return this._transport.getDestinations();\n }\n getDestination(id) {\n return this._transport.getDestination(id);\n }\n getPageLabels() {\n return this._transport.getPageLabels();\n }\n getPageLayout() {\n return this._transport.getPageLayout();\n }\n getPageMode() {\n return this._transport.getPageMode();\n }\n getViewerPreferences() {\n return this._transport.getViewerPreferences();\n }\n getOpenAction() {\n return this._transport.getOpenAction();\n }\n getAttachments() {\n return this._transport.getAttachments();\n }\n getJSActions() {\n return this._transport.getDocJSActions();\n }\n getOutline() {\n return this._transport.getOutline();\n }\n getOptionalContentConfig() {\n return this._transport.getOptionalContentConfig();\n }\n getPermissions() {\n return this._transport.getPermissions();\n }\n getMetadata() {\n return this._transport.getMetadata();\n }\n getMarkInfo() {\n return this._transport.getMarkInfo();\n }\n getData() {\n return this._transport.getData();\n }\n saveDocument() {\n return this._transport.saveDocument();\n }\n getDownloadInfo() {\n return this._transport.downloadInfoCapability.promise;\n }\n cleanup() {\n let keepLoadedFonts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n }\n destroy() {\n return this.loadingTask.destroy();\n }\n get loadingParams() {\n return this._transport.loadingParams;\n }\n get loadingTask() {\n return this._transport.loadingTask;\n }\n getFieldObjects() {\n return this._transport.getFieldObjects();\n }\n hasJSActions() {\n return this._transport.hasJSActions();\n }\n getCalculationOrderIds() {\n return this._transport.getCalculationOrderIds();\n }\n}\nclass PDFPageProxy {\n #delayedCleanupTimeout = null;\n #pendingCleanup = false;\n constructor(pageIndex, pageInfo, transport) {\n let pdfBug = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n this._pageIndex = pageIndex;\n this._pageInfo = pageInfo;\n this._transport = transport;\n this._stats = pdfBug ? new _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.StatTimer() : null;\n this._pdfBug = pdfBug;\n this.commonObjs = transport.commonObjs;\n this.objs = new PDFObjects();\n this._maybeCleanupAfterRender = false;\n this._intentStates = new Map();\n this.destroyed = false;\n }\n get pageNumber() {\n return this._pageIndex + 1;\n }\n get rotate() {\n return this._pageInfo.rotate;\n }\n get ref() {\n return this._pageInfo.ref;\n }\n get userUnit() {\n return this._pageInfo.userUnit;\n }\n get view() {\n return this._pageInfo.view;\n }\n getViewport() {\n let {\n scale,\n rotation = this.rotate,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return new _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.PageViewport({\n viewBox: this.view,\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip\n });\n }\n getAnnotations() {\n let {\n intent = \"display\"\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const intentArgs = this._transport.getRenderingIntent(intent);\n return this._transport.getAnnotations(this._pageIndex, intentArgs.renderingIntent);\n }\n getJSActions() {\n return this._transport.getPageJSActions(this._pageIndex);\n }\n get filterFactory() {\n return this._transport.filterFactory;\n }\n get isPureXfa() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.shadow)(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n async getXfa() {\n return this._transport._htmlForXfa?.children[this._pageIndex] || null;\n }\n render(_ref2) {\n let {\n canvasContext,\n viewport,\n intent = \"display\",\n annotationMode = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AnnotationMode.ENABLE,\n transform = null,\n background = null,\n optionalContentConfigPromise = null,\n annotationCanvasMap = null,\n pageColors = null,\n printAnnotationStorage = null\n } = _ref2;\n this._stats?.time(\"Overall\");\n const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage);\n this.#pendingCleanup = false;\n this.#abortDelayedCleanup();\n if (!optionalContentConfigPromise) {\n optionalContentConfigPromise = this._transport.getOptionalContentConfig();\n }\n let intentState = this._intentStates.get(intentArgs.cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(intentArgs.cacheKey, intentState);\n }\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n const intentPrint = !!(intentArgs.renderingIntent & _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.PRINT);\n if (!intentState.displayReadyCapability) {\n intentState.displayReadyCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null\n };\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n const complete = error => {\n intentState.renderTasks.delete(internalRenderTask);\n if (this._maybeCleanupAfterRender || intentPrint) {\n this.#pendingCleanup = true;\n }\n this.#tryCleanup(!intentPrint);\n if (error) {\n internalRenderTask.capability.reject(error);\n this._abortOperatorList({\n intentState,\n reason: error instanceof Error ? error : new Error(error)\n });\n } else {\n internalRenderTask.capability.resolve();\n }\n this._stats?.timeEnd(\"Rendering\");\n this._stats?.timeEnd(\"Overall\");\n };\n const internalRenderTask = new InternalRenderTask({\n callback: complete,\n params: {\n canvasContext,\n viewport,\n transform,\n background\n },\n objs: this.objs,\n commonObjs: this.commonObjs,\n annotationCanvasMap,\n operatorList: intentState.operatorList,\n pageIndex: this._pageIndex,\n canvasFactory: this._transport.canvasFactory,\n filterFactory: this._transport.filterFactory,\n useRequestAnimationFrame: !intentPrint,\n pdfBug: this._pdfBug,\n pageColors\n });\n (intentState.renderTasks ||= new Set()).add(internalRenderTask);\n const renderTask = internalRenderTask.task;\n Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(_ref3 => {\n let [transparency, optionalContentConfig] = _ref3;\n if (this.destroyed) {\n complete();\n return;\n }\n this._stats?.time(\"Rendering\");\n internalRenderTask.initializeGraphics({\n transparency,\n optionalContentConfig\n });\n internalRenderTask.operatorListChanged();\n }).catch(complete);\n return renderTask;\n }\n getOperatorList() {\n let {\n intent = \"display\",\n annotationMode = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AnnotationMode.ENABLE,\n printAnnotationStorage = null\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n function operatorListChanged() {\n if (intentState.operatorList.lastChunk) {\n intentState.opListReadCapability.resolve(intentState.operatorList);\n intentState.renderTasks.delete(opListTask);\n }\n }\n const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, true);\n let intentState = this._intentStates.get(intentArgs.cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(intentArgs.cacheKey, intentState);\n }\n let opListTask;\n if (!intentState.opListReadCapability) {\n opListTask = Object.create(null);\n opListTask.operatorListChanged = operatorListChanged;\n intentState.opListReadCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n (intentState.renderTasks ||= new Set()).add(opListTask);\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null\n };\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n return intentState.opListReadCapability.promise;\n }\n streamTextContent() {\n let {\n includeMarkedContent = false,\n disableNormalization = false\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const TEXT_CONTENT_CHUNK_SIZE = 100;\n return this._transport.messageHandler.sendWithStream(\"GetTextContent\", {\n pageIndex: this._pageIndex,\n includeMarkedContent: includeMarkedContent === true,\n disableNormalization: disableNormalization === true\n }, {\n highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n size(textContent) {\n return textContent.items.length;\n }\n });\n }\n getTextContent() {\n let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (this._transport._htmlForXfa) {\n return this.getXfa().then(xfa => {\n return _xfa_text_js__WEBPACK_IMPORTED_MODULE_37__.XfaText.textContent(xfa);\n });\n }\n const readableStream = this.streamTextContent(params);\n return new Promise(function (resolve, reject) {\n function pump() {\n reader.read().then(function (_ref4) {\n let {\n value,\n done\n } = _ref4;\n if (done) {\n resolve(textContent);\n return;\n }\n Object.assign(textContent.styles, value.styles);\n textContent.items.push(...value.items);\n pump();\n }, reject);\n }\n const reader = readableStream.getReader();\n const textContent = {\n items: [],\n styles: Object.create(null)\n };\n pump();\n });\n }\n getStructTree() {\n return this._transport.getStructTree(this._pageIndex);\n }\n _destroy() {\n this.destroyed = true;\n const waitOn = [];\n for (const intentState of this._intentStates.values()) {\n this._abortOperatorList({\n intentState,\n reason: new Error(\"Page was destroyed.\"),\n force: true\n });\n if (intentState.opListReadCapability) {\n continue;\n }\n for (const internalRenderTask of intentState.renderTasks) {\n waitOn.push(internalRenderTask.completed);\n internalRenderTask.cancel();\n }\n }\n this.objs.clear();\n this.#pendingCleanup = false;\n this.#abortDelayedCleanup();\n return Promise.all(waitOn);\n }\n cleanup() {\n let resetStats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this.#pendingCleanup = true;\n const success = this.#tryCleanup(false);\n if (resetStats && success) {\n this._stats &&= new _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.StatTimer();\n }\n return success;\n }\n #tryCleanup() {\n let delayed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this.#abortDelayedCleanup();\n if (!this.#pendingCleanup || this.destroyed) {\n return false;\n }\n if (delayed) {\n this.#delayedCleanupTimeout = setTimeout(() => {\n this.#delayedCleanupTimeout = null;\n this.#tryCleanup(false);\n }, DELAYED_CLEANUP_TIMEOUT);\n return false;\n }\n for (const {\n renderTasks,\n operatorList\n } of this._intentStates.values()) {\n if (renderTasks.size > 0 || !operatorList.lastChunk) {\n return false;\n }\n }\n this._intentStates.clear();\n this.objs.clear();\n this.#pendingCleanup = false;\n return true;\n }\n #abortDelayedCleanup() {\n if (this.#delayedCleanupTimeout) {\n clearTimeout(this.#delayedCleanupTimeout);\n this.#delayedCleanupTimeout = null;\n }\n }\n _startRenderPage(transparency, cacheKey) {\n const intentState = this._intentStates.get(cacheKey);\n if (!intentState) {\n return;\n }\n this._stats?.timeEnd(\"Page Request\");\n intentState.displayReadyCapability?.resolve(transparency);\n }\n _renderPageChunk(operatorListChunk, intentState) {\n for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n }\n intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n if (operatorListChunk.lastChunk) {\n this.#tryCleanup(true);\n }\n }\n _pumpOperatorList(_ref5) {\n let {\n renderingIntent,\n cacheKey,\n annotationStorageSerializable\n } = _ref5;\n const {\n map,\n transfer\n } = annotationStorageSerializable;\n const readableStream = this._transport.messageHandler.sendWithStream(\"GetOperatorList\", {\n pageIndex: this._pageIndex,\n intent: renderingIntent,\n cacheKey,\n annotationStorage: map\n }, transfer);\n const reader = readableStream.getReader();\n const intentState = this._intentStates.get(cacheKey);\n intentState.streamReader = reader;\n const pump = () => {\n reader.read().then(_ref6 => {\n let {\n value,\n done\n } = _ref6;\n if (done) {\n intentState.streamReader = null;\n return;\n }\n if (this._transport.destroyed) {\n return;\n }\n this._renderPageChunk(value, intentState);\n pump();\n }, reason => {\n intentState.streamReader = null;\n if (this._transport.destroyed) {\n return;\n }\n if (intentState.operatorList) {\n intentState.operatorList.lastChunk = true;\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n this.#tryCleanup(true);\n }\n if (intentState.displayReadyCapability) {\n intentState.displayReadyCapability.reject(reason);\n } else if (intentState.opListReadCapability) {\n intentState.opListReadCapability.reject(reason);\n } else {\n throw reason;\n }\n });\n };\n pump();\n }\n _abortOperatorList(_ref7) {\n let {\n intentState,\n reason,\n force = false\n } = _ref7;\n if (!intentState.streamReader) {\n return;\n }\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n if (!force) {\n if (intentState.renderTasks.size > 0) {\n return;\n }\n if (reason instanceof _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.RenderingCancelledException) {\n let delay = RENDERING_CANCELLED_TIMEOUT;\n if (reason.extraDelay > 0 && reason.extraDelay < 1000) {\n delay += reason.extraDelay;\n }\n intentState.streamReaderCancelTimeout = setTimeout(() => {\n intentState.streamReaderCancelTimeout = null;\n this._abortOperatorList({\n intentState,\n reason,\n force: true\n });\n }, delay);\n return;\n }\n }\n intentState.streamReader.cancel(new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AbortException(reason.message)).catch(() => {});\n intentState.streamReader = null;\n if (this._transport.destroyed) {\n return;\n }\n for (const [curCacheKey, curIntentState] of this._intentStates) {\n if (curIntentState === intentState) {\n this._intentStates.delete(curCacheKey);\n break;\n }\n }\n this.cleanup();\n }\n get stats() {\n return this._stats;\n }\n}\nclass LoopbackPort {\n #listeners = new Set();\n #deferred = Promise.resolve();\n postMessage(obj, transfer) {\n const event = {\n data: structuredClone(obj, transfer ? {\n transfer\n } : null)\n };\n this.#deferred.then(() => {\n for (const listener of this.#listeners) {\n listener.call(this, event);\n }\n });\n }\n addEventListener(name, listener) {\n this.#listeners.add(listener);\n }\n removeEventListener(name, listener) {\n this.#listeners.delete(listener);\n }\n terminate() {\n this.#listeners.clear();\n }\n}\nconst PDFWorkerUtil = {\n isWorkerDisabled: false,\n fakeWorkerId: 0\n};\n{\n if (_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.isNodeJS) {\n PDFWorkerUtil.isWorkerDisabled = true;\n _worker_options_js__WEBPACK_IMPORTED_MODULE_29__.GlobalWorkerOptions.workerSrc ||= \"./pdf.worker.mjs\";\n }\n PDFWorkerUtil.isSameOrigin = function (baseUrl, otherUrl) {\n let base;\n try {\n base = new URL(baseUrl);\n if (!base.origin || base.origin === \"null\") {\n return false;\n }\n } catch {\n return false;\n }\n const other = new URL(otherUrl, base);\n return base.origin === other.origin;\n };\n PDFWorkerUtil.createCDNWrapper = function (url) {\n const wrapper = `await import(\"${url}\");`;\n return URL.createObjectURL(new Blob([wrapper], {\n type: \"text/javascript\"\n }));\n };\n}\nclass PDFWorker {\n static #workerPorts;\n constructor() {\n let {\n name = null,\n port = null,\n verbosity = (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.getVerbosityLevel)()\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.name = name;\n this.destroyed = false;\n this.verbosity = verbosity;\n this._readyCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n this._port = null;\n this._webWorker = null;\n this._messageHandler = null;\n if (port) {\n if (PDFWorker.#workerPorts?.has(port)) {\n throw new Error(\"Cannot use more than one PDFWorker per port.\");\n }\n (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this);\n this._initializeFromPort(port);\n return;\n }\n this._initialize();\n }\n get promise() {\n return this._readyCapability.promise;\n }\n get port() {\n return this._port;\n }\n get messageHandler() {\n return this._messageHandler;\n }\n _initializeFromPort(port) {\n this._port = port;\n this._messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_30__.MessageHandler(\"main\", \"worker\", port);\n this._messageHandler.on(\"ready\", function () {});\n this._readyCapability.resolve();\n this._messageHandler.send(\"configure\", {\n verbosity: this.verbosity\n });\n }\n _initialize() {\n if (!PDFWorkerUtil.isWorkerDisabled && !PDFWorker.#mainThreadWorkerMessageHandler) {\n let {\n workerSrc\n } = PDFWorker;\n try {\n if (!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)) {\n workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href);\n }\n const worker = new Worker(workerSrc, {\n type: \"module\"\n });\n const messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_30__.MessageHandler(\"main\", \"worker\", worker);\n const terminateEarly = () => {\n worker.removeEventListener(\"error\", onWorkerError);\n messageHandler.destroy();\n worker.terminate();\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n } else {\n this._setupFakeWorker();\n }\n };\n const onWorkerError = () => {\n if (!this._webWorker) {\n terminateEarly();\n }\n };\n worker.addEventListener(\"error\", onWorkerError);\n messageHandler.on(\"test\", data => {\n worker.removeEventListener(\"error\", onWorkerError);\n if (this.destroyed) {\n terminateEarly();\n return;\n }\n if (data) {\n this._messageHandler = messageHandler;\n this._port = worker;\n this._webWorker = worker;\n this._readyCapability.resolve();\n messageHandler.send(\"configure\", {\n verbosity: this.verbosity\n });\n } else {\n this._setupFakeWorker();\n messageHandler.destroy();\n worker.terminate();\n }\n });\n messageHandler.on(\"ready\", data => {\n worker.removeEventListener(\"error\", onWorkerError);\n if (this.destroyed) {\n terminateEarly();\n return;\n }\n try {\n sendTest();\n } catch {\n this._setupFakeWorker();\n }\n });\n const sendTest = () => {\n const testObj = new Uint8Array();\n messageHandler.send(\"test\", testObj, [testObj.buffer]);\n };\n sendTest();\n return;\n } catch {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.info)(\"The worker has been disabled.\");\n }\n }\n this._setupFakeWorker();\n }\n _setupFakeWorker() {\n if (!PDFWorkerUtil.isWorkerDisabled) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.warn)(\"Setting up fake worker.\");\n PDFWorkerUtil.isWorkerDisabled = true;\n }\n PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => {\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n return;\n }\n const port = new LoopbackPort();\n this._port = port;\n const id = `fake${PDFWorkerUtil.fakeWorkerId++}`;\n const workerHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_30__.MessageHandler(id + \"_worker\", id, port);\n WorkerMessageHandler.setup(workerHandler, port);\n const messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_30__.MessageHandler(id, id + \"_worker\", port);\n this._messageHandler = messageHandler;\n this._readyCapability.resolve();\n messageHandler.send(\"configure\", {\n verbosity: this.verbosity\n });\n }).catch(reason => {\n this._readyCapability.reject(new Error(`Setting up fake worker failed: \"${reason.message}\".`));\n });\n }\n destroy() {\n this.destroyed = true;\n if (this._webWorker) {\n this._webWorker.terminate();\n this._webWorker = null;\n }\n PDFWorker.#workerPorts?.delete(this._port);\n this._port = null;\n if (this._messageHandler) {\n this._messageHandler.destroy();\n this._messageHandler = null;\n }\n }\n static fromPort(params) {\n if (!params?.port) {\n throw new Error(\"PDFWorker.fromPort - invalid method signature.\");\n }\n const cachedPort = this.#workerPorts?.get(params.port);\n if (cachedPort) {\n if (cachedPort._pendingDestroy) {\n throw new Error(\"PDFWorker.fromPort - the worker is being destroyed.\\n\" + \"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.\");\n }\n return cachedPort;\n }\n return new PDFWorker(params);\n }\n static get workerSrc() {\n if (_worker_options_js__WEBPACK_IMPORTED_MODULE_29__.GlobalWorkerOptions.workerSrc) {\n return _worker_options_js__WEBPACK_IMPORTED_MODULE_29__.GlobalWorkerOptions.workerSrc;\n }\n throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n }\n static get #mainThreadWorkerMessageHandler() {\n try {\n return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n } catch {\n return null;\n }\n }\n static get _setupFakeWorkerGlobal() {\n const loader = async () => {\n if (this.#mainThreadWorkerMessageHandler) {\n return this.#mainThreadWorkerMessageHandler;\n }\n const worker = await import(/* webpackIgnore: true */ this.workerSrc);\n return worker.WorkerMessageHandler;\n };\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.shadow)(this, \"_setupFakeWorkerGlobal\", loader());\n }\n}\nclass WorkerTransport {\n #methodPromises = new Map();\n #pageCache = new Map();\n #pagePromises = new Map();\n #passwordCapability = null;\n constructor(messageHandler, loadingTask, networkStream, params, factory) {\n this.messageHandler = messageHandler;\n this.loadingTask = loadingTask;\n this.commonObjs = new PDFObjects();\n this.fontLoader = new _font_loader_js__WEBPACK_IMPORTED_MODULE_26__.FontLoader({\n ownerDocument: params.ownerDocument,\n styleElement: params.styleElement\n });\n this._params = params;\n this.canvasFactory = factory.canvasFactory;\n this.filterFactory = factory.filterFactory;\n this.cMapReaderFactory = factory.cMapReaderFactory;\n this.standardFontDataFactory = factory.standardFontDataFactory;\n this.destroyed = false;\n this.destroyCapability = null;\n this._networkStream = networkStream;\n this._fullReader = null;\n this._lastProgress = null;\n this.downloadInfoCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n this.setupMessageHandler();\n }\n #cacheSimpleMethod(name) {\n let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n const cachedPromise = this.#methodPromises.get(name);\n if (cachedPromise) {\n return cachedPromise;\n }\n const promise = this.messageHandler.sendWithPromise(name, data);\n this.#methodPromises.set(name, promise);\n return promise;\n }\n get annotationStorage() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.shadow)(this, \"annotationStorage\", new _annotation_storage_js__WEBPACK_IMPORTED_MODULE_24__.AnnotationStorage());\n }\n getRenderingIntent(intent) {\n let annotationMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AnnotationMode.ENABLE;\n let printAnnotationStorage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n let isOpList = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n let renderingIntent = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.DISPLAY;\n let annotationStorageSerializable = _annotation_storage_js__WEBPACK_IMPORTED_MODULE_24__.SerializableEmpty;\n switch (intent) {\n case \"any\":\n renderingIntent = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.ANY;\n break;\n case \"display\":\n break;\n case \"print\":\n renderingIntent = _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.PRINT;\n break;\n default:\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.warn)(`getRenderingIntent - invalid intent: ${intent}`);\n }\n switch (annotationMode) {\n case _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AnnotationMode.DISABLE:\n renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.ANNOTATIONS_DISABLE;\n break;\n case _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AnnotationMode.ENABLE:\n break;\n case _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AnnotationMode.ENABLE_FORMS:\n renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.ANNOTATIONS_FORMS;\n break;\n case _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AnnotationMode.ENABLE_STORAGE:\n renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.ANNOTATIONS_STORAGE;\n const annotationStorage = renderingIntent & _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.PRINT && printAnnotationStorage instanceof _annotation_storage_js__WEBPACK_IMPORTED_MODULE_24__.PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage;\n annotationStorageSerializable = annotationStorage.serializable;\n break;\n default:\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.warn)(`getRenderingIntent - invalid annotationMode: ${annotationMode}`);\n }\n if (isOpList) {\n renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.RenderingIntentFlag.OPLIST;\n }\n return {\n renderingIntent,\n cacheKey: `${renderingIntent}_${annotationStorageSerializable.hash}`,\n annotationStorageSerializable\n };\n }\n destroy() {\n if (this.destroyCapability) {\n return this.destroyCapability.promise;\n }\n this.destroyed = true;\n this.destroyCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n this.#passwordCapability?.reject(new Error(\"Worker was destroyed during onPassword callback\"));\n const waitOn = [];\n for (const page of this.#pageCache.values()) {\n waitOn.push(page._destroy());\n }\n this.#pageCache.clear();\n this.#pagePromises.clear();\n if (this.hasOwnProperty(\"annotationStorage\")) {\n this.annotationStorage.resetModified();\n }\n const terminated = this.messageHandler.sendWithPromise(\"Terminate\", null);\n waitOn.push(terminated);\n Promise.all(waitOn).then(() => {\n this.commonObjs.clear();\n this.fontLoader.clear();\n this.#methodPromises.clear();\n this.filterFactory.destroy();\n this._networkStream?.cancelAllRequests(new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.AbortException(\"Worker was terminated.\"));\n if (this.messageHandler) {\n this.messageHandler.destroy();\n this.messageHandler = null;\n }\n this.destroyCapability.resolve();\n }, this.destroyCapability.reject);\n return this.destroyCapability.promise;\n }\n setupMessageHandler() {\n const {\n messageHandler,\n loadingTask\n } = this;\n messageHandler.on(\"GetReader\", (data, sink) => {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.assert)(this._networkStream, \"GetReader - no `IPDFStream` instance available.\");\n this._fullReader = this._networkStream.getFullReader();\n this._fullReader.onProgress = evt => {\n this._lastProgress = {\n loaded: evt.loaded,\n total: evt.total\n };\n };\n sink.onPull = () => {\n this._fullReader.read().then(function (_ref8) {\n let {\n value,\n done\n } = _ref8;\n if (done) {\n sink.close();\n return;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.assert)(value instanceof ArrayBuffer, \"GetReader - expected an ArrayBuffer.\");\n sink.enqueue(new Uint8Array(value), 1, [value]);\n }).catch(reason => {\n sink.error(reason);\n });\n };\n sink.onCancel = reason => {\n this._fullReader.cancel(reason);\n sink.ready.catch(readyReason => {\n if (this.destroyed) {\n return;\n }\n throw readyReason;\n });\n };\n });\n messageHandler.on(\"ReaderHeadersReady\", data => {\n const headersCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n const fullReader = this._fullReader;\n fullReader.headersReady.then(() => {\n if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {\n if (this._lastProgress) {\n loadingTask.onProgress?.(this._lastProgress);\n }\n fullReader.onProgress = evt => {\n loadingTask.onProgress?.({\n loaded: evt.loaded,\n total: evt.total\n });\n };\n }\n headersCapability.resolve({\n isStreamingSupported: fullReader.isStreamingSupported,\n isRangeSupported: fullReader.isRangeSupported,\n contentLength: fullReader.contentLength\n });\n }, headersCapability.reject);\n return headersCapability.promise;\n });\n messageHandler.on(\"GetRangeReader\", (data, sink) => {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.assert)(this._networkStream, \"GetRangeReader - no `IPDFStream` instance available.\");\n const rangeReader = this._networkStream.getRangeReader(data.begin, data.end);\n if (!rangeReader) {\n sink.close();\n return;\n }\n sink.onPull = () => {\n rangeReader.read().then(function (_ref9) {\n let {\n value,\n done\n } = _ref9;\n if (done) {\n sink.close();\n return;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.assert)(value instanceof ArrayBuffer, \"GetRangeReader - expected an ArrayBuffer.\");\n sink.enqueue(new Uint8Array(value), 1, [value]);\n }).catch(reason => {\n sink.error(reason);\n });\n };\n sink.onCancel = reason => {\n rangeReader.cancel(reason);\n sink.ready.catch(readyReason => {\n if (this.destroyed) {\n return;\n }\n throw readyReason;\n });\n };\n });\n messageHandler.on(\"GetDoc\", _ref10 => {\n let {\n pdfInfo\n } = _ref10;\n this._numPages = pdfInfo.numPages;\n this._htmlForXfa = pdfInfo.htmlForXfa;\n delete pdfInfo.htmlForXfa;\n loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));\n });\n messageHandler.on(\"DocException\", function (ex) {\n let reason;\n switch (ex.name) {\n case \"PasswordException\":\n reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PasswordException(ex.message, ex.code);\n break;\n case \"InvalidPDFException\":\n reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.InvalidPDFException(ex.message);\n break;\n case \"MissingPDFException\":\n reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.MissingPDFException(ex.message);\n break;\n case \"UnexpectedResponseException\":\n reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.UnexpectedResponseException(ex.message, ex.status);\n break;\n case \"UnknownErrorException\":\n reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.UnknownErrorException(ex.message, ex.details);\n break;\n default:\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.unreachable)(\"DocException - expected a valid Error.\");\n }\n loadingTask._capability.reject(reason);\n });\n messageHandler.on(\"PasswordRequest\", exception => {\n this.#passwordCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n if (loadingTask.onPassword) {\n const updatePassword = password => {\n if (password instanceof Error) {\n this.#passwordCapability.reject(password);\n } else {\n this.#passwordCapability.resolve({\n password\n });\n }\n };\n try {\n loadingTask.onPassword(updatePassword, exception.code);\n } catch (ex) {\n this.#passwordCapability.reject(ex);\n }\n } else {\n this.#passwordCapability.reject(new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PasswordException(exception.message, exception.code));\n }\n return this.#passwordCapability.promise;\n });\n messageHandler.on(\"DataLoaded\", data => {\n loadingTask.onProgress?.({\n loaded: data.length,\n total: data.length\n });\n this.downloadInfoCapability.resolve(data);\n });\n messageHandler.on(\"StartRenderPage\", data => {\n if (this.destroyed) {\n return;\n }\n const page = this.#pageCache.get(data.pageIndex);\n page._startRenderPage(data.transparency, data.cacheKey);\n });\n messageHandler.on(\"commonobj\", _ref11 => {\n let [id, type, exportedData] = _ref11;\n if (this.destroyed) {\n return null;\n }\n if (this.commonObjs.has(id)) {\n return null;\n }\n switch (type) {\n case \"Font\":\n const params = this._params;\n if (\"error\" in exportedData) {\n const exportedError = exportedData.error;\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.warn)(`Error during font loading: ${exportedError}`);\n this.commonObjs.resolve(id, exportedError);\n break;\n }\n const inspectFont = params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null;\n const font = new _font_loader_js__WEBPACK_IMPORTED_MODULE_26__.FontFaceObject(exportedData, {\n isEvalSupported: params.isEvalSupported,\n disableFontFace: params.disableFontFace,\n ignoreErrors: params.ignoreErrors,\n inspectFont\n });\n this.fontLoader.bind(font).catch(reason => {\n return messageHandler.sendWithPromise(\"FontFallback\", {\n id\n });\n }).finally(() => {\n if (!params.fontExtraProperties && font.data) {\n font.data = null;\n }\n this.commonObjs.resolve(id, font);\n });\n break;\n case \"CopyLocalImage\":\n const {\n imageRef\n } = exportedData;\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.assert)(imageRef, \"The imageRef must be defined.\");\n for (const pageProxy of this.#pageCache.values()) {\n for (const [, data] of pageProxy.objs) {\n if (data.ref !== imageRef) {\n continue;\n }\n if (!data.dataLen) {\n return null;\n }\n this.commonObjs.resolve(id, structuredClone(data));\n return data.dataLen;\n }\n }\n break;\n case \"FontPath\":\n case \"Image\":\n case \"Pattern\":\n this.commonObjs.resolve(id, exportedData);\n break;\n default:\n throw new Error(`Got unknown common object type ${type}`);\n }\n return null;\n });\n messageHandler.on(\"obj\", _ref12 => {\n let [id, pageIndex, type, imageData] = _ref12;\n if (this.destroyed) {\n return;\n }\n const pageProxy = this.#pageCache.get(pageIndex);\n if (pageProxy.objs.has(id)) {\n return;\n }\n if (pageProxy._intentStates.size === 0) {\n imageData?.bitmap?.close();\n return;\n }\n switch (type) {\n case \"Image\":\n pageProxy.objs.resolve(id, imageData);\n if (imageData?.dataLen > _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.MAX_IMAGE_SIZE_TO_CACHE) {\n pageProxy._maybeCleanupAfterRender = true;\n }\n break;\n case \"Pattern\":\n pageProxy.objs.resolve(id, imageData);\n break;\n default:\n throw new Error(`Got unknown object type ${type}`);\n }\n });\n messageHandler.on(\"DocProgress\", data => {\n if (this.destroyed) {\n return;\n }\n loadingTask.onProgress?.({\n loaded: data.loaded,\n total: data.total\n });\n });\n messageHandler.on(\"FetchBuiltInCMap\", data => {\n if (this.destroyed) {\n return Promise.reject(new Error(\"Worker was destroyed.\"));\n }\n if (!this.cMapReaderFactory) {\n return Promise.reject(new Error(\"CMapReaderFactory not initialized, see the `useWorkerFetch` parameter.\"));\n }\n return this.cMapReaderFactory.fetch(data);\n });\n messageHandler.on(\"FetchStandardFontData\", data => {\n if (this.destroyed) {\n return Promise.reject(new Error(\"Worker was destroyed.\"));\n }\n if (!this.standardFontDataFactory) {\n return Promise.reject(new Error(\"StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter.\"));\n }\n return this.standardFontDataFactory.fetch(data);\n });\n }\n getData() {\n return this.messageHandler.sendWithPromise(\"GetData\", null);\n }\n saveDocument() {\n if (this.annotationStorage.size <= 0) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.warn)(\"saveDocument called while `annotationStorage` is empty, \" + \"please use the getData-method instead.\");\n }\n const {\n map,\n transfer\n } = this.annotationStorage.serializable;\n return this.messageHandler.sendWithPromise(\"SaveDocument\", {\n isPureXfa: !!this._htmlForXfa,\n numPages: this._numPages,\n annotationStorage: map,\n filename: this._fullReader?.filename ?? null\n }, transfer).finally(() => {\n this.annotationStorage.resetModified();\n });\n }\n getPage(pageNumber) {\n if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) {\n return Promise.reject(new Error(\"Invalid page request.\"));\n }\n const pageIndex = pageNumber - 1,\n cachedPromise = this.#pagePromises.get(pageIndex);\n if (cachedPromise) {\n return cachedPromise;\n }\n const promise = this.messageHandler.sendWithPromise(\"GetPage\", {\n pageIndex\n }).then(pageInfo => {\n if (this.destroyed) {\n throw new Error(\"Transport destroyed\");\n }\n const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug);\n this.#pageCache.set(pageIndex, page);\n return page;\n });\n this.#pagePromises.set(pageIndex, promise);\n return promise;\n }\n getPageIndex(ref) {\n if (typeof ref !== \"object\" || ref === null || !Number.isInteger(ref.num) || ref.num < 0 || !Number.isInteger(ref.gen) || ref.gen < 0) {\n return Promise.reject(new Error(\"Invalid pageIndex request.\"));\n }\n return this.messageHandler.sendWithPromise(\"GetPageIndex\", {\n num: ref.num,\n gen: ref.gen\n });\n }\n getAnnotations(pageIndex, intent) {\n return this.messageHandler.sendWithPromise(\"GetAnnotations\", {\n pageIndex,\n intent\n });\n }\n getFieldObjects() {\n return this.#cacheSimpleMethod(\"GetFieldObjects\");\n }\n hasJSActions() {\n return this.#cacheSimpleMethod(\"HasJSActions\");\n }\n getCalculationOrderIds() {\n return this.messageHandler.sendWithPromise(\"GetCalculationOrderIds\", null);\n }\n getDestinations() {\n return this.messageHandler.sendWithPromise(\"GetDestinations\", null);\n }\n getDestination(id) {\n if (typeof id !== \"string\") {\n return Promise.reject(new Error(\"Invalid destination request.\"));\n }\n return this.messageHandler.sendWithPromise(\"GetDestination\", {\n id\n });\n }\n getPageLabels() {\n return this.messageHandler.sendWithPromise(\"GetPageLabels\", null);\n }\n getPageLayout() {\n return this.messageHandler.sendWithPromise(\"GetPageLayout\", null);\n }\n getPageMode() {\n return this.messageHandler.sendWithPromise(\"GetPageMode\", null);\n }\n getViewerPreferences() {\n return this.messageHandler.sendWithPromise(\"GetViewerPreferences\", null);\n }\n getOpenAction() {\n return this.messageHandler.sendWithPromise(\"GetOpenAction\", null);\n }\n getAttachments() {\n return this.messageHandler.sendWithPromise(\"GetAttachments\", null);\n }\n getDocJSActions() {\n return this.#cacheSimpleMethod(\"GetDocJSActions\");\n }\n getPageJSActions(pageIndex) {\n return this.messageHandler.sendWithPromise(\"GetPageJSActions\", {\n pageIndex\n });\n }\n getStructTree(pageIndex) {\n return this.messageHandler.sendWithPromise(\"GetStructTree\", {\n pageIndex\n });\n }\n getOutline() {\n return this.messageHandler.sendWithPromise(\"GetOutline\", null);\n }\n getOptionalContentConfig() {\n return this.messageHandler.sendWithPromise(\"GetOptionalContentConfig\", null).then(results => {\n return new _optional_content_config_js__WEBPACK_IMPORTED_MODULE_32__.OptionalContentConfig(results);\n });\n }\n getPermissions() {\n return this.messageHandler.sendWithPromise(\"GetPermissions\", null);\n }\n getMetadata() {\n const name = \"GetMetadata\",\n cachedPromise = this.#methodPromises.get(name);\n if (cachedPromise) {\n return cachedPromise;\n }\n const promise = this.messageHandler.sendWithPromise(name, null).then(results => {\n return {\n info: results[0],\n metadata: results[1] ? new _metadata_js__WEBPACK_IMPORTED_MODULE_31__.Metadata(results[1]) : null,\n contentDispositionFilename: this._fullReader?.filename ?? null,\n contentLength: this._fullReader?.contentLength ?? null\n };\n });\n this.#methodPromises.set(name, promise);\n return promise;\n }\n getMarkInfo() {\n return this.messageHandler.sendWithPromise(\"GetMarkInfo\", null);\n }\n async startCleanup() {\n let keepLoadedFonts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (this.destroyed) {\n return;\n }\n await this.messageHandler.sendWithPromise(\"Cleanup\", null);\n for (const page of this.#pageCache.values()) {\n const cleanupSuccessful = page.cleanup();\n if (!cleanupSuccessful) {\n throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`);\n }\n }\n this.commonObjs.clear();\n if (!keepLoadedFonts) {\n this.fontLoader.clear();\n }\n this.#methodPromises.clear();\n this.filterFactory.destroy(true);\n }\n get loadingParams() {\n const {\n disableAutoFetch,\n enableXfa\n } = this._params;\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_23__.shadow)(this, \"loadingParams\", {\n disableAutoFetch,\n enableXfa\n });\n }\n}\nclass PDFObjects {\n #objs = Object.create(null);\n #ensureObj(objId) {\n return this.#objs[objId] ||= {\n capability: new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability(),\n data: null\n };\n }\n get(objId) {\n let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (callback) {\n const obj = this.#ensureObj(objId);\n obj.capability.promise.then(() => callback(obj.data));\n return null;\n }\n const obj = this.#objs[objId];\n if (!obj?.capability.settled) {\n throw new Error(`Requesting object that isn't resolved yet ${objId}.`);\n }\n return obj.data;\n }\n has(objId) {\n const obj = this.#objs[objId];\n return obj?.capability.settled ?? false;\n }\n resolve(objId) {\n let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n const obj = this.#ensureObj(objId);\n obj.data = data;\n obj.capability.resolve();\n }\n clear() {\n for (const objId in this.#objs) {\n const {\n data\n } = this.#objs[objId];\n data?.bitmap?.close();\n }\n this.#objs = Object.create(null);\n }\n *[Symbol.iterator]() {\n for (const objId in this.#objs) {\n const {\n capability,\n data\n } = this.#objs[objId];\n if (!capability.settled) {\n continue;\n }\n yield [objId, data];\n }\n }\n}\nclass RenderTask {\n #internalRenderTask = null;\n constructor(internalRenderTask) {\n this.#internalRenderTask = internalRenderTask;\n this.onContinue = null;\n }\n get promise() {\n return this.#internalRenderTask.capability.promise;\n }\n cancel() {\n let extraDelay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n this.#internalRenderTask.cancel(null, extraDelay);\n }\n get separateAnnots() {\n const {\n separateAnnots\n } = this.#internalRenderTask.operatorList;\n if (!separateAnnots) {\n return false;\n }\n const {\n annotationCanvasMap\n } = this.#internalRenderTask;\n return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0;\n }\n}\nclass InternalRenderTask {\n static #canvasInUse = new WeakSet();\n constructor(_ref13) {\n let {\n callback,\n params,\n objs,\n commonObjs,\n annotationCanvasMap,\n operatorList,\n pageIndex,\n canvasFactory,\n filterFactory,\n useRequestAnimationFrame = false,\n pdfBug = false,\n pageColors = null\n } = _ref13;\n this.callback = callback;\n this.params = params;\n this.objs = objs;\n this.commonObjs = commonObjs;\n this.annotationCanvasMap = annotationCanvasMap;\n this.operatorListIdx = null;\n this.operatorList = operatorList;\n this._pageIndex = pageIndex;\n this.canvasFactory = canvasFactory;\n this.filterFactory = filterFactory;\n this._pdfBug = pdfBug;\n this.pageColors = pageColors;\n this.running = false;\n this.graphicsReadyCallback = null;\n this.graphicsReady = false;\n this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== \"undefined\";\n this.cancelled = false;\n this.capability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_23__.PromiseCapability();\n this.task = new RenderTask(this);\n this._cancelBound = this.cancel.bind(this);\n this._continueBound = this._continue.bind(this);\n this._scheduleNextBound = this._scheduleNext.bind(this);\n this._nextBound = this._next.bind(this);\n this._canvas = params.canvasContext.canvas;\n }\n get completed() {\n return this.capability.promise.catch(function () {});\n }\n initializeGraphics(_ref14) {\n let {\n transparency = false,\n optionalContentConfig\n } = _ref14;\n if (this.cancelled) {\n return;\n }\n if (this._canvas) {\n if (InternalRenderTask.#canvasInUse.has(this._canvas)) {\n throw new Error(\"Cannot use the same canvas during multiple render() operations. \" + \"Use different canvas or ensure previous operations were \" + \"cancelled or completed.\");\n }\n InternalRenderTask.#canvasInUse.add(this._canvas);\n }\n if (this._pdfBug && globalThis.StepperManager?.enabled) {\n this.stepper = globalThis.StepperManager.create(this._pageIndex);\n this.stepper.init(this.operatorList);\n this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n }\n const {\n canvasContext,\n viewport,\n transform,\n background\n } = this.params;\n this.gfx = new _canvas_js__WEBPACK_IMPORTED_MODULE_28__.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {\n optionalContentConfig\n }, this.annotationCanvasMap, this.pageColors);\n this.gfx.beginDrawing({\n transform,\n viewport,\n transparency,\n background\n });\n this.operatorListIdx = 0;\n this.graphicsReady = true;\n this.graphicsReadyCallback?.();\n }\n cancel() {\n let error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n let extraDelay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n this.running = false;\n this.cancelled = true;\n this.gfx?.endDrawing();\n InternalRenderTask.#canvasInUse.delete(this._canvas);\n this.callback(error || new _display_utils_js__WEBPACK_IMPORTED_MODULE_25__.RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay));\n }\n operatorListChanged() {\n if (!this.graphicsReady) {\n this.graphicsReadyCallback ||= this._continueBound;\n return;\n }\n this.stepper?.updateOperatorList(this.operatorList);\n if (this.running) {\n return;\n }\n this._continue();\n }\n _continue() {\n this.running = true;\n if (this.cancelled) {\n return;\n }\n if (this.task.onContinue) {\n this.task.onContinue(this._scheduleNextBound);\n } else {\n this._scheduleNext();\n }\n }\n _scheduleNext() {\n if (this._useRequestAnimationFrame) {\n window.requestAnimationFrame(() => {\n this._nextBound().catch(this._cancelBound);\n });\n } else {\n Promise.resolve().then(this._nextBound).catch(this._cancelBound);\n }\n }\n async _next() {\n if (this.cancelled) {\n return;\n }\n this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper);\n if (this.operatorListIdx === this.operatorList.argsArray.length) {\n this.running = false;\n if (this.operatorList.lastChunk) {\n this.gfx.endDrawing();\n InternalRenderTask.#canvasInUse.delete(this._canvas);\n this.callback();\n }\n }\n }\n}\nconst version = '4.0.379';\nconst build = '9e14d04fd';\n\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } });\n\n/***/ }),\n\n/***/ 6822:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_280877__) => {\n\n/* harmony export */ __nested_webpack_require_280877__.d(__nested_webpack_exports__, {\n/* harmony export */ BaseCMapReaderFactory: () => (/* binding */ BaseCMapReaderFactory),\n/* harmony export */ BaseCanvasFactory: () => (/* binding */ BaseCanvasFactory),\n/* harmony export */ BaseFilterFactory: () => (/* binding */ BaseFilterFactory),\n/* harmony export */ BaseSVGFactory: () => (/* binding */ BaseSVGFactory),\n/* harmony export */ BaseStandardFontDataFactory: () => (/* binding */ BaseStandardFontDataFactory)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_280877__(3352);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_280877__(3266);\n\n\nclass BaseFilterFactory {\n constructor() {\n if (this.constructor === BaseFilterFactory) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Cannot initialize BaseFilterFactory.\");\n }\n }\n addFilter(maps) {\n return \"none\";\n }\n addHCMFilter(fgColor, bgColor) {\n return \"none\";\n }\n addHighlightHCMFilter(fgColor, bgColor, newFgColor, newBgColor) {\n return \"none\";\n }\n destroy() {\n let keepHCM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n }\n}\nclass BaseCanvasFactory {\n constructor() {\n if (this.constructor === BaseCanvasFactory) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Cannot initialize BaseCanvasFactory.\");\n }\n }\n create(width, height) {\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n const canvas = this._createCanvas(width, height);\n return {\n canvas,\n context: canvas.getContext(\"2d\")\n };\n }\n reset(canvasAndContext, width, height) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n canvasAndContext.canvas.width = width;\n canvasAndContext.canvas.height = height;\n }\n destroy(canvasAndContext) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n canvasAndContext.canvas.width = 0;\n canvasAndContext.canvas.height = 0;\n canvasAndContext.canvas = null;\n canvasAndContext.context = null;\n }\n _createCanvas(width, height) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Abstract method `_createCanvas` called.\");\n }\n}\nclass BaseCMapReaderFactory {\n constructor(_ref) {\n let {\n baseUrl = null,\n isCompressed = true\n } = _ref;\n if (this.constructor === BaseCMapReaderFactory) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Cannot initialize BaseCMapReaderFactory.\");\n }\n this.baseUrl = baseUrl;\n this.isCompressed = isCompressed;\n }\n async fetch(_ref2) {\n let {\n name\n } = _ref2;\n if (!this.baseUrl) {\n throw new Error('The CMap \"baseUrl\" parameter must be specified, ensure that ' + 'the \"cMapUrl\" and \"cMapPacked\" API parameters are provided.');\n }\n if (!name) {\n throw new Error(\"CMap name must be specified.\");\n }\n const url = this.baseUrl + name + (this.isCompressed ? \".bcmap\" : \"\");\n const compressionType = this.isCompressed ? _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.CMapCompressionType.BINARY : _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.CMapCompressionType.NONE;\n return this._fetchData(url, compressionType).catch(reason => {\n throw new Error(`Unable to load ${this.isCompressed ? \"binary \" : \"\"}CMap at: ${url}`);\n });\n }\n _fetchData(url, compressionType) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Abstract method `_fetchData` called.\");\n }\n}\nclass BaseStandardFontDataFactory {\n constructor(_ref3) {\n let {\n baseUrl = null\n } = _ref3;\n if (this.constructor === BaseStandardFontDataFactory) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Cannot initialize BaseStandardFontDataFactory.\");\n }\n this.baseUrl = baseUrl;\n }\n async fetch(_ref4) {\n let {\n filename\n } = _ref4;\n if (!this.baseUrl) {\n throw new Error('The standard font \"baseUrl\" parameter must be specified, ensure that ' + 'the \"standardFontDataUrl\" API parameter is provided.');\n }\n if (!filename) {\n throw new Error(\"Font filename must be specified.\");\n }\n const url = `${this.baseUrl}${filename}`;\n return this._fetchData(url).catch(reason => {\n throw new Error(`Unable to load font data at: ${url}`);\n });\n }\n _fetchData(url) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Abstract method `_fetchData` called.\");\n }\n}\nclass BaseSVGFactory {\n constructor() {\n if (this.constructor === BaseSVGFactory) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Cannot initialize BaseSVGFactory.\");\n }\n }\n create(width, height) {\n let skipDimensions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid SVG dimensions\");\n }\n const svg = this._createSVG(\"svg:svg\");\n svg.setAttribute(\"version\", \"1.1\");\n if (!skipDimensions) {\n svg.setAttribute(\"width\", `${width}px`);\n svg.setAttribute(\"height\", `${height}px`);\n }\n svg.setAttribute(\"preserveAspectRatio\", \"none\");\n svg.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n return svg;\n }\n createElement(type) {\n if (typeof type !== \"string\") {\n throw new Error(\"Invalid SVG element type\");\n }\n return this._createSVG(type);\n }\n _createSVG(type) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)(\"Abstract method `_createSVG` called.\");\n }\n}\n\n\n/***/ }),\n\n/***/ 1250:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_286742__) => {\n\n\n// EXPORTS\n__nested_webpack_require_286742__.d(__nested_webpack_exports__, {\n CanvasGraphics: () => (/* binding */ CanvasGraphics)\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.error.cause.js\nvar es_error_cause = __nested_webpack_require_286742__(3352);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find-last.js\nvar es_typed_array_find_last = __nested_webpack_require_286742__(8837);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find-last-index.js\nvar es_typed_array_find_last_index = __nested_webpack_require_286742__(9803);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.set.js\nvar es_typed_array_set = __nested_webpack_require_286742__(8347);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-reversed.js\nvar es_typed_array_to_reversed = __nested_webpack_require_286742__(7995);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-sorted.js\nvar es_typed_array_to_sorted = __nested_webpack_require_286742__(62);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js\nvar es_typed_array_with = __nested_webpack_require_286742__(4602);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.detached.js\nvar esnext_array_buffer_detached = __nested_webpack_require_286742__(344);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.transfer.js\nvar esnext_array_buffer_transfer = __nested_webpack_require_286742__(4305);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.transfer-to-fixed-length.js\nvar esnext_array_buffer_transfer_to_fixed_length = __nested_webpack_require_286742__(7583);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js\nvar esnext_iterator_constructor = __nested_webpack_require_286742__(7121);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js\nvar esnext_iterator_filter = __nested_webpack_require_286742__(2993);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push = __nested_webpack_require_286742__(4226);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.map.js\nvar esnext_iterator_map = __nested_webpack_require_286742__(7944);\n// EXTERNAL MODULE: ./src/shared/util.js\nvar util = __nested_webpack_require_286742__(3266);\n// EXTERNAL MODULE: ./src/display/display_utils.js\nvar display_utils = __nested_webpack_require_286742__(473);\n;// CONCATENATED MODULE: ./src/display/pattern_helper.js\n\n\n\nconst PathType = {\n FILL: \"Fill\",\n STROKE: \"Stroke\",\n SHADING: \"Shading\"\n};\nfunction applyBoundingBox(ctx, bbox) {\n if (!bbox) {\n return;\n }\n const width = bbox[2] - bbox[0];\n const height = bbox[3] - bbox[1];\n const region = new Path2D();\n region.rect(bbox[0], bbox[1], width, height);\n ctx.clip(region);\n}\nclass BaseShadingPattern {\n constructor() {\n if (this.constructor === BaseShadingPattern) {\n (0,util.unreachable)(\"Cannot initialize BaseShadingPattern.\");\n }\n }\n getPattern() {\n (0,util.unreachable)(\"Abstract method `getPattern` called.\");\n }\n}\nclass RadialAxialShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._type = IR[1];\n this._bbox = IR[2];\n this._colorStops = IR[3];\n this._p0 = IR[4];\n this._p1 = IR[5];\n this._r0 = IR[6];\n this._r1 = IR[7];\n this.matrix = null;\n }\n _createGradient(ctx) {\n let grad;\n if (this._type === \"axial\") {\n grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]);\n } else if (this._type === \"radial\") {\n grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1);\n }\n for (const colorStop of this._colorStops) {\n grad.addColorStop(colorStop[0], colorStop[1]);\n }\n return grad;\n }\n getPattern(ctx, owner, inverse, pathType) {\n let pattern;\n if (pathType === PathType.STROKE || pathType === PathType.FILL) {\n const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, (0,display_utils.getCurrentTransform)(ctx)) || [0, 0, 0, 0];\n const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;\n const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;\n const tmpCanvas = owner.cachedCanvases.getCanvas(\"pattern\", width, height, true);\n const tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n tmpCtx.beginPath();\n tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);\n inverse = util.Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]);\n tmpCtx.transform(...owner.baseTransform);\n if (this.matrix) {\n tmpCtx.transform(...this.matrix);\n }\n applyBoundingBox(tmpCtx, this._bbox);\n tmpCtx.fillStyle = this._createGradient(tmpCtx);\n tmpCtx.fill();\n pattern = ctx.createPattern(tmpCanvas.canvas, \"no-repeat\");\n const domMatrix = new DOMMatrix(inverse);\n pattern.setTransform(domMatrix);\n } else {\n applyBoundingBox(ctx, this._bbox);\n pattern = this._createGradient(ctx);\n }\n return pattern;\n }\n}\nfunction drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n const coords = context.coords,\n colors = context.colors;\n const bytes = data.data,\n rowSize = data.width * 4;\n let tmp;\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n if (coords[p2 + 1] > coords[p3 + 1]) {\n tmp = p2;\n p2 = p3;\n p3 = tmp;\n tmp = c2;\n c2 = c3;\n c3 = tmp;\n }\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n const x1 = (coords[p1] + context.offsetX) * context.scaleX;\n const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n const x2 = (coords[p2] + context.offsetX) * context.scaleX;\n const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n const x3 = (coords[p3] + context.offsetX) * context.scaleX;\n const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n if (y1 >= y3) {\n return;\n }\n const c1r = colors[c1],\n c1g = colors[c1 + 1],\n c1b = colors[c1 + 2];\n const c2r = colors[c2],\n c2g = colors[c2 + 1],\n c2b = colors[c2 + 2];\n const c3r = colors[c3],\n c3g = colors[c3 + 1],\n c3b = colors[c3 + 2];\n const minY = Math.round(y1),\n maxY = Math.round(y3);\n let xa, car, cag, cab;\n let xb, cbr, cbg, cbb;\n for (let y = minY; y <= maxY; y++) {\n if (y < y2) {\n const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);\n xa = x1 - (x1 - x2) * k;\n car = c1r - (c1r - c2r) * k;\n cag = c1g - (c1g - c2g) * k;\n cab = c1b - (c1b - c2b) * k;\n } else {\n let k;\n if (y > y3) {\n k = 1;\n } else if (y2 === y3) {\n k = 0;\n } else {\n k = (y2 - y) / (y2 - y3);\n }\n xa = x2 - (x2 - x3) * k;\n car = c2r - (c2r - c3r) * k;\n cag = c2g - (c2g - c3g) * k;\n cab = c2b - (c2b - c3b) * k;\n }\n let k;\n if (y < y1) {\n k = 0;\n } else if (y > y3) {\n k = 1;\n } else {\n k = (y1 - y) / (y1 - y3);\n }\n xb = x1 - (x1 - x3) * k;\n cbr = c1r - (c1r - c3r) * k;\n cbg = c1g - (c1g - c3g) * k;\n cbb = c1b - (c1b - c3b) * k;\n const x1_ = Math.round(Math.min(xa, xb));\n const x2_ = Math.round(Math.max(xa, xb));\n let j = rowSize * y + x1_ * 4;\n for (let x = x1_; x <= x2_; x++) {\n k = (xa - x) / (xa - xb);\n if (k < 0) {\n k = 0;\n } else if (k > 1) {\n k = 1;\n }\n bytes[j++] = car - (car - cbr) * k | 0;\n bytes[j++] = cag - (cag - cbg) * k | 0;\n bytes[j++] = cab - (cab - cbb) * k | 0;\n bytes[j++] = 255;\n }\n }\n}\nfunction drawFigure(data, figure, context) {\n const ps = figure.coords;\n const cs = figure.colors;\n let i, ii;\n switch (figure.type) {\n case \"lattice\":\n const verticesPerRow = figure.verticesPerRow;\n const rows = Math.floor(ps.length / verticesPerRow) - 1;\n const cols = verticesPerRow - 1;\n for (i = 0; i < rows; i++) {\n let q = i * verticesPerRow;\n for (let j = 0; j < cols; j++, q++) {\n drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]);\n drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);\n }\n }\n break;\n case \"triangles\":\n for (i = 0, ii = ps.length; i < ii; i += 3) {\n drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);\n }\n break;\n default:\n throw new Error(\"illegal figure\");\n }\n}\nclass MeshShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._coords = IR[2];\n this._colors = IR[3];\n this._figures = IR[4];\n this._bounds = IR[5];\n this._bbox = IR[7];\n this._background = IR[8];\n this.matrix = null;\n }\n _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) {\n const EXPECTED_SCALE = 1.1;\n const MAX_PATTERN_SIZE = 3000;\n const BORDER_SIZE = 2;\n const offsetX = Math.floor(this._bounds[0]);\n const offsetY = Math.floor(this._bounds[1]);\n const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;\n const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;\n const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n const scaleX = boundsWidth / width;\n const scaleY = boundsHeight / height;\n const context = {\n coords: this._coords,\n colors: this._colors,\n offsetX: -offsetX,\n offsetY: -offsetY,\n scaleX: 1 / scaleX,\n scaleY: 1 / scaleY\n };\n const paddedWidth = width + BORDER_SIZE * 2;\n const paddedHeight = height + BORDER_SIZE * 2;\n const tmpCanvas = cachedCanvases.getCanvas(\"mesh\", paddedWidth, paddedHeight, false);\n const tmpCtx = tmpCanvas.context;\n const data = tmpCtx.createImageData(width, height);\n if (backgroundColor) {\n const bytes = data.data;\n for (let i = 0, ii = bytes.length; i < ii; i += 4) {\n bytes[i] = backgroundColor[0];\n bytes[i + 1] = backgroundColor[1];\n bytes[i + 2] = backgroundColor[2];\n bytes[i + 3] = 255;\n }\n }\n for (const figure of this._figures) {\n drawFigure(data, figure, context);\n }\n tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n const canvas = tmpCanvas.canvas;\n return {\n canvas,\n offsetX: offsetX - BORDER_SIZE * scaleX,\n offsetY: offsetY - BORDER_SIZE * scaleY,\n scaleX,\n scaleY\n };\n }\n getPattern(ctx, owner, inverse, pathType) {\n applyBoundingBox(ctx, this._bbox);\n let scale;\n if (pathType === PathType.SHADING) {\n scale = util.Util.singularValueDecompose2dScale((0,display_utils.getCurrentTransform)(ctx));\n } else {\n scale = util.Util.singularValueDecompose2dScale(owner.baseTransform);\n if (this.matrix) {\n const matrixScale = util.Util.singularValueDecompose2dScale(this.matrix);\n scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];\n }\n }\n const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases);\n if (pathType !== PathType.SHADING) {\n ctx.setTransform(...owner.baseTransform);\n if (this.matrix) {\n ctx.transform(...this.matrix);\n }\n }\n ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);\n ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n return ctx.createPattern(temporaryPatternCanvas.canvas, \"no-repeat\");\n }\n}\nclass DummyShadingPattern extends BaseShadingPattern {\n getPattern() {\n return \"hotpink\";\n }\n}\nfunction getShadingPattern(IR) {\n switch (IR[0]) {\n case \"RadialAxial\":\n return new RadialAxialShadingPattern(IR);\n case \"Mesh\":\n return new MeshShadingPattern(IR);\n case \"Dummy\":\n return new DummyShadingPattern();\n }\n throw new Error(`Unknown IR type: ${IR[0]}`);\n}\nconst PaintType = {\n COLORED: 1,\n UNCOLORED: 2\n};\nclass TilingPattern {\n static MAX_PATTERN_SIZE = 3000;\n constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) {\n this.operatorList = IR[2];\n this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];\n this.bbox = IR[4];\n this.xstep = IR[5];\n this.ystep = IR[6];\n this.paintType = IR[7];\n this.tilingType = IR[8];\n this.color = color;\n this.ctx = ctx;\n this.canvasGraphicsFactory = canvasGraphicsFactory;\n this.baseTransform = baseTransform;\n }\n createPatternCanvas(owner) {\n const operatorList = this.operatorList;\n const bbox = this.bbox;\n const xstep = this.xstep;\n const ystep = this.ystep;\n const paintType = this.paintType;\n const tilingType = this.tilingType;\n const color = this.color;\n const canvasGraphicsFactory = this.canvasGraphicsFactory;\n (0,util.info)(\"TilingType: \" + tilingType);\n const x0 = bbox[0],\n y0 = bbox[1],\n x1 = bbox[2],\n y1 = bbox[3];\n const matrixScale = util.Util.singularValueDecompose2dScale(this.matrix);\n const curMatrixScale = util.Util.singularValueDecompose2dScale(this.baseTransform);\n const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];\n const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]);\n const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]);\n const tmpCanvas = owner.cachedCanvases.getCanvas(\"pattern\", dimx.size, dimy.size, true);\n const tmpCtx = tmpCanvas.context;\n const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n graphics.groupLevel = owner.groupLevel;\n this.setFillAndStrokeStyleToContext(graphics, paintType, color);\n let adjustedX0 = x0;\n let adjustedY0 = y0;\n let adjustedX1 = x1;\n let adjustedY1 = y1;\n if (x0 < 0) {\n adjustedX0 = 0;\n adjustedX1 += Math.abs(x0);\n }\n if (y0 < 0) {\n adjustedY0 = 0;\n adjustedY1 += Math.abs(y0);\n }\n tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0));\n graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);\n tmpCtx.save();\n this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1);\n graphics.baseTransform = (0,display_utils.getCurrentTransform)(graphics.ctx);\n graphics.executeOperatorList(operatorList);\n graphics.endDrawing();\n return {\n canvas: tmpCanvas.canvas,\n scaleX: dimx.scale,\n scaleY: dimy.scale,\n offsetX: adjustedX0,\n offsetY: adjustedY0\n };\n }\n getSizeAndScale(step, realOutputSize, scale) {\n step = Math.abs(step);\n const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);\n let size = Math.ceil(step * scale);\n if (size >= maxSize) {\n size = maxSize;\n } else {\n scale = size / step;\n }\n return {\n scale,\n size\n };\n }\n clipBbox(graphics, x0, y0, x1, y1) {\n const bboxWidth = x1 - x0;\n const bboxHeight = y1 - y0;\n graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n graphics.current.updateRectMinMax((0,display_utils.getCurrentTransform)(graphics.ctx), [x0, y0, x1, y1]);\n graphics.clip();\n graphics.endPath();\n }\n setFillAndStrokeStyleToContext(graphics, paintType, color) {\n const context = graphics.ctx,\n current = graphics.current;\n switch (paintType) {\n case PaintType.COLORED:\n const ctx = this.ctx;\n context.fillStyle = ctx.fillStyle;\n context.strokeStyle = ctx.strokeStyle;\n current.fillColor = ctx.fillStyle;\n current.strokeColor = ctx.strokeStyle;\n break;\n case PaintType.UNCOLORED:\n const cssColor = util.Util.makeHexColor(color[0], color[1], color[2]);\n context.fillStyle = cssColor;\n context.strokeStyle = cssColor;\n current.fillColor = cssColor;\n current.strokeColor = cssColor;\n break;\n default:\n throw new util.FormatError(`Unsupported paint type: ${paintType}`);\n }\n }\n getPattern(ctx, owner, inverse, pathType) {\n let matrix = inverse;\n if (pathType !== PathType.SHADING) {\n matrix = util.Util.transform(matrix, owner.baseTransform);\n if (this.matrix) {\n matrix = util.Util.transform(matrix, this.matrix);\n }\n }\n const temporaryPatternCanvas = this.createPatternCanvas(owner);\n let domMatrix = new DOMMatrix(matrix);\n domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);\n domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY);\n const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"repeat\");\n pattern.setTransform(domMatrix);\n return pattern;\n }\n}\n\n;// CONCATENATED MODULE: ./src/shared/image_utils.js\n\n\n\n\n\n\n\n\n\n\nfunction convertToRGBA(params) {\n switch (params.kind) {\n case ImageKind.GRAYSCALE_1BPP:\n return convertBlackAndWhiteToRGBA(params);\n case ImageKind.RGB_24BPP:\n return convertRGBToRGBA(params);\n }\n return null;\n}\nfunction convertBlackAndWhiteToRGBA(_ref) {\n let {\n src,\n srcPos = 0,\n dest,\n width,\n height,\n nonBlackColor = 0xffffffff,\n inverseDecode = false\n } = _ref;\n const black = util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor];\n const widthInSource = width >> 3;\n const widthRemainder = width & 7;\n const srcLength = src.length;\n dest = new Uint32Array(dest.buffer);\n let destPos = 0;\n for (let i = 0; i < height; i++) {\n for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {\n const elem = srcPos < srcLength ? src[srcPos] : 255;\n dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping;\n }\n if (widthRemainder === 0) {\n continue;\n }\n const elem = srcPos < srcLength ? src[srcPos++] : 255;\n for (let j = 0; j < widthRemainder; j++) {\n dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping;\n }\n }\n return {\n srcPos,\n destPos\n };\n}\nfunction convertRGBToRGBA(_ref2) {\n let {\n src,\n srcPos = 0,\n dest,\n destPos = 0,\n width,\n height\n } = _ref2;\n let i = 0;\n const len32 = src.length >> 2;\n const src32 = new Uint32Array(src.buffer, srcPos, len32);\n if (FeatureTest.isLittleEndian) {\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i];\n const s2 = src32[i + 1];\n const s3 = src32[i + 2];\n dest[destPos] = s1 | 0xff000000;\n dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000;\n dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000;\n dest[destPos + 3] = s3 >>> 8 | 0xff000000;\n }\n for (let j = i * 4, jj = src.length; j < jj; j += 3) {\n dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000;\n }\n } else {\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i];\n const s2 = src32[i + 1];\n const s3 = src32[i + 2];\n dest[destPos] = s1 | 0xff;\n dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff;\n dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff;\n dest[destPos + 3] = s3 << 8 | 0xff;\n }\n for (let j = i * 4, jj = src.length; j < jj; j += 3) {\n dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff;\n }\n }\n return {\n srcPos,\n destPos\n };\n}\nfunction grayToRGBA(src, dest) {\n if (FeatureTest.isLittleEndian) {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = src[i] * 0x10101 | 0xff000000;\n }\n } else {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = src[i] * 0x1010100 | 0x000000ff;\n }\n }\n}\n\n;// CONCATENATED MODULE: ./src/display/canvas.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst MIN_FONT_SIZE = 16;\nconst MAX_FONT_SIZE = 100;\nconst MAX_GROUP_SIZE = 4096;\nconst EXECUTION_TIME = 15;\nconst EXECUTION_STEPS = 10;\nconst MAX_SIZE_TO_COMPILE = 1000;\nconst FULL_CHUNK_HEIGHT = 16;\nfunction mirrorContextOperations(ctx, destCtx) {\n if (ctx._removeMirroring) {\n throw new Error(\"Context is already forwarding operations.\");\n }\n ctx.__originalSave = ctx.save;\n ctx.__originalRestore = ctx.restore;\n ctx.__originalRotate = ctx.rotate;\n ctx.__originalScale = ctx.scale;\n ctx.__originalTranslate = ctx.translate;\n ctx.__originalTransform = ctx.transform;\n ctx.__originalSetTransform = ctx.setTransform;\n ctx.__originalResetTransform = ctx.resetTransform;\n ctx.__originalClip = ctx.clip;\n ctx.__originalMoveTo = ctx.moveTo;\n ctx.__originalLineTo = ctx.lineTo;\n ctx.__originalBezierCurveTo = ctx.bezierCurveTo;\n ctx.__originalRect = ctx.rect;\n ctx.__originalClosePath = ctx.closePath;\n ctx.__originalBeginPath = ctx.beginPath;\n ctx._removeMirroring = () => {\n ctx.save = ctx.__originalSave;\n ctx.restore = ctx.__originalRestore;\n ctx.rotate = ctx.__originalRotate;\n ctx.scale = ctx.__originalScale;\n ctx.translate = ctx.__originalTranslate;\n ctx.transform = ctx.__originalTransform;\n ctx.setTransform = ctx.__originalSetTransform;\n ctx.resetTransform = ctx.__originalResetTransform;\n ctx.clip = ctx.__originalClip;\n ctx.moveTo = ctx.__originalMoveTo;\n ctx.lineTo = ctx.__originalLineTo;\n ctx.bezierCurveTo = ctx.__originalBezierCurveTo;\n ctx.rect = ctx.__originalRect;\n ctx.closePath = ctx.__originalClosePath;\n ctx.beginPath = ctx.__originalBeginPath;\n delete ctx._removeMirroring;\n };\n ctx.save = function ctxSave() {\n destCtx.save();\n this.__originalSave();\n };\n ctx.restore = function ctxRestore() {\n destCtx.restore();\n this.__originalRestore();\n };\n ctx.translate = function ctxTranslate(x, y) {\n destCtx.translate(x, y);\n this.__originalTranslate(x, y);\n };\n ctx.scale = function ctxScale(x, y) {\n destCtx.scale(x, y);\n this.__originalScale(x, y);\n };\n ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n destCtx.transform(a, b, c, d, e, f);\n this.__originalTransform(a, b, c, d, e, f);\n };\n ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n destCtx.setTransform(a, b, c, d, e, f);\n this.__originalSetTransform(a, b, c, d, e, f);\n };\n ctx.resetTransform = function ctxResetTransform() {\n destCtx.resetTransform();\n this.__originalResetTransform();\n };\n ctx.rotate = function ctxRotate(angle) {\n destCtx.rotate(angle);\n this.__originalRotate(angle);\n };\n ctx.clip = function ctxRotate(rule) {\n destCtx.clip(rule);\n this.__originalClip(rule);\n };\n ctx.moveTo = function (x, y) {\n destCtx.moveTo(x, y);\n this.__originalMoveTo(x, y);\n };\n ctx.lineTo = function (x, y) {\n destCtx.lineTo(x, y);\n this.__originalLineTo(x, y);\n };\n ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {\n destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n };\n ctx.rect = function (x, y, width, height) {\n destCtx.rect(x, y, width, height);\n this.__originalRect(x, y, width, height);\n };\n ctx.closePath = function () {\n destCtx.closePath();\n this.__originalClosePath();\n };\n ctx.beginPath = function () {\n destCtx.beginPath();\n this.__originalBeginPath();\n };\n}\nclass CachedCanvases {\n constructor(canvasFactory) {\n this.canvasFactory = canvasFactory;\n this.cache = Object.create(null);\n }\n getCanvas(id, width, height) {\n let canvasEntry;\n if (this.cache[id] !== undefined) {\n canvasEntry = this.cache[id];\n this.canvasFactory.reset(canvasEntry, width, height);\n } else {\n canvasEntry = this.canvasFactory.create(width, height);\n this.cache[id] = canvasEntry;\n }\n return canvasEntry;\n }\n delete(id) {\n delete this.cache[id];\n }\n clear() {\n for (const id in this.cache) {\n const canvasEntry = this.cache[id];\n this.canvasFactory.destroy(canvasEntry);\n delete this.cache[id];\n }\n }\n}\nfunction drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) {\n const [a, b, c, d, tx, ty] = (0,display_utils.getCurrentTransform)(ctx);\n if (b === 0 && c === 0) {\n const tlX = destX * a + tx;\n const rTlX = Math.round(tlX);\n const tlY = destY * d + ty;\n const rTlY = Math.round(tlY);\n const brX = (destX + destW) * a + tx;\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destY + destH) * d + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);\n ctx.setTransform(a, b, c, d, tx, ty);\n return [rWidth, rHeight];\n }\n if (a === 0 && d === 0) {\n const tlX = destY * c + tx;\n const rTlX = Math.round(tlX);\n const tlY = destX * b + ty;\n const rTlY = Math.round(tlY);\n const brX = (destY + destH) * c + tx;\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destX + destW) * b + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);\n ctx.setTransform(a, b, c, d, tx, ty);\n return [rHeight, rWidth];\n }\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);\n const scaleX = Math.hypot(a, b);\n const scaleY = Math.hypot(c, d);\n return [scaleX * destW, scaleY * destH];\n}\nfunction compileType3Glyph(imgData) {\n const {\n width,\n height\n } = imgData;\n if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) {\n return null;\n }\n const POINT_TO_PROCESS_LIMIT = 1000;\n const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);\n const width1 = width + 1;\n let points = new Uint8Array(width1 * (height + 1));\n let i, j, j0;\n const lineSize = width + 7 & ~7;\n let data = new Uint8Array(lineSize * height),\n pos = 0;\n for (const elem of imgData.data) {\n let mask = 128;\n while (mask > 0) {\n data[pos++] = elem & mask ? 0 : 255;\n mask >>= 1;\n }\n }\n let count = 0;\n pos = 0;\n if (data[pos] !== 0) {\n points[0] = 1;\n ++count;\n }\n for (j = 1; j < width; j++) {\n if (data[pos] !== data[pos + 1]) {\n points[j] = data[pos] ? 2 : 1;\n ++count;\n }\n pos++;\n }\n if (data[pos] !== 0) {\n points[j] = 2;\n ++count;\n }\n for (i = 1; i < height; i++) {\n pos = i * lineSize;\n j0 = i * width1;\n if (data[pos - lineSize] !== data[pos]) {\n points[j0] = data[pos] ? 1 : 8;\n ++count;\n }\n let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n for (j = 1; j < width; j++) {\n sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);\n if (POINT_TYPES[sum]) {\n points[j0 + j] = POINT_TYPES[sum];\n ++count;\n }\n pos++;\n }\n if (data[pos - lineSize] !== data[pos]) {\n points[j0 + j] = data[pos] ? 2 : 4;\n ++count;\n }\n if (count > POINT_TO_PROCESS_LIMIT) {\n return null;\n }\n }\n pos = lineSize * (height - 1);\n j0 = i * width1;\n if (data[pos] !== 0) {\n points[j0] = 8;\n ++count;\n }\n for (j = 1; j < width; j++) {\n if (data[pos] !== data[pos + 1]) {\n points[j0 + j] = data[pos] ? 4 : 8;\n ++count;\n }\n pos++;\n }\n if (data[pos] !== 0) {\n points[j0 + j] = 4;\n ++count;\n }\n if (count > POINT_TO_PROCESS_LIMIT) {\n return null;\n }\n const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n const path = new Path2D();\n for (i = 0; count && i <= height; i++) {\n let p = i * width1;\n const end = p + width;\n while (p < end && !points[p]) {\n p++;\n }\n if (p === end) {\n continue;\n }\n path.moveTo(p % width1, i);\n const p0 = p;\n let type = points[p];\n do {\n const step = steps[type];\n do {\n p += step;\n } while (!points[p]);\n const pp = points[p];\n if (pp !== 5 && pp !== 10) {\n type = pp;\n points[p] = 0;\n } else {\n type = pp & 0x33 * type >> 4;\n points[p] &= type >> 2 | type << 2;\n }\n path.lineTo(p % width1, p / width1 | 0);\n if (!points[p]) {\n --count;\n }\n } while (p0 !== p);\n --i;\n }\n data = null;\n points = null;\n const drawOutline = function (c) {\n c.save();\n c.scale(1 / width, -1 / height);\n c.translate(0, -height);\n c.fill(path);\n c.beginPath();\n c.restore();\n };\n return drawOutline;\n}\nclass CanvasExtraState {\n constructor(width, height) {\n this.alphaIsShape = false;\n this.fontSize = 0;\n this.fontSizeScale = 1;\n this.textMatrix = util.IDENTITY_MATRIX;\n this.textMatrixScale = 1;\n this.fontMatrix = util.FONT_IDENTITY_MATRIX;\n this.leading = 0;\n this.x = 0;\n this.y = 0;\n this.lineX = 0;\n this.lineY = 0;\n this.charSpacing = 0;\n this.wordSpacing = 0;\n this.textHScale = 1;\n this.textRenderingMode = util.TextRenderingMode.FILL;\n this.textRise = 0;\n this.fillColor = \"#000000\";\n this.strokeColor = \"#000000\";\n this.patternFill = false;\n this.fillAlpha = 1;\n this.strokeAlpha = 1;\n this.lineWidth = 1;\n this.activeSMask = null;\n this.transferMaps = \"none\";\n this.startNewPathAndClipBox([0, 0, width, height]);\n }\n clone() {\n const clone = Object.create(this);\n clone.clipBox = this.clipBox.slice();\n return clone;\n }\n setCurrentPoint(x, y) {\n this.x = x;\n this.y = y;\n }\n updatePathMinMax(transform, x, y) {\n [x, y] = util.Util.applyTransform([x, y], transform);\n this.minX = Math.min(this.minX, x);\n this.minY = Math.min(this.minY, y);\n this.maxX = Math.max(this.maxX, x);\n this.maxY = Math.max(this.maxY, y);\n }\n updateRectMinMax(transform, rect) {\n const p1 = util.Util.applyTransform(rect, transform);\n const p2 = util.Util.applyTransform(rect.slice(2), transform);\n const p3 = util.Util.applyTransform([rect[0], rect[3]], transform);\n const p4 = util.Util.applyTransform([rect[2], rect[1]], transform);\n this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]);\n this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]);\n this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]);\n this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]);\n }\n updateScalingPathMinMax(transform, minMax) {\n util.Util.scaleMinMax(transform, minMax);\n this.minX = Math.min(this.minX, minMax[0]);\n this.maxX = Math.max(this.maxX, minMax[1]);\n this.minY = Math.min(this.minY, minMax[2]);\n this.maxY = Math.max(this.maxY, minMax[3]);\n }\n updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n const box = util.Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3);\n if (minMax) {\n minMax[0] = Math.min(minMax[0], box[0], box[2]);\n minMax[1] = Math.max(minMax[1], box[0], box[2]);\n minMax[2] = Math.min(minMax[2], box[1], box[3]);\n minMax[3] = Math.max(minMax[3], box[1], box[3]);\n return;\n }\n this.updateRectMinMax(transform, box);\n }\n getPathBoundingBox() {\n let pathType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : PathType.FILL;\n let transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n const box = [this.minX, this.minY, this.maxX, this.maxY];\n if (pathType === PathType.STROKE) {\n if (!transform) {\n (0,util.unreachable)(\"Stroke bounding box must include transform.\");\n }\n const scale = util.Util.singularValueDecompose2dScale(transform);\n const xStrokePad = scale[0] * this.lineWidth / 2;\n const yStrokePad = scale[1] * this.lineWidth / 2;\n box[0] -= xStrokePad;\n box[1] -= yStrokePad;\n box[2] += xStrokePad;\n box[3] += yStrokePad;\n }\n return box;\n }\n updateClipFromPath() {\n const intersect = util.Util.intersect(this.clipBox, this.getPathBoundingBox());\n this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);\n }\n isEmptyClip() {\n return this.minX === Infinity;\n }\n startNewPathAndClipBox(box) {\n this.clipBox = box;\n this.minX = Infinity;\n this.minY = Infinity;\n this.maxX = 0;\n this.maxY = 0;\n }\n getClippedPathBoundingBox() {\n let pathType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : PathType.FILL;\n let transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n return util.Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform));\n }\n}\nfunction putBinaryImageData(ctx, imgData) {\n if (typeof ImageData !== \"undefined\" && imgData instanceof ImageData) {\n ctx.putImageData(imgData, 0, 0);\n return;\n }\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0,\n destPos;\n const src = imgData.data;\n const dest = chunkImgData.data;\n let i, j, thisChunkHeight, elemsInThisChunk;\n if (imgData.kind === util.ImageKind.GRAYSCALE_1BPP) {\n const srcLength = src.byteLength;\n const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n const dest32DataLength = dest32.length;\n const fullSrcDiff = width + 7 >> 3;\n const white = 0xffffffff;\n const black = util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n for (i = 0; i < totalChunks; i++) {\n thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n destPos = 0;\n for (j = 0; j < thisChunkHeight; j++) {\n const srcDiff = srcLength - srcPos;\n let k = 0;\n const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n const kEndUnrolled = kEnd & ~7;\n let mask = 0;\n let srcByte = 0;\n for (; k < kEndUnrolled; k += 8) {\n srcByte = src[srcPos++];\n dest32[destPos++] = srcByte & 128 ? white : black;\n dest32[destPos++] = srcByte & 64 ? white : black;\n dest32[destPos++] = srcByte & 32 ? white : black;\n dest32[destPos++] = srcByte & 16 ? white : black;\n dest32[destPos++] = srcByte & 8 ? white : black;\n dest32[destPos++] = srcByte & 4 ? white : black;\n dest32[destPos++] = srcByte & 2 ? white : black;\n dest32[destPos++] = srcByte & 1 ? white : black;\n }\n for (; k < kEnd; k++) {\n if (mask === 0) {\n srcByte = src[srcPos++];\n mask = 128;\n }\n dest32[destPos++] = srcByte & mask ? white : black;\n mask >>= 1;\n }\n }\n while (destPos < dest32DataLength) {\n dest32[destPos++] = 0;\n }\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else if (imgData.kind === util.ImageKind.RGBA_32BPP) {\n j = 0;\n elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n for (i = 0; i < fullChunks; i++) {\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n srcPos += elemsInThisChunk;\n ctx.putImageData(chunkImgData, 0, j);\n j += FULL_CHUNK_HEIGHT;\n }\n if (i < totalChunks) {\n elemsInThisChunk = width * partialChunkHeight * 4;\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n ctx.putImageData(chunkImgData, 0, j);\n }\n } else if (imgData.kind === util.ImageKind.RGB_24BPP) {\n thisChunkHeight = FULL_CHUNK_HEIGHT;\n elemsInThisChunk = width * thisChunkHeight;\n for (i = 0; i < totalChunks; i++) {\n if (i >= fullChunks) {\n thisChunkHeight = partialChunkHeight;\n elemsInThisChunk = width * thisChunkHeight;\n }\n destPos = 0;\n for (j = elemsInThisChunk; j--;) {\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = 255;\n }\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else {\n throw new Error(`bad image kind: ${imgData.kind}`);\n }\n}\nfunction putBinaryImageMask(ctx, imgData) {\n if (imgData.bitmap) {\n ctx.drawImage(imgData.bitmap, 0, 0);\n return;\n }\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0;\n const src = imgData.data;\n const dest = chunkImgData.data;\n for (let i = 0; i < totalChunks; i++) {\n const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n ({\n srcPos\n } = convertBlackAndWhiteToRGBA({\n src,\n srcPos,\n dest,\n width,\n height: thisChunkHeight,\n nonBlackColor: 0\n }));\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n}\nfunction copyCtxState(sourceCtx, destCtx) {\n const properties = [\"strokeStyle\", \"fillStyle\", \"fillRule\", \"globalAlpha\", \"lineWidth\", \"lineCap\", \"lineJoin\", \"miterLimit\", \"globalCompositeOperation\", \"font\", \"filter\"];\n for (const property of properties) {\n if (sourceCtx[property] !== undefined) {\n destCtx[property] = sourceCtx[property];\n }\n }\n if (sourceCtx.setLineDash !== undefined) {\n destCtx.setLineDash(sourceCtx.getLineDash());\n destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n }\n}\nfunction resetCtxToDefault(ctx) {\n ctx.strokeStyle = ctx.fillStyle = \"#000000\";\n ctx.fillRule = \"nonzero\";\n ctx.globalAlpha = 1;\n ctx.lineWidth = 1;\n ctx.lineCap = \"butt\";\n ctx.lineJoin = \"miter\";\n ctx.miterLimit = 10;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.font = \"10px sans-serif\";\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n }\n if (!util.isNodeJS) {\n const {\n filter\n } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n }\n}\nfunction composeSMaskBackdrop(bytes, r0, g0, b0) {\n const length = bytes.length;\n for (let i = 3; i < length; i += 4) {\n const alpha = bytes[i];\n if (alpha === 0) {\n bytes[i - 3] = r0;\n bytes[i - 2] = g0;\n bytes[i - 1] = b0;\n } else if (alpha < 255) {\n const alpha_ = 255 - alpha;\n bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8;\n bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8;\n bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8;\n }\n }\n}\nfunction composeSMaskAlpha(maskData, layerData, transferMap) {\n const length = maskData.length;\n const scale = 1 / 255;\n for (let i = 3; i < length; i += 4) {\n const alpha = transferMap ? transferMap[maskData[i]] : maskData[i];\n layerData[i] = layerData[i] * alpha * scale | 0;\n }\n}\nfunction composeSMaskLuminosity(maskData, layerData, transferMap) {\n const length = maskData.length;\n for (let i = 3; i < length; i += 4) {\n const y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;\n layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16;\n }\n}\nfunction genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) {\n const hasBackdrop = !!backdrop;\n const r0 = hasBackdrop ? backdrop[0] : 0;\n const g0 = hasBackdrop ? backdrop[1] : 0;\n const b0 = hasBackdrop ? backdrop[2] : 0;\n const composeFn = subtype === \"Luminosity\" ? composeSMaskLuminosity : composeSMaskAlpha;\n const PIXELS_TO_PROCESS = 1048576;\n const chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));\n for (let row = 0; row < height; row += chunkSize) {\n const chunkHeight = Math.min(chunkSize, height - row);\n const maskData = maskCtx.getImageData(layerOffsetX - maskOffsetX, row + (layerOffsetY - maskOffsetY), width, chunkHeight);\n const layerData = layerCtx.getImageData(layerOffsetX, row + layerOffsetY, width, chunkHeight);\n if (hasBackdrop) {\n composeSMaskBackdrop(maskData.data, r0, g0, b0);\n }\n composeFn(maskData.data, layerData.data, transferMap);\n layerCtx.putImageData(layerData, layerOffsetX, row + layerOffsetY);\n }\n}\nfunction composeSMask(ctx, smask, layerCtx, layerBox) {\n const layerOffsetX = layerBox[0];\n const layerOffsetY = layerBox[1];\n const layerWidth = layerBox[2] - layerOffsetX;\n const layerHeight = layerBox[3] - layerOffsetY;\n if (layerWidth === 0 || layerHeight === 0) {\n return;\n }\n genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY);\n ctx.save();\n ctx.globalAlpha = 1;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(layerCtx.canvas, 0, 0);\n ctx.restore();\n}\nfunction getImageSmoothingEnabled(transform, interpolate) {\n const scale = util.Util.singularValueDecompose2dScale(transform);\n scale[0] = Math.fround(scale[0]);\n scale[1] = Math.fround(scale[1]);\n const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * display_utils.PixelsPerInch.PDF_TO_CSS_UNITS);\n if (interpolate !== undefined) {\n return interpolate;\n } else if (scale[0] <= actualScale || scale[1] <= actualScale) {\n return true;\n }\n return false;\n}\nconst LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\nconst LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\nconst NORMAL_CLIP = {};\nconst EO_CLIP = {};\nclass CanvasGraphics {\n constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, _ref, annotationCanvasMap, pageColors) {\n let {\n optionalContentConfig,\n markedContentStack = null\n } = _ref;\n this.ctx = canvasCtx;\n this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);\n this.stateStack = [];\n this.pendingClip = null;\n this.pendingEOFill = false;\n this.res = null;\n this.xobjs = null;\n this.commonObjs = commonObjs;\n this.objs = objs;\n this.canvasFactory = canvasFactory;\n this.filterFactory = filterFactory;\n this.groupStack = [];\n this.processingType3 = null;\n this.baseTransform = null;\n this.baseTransformStack = [];\n this.groupLevel = 0;\n this.smaskStack = [];\n this.smaskCounter = 0;\n this.tempSMask = null;\n this.suspendedCtx = null;\n this.contentVisible = true;\n this.markedContentStack = markedContentStack || [];\n this.optionalContentConfig = optionalContentConfig;\n this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n this.cachedPatterns = new Map();\n this.annotationCanvasMap = annotationCanvasMap;\n this.viewportScale = 1;\n this.outputScaleX = 1;\n this.outputScaleY = 1;\n this.pageColors = pageColors;\n this._cachedScaleForStroking = [-1, 0];\n this._cachedGetSinglePixelWidth = null;\n this._cachedBitmapsMap = new Map();\n }\n getObject(data) {\n let fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (typeof data === \"string\") {\n return data.startsWith(\"g_\") ? this.commonObjs.get(data) : this.objs.get(data);\n }\n return fallback;\n }\n beginDrawing(_ref2) {\n let {\n transform,\n viewport,\n transparency = false,\n background = null\n } = _ref2;\n const width = this.ctx.canvas.width;\n const height = this.ctx.canvas.height;\n const savedFillStyle = this.ctx.fillStyle;\n this.ctx.fillStyle = background || \"#ffffff\";\n this.ctx.fillRect(0, 0, width, height);\n this.ctx.fillStyle = savedFillStyle;\n if (transparency) {\n const transparentCanvas = this.cachedCanvases.getCanvas(\"transparent\", width, height);\n this.compositeCtx = this.ctx;\n this.transparentCanvas = transparentCanvas.canvas;\n this.ctx = transparentCanvas.context;\n this.ctx.save();\n this.ctx.transform(...(0,display_utils.getCurrentTransform)(this.compositeCtx));\n }\n this.ctx.save();\n resetCtxToDefault(this.ctx);\n if (transform) {\n this.ctx.transform(...transform);\n this.outputScaleX = transform[0];\n this.outputScaleY = transform[0];\n }\n this.ctx.transform(...viewport.transform);\n this.viewportScale = viewport.scale;\n this.baseTransform = (0,display_utils.getCurrentTransform)(this.ctx);\n }\n executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {\n const argsArray = operatorList.argsArray;\n const fnArray = operatorList.fnArray;\n let i = executionStartIdx || 0;\n const argsArrayLen = argsArray.length;\n if (argsArrayLen === i) {\n return i;\n }\n const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === \"function\";\n const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n let steps = 0;\n const commonObjs = this.commonObjs;\n const objs = this.objs;\n let fnId;\n while (true) {\n if (stepper !== undefined && i === stepper.nextBreakPoint) {\n stepper.breakIt(i, continueCallback);\n return i;\n }\n fnId = fnArray[i];\n if (fnId !== util.OPS.dependency) {\n this[fnId].apply(this, argsArray[i]);\n } else {\n for (const depObjId of argsArray[i]) {\n const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n if (!objsPool.has(depObjId)) {\n objsPool.get(depObjId, continueCallback);\n return i;\n }\n }\n }\n i++;\n if (i === argsArrayLen) {\n return i;\n }\n if (chunkOperations && ++steps > EXECUTION_STEPS) {\n if (Date.now() > endTime) {\n continueCallback();\n return i;\n }\n steps = 0;\n }\n }\n }\n #restoreInitialState() {\n while (this.stateStack.length || this.inSMaskMode) {\n this.restore();\n }\n this.ctx.restore();\n if (this.transparentCanvas) {\n this.ctx = this.compositeCtx;\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.drawImage(this.transparentCanvas, 0, 0);\n this.ctx.restore();\n this.transparentCanvas = null;\n }\n }\n endDrawing() {\n this.#restoreInitialState();\n this.cachedCanvases.clear();\n this.cachedPatterns.clear();\n for (const cache of this._cachedBitmapsMap.values()) {\n for (const canvas of cache.values()) {\n if (typeof HTMLCanvasElement !== \"undefined\" && canvas instanceof HTMLCanvasElement) {\n canvas.width = canvas.height = 0;\n }\n }\n cache.clear();\n }\n this._cachedBitmapsMap.clear();\n this.#drawFilter();\n }\n #drawFilter() {\n if (this.pageColors) {\n const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background);\n if (hcmFilterId !== \"none\") {\n const savedFilter = this.ctx.filter;\n this.ctx.filter = hcmFilterId;\n this.ctx.drawImage(this.ctx.canvas, 0, 0);\n this.ctx.filter = savedFilter;\n }\n }\n }\n _scaleImage(img, inverseTransform) {\n const width = img.width;\n const height = img.height;\n let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1);\n let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1);\n let paintWidth = width,\n paintHeight = height;\n let tmpCanvasId = \"prescale1\";\n let tmpCanvas, tmpCtx;\n while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {\n let newWidth = paintWidth,\n newHeight = paintHeight;\n if (widthScale > 2 && paintWidth > 1) {\n newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2);\n widthScale /= paintWidth / newWidth;\n }\n if (heightScale > 2 && paintHeight > 1) {\n newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : Math.ceil(paintHeight) / 2;\n heightScale /= paintHeight / newHeight;\n }\n tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);\n tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, newWidth, newHeight);\n tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);\n img = tmpCanvas.canvas;\n paintWidth = newWidth;\n paintHeight = newHeight;\n tmpCanvasId = tmpCanvasId === \"prescale1\" ? \"prescale2\" : \"prescale1\";\n }\n return {\n img,\n paintWidth,\n paintHeight\n };\n }\n _createMaskCanvas(img) {\n const ctx = this.ctx;\n const {\n width,\n height\n } = img;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n const currentTransform = (0,display_utils.getCurrentTransform)(ctx);\n let cache, cacheKey, scaled, maskCanvas;\n if ((img.bitmap || img.data) && img.count > 1) {\n const mainKey = img.bitmap || img.data.buffer;\n cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]);\n cache = this._cachedBitmapsMap.get(mainKey);\n if (!cache) {\n cache = new Map();\n this._cachedBitmapsMap.set(mainKey, cache);\n }\n const cachedImage = cache.get(cacheKey);\n if (cachedImage && !isPatternFill) {\n const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]);\n const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]);\n return {\n canvas: cachedImage,\n offsetX,\n offsetY\n };\n }\n scaled = cachedImage;\n }\n if (!scaled) {\n maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n putBinaryImageMask(maskCanvas.context, img);\n }\n let maskToCanvas = util.Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]);\n maskToCanvas = util.Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);\n const [minX, minY, maxX, maxY] = util.Util.getAxialAlignedBoundingBox([0, 0, width, height], maskToCanvas);\n const drawnWidth = Math.round(maxX - minX) || 1;\n const drawnHeight = Math.round(maxY - minY) || 1;\n const fillCanvas = this.cachedCanvases.getCanvas(\"fillCanvas\", drawnWidth, drawnHeight);\n const fillCtx = fillCanvas.context;\n const offsetX = minX;\n const offsetY = minY;\n fillCtx.translate(-offsetX, -offsetY);\n fillCtx.transform(...maskToCanvas);\n if (!scaled) {\n scaled = this._scaleImage(maskCanvas.canvas, (0,display_utils.getCurrentTransformInverse)(fillCtx));\n scaled = scaled.img;\n if (cache && isPatternFill) {\n cache.set(cacheKey, scaled);\n }\n }\n fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled((0,display_utils.getCurrentTransform)(fillCtx), img.interpolate);\n drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height);\n fillCtx.globalCompositeOperation = \"source-in\";\n const inverse = util.Util.transform((0,display_utils.getCurrentTransformInverse)(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]);\n fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) : fillColor;\n fillCtx.fillRect(0, 0, width, height);\n if (cache && !isPatternFill) {\n this.cachedCanvases.delete(\"fillCanvas\");\n cache.set(cacheKey, fillCanvas.canvas);\n }\n return {\n canvas: fillCanvas.canvas,\n offsetX: Math.round(offsetX),\n offsetY: Math.round(offsetY)\n };\n }\n setLineWidth(width) {\n if (width !== this.current.lineWidth) {\n this._cachedScaleForStroking[0] = -1;\n }\n this.current.lineWidth = width;\n this.ctx.lineWidth = width;\n }\n setLineCap(style) {\n this.ctx.lineCap = LINE_CAP_STYLES[style];\n }\n setLineJoin(style) {\n this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n }\n setMiterLimit(limit) {\n this.ctx.miterLimit = limit;\n }\n setDash(dashArray, dashPhase) {\n const ctx = this.ctx;\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash(dashArray);\n ctx.lineDashOffset = dashPhase;\n }\n }\n setRenderingIntent(intent) {}\n setFlatness(flatness) {}\n setGState(states) {\n for (const [key, value] of states) {\n switch (key) {\n case \"LW\":\n this.setLineWidth(value);\n break;\n case \"LC\":\n this.setLineCap(value);\n break;\n case \"LJ\":\n this.setLineJoin(value);\n break;\n case \"ML\":\n this.setMiterLimit(value);\n break;\n case \"D\":\n this.setDash(value[0], value[1]);\n break;\n case \"RI\":\n this.setRenderingIntent(value);\n break;\n case \"FL\":\n this.setFlatness(value);\n break;\n case \"Font\":\n this.setFont(value[0], value[1]);\n break;\n case \"CA\":\n this.current.strokeAlpha = value;\n break;\n case \"ca\":\n this.current.fillAlpha = value;\n this.ctx.globalAlpha = value;\n break;\n case \"BM\":\n this.ctx.globalCompositeOperation = value;\n break;\n case \"SMask\":\n this.current.activeSMask = value ? this.tempSMask : null;\n this.tempSMask = null;\n this.checkSMaskState();\n break;\n case \"TR\":\n this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value);\n break;\n }\n }\n }\n get inSMaskMode() {\n return !!this.suspendedCtx;\n }\n checkSMaskState() {\n const inSMaskMode = this.inSMaskMode;\n if (this.current.activeSMask && !inSMaskMode) {\n this.beginSMaskMode();\n } else if (!this.current.activeSMask && inSMaskMode) {\n this.endSMaskMode();\n }\n }\n beginSMaskMode() {\n if (this.inSMaskMode) {\n throw new Error(\"beginSMaskMode called while already in smask mode\");\n }\n const drawnWidth = this.ctx.canvas.width;\n const drawnHeight = this.ctx.canvas.height;\n const cacheId = \"smaskGroupAt\" + this.groupLevel;\n const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight);\n this.suspendedCtx = this.ctx;\n this.ctx = scratchCanvas.context;\n const ctx = this.ctx;\n ctx.setTransform(...(0,display_utils.getCurrentTransform)(this.suspendedCtx));\n copyCtxState(this.suspendedCtx, ctx);\n mirrorContextOperations(ctx, this.suspendedCtx);\n this.setGState([[\"BM\", \"source-over\"], [\"ca\", 1], [\"CA\", 1]]);\n }\n endSMaskMode() {\n if (!this.inSMaskMode) {\n throw new Error(\"endSMaskMode called while not in smask mode\");\n }\n this.ctx._removeMirroring();\n copyCtxState(this.ctx, this.suspendedCtx);\n this.ctx = this.suspendedCtx;\n this.suspendedCtx = null;\n }\n compose(dirtyBox) {\n if (!this.current.activeSMask) {\n return;\n }\n if (!dirtyBox) {\n dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];\n } else {\n dirtyBox[0] = Math.floor(dirtyBox[0]);\n dirtyBox[1] = Math.floor(dirtyBox[1]);\n dirtyBox[2] = Math.ceil(dirtyBox[2]);\n dirtyBox[3] = Math.ceil(dirtyBox[3]);\n }\n const smask = this.current.activeSMask;\n const suspendedCtx = this.suspendedCtx;\n composeSMask(suspendedCtx, smask, this.ctx, dirtyBox);\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n this.ctx.restore();\n }\n save() {\n if (this.inSMaskMode) {\n copyCtxState(this.ctx, this.suspendedCtx);\n this.suspendedCtx.save();\n } else {\n this.ctx.save();\n }\n const old = this.current;\n this.stateStack.push(old);\n this.current = old.clone();\n }\n restore() {\n if (this.stateStack.length === 0 && this.inSMaskMode) {\n this.endSMaskMode();\n }\n if (this.stateStack.length !== 0) {\n this.current = this.stateStack.pop();\n if (this.inSMaskMode) {\n this.suspendedCtx.restore();\n copyCtxState(this.suspendedCtx, this.ctx);\n } else {\n this.ctx.restore();\n }\n this.checkSMaskState();\n this.pendingClip = null;\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n }\n transform(a, b, c, d, e, f) {\n this.ctx.transform(a, b, c, d, e, f);\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n constructPath(ops, args, minMax) {\n const ctx = this.ctx;\n const current = this.current;\n let x = current.x,\n y = current.y;\n let startX, startY;\n const currentTransform = (0,display_utils.getCurrentTransform)(ctx);\n const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0;\n const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null;\n for (let i = 0, j = 0, ii = ops.length; i < ii; i++) {\n switch (ops[i] | 0) {\n case util.OPS.rectangle:\n x = args[j++];\n y = args[j++];\n const width = args[j++];\n const height = args[j++];\n const xw = x + width;\n const yh = y + height;\n ctx.moveTo(x, y);\n if (width === 0 || height === 0) {\n ctx.lineTo(xw, yh);\n } else {\n ctx.lineTo(xw, y);\n ctx.lineTo(xw, yh);\n ctx.lineTo(x, yh);\n }\n if (!isScalingMatrix) {\n current.updateRectMinMax(currentTransform, [x, y, xw, yh]);\n }\n ctx.closePath();\n break;\n case util.OPS.moveTo:\n x = args[j++];\n y = args[j++];\n ctx.moveTo(x, y);\n if (!isScalingMatrix) {\n current.updatePathMinMax(currentTransform, x, y);\n }\n break;\n case util.OPS.lineTo:\n x = args[j++];\n y = args[j++];\n ctx.lineTo(x, y);\n if (!isScalingMatrix) {\n current.updatePathMinMax(currentTransform, x, y);\n }\n break;\n case util.OPS.curveTo:\n startX = x;\n startY = y;\n x = args[j + 4];\n y = args[j + 5];\n ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);\n current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier);\n j += 6;\n break;\n case util.OPS.curveTo2:\n startX = x;\n startY = y;\n ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);\n current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier);\n x = args[j + 2];\n y = args[j + 3];\n j += 4;\n break;\n case util.OPS.curveTo3:\n startX = x;\n startY = y;\n x = args[j + 2];\n y = args[j + 3];\n ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier);\n j += 4;\n break;\n case util.OPS.closePath:\n ctx.closePath();\n break;\n }\n }\n if (isScalingMatrix) {\n current.updateScalingPathMinMax(currentTransform, minMaxForBezier);\n }\n current.setCurrentPoint(x, y);\n }\n closePath() {\n this.ctx.closePath();\n }\n stroke() {\n let consumePath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n const ctx = this.ctx;\n const strokeColor = this.current.strokeColor;\n ctx.globalAlpha = this.current.strokeAlpha;\n if (this.contentVisible) {\n if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n ctx.save();\n ctx.strokeStyle = strokeColor.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.STROKE);\n this.rescaleAndStroke(false);\n ctx.restore();\n } else {\n this.rescaleAndStroke(true);\n }\n }\n if (consumePath) {\n this.consumePath(this.current.getClippedPathBoundingBox());\n }\n ctx.globalAlpha = this.current.fillAlpha;\n }\n closeStroke() {\n this.closePath();\n this.stroke();\n }\n fill() {\n let consumePath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n const ctx = this.ctx;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n let needRestore = false;\n if (isPatternFill) {\n ctx.save();\n ctx.fillStyle = fillColor.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.FILL);\n needRestore = true;\n }\n const intersect = this.current.getClippedPathBoundingBox();\n if (this.contentVisible && intersect !== null) {\n if (this.pendingEOFill) {\n ctx.fill(\"evenodd\");\n this.pendingEOFill = false;\n } else {\n ctx.fill();\n }\n }\n if (needRestore) {\n ctx.restore();\n }\n if (consumePath) {\n this.consumePath(intersect);\n }\n }\n eoFill() {\n this.pendingEOFill = true;\n this.fill();\n }\n fillStroke() {\n this.fill(false);\n this.stroke(false);\n this.consumePath();\n }\n eoFillStroke() {\n this.pendingEOFill = true;\n this.fillStroke();\n }\n closeFillStroke() {\n this.closePath();\n this.fillStroke();\n }\n closeEOFillStroke() {\n this.pendingEOFill = true;\n this.closePath();\n this.fillStroke();\n }\n endPath() {\n this.consumePath();\n }\n clip() {\n this.pendingClip = NORMAL_CLIP;\n }\n eoClip() {\n this.pendingClip = EO_CLIP;\n }\n beginText() {\n this.current.textMatrix = util.IDENTITY_MATRIX;\n this.current.textMatrixScale = 1;\n this.current.x = this.current.lineX = 0;\n this.current.y = this.current.lineY = 0;\n }\n endText() {\n const paths = this.pendingTextPaths;\n const ctx = this.ctx;\n if (paths === undefined) {\n ctx.beginPath();\n return;\n }\n ctx.save();\n ctx.beginPath();\n for (const path of paths) {\n ctx.setTransform(...path.transform);\n ctx.translate(path.x, path.y);\n path.addToPath(ctx, path.fontSize);\n }\n ctx.restore();\n ctx.clip();\n ctx.beginPath();\n delete this.pendingTextPaths;\n }\n setCharSpacing(spacing) {\n this.current.charSpacing = spacing;\n }\n setWordSpacing(spacing) {\n this.current.wordSpacing = spacing;\n }\n setHScale(scale) {\n this.current.textHScale = scale / 100;\n }\n setLeading(leading) {\n this.current.leading = -leading;\n }\n setFont(fontRefName, size) {\n const fontObj = this.commonObjs.get(fontRefName);\n const current = this.current;\n if (!fontObj) {\n throw new Error(`Can't find font for ${fontRefName}`);\n }\n current.fontMatrix = fontObj.fontMatrix || util.FONT_IDENTITY_MATRIX;\n if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n (0,util.warn)(\"Invalid font matrix for font \" + fontRefName);\n }\n if (size < 0) {\n size = -size;\n current.fontDirection = -1;\n } else {\n current.fontDirection = 1;\n }\n this.current.font = fontObj;\n this.current.fontSize = size;\n if (fontObj.isType3Font) {\n return;\n }\n const name = fontObj.loadedName || \"sans-serif\";\n const typeface = fontObj.systemFontInfo?.css || `\"${name}\", ${fontObj.fallbackName}`;\n let bold = \"normal\";\n if (fontObj.black) {\n bold = \"900\";\n } else if (fontObj.bold) {\n bold = \"bold\";\n }\n const italic = fontObj.italic ? \"italic\" : \"normal\";\n let browserFontSize = size;\n if (size < MIN_FONT_SIZE) {\n browserFontSize = MIN_FONT_SIZE;\n } else if (size > MAX_FONT_SIZE) {\n browserFontSize = MAX_FONT_SIZE;\n }\n this.current.fontSizeScale = size / browserFontSize;\n this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n }\n setTextRenderingMode(mode) {\n this.current.textRenderingMode = mode;\n }\n setTextRise(rise) {\n this.current.textRise = rise;\n }\n moveText(x, y) {\n this.current.x = this.current.lineX += x;\n this.current.y = this.current.lineY += y;\n }\n setLeadingMoveText(x, y) {\n this.setLeading(-y);\n this.moveText(x, y);\n }\n setTextMatrix(a, b, c, d, e, f) {\n this.current.textMatrix = [a, b, c, d, e, f];\n this.current.textMatrixScale = Math.hypot(a, b);\n this.current.x = this.current.lineX = 0;\n this.current.y = this.current.lineY = 0;\n }\n nextLine() {\n this.moveText(0, this.current.leading);\n }\n paintChar(character, x, y, patternTransform) {\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const textRenderingMode = current.textRenderingMode;\n const fontSize = current.fontSize / current.fontSizeScale;\n const fillStrokeMode = textRenderingMode & util.TextRenderingMode.FILL_STROKE_MASK;\n const isAddToPathSet = !!(textRenderingMode & util.TextRenderingMode.ADD_TO_PATH_FLAG);\n const patternFill = current.patternFill && !font.missingFile;\n let addToPath;\n if (font.disableFontFace || isAddToPathSet || patternFill) {\n addToPath = font.getPathGenerator(this.commonObjs, character);\n }\n if (font.disableFontFace || patternFill) {\n ctx.save();\n ctx.translate(x, y);\n ctx.beginPath();\n addToPath(ctx, fontSize);\n if (patternTransform) {\n ctx.setTransform(...patternTransform);\n }\n if (fillStrokeMode === util.TextRenderingMode.FILL || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) {\n ctx.fill();\n }\n if (fillStrokeMode === util.TextRenderingMode.STROKE || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) {\n ctx.stroke();\n }\n ctx.restore();\n } else {\n if (fillStrokeMode === util.TextRenderingMode.FILL || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) {\n ctx.fillText(character, x, y);\n }\n if (fillStrokeMode === util.TextRenderingMode.STROKE || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) {\n ctx.strokeText(character, x, y);\n }\n }\n if (isAddToPathSet) {\n const paths = this.pendingTextPaths ||= [];\n paths.push({\n transform: (0,display_utils.getCurrentTransform)(ctx),\n x,\n y,\n fontSize,\n addToPath\n });\n }\n }\n get isFontSubpixelAAEnabled() {\n const {\n context: ctx\n } = this.cachedCanvases.getCanvas(\"isFontSubpixelAAEnabled\", 10, 10);\n ctx.scale(1.5, 1);\n ctx.fillText(\"I\", 0, 10);\n const data = ctx.getImageData(0, 0, 10, 10).data;\n let enabled = false;\n for (let i = 3; i < data.length; i += 4) {\n if (data[i] > 0 && data[i] < 255) {\n enabled = true;\n break;\n }\n }\n return (0,util.shadow)(this, \"isFontSubpixelAAEnabled\", enabled);\n }\n showText(glyphs) {\n const current = this.current;\n const font = current.font;\n if (font.isType3Font) {\n return this.showType3Text(glyphs);\n }\n const fontSize = current.fontSize;\n if (fontSize === 0) {\n return undefined;\n }\n const ctx = this.ctx;\n const fontSizeScale = current.fontSizeScale;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const fontDirection = current.fontDirection;\n const textHScale = current.textHScale * fontDirection;\n const glyphsLength = glyphs.length;\n const vertical = font.vertical;\n const spacingDir = vertical ? 1 : -1;\n const defaultVMetrics = font.defaultVMetrics;\n const widthAdvanceScale = fontSize * current.fontMatrix[0];\n const simpleFillText = current.textRenderingMode === util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;\n ctx.save();\n ctx.transform(...current.textMatrix);\n ctx.translate(current.x, current.y + current.textRise);\n if (fontDirection > 0) {\n ctx.scale(textHScale, -1);\n } else {\n ctx.scale(textHScale, 1);\n }\n let patternTransform;\n if (current.patternFill) {\n ctx.save();\n const pattern = current.fillColor.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.FILL);\n patternTransform = (0,display_utils.getCurrentTransform)(ctx);\n ctx.restore();\n ctx.fillStyle = pattern;\n }\n let lineWidth = current.lineWidth;\n const scale = current.textMatrixScale;\n if (scale === 0 || lineWidth === 0) {\n const fillStrokeMode = current.textRenderingMode & util.TextRenderingMode.FILL_STROKE_MASK;\n if (fillStrokeMode === util.TextRenderingMode.STROKE || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) {\n lineWidth = this.getSinglePixelWidth();\n }\n } else {\n lineWidth /= scale;\n }\n if (fontSizeScale !== 1.0) {\n ctx.scale(fontSizeScale, fontSizeScale);\n lineWidth /= fontSizeScale;\n }\n ctx.lineWidth = lineWidth;\n if (font.isInvalidPDFjsFont) {\n const chars = [];\n let width = 0;\n for (const glyph of glyphs) {\n chars.push(glyph.unicode);\n width += glyph.width;\n }\n ctx.fillText(chars.join(\"\"), 0, 0);\n current.x += width * widthAdvanceScale * textHScale;\n ctx.restore();\n this.compose();\n return undefined;\n }\n let x = 0,\n i;\n for (i = 0; i < glyphsLength; ++i) {\n const glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n x += spacingDir * glyph * fontSize / 1000;\n continue;\n }\n let restoreNeeded = false;\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const character = glyph.fontChar;\n const accent = glyph.accent;\n let scaledX, scaledY;\n let width = glyph.width;\n if (vertical) {\n const vmetric = glyph.vmetric || defaultVMetrics;\n const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n const vy = vmetric[2] * widthAdvanceScale;\n width = vmetric ? -vmetric[0] : width;\n scaledX = vx / fontSizeScale;\n scaledY = (x + vy) / fontSizeScale;\n } else {\n scaledX = x / fontSizeScale;\n scaledY = 0;\n }\n if (font.remeasure && width > 0) {\n const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale;\n if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n const characterScaleX = width / measuredWidth;\n restoreNeeded = true;\n ctx.save();\n ctx.scale(characterScaleX, 1);\n scaledX /= characterScaleX;\n } else if (width !== measuredWidth) {\n scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;\n }\n }\n if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n if (simpleFillText && !accent) {\n ctx.fillText(character, scaledX, scaledY);\n } else {\n this.paintChar(character, scaledX, scaledY, patternTransform);\n if (accent) {\n const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale;\n const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale;\n this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform);\n }\n }\n }\n const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection;\n x += charWidth;\n if (restoreNeeded) {\n ctx.restore();\n }\n }\n if (vertical) {\n current.y -= x;\n } else {\n current.x += x * textHScale;\n }\n ctx.restore();\n this.compose();\n return undefined;\n }\n showType3Text(glyphs) {\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const fontSize = current.fontSize;\n const fontDirection = current.fontDirection;\n const spacingDir = font.vertical ? 1 : -1;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const textHScale = current.textHScale * fontDirection;\n const fontMatrix = current.fontMatrix || util.FONT_IDENTITY_MATRIX;\n const glyphsLength = glyphs.length;\n const isTextInvisible = current.textRenderingMode === util.TextRenderingMode.INVISIBLE;\n let i, glyph, width, spacingLength;\n if (isTextInvisible || fontSize === 0) {\n return;\n }\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n ctx.save();\n ctx.transform(...current.textMatrix);\n ctx.translate(current.x, current.y);\n ctx.scale(textHScale, fontDirection);\n for (i = 0; i < glyphsLength; ++i) {\n glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n spacingLength = spacingDir * glyph * fontSize / 1000;\n this.ctx.translate(spacingLength, 0);\n current.x += spacingLength * textHScale;\n continue;\n }\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const operatorList = font.charProcOperatorList[glyph.operatorListId];\n if (!operatorList) {\n (0,util.warn)(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n continue;\n }\n if (this.contentVisible) {\n this.processingType3 = glyph;\n this.save();\n ctx.scale(fontSize, fontSize);\n ctx.transform(...fontMatrix);\n this.executeOperatorList(operatorList);\n this.restore();\n }\n const transformed = util.Util.applyTransform([glyph.width, 0], fontMatrix);\n width = transformed[0] * fontSize + spacing;\n ctx.translate(width, 0);\n current.x += width * textHScale;\n }\n ctx.restore();\n this.processingType3 = null;\n }\n setCharWidth(xWidth, yWidth) {}\n setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {\n this.ctx.rect(llx, lly, urx - llx, ury - lly);\n this.ctx.clip();\n this.endPath();\n }\n getColorN_Pattern(IR) {\n let pattern;\n if (IR[0] === \"TilingPattern\") {\n const color = IR[1];\n const baseTransform = this.baseTransform || (0,display_utils.getCurrentTransform)(this.ctx);\n const canvasGraphicsFactory = {\n createCanvasGraphics: ctx => {\n return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {\n optionalContentConfig: this.optionalContentConfig,\n markedContentStack: this.markedContentStack\n });\n }\n };\n pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform);\n } else {\n pattern = this._getPattern(IR[1], IR[2]);\n }\n return pattern;\n }\n setStrokeColorN() {\n this.current.strokeColor = this.getColorN_Pattern(arguments);\n }\n setFillColorN() {\n this.current.fillColor = this.getColorN_Pattern(arguments);\n this.current.patternFill = true;\n }\n setStrokeRGBColor(r, g, b) {\n const color = util.Util.makeHexColor(r, g, b);\n this.ctx.strokeStyle = color;\n this.current.strokeColor = color;\n }\n setFillRGBColor(r, g, b) {\n const color = util.Util.makeHexColor(r, g, b);\n this.ctx.fillStyle = color;\n this.current.fillColor = color;\n this.current.patternFill = false;\n }\n _getPattern(objId) {\n let matrix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n let pattern;\n if (this.cachedPatterns.has(objId)) {\n pattern = this.cachedPatterns.get(objId);\n } else {\n pattern = getShadingPattern(this.getObject(objId));\n this.cachedPatterns.set(objId, pattern);\n }\n if (matrix) {\n pattern.matrix = matrix;\n }\n return pattern;\n }\n shadingFill(objId) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n this.save();\n const pattern = this._getPattern(objId);\n ctx.fillStyle = pattern.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.SHADING);\n const inv = (0,display_utils.getCurrentTransformInverse)(ctx);\n if (inv) {\n const {\n width,\n height\n } = ctx.canvas;\n const [x0, y0, x1, y1] = util.Util.getAxialAlignedBoundingBox([0, 0, width, height], inv);\n this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n } else {\n this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n }\n this.compose(this.current.getClippedPathBoundingBox());\n this.restore();\n }\n beginInlineImage() {\n (0,util.unreachable)(\"Should not call beginInlineImage\");\n }\n beginImageData() {\n (0,util.unreachable)(\"Should not call beginImageData\");\n }\n paintFormXObjectBegin(matrix, bbox) {\n if (!this.contentVisible) {\n return;\n }\n this.save();\n this.baseTransformStack.push(this.baseTransform);\n if (Array.isArray(matrix) && matrix.length === 6) {\n this.transform(...matrix);\n }\n this.baseTransform = (0,display_utils.getCurrentTransform)(this.ctx);\n if (bbox) {\n const width = bbox[2] - bbox[0];\n const height = bbox[3] - bbox[1];\n this.ctx.rect(bbox[0], bbox[1], width, height);\n this.current.updateRectMinMax((0,display_utils.getCurrentTransform)(this.ctx), bbox);\n this.clip();\n this.endPath();\n }\n }\n paintFormXObjectEnd() {\n if (!this.contentVisible) {\n return;\n }\n this.restore();\n this.baseTransform = this.baseTransformStack.pop();\n }\n beginGroup(group) {\n if (!this.contentVisible) {\n return;\n }\n this.save();\n if (this.inSMaskMode) {\n this.endSMaskMode();\n this.current.activeSMask = null;\n }\n const currentCtx = this.ctx;\n if (!group.isolated) {\n (0,util.info)(\"TODO: Support non-isolated groups.\");\n }\n if (group.knockout) {\n (0,util.warn)(\"Knockout groups not supported.\");\n }\n const currentTransform = (0,display_utils.getCurrentTransform)(currentCtx);\n if (group.matrix) {\n currentCtx.transform(...group.matrix);\n }\n if (!group.bbox) {\n throw new Error(\"Bounding box is required.\");\n }\n let bounds = util.Util.getAxialAlignedBoundingBox(group.bbox, (0,display_utils.getCurrentTransform)(currentCtx));\n const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];\n bounds = util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n const offsetX = Math.floor(bounds[0]);\n const offsetY = Math.floor(bounds[1]);\n let drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n let drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n let scaleX = 1,\n scaleY = 1;\n if (drawnWidth > MAX_GROUP_SIZE) {\n scaleX = drawnWidth / MAX_GROUP_SIZE;\n drawnWidth = MAX_GROUP_SIZE;\n }\n if (drawnHeight > MAX_GROUP_SIZE) {\n scaleY = drawnHeight / MAX_GROUP_SIZE;\n drawnHeight = MAX_GROUP_SIZE;\n }\n this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);\n let cacheId = \"groupAt\" + this.groupLevel;\n if (group.smask) {\n cacheId += \"_smask_\" + this.smaskCounter++ % 2;\n }\n const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight);\n const groupCtx = scratchCanvas.context;\n groupCtx.scale(1 / scaleX, 1 / scaleY);\n groupCtx.translate(-offsetX, -offsetY);\n groupCtx.transform(...currentTransform);\n if (group.smask) {\n this.smaskStack.push({\n canvas: scratchCanvas.canvas,\n context: groupCtx,\n offsetX,\n offsetY,\n scaleX,\n scaleY,\n subtype: group.smask.subtype,\n backdrop: group.smask.backdrop,\n transferMap: group.smask.transferMap || null,\n startTransformInverse: null\n });\n } else {\n currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n currentCtx.translate(offsetX, offsetY);\n currentCtx.scale(scaleX, scaleY);\n currentCtx.save();\n }\n copyCtxState(currentCtx, groupCtx);\n this.ctx = groupCtx;\n this.setGState([[\"BM\", \"source-over\"], [\"ca\", 1], [\"CA\", 1]]);\n this.groupStack.push(currentCtx);\n this.groupLevel++;\n }\n endGroup(group) {\n if (!this.contentVisible) {\n return;\n }\n this.groupLevel--;\n const groupCtx = this.ctx;\n const ctx = this.groupStack.pop();\n this.ctx = ctx;\n this.ctx.imageSmoothingEnabled = false;\n if (group.smask) {\n this.tempSMask = this.smaskStack.pop();\n this.restore();\n } else {\n this.ctx.restore();\n const currentMtx = (0,display_utils.getCurrentTransform)(this.ctx);\n this.restore();\n this.ctx.save();\n this.ctx.setTransform(...currentMtx);\n const dirtyBox = util.Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx);\n this.ctx.drawImage(groupCtx.canvas, 0, 0);\n this.ctx.restore();\n this.compose(dirtyBox);\n }\n }\n beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) {\n this.#restoreInitialState();\n resetCtxToDefault(this.ctx);\n this.ctx.save();\n this.save();\n if (this.baseTransform) {\n this.ctx.setTransform(...this.baseTransform);\n }\n if (Array.isArray(rect) && rect.length === 4) {\n const width = rect[2] - rect[0];\n const height = rect[3] - rect[1];\n if (hasOwnCanvas && this.annotationCanvasMap) {\n transform = transform.slice();\n transform[4] -= rect[0];\n transform[5] -= rect[1];\n rect = rect.slice();\n rect[0] = rect[1] = 0;\n rect[2] = width;\n rect[3] = height;\n const [scaleX, scaleY] = util.Util.singularValueDecompose2dScale((0,display_utils.getCurrentTransform)(this.ctx));\n const {\n viewportScale\n } = this;\n const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale);\n const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale);\n this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight);\n const {\n canvas,\n context\n } = this.annotationCanvas;\n this.annotationCanvasMap.set(id, canvas);\n this.annotationCanvas.savedCtx = this.ctx;\n this.ctx = context;\n this.ctx.save();\n this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY);\n resetCtxToDefault(this.ctx);\n } else {\n resetCtxToDefault(this.ctx);\n this.ctx.rect(rect[0], rect[1], width, height);\n this.ctx.clip();\n this.endPath();\n }\n }\n this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);\n this.transform(...transform);\n this.transform(...matrix);\n }\n endAnnotation() {\n if (this.annotationCanvas) {\n this.ctx.restore();\n this.#drawFilter();\n this.ctx = this.annotationCanvas.savedCtx;\n delete this.annotationCanvas.savedCtx;\n delete this.annotationCanvas;\n }\n }\n paintImageMaskXObject(img) {\n if (!this.contentVisible) {\n return;\n }\n const count = img.count;\n img = this.getObject(img.data, img);\n img.count = count;\n const ctx = this.ctx;\n const glyph = this.processingType3;\n if (glyph) {\n if (glyph.compiled === undefined) {\n glyph.compiled = compileType3Glyph(img);\n }\n if (glyph.compiled) {\n glyph.compiled(ctx);\n return;\n }\n }\n const mask = this._createMaskCanvas(img);\n const maskCanvas = mask.canvas;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);\n ctx.restore();\n this.compose();\n }\n paintImageMaskXObjectRepeat(img, scaleX) {\n let skewX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n let skewY = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n let scaleY = arguments.length > 4 ? arguments[4] : undefined;\n let positions = arguments.length > 5 ? arguments[5] : undefined;\n if (!this.contentVisible) {\n return;\n }\n img = this.getObject(img.data, img);\n const ctx = this.ctx;\n ctx.save();\n const currentTransform = (0,display_utils.getCurrentTransform)(ctx);\n ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);\n const mask = this._createMaskCanvas(img);\n ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]);\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n const trans = util.Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]);\n const [x, y] = util.Util.applyTransform([0, 0], trans);\n ctx.drawImage(mask.canvas, x, y);\n }\n ctx.restore();\n this.compose();\n }\n paintImageMaskXObjectGroup(images) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n for (const image of images) {\n const {\n data,\n width,\n height,\n transform\n } = image;\n const maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n const maskCtx = maskCanvas.context;\n maskCtx.save();\n const img = this.getObject(data, image);\n putBinaryImageMask(maskCtx, img);\n maskCtx.globalCompositeOperation = \"source-in\";\n maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.FILL) : fillColor;\n maskCtx.fillRect(0, 0, width, height);\n maskCtx.restore();\n ctx.save();\n ctx.transform(...transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n ctx.restore();\n }\n this.compose();\n }\n paintImageXObject(objId) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(objId);\n if (!imgData) {\n (0,util.warn)(\"Dependent image isn't ready yet\");\n return;\n }\n this.paintInlineImageXObject(imgData);\n }\n paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(objId);\n if (!imgData) {\n (0,util.warn)(\"Dependent image isn't ready yet\");\n return;\n }\n const width = imgData.width;\n const height = imgData.height;\n const map = [];\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n map.push({\n transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n x: 0,\n y: 0,\n w: width,\n h: height\n });\n }\n this.paintInlineImageXObjectGroup(imgData, map);\n }\n applyTransferMapsToCanvas(ctx) {\n if (this.current.transferMaps !== \"none\") {\n ctx.filter = this.current.transferMaps;\n ctx.drawImage(ctx.canvas, 0, 0);\n ctx.filter = \"none\";\n }\n return ctx.canvas;\n }\n applyTransferMapsToBitmap(imgData) {\n if (this.current.transferMaps === \"none\") {\n return imgData.bitmap;\n }\n const {\n bitmap,\n width,\n height\n } = imgData;\n const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", width, height);\n const tmpCtx = tmpCanvas.context;\n tmpCtx.filter = this.current.transferMaps;\n tmpCtx.drawImage(bitmap, 0, 0);\n tmpCtx.filter = \"none\";\n return tmpCanvas.canvas;\n }\n paintInlineImageXObject(imgData) {\n if (!this.contentVisible) {\n return;\n }\n const width = imgData.width;\n const height = imgData.height;\n const ctx = this.ctx;\n this.save();\n if (!util.isNodeJS) {\n const {\n filter\n } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n }\n ctx.scale(1 / width, -1 / height);\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = this.applyTransferMapsToBitmap(imgData);\n } else if (typeof HTMLElement === \"function\" && imgData instanceof HTMLElement || !imgData.data) {\n imgToPaint = imgData;\n } else {\n const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", width, height);\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n const scaled = this._scaleImage(imgToPaint, (0,display_utils.getCurrentTransformInverse)(ctx));\n ctx.imageSmoothingEnabled = getImageSmoothingEnabled((0,display_utils.getCurrentTransform)(ctx), imgData.interpolate);\n drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height);\n this.compose();\n this.restore();\n }\n paintInlineImageXObjectGroup(imgData, map) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = imgData.bitmap;\n } else {\n const w = imgData.width;\n const h = imgData.height;\n const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", w, h);\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n for (const entry of map) {\n ctx.save();\n ctx.transform(...entry.transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);\n ctx.restore();\n }\n this.compose();\n }\n paintSolidColorImageMask() {\n if (!this.contentVisible) {\n return;\n }\n this.ctx.fillRect(0, 0, 1, 1);\n this.compose();\n }\n markPoint(tag) {}\n markPointProps(tag, properties) {}\n beginMarkedContent(tag) {\n this.markedContentStack.push({\n visible: true\n });\n }\n beginMarkedContentProps(tag, properties) {\n if (tag === \"OC\") {\n this.markedContentStack.push({\n visible: this.optionalContentConfig.isVisible(properties)\n });\n } else {\n this.markedContentStack.push({\n visible: true\n });\n }\n this.contentVisible = this.isContentVisible();\n }\n endMarkedContent() {\n this.markedContentStack.pop();\n this.contentVisible = this.isContentVisible();\n }\n beginCompat() {}\n endCompat() {}\n consumePath(clipBox) {\n const isEmpty = this.current.isEmptyClip();\n if (this.pendingClip) {\n this.current.updateClipFromPath();\n }\n if (!this.pendingClip) {\n this.compose(clipBox);\n }\n const ctx = this.ctx;\n if (this.pendingClip) {\n if (!isEmpty) {\n if (this.pendingClip === EO_CLIP) {\n ctx.clip(\"evenodd\");\n } else {\n ctx.clip();\n }\n }\n this.pendingClip = null;\n }\n this.current.startNewPathAndClipBox(this.current.clipBox);\n ctx.beginPath();\n }\n getSinglePixelWidth() {\n if (!this._cachedGetSinglePixelWidth) {\n const m = (0,display_utils.getCurrentTransform)(this.ctx);\n if (m[1] === 0 && m[2] === 0) {\n this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));\n } else {\n const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n const normX = Math.hypot(m[0], m[2]);\n const normY = Math.hypot(m[1], m[3]);\n this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;\n }\n }\n return this._cachedGetSinglePixelWidth;\n }\n getScaleForStroking() {\n if (this._cachedScaleForStroking[0] === -1) {\n const {\n lineWidth\n } = this.current;\n const {\n a,\n b,\n c,\n d\n } = this.ctx.getTransform();\n let scaleX, scaleY;\n if (b === 0 && c === 0) {\n const normX = Math.abs(a);\n const normY = Math.abs(d);\n if (normX === normY) {\n if (lineWidth === 0) {\n scaleX = scaleY = 1 / normX;\n } else {\n const scaledLineWidth = normX * lineWidth;\n scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;\n }\n } else if (lineWidth === 0) {\n scaleX = 1 / normX;\n scaleY = 1 / normY;\n } else {\n const scaledXLineWidth = normX * lineWidth;\n const scaledYLineWidth = normY * lineWidth;\n scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;\n scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;\n }\n } else {\n const absDet = Math.abs(a * d - b * c);\n const normX = Math.hypot(a, b);\n const normY = Math.hypot(c, d);\n if (lineWidth === 0) {\n scaleX = normY / absDet;\n scaleY = normX / absDet;\n } else {\n const baseArea = lineWidth * absDet;\n scaleX = normY > baseArea ? normY / baseArea : 1;\n scaleY = normX > baseArea ? normX / baseArea : 1;\n }\n }\n this._cachedScaleForStroking[0] = scaleX;\n this._cachedScaleForStroking[1] = scaleY;\n }\n return this._cachedScaleForStroking;\n }\n rescaleAndStroke(saveRestore) {\n const {\n ctx\n } = this;\n const {\n lineWidth\n } = this.current;\n const [scaleX, scaleY] = this.getScaleForStroking();\n ctx.lineWidth = lineWidth || 1;\n if (scaleX === 1 && scaleY === 1) {\n ctx.stroke();\n return;\n }\n const dashes = ctx.getLineDash();\n if (saveRestore) {\n ctx.save();\n }\n ctx.scale(scaleX, scaleY);\n if (dashes.length > 0) {\n const scale = Math.max(scaleX, scaleY);\n ctx.setLineDash(dashes.map(x => x / scale));\n ctx.lineDashOffset /= scale;\n }\n ctx.stroke();\n if (saveRestore) {\n ctx.restore();\n }\n }\n isContentVisible() {\n for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n if (!this.markedContentStack[i].visible) {\n return false;\n }\n }\n return true;\n }\n}\nfor (const op in util.OPS) {\n if (CanvasGraphics.prototype[op] !== undefined) {\n CanvasGraphics.prototype[util.OPS[op]] = CanvasGraphics.prototype[op];\n }\n}\n\n\n/***/ }),\n\n/***/ 473:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_380959__) => {\n\n/* harmony export */ __nested_webpack_require_380959__.d(__nested_webpack_exports__, {\n/* harmony export */ DOMCMapReaderFactory: () => (/* binding */ DOMCMapReaderFactory),\n/* harmony export */ DOMCanvasFactory: () => (/* binding */ DOMCanvasFactory),\n/* harmony export */ DOMFilterFactory: () => (/* binding */ DOMFilterFactory),\n/* harmony export */ DOMSVGFactory: () => (/* binding */ DOMSVGFactory),\n/* harmony export */ DOMStandardFontDataFactory: () => (/* binding */ DOMStandardFontDataFactory),\n/* harmony export */ PDFDateString: () => (/* binding */ PDFDateString),\n/* harmony export */ PageViewport: () => (/* binding */ PageViewport),\n/* harmony export */ PixelsPerInch: () => (/* binding */ PixelsPerInch),\n/* harmony export */ RenderingCancelledException: () => (/* binding */ RenderingCancelledException),\n/* harmony export */ StatTimer: () => (/* binding */ StatTimer),\n/* harmony export */ fetchData: () => (/* binding */ fetchData),\n/* harmony export */ getColorValues: () => (/* binding */ getColorValues),\n/* harmony export */ getCurrentTransform: () => (/* binding */ getCurrentTransform),\n/* harmony export */ getCurrentTransformInverse: () => (/* binding */ getCurrentTransformInverse),\n/* harmony export */ getFilenameFromUrl: () => (/* binding */ getFilenameFromUrl),\n/* harmony export */ getPdfFilenameFromUrl: () => (/* binding */ getPdfFilenameFromUrl),\n/* harmony export */ getRGB: () => (/* binding */ getRGB),\n/* harmony export */ getXfaPageViewport: () => (/* binding */ getXfaPageViewport),\n/* harmony export */ isDataScheme: () => (/* binding */ isDataScheme),\n/* harmony export */ isPdfFile: () => (/* binding */ isPdfFile),\n/* harmony export */ isValidFetchUrl: () => (/* binding */ isValidFetchUrl),\n/* harmony export */ noContextMenu: () => (/* binding */ noContextMenu),\n/* harmony export */ setLayerDimensions: () => (/* binding */ setLayerDimensions)\n/* harmony export */ });\n/* unused harmony export deprecated */\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_380959__(7944);\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_380959__(3352);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_380959__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_380959__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_380959__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_380959__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_380959__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_380959__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_380959__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_380959__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_380959__(7583);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_380959__(4226);\n/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_12__ = __nested_webpack_require_380959__(3655);\n/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_13__ = __nested_webpack_require_380959__(2555);\n/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_14__ = __nested_webpack_require_380959__(2202);\n/* harmony import */ var _base_factory_js__WEBPACK_IMPORTED_MODULE_15__ = __nested_webpack_require_380959__(6822);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_16__ = __nested_webpack_require_380959__(3266);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nclass PixelsPerInch {\n static CSS = 96.0;\n static PDF = 72.0;\n static #_ = _defineProperty(this, \"PDF_TO_CSS_UNITS\", this.CSS / this.PDF);\n}\nclass DOMFilterFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_15__.BaseFilterFactory {\n #_cache;\n #_defs;\n #docId;\n #document;\n #hcmFilter;\n #hcmKey;\n #hcmUrl;\n #hcmHighlightFilter;\n #hcmHighlightKey;\n #hcmHighlightUrl;\n #id = 0;\n constructor() {\n let {\n docId,\n ownerDocument = globalThis.document\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n super();\n this.#docId = docId;\n this.#document = ownerDocument;\n }\n get #cache() {\n return this.#_cache ||= new Map();\n }\n get #defs() {\n if (!this.#_defs) {\n const div = this.#document.createElement(\"div\");\n const {\n style\n } = div;\n style.visibility = \"hidden\";\n style.contain = \"strict\";\n style.width = style.height = 0;\n style.position = \"absolute\";\n style.top = style.left = 0;\n style.zIndex = -1;\n const svg = this.#document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"width\", 0);\n svg.setAttribute(\"height\", 0);\n this.#_defs = this.#document.createElementNS(SVG_NS, \"defs\");\n div.append(svg);\n svg.append(this.#_defs);\n this.#document.body.append(div);\n }\n return this.#_defs;\n }\n addFilter(maps) {\n if (!maps) {\n return \"none\";\n }\n let value = this.#cache.get(maps);\n if (value) {\n return value;\n }\n let tableR, tableG, tableB, key;\n if (maps.length === 1) {\n const mapR = maps[0];\n const buffer = new Array(256);\n for (let i = 0; i < 256; i++) {\n buffer[i] = mapR[i] / 255;\n }\n key = tableR = tableG = tableB = buffer.join(\",\");\n } else {\n const [mapR, mapG, mapB] = maps;\n const bufferR = new Array(256);\n const bufferG = new Array(256);\n const bufferB = new Array(256);\n for (let i = 0; i < 256; i++) {\n bufferR[i] = mapR[i] / 255;\n bufferG[i] = mapG[i] / 255;\n bufferB[i] = mapB[i] / 255;\n }\n tableR = bufferR.join(\",\");\n tableG = bufferG.join(\",\");\n tableB = bufferB.join(\",\");\n key = `${tableR}${tableG}${tableB}`;\n }\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(maps, value);\n return value;\n }\n const id = `g_${this.#docId}_transfer_map_${this.#id++}`;\n const url = `url(#${id})`;\n this.#cache.set(maps, url);\n this.#cache.set(key, url);\n const filter = this.#createFilter(id);\n this.#addTransferMapConversion(tableR, tableG, tableB, filter);\n return url;\n }\n addHCMFilter(fgColor, bgColor) {\n const key = `${fgColor}-${bgColor}`;\n if (this.#hcmKey === key) {\n return this.#hcmUrl;\n }\n this.#hcmKey = key;\n this.#hcmUrl = \"none\";\n this.#hcmFilter?.remove();\n if (!fgColor || !bgColor) {\n return this.#hcmUrl;\n }\n const fgRGB = this.#getRGB(fgColor);\n fgColor = _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.Util.makeHexColor(...fgRGB);\n const bgRGB = this.#getRGB(bgColor);\n bgColor = _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.Util.makeHexColor(...bgRGB);\n this.#defs.style.color = \"\";\n if (fgColor === \"#000000\" && bgColor === \"#ffffff\" || fgColor === bgColor) {\n return this.#hcmUrl;\n }\n const map = new Array(256);\n for (let i = 0; i <= 255; i++) {\n const x = i / 255;\n map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n }\n const table = map.join(\",\");\n const id = `g_${this.#docId}_hcm_filter`;\n const filter = this.#hcmHighlightFilter = this.#createFilter(id);\n this.#addTransferMapConversion(table, table, table, filter);\n this.#addGrayConversion(filter);\n const getSteps = (c, n) => {\n const start = fgRGB[c] / 255;\n const end = bgRGB[c] / 255;\n const arr = new Array(n + 1);\n for (let i = 0; i <= n; i++) {\n arr[i] = start + i / n * (end - start);\n }\n return arr.join(\",\");\n };\n this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter);\n this.#hcmUrl = `url(#${id})`;\n return this.#hcmUrl;\n }\n addHighlightHCMFilter(fgColor, bgColor, newFgColor, newBgColor) {\n const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;\n if (this.#hcmHighlightKey === key) {\n return this.#hcmHighlightUrl;\n }\n this.#hcmHighlightKey = key;\n this.#hcmHighlightUrl = \"none\";\n this.#hcmHighlightFilter?.remove();\n if (!fgColor || !bgColor) {\n return this.#hcmHighlightUrl;\n }\n const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));\n let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]);\n let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]);\n let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this));\n if (bgGray < fgGray) {\n [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB];\n }\n this.#defs.style.color = \"\";\n const getSteps = (fg, bg, n) => {\n const arr = new Array(256);\n const step = (bgGray - fgGray) / n;\n const newStart = fg / 255;\n const newStep = (bg - fg) / (255 * n);\n let prev = 0;\n for (let i = 0; i <= n; i++) {\n const k = Math.round(fgGray + i * step);\n const value = newStart + i * newStep;\n for (let j = prev; j <= k; j++) {\n arr[j] = value;\n }\n prev = k + 1;\n }\n for (let i = prev; i < 256; i++) {\n arr[i] = arr[prev - 1];\n }\n return arr.join(\",\");\n };\n const id = `g_${this.#docId}_hcm_highlight_filter`;\n const filter = this.#hcmHighlightFilter = this.#createFilter(id);\n this.#addGrayConversion(filter);\n this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter);\n this.#hcmHighlightUrl = `url(#${id})`;\n return this.#hcmHighlightUrl;\n }\n destroy() {\n let keepHCM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (keepHCM && (this.#hcmUrl || this.#hcmHighlightUrl)) {\n return;\n }\n if (this.#_defs) {\n this.#_defs.parentNode.parentNode.remove();\n this.#_defs = null;\n }\n if (this.#_cache) {\n this.#_cache.clear();\n this.#_cache = null;\n }\n this.#id = 0;\n }\n #addGrayConversion(filter) {\n const feColorMatrix = this.#document.createElementNS(SVG_NS, \"feColorMatrix\");\n feColorMatrix.setAttribute(\"type\", \"matrix\");\n feColorMatrix.setAttribute(\"values\", \"0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0\");\n filter.append(feColorMatrix);\n }\n #createFilter(id) {\n const filter = this.#document.createElementNS(SVG_NS, \"filter\");\n filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n filter.setAttribute(\"id\", id);\n this.#defs.append(filter);\n return filter;\n }\n #appendFeFunc(feComponentTransfer, func, table) {\n const feFunc = this.#document.createElementNS(SVG_NS, func);\n feFunc.setAttribute(\"type\", \"discrete\");\n feFunc.setAttribute(\"tableValues\", table);\n feComponentTransfer.append(feFunc);\n }\n #addTransferMapConversion(rTable, gTable, bTable, filter) {\n const feComponentTransfer = this.#document.createElementNS(SVG_NS, \"feComponentTransfer\");\n filter.append(feComponentTransfer);\n this.#appendFeFunc(feComponentTransfer, \"feFuncR\", rTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncG\", gTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncB\", bTable);\n }\n #getRGB(color) {\n this.#defs.style.color = color;\n return getRGB(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n }\n}\nclass DOMCanvasFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_15__.BaseCanvasFactory {\n constructor() {\n let {\n ownerDocument = globalThis.document\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n super();\n this._document = ownerDocument;\n }\n _createCanvas(width, height) {\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n}\nasync function fetchData(url) {\n let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"text\";\n if (isValidFetchUrl(url, document.baseURI)) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n switch (type) {\n case \"arraybuffer\":\n return response.arrayBuffer();\n case \"blob\":\n return response.blob();\n case \"json\":\n return response.json();\n }\n return response.text();\n }\n return new Promise((resolve, reject) => {\n const request = new XMLHttpRequest();\n request.open(\"GET\", url, true);\n request.responseType = type;\n request.onreadystatechange = () => {\n if (request.readyState !== XMLHttpRequest.DONE) {\n return;\n }\n if (request.status === 200 || request.status === 0) {\n let data;\n switch (type) {\n case \"arraybuffer\":\n case \"blob\":\n case \"json\":\n data = request.response;\n break;\n default:\n data = request.responseText;\n break;\n }\n if (data) {\n resolve(data);\n return;\n }\n }\n reject(new Error(request.statusText));\n };\n request.send(null);\n });\n}\nclass DOMCMapReaderFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_15__.BaseCMapReaderFactory {\n _fetchData(url, compressionType) {\n return fetchData(url, this.isCompressed ? \"arraybuffer\" : \"text\").then(data => {\n return {\n cMapData: data instanceof ArrayBuffer ? new Uint8Array(data) : (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_16__.stringToBytes)(data),\n compressionType\n };\n });\n }\n}\nclass DOMStandardFontDataFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_15__.BaseStandardFontDataFactory {\n _fetchData(url) {\n return fetchData(url, \"arraybuffer\").then(data => {\n return new Uint8Array(data);\n });\n }\n}\nclass DOMSVGFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_15__.BaseSVGFactory {\n _createSVG(type) {\n return document.createElementNS(SVG_NS, type);\n }\n}\nclass PageViewport {\n constructor(_ref) {\n let {\n viewBox,\n scale,\n rotation,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false\n } = _ref;\n this.viewBox = viewBox;\n this.scale = scale;\n this.rotation = rotation;\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n const centerX = (viewBox[2] + viewBox[0]) / 2;\n const centerY = (viewBox[3] + viewBox[1]) / 2;\n let rotateA, rotateB, rotateC, rotateD;\n rotation %= 360;\n if (rotation < 0) {\n rotation += 360;\n }\n switch (rotation) {\n case 180:\n rotateA = -1;\n rotateB = 0;\n rotateC = 0;\n rotateD = 1;\n break;\n case 90:\n rotateA = 0;\n rotateB = 1;\n rotateC = 1;\n rotateD = 0;\n break;\n case 270:\n rotateA = 0;\n rotateB = -1;\n rotateC = -1;\n rotateD = 0;\n break;\n case 0:\n rotateA = 1;\n rotateB = 0;\n rotateC = 0;\n rotateD = -1;\n break;\n default:\n throw new Error(\"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\");\n }\n if (dontFlip) {\n rotateC = -rotateC;\n rotateD = -rotateD;\n }\n let offsetCanvasX, offsetCanvasY;\n let width, height;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n width = (viewBox[3] - viewBox[1]) * scale;\n height = (viewBox[2] - viewBox[0]) * scale;\n } else {\n offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n width = (viewBox[2] - viewBox[0]) * scale;\n height = (viewBox[3] - viewBox[1]) * scale;\n }\n this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];\n this.width = width;\n this.height = height;\n }\n get rawDims() {\n const {\n viewBox\n } = this;\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_16__.shadow)(this, \"rawDims\", {\n pageWidth: viewBox[2] - viewBox[0],\n pageHeight: viewBox[3] - viewBox[1],\n pageX: viewBox[0],\n pageY: viewBox[1]\n });\n }\n clone() {\n let {\n scale = this.scale,\n rotation = this.rotation,\n offsetX = this.offsetX,\n offsetY = this.offsetY,\n dontFlip = false\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return new PageViewport({\n viewBox: this.viewBox.slice(),\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip\n });\n }\n convertToViewportPoint(x, y) {\n return _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.Util.applyTransform([x, y], this.transform);\n }\n convertToViewportRectangle(rect) {\n const topLeft = _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.Util.applyTransform([rect[0], rect[1]], this.transform);\n const bottomRight = _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.Util.applyTransform([rect[2], rect[3]], this.transform);\n return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];\n }\n convertToPdfPoint(x, y) {\n return _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.Util.applyInverseTransform([x, y], this.transform);\n }\n}\nclass RenderingCancelledException extends _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.BaseException {\n constructor(msg) {\n let extraDelay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n super(msg, \"RenderingCancelledException\");\n this.extraDelay = extraDelay;\n }\n}\nfunction isDataScheme(url) {\n const ii = url.length;\n let i = 0;\n while (i < ii && url[i].trim() === \"\") {\n i++;\n }\n return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\nfunction isPdfFile(filename) {\n return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\nfunction getFilenameFromUrl(url) {\n let onlyStripPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!onlyStripPath) {\n [url] = url.split(/[#?]/, 1);\n }\n return url.substring(url.lastIndexOf(\"/\") + 1);\n}\nfunction getPdfFilenameFromUrl(url) {\n let defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"document.pdf\";\n if (typeof url !== \"string\") {\n return defaultFilename;\n }\n if (isDataScheme(url)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_16__.warn)('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n return defaultFilename;\n }\n const reURI = /^(?:(?:[^:]+:)?\\/\\/[^/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n const splitURI = reURI.exec(url);\n let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);\n if (suggestedFilename) {\n suggestedFilename = suggestedFilename[0];\n if (suggestedFilename.includes(\"%\")) {\n try {\n suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n } catch {}\n }\n }\n return suggestedFilename || defaultFilename;\n}\nclass StatTimer {\n started = Object.create(null);\n times = [];\n time(name) {\n if (name in this.started) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_16__.warn)(`Timer is already running for ${name}`);\n }\n this.started[name] = Date.now();\n }\n timeEnd(name) {\n if (!(name in this.started)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_16__.warn)(`Timer has not been started for ${name}`);\n }\n this.times.push({\n name,\n start: this.started[name],\n end: Date.now()\n });\n delete this.started[name];\n }\n toString() {\n const outBuf = [];\n let longest = 0;\n for (const {\n name\n } of this.times) {\n longest = Math.max(name.length, longest);\n }\n for (const {\n name,\n start,\n end\n } of this.times) {\n outBuf.push(`${name.padEnd(longest)} ${end - start}ms\\n`);\n }\n return outBuf.join(\"\");\n }\n}\nfunction isValidFetchUrl(url, baseUrl) {\n try {\n const {\n protocol\n } = baseUrl ? new URL(url, baseUrl) : new URL(url);\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n}\nfunction noContextMenu(e) {\n e.preventDefault();\n}\nfunction deprecated(details) {\n console.log(\"Deprecated API usage: \" + details);\n}\nlet pdfDateStringRegex;\nclass PDFDateString {\n static toDateObject(input) {\n if (!input || typeof input !== \"string\") {\n return null;\n }\n pdfDateStringRegex ||= new RegExp(\"^D:\" + \"(\\\\d{4})\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"(\\\\d{2})?\" + \"([Z|+|-])?\" + \"(\\\\d{2})?\" + \"'?\" + \"(\\\\d{2})?\" + \"'?\");\n const matches = pdfDateStringRegex.exec(input);\n if (!matches) {\n return null;\n }\n const year = parseInt(matches[1], 10);\n let month = parseInt(matches[2], 10);\n month = month >= 1 && month <= 12 ? month - 1 : 0;\n let day = parseInt(matches[3], 10);\n day = day >= 1 && day <= 31 ? day : 1;\n let hour = parseInt(matches[4], 10);\n hour = hour >= 0 && hour <= 23 ? hour : 0;\n let minute = parseInt(matches[5], 10);\n minute = minute >= 0 && minute <= 59 ? minute : 0;\n let second = parseInt(matches[6], 10);\n second = second >= 0 && second <= 59 ? second : 0;\n const universalTimeRelation = matches[7] || \"Z\";\n let offsetHour = parseInt(matches[8], 10);\n offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n let offsetMinute = parseInt(matches[9], 10) || 0;\n offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n if (universalTimeRelation === \"-\") {\n hour += offsetHour;\n minute += offsetMinute;\n } else if (universalTimeRelation === \"+\") {\n hour -= offsetHour;\n minute -= offsetMinute;\n }\n return new Date(Date.UTC(year, month, day, hour, minute, second));\n }\n}\nfunction getXfaPageViewport(xfaPage, _ref2) {\n let {\n scale = 1,\n rotation = 0\n } = _ref2;\n const {\n width,\n height\n } = xfaPage.attributes.style;\n const viewBox = [0, 0, parseInt(width), parseInt(height)];\n return new PageViewport({\n viewBox,\n scale,\n rotation\n });\n}\nfunction getRGB(color) {\n if (color.startsWith(\"#\")) {\n const colorRGB = parseInt(color.slice(1), 16);\n return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff];\n }\n if (color.startsWith(\"rgb(\")) {\n return color.slice(4, -1).split(\",\").map(x => parseInt(x));\n }\n if (color.startsWith(\"rgba(\")) {\n return color.slice(5, -1).split(\",\").map(x => parseInt(x)).slice(0, 3);\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_16__.warn)(`Not a valid color format: \"${color}\"`);\n return [0, 0, 0];\n}\nfunction getColorValues(colors) {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n document.body.append(span);\n for (const name of colors.keys()) {\n span.style.color = name;\n const computedColor = window.getComputedStyle(span).color;\n colors.set(name, getRGB(computedColor));\n }\n span.remove();\n}\nfunction getCurrentTransform(ctx) {\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = ctx.getTransform();\n return [a, b, c, d, e, f];\n}\nfunction getCurrentTransformInverse(ctx) {\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = ctx.getTransform().invertSelf();\n return [a, b, c, d, e, f];\n}\nfunction setLayerDimensions(div, viewport) {\n let mustFlip = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let mustRotate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n if (viewport instanceof PageViewport) {\n const {\n pageWidth,\n pageHeight\n } = viewport.rawDims;\n const {\n style\n } = div;\n const useRound = _shared_util_js__WEBPACK_IMPORTED_MODULE_16__.FeatureTest.isCSSRoundSupported;\n const w = `var(--scale-factor) * ${pageWidth}px`,\n h = `var(--scale-factor) * ${pageHeight}px`;\n const widthStr = useRound ? `round(${w}, 1px)` : `calc(${w})`,\n heightStr = useRound ? `round(${h}, 1px)` : `calc(${h})`;\n if (!mustFlip || viewport.rotation % 180 === 0) {\n style.width = widthStr;\n style.height = heightStr;\n } else {\n style.width = heightStr;\n style.height = widthStr;\n }\n }\n if (mustRotate) {\n div.setAttribute(\"data-main-rotation\", viewport.rotation);\n }\n}\n\n\n/***/ }),\n\n/***/ 9423:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_406806__) => {\n\n/* harmony export */ __nested_webpack_require_406806__.d(__nested_webpack_exports__, {\n/* harmony export */ DrawLayer: () => (/* binding */ DrawLayer)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_406806__(4226);\n/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_406806__(473);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_406806__(3266);\n\n\n\nclass DrawLayer {\n #parent = null;\n #id = 0;\n #mapping = new Map();\n constructor(_ref) {\n let {\n pageIndex\n } = _ref;\n this.pageIndex = pageIndex;\n }\n setParent(parent) {\n if (!this.#parent) {\n this.#parent = parent;\n return;\n }\n if (this.#parent !== parent) {\n if (this.#mapping.size > 0) {\n for (const root of this.#mapping.values()) {\n root.remove();\n parent.append(root);\n }\n }\n this.#parent = parent;\n }\n }\n static get _svgFactory() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_2__.shadow)(this, \"_svgFactory\", new _display_utils_js__WEBPACK_IMPORTED_MODULE_1__.DOMSVGFactory());\n }\n static #setBox(element, _ref2) {\n let {\n x,\n y,\n width,\n height\n } = _ref2;\n const {\n style\n } = element;\n style.top = `${100 * y}%`;\n style.left = `${100 * x}%`;\n style.width = `${100 * width}%`;\n style.height = `${100 * height}%`;\n }\n #createSVG(box) {\n const svg = DrawLayer._svgFactory.create(1, 1, true);\n this.#parent.append(svg);\n DrawLayer.#setBox(svg, box);\n return svg;\n }\n highlight(_ref3, color, opacity) {\n let {\n outlines,\n box\n } = _ref3;\n const id = this.#id++;\n const root = this.#createSVG(box);\n root.classList.add(\"highlight\");\n const defs = DrawLayer._svgFactory.createElement(\"defs\");\n root.append(defs);\n const path = DrawLayer._svgFactory.createElement(\"path\");\n defs.append(path);\n const pathId = `path_p${this.pageIndex}_${id}`;\n path.setAttribute(\"id\", pathId);\n path.setAttribute(\"d\", DrawLayer.#extractPathFromHighlightOutlines(outlines));\n const clipPath = DrawLayer._svgFactory.createElement(\"clipPath\");\n defs.append(clipPath);\n const clipPathId = `clip_${pathId}`;\n clipPath.setAttribute(\"id\", clipPathId);\n clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n const clipPathUse = DrawLayer._svgFactory.createElement(\"use\");\n clipPath.append(clipPathUse);\n clipPathUse.setAttribute(\"href\", `#${pathId}`);\n clipPathUse.classList.add(\"clip\");\n const use = DrawLayer._svgFactory.createElement(\"use\");\n root.append(use);\n root.setAttribute(\"fill\", color);\n root.setAttribute(\"fill-opacity\", opacity);\n use.setAttribute(\"href\", `#${pathId}`);\n this.#mapping.set(id, root);\n return {\n id,\n clipPathId: `url(#${clipPathId})`\n };\n }\n highlightOutline(_ref4) {\n let {\n outlines,\n box\n } = _ref4;\n const id = this.#id++;\n const root = this.#createSVG(box);\n root.classList.add(\"highlightOutline\");\n const defs = DrawLayer._svgFactory.createElement(\"defs\");\n root.append(defs);\n const path = DrawLayer._svgFactory.createElement(\"path\");\n defs.append(path);\n const pathId = `path_p${this.pageIndex}_${id}`;\n path.setAttribute(\"id\", pathId);\n path.setAttribute(\"d\", DrawLayer.#extractPathFromHighlightOutlines(outlines));\n path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n const use1 = DrawLayer._svgFactory.createElement(\"use\");\n root.append(use1);\n use1.setAttribute(\"href\", `#${pathId}`);\n const use2 = use1.cloneNode();\n root.append(use2);\n use1.classList.add(\"mainOutline\");\n use2.classList.add(\"secondaryOutline\");\n this.#mapping.set(id, root);\n return id;\n }\n static #extractPathFromHighlightOutlines(polygons) {\n const buffer = [];\n for (const polygon of polygons) {\n let [prevX, prevY] = polygon;\n buffer.push(`M${prevX} ${prevY}`);\n for (let i = 2; i < polygon.length; i += 2) {\n const x = polygon[i];\n const y = polygon[i + 1];\n if (x === prevX) {\n buffer.push(`V${y}`);\n prevY = y;\n } else if (y === prevY) {\n buffer.push(`H${x}`);\n prevX = x;\n }\n }\n buffer.push(\"Z\");\n }\n return buffer.join(\" \");\n }\n updateBox(id, box) {\n DrawLayer.#setBox(this.#mapping.get(id), box);\n }\n rotate(id, angle) {\n this.#mapping.get(id).setAttribute(\"data-main-rotation\", angle);\n }\n changeColor(id, color) {\n this.#mapping.get(id).setAttribute(\"fill\", color);\n }\n changeOpacity(id, opacity) {\n this.#mapping.get(id).setAttribute(\"fill-opacity\", opacity);\n }\n addClass(id, className) {\n this.#mapping.get(id).classList.add(className);\n }\n removeClass(id, className) {\n this.#mapping.get(id).classList.remove(className);\n }\n remove(id) {\n if (this.#parent === null) {\n return;\n }\n this.#mapping.get(id).remove();\n this.#mapping.delete(id);\n }\n destroy() {\n this.#parent = null;\n for (const root of this.#mapping.values()) {\n root.remove();\n }\n this.#mapping.clear();\n }\n}\n\n\n/***/ }),\n\n/***/ 4629:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_412124__) => {\n\n\n// EXPORTS\n__nested_webpack_require_412124__.d(__nested_webpack_exports__, {\n AnnotationEditorLayer: () => (/* binding */ AnnotationEditorLayer)\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.map.js\nvar esnext_iterator_map = __nested_webpack_require_412124__(7944);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.difference.v2.js\nvar esnext_set_difference_v2 = __nested_webpack_require_412124__(5561);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.intersection.v2.js\nvar esnext_set_intersection_v2 = __nested_webpack_require_412124__(8587);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-disjoint-from.v2.js\nvar esnext_set_is_disjoint_from_v2 = __nested_webpack_require_412124__(3247);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-subset-of.v2.js\nvar esnext_set_is_subset_of_v2 = __nested_webpack_require_412124__(3302);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-superset-of.v2.js\nvar esnext_set_is_superset_of_v2 = __nested_webpack_require_412124__(9490);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.symmetric-difference.v2.js\nvar esnext_set_symmetric_difference_v2 = __nested_webpack_require_412124__(5438);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.union.v2.js\nvar esnext_set_union_v2 = __nested_webpack_require_412124__(7914);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push = __nested_webpack_require_412124__(4226);\n// EXTERNAL MODULE: ./src/shared/util.js\nvar util = __nested_webpack_require_412124__(3266);\n// EXTERNAL MODULE: ./src/display/editor/editor.js + 2 modules\nvar editor_editor = __nested_webpack_require_412124__(9115);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js\nvar esnext_iterator_constructor = __nested_webpack_require_412124__(7121);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.some.js\nvar esnext_iterator_some = __nested_webpack_require_412124__(8518);\n// EXTERNAL MODULE: ./src/display/editor/tools.js\nvar tools = __nested_webpack_require_412124__(4812);\n// EXTERNAL MODULE: ./src/display/annotation_layer.js + 1 modules\nvar annotation_layer = __nested_webpack_require_412124__(7640);\n;// CONCATENATED MODULE: ./src/display/editor/freetext.js\n\n\n\n\n\n\n\nclass FreeTextEditor extends editor_editor.AnnotationEditor {\n #boundEditorDivBlur = this.editorDivBlur.bind(this);\n #boundEditorDivFocus = this.editorDivFocus.bind(this);\n #boundEditorDivInput = this.editorDivInput.bind(this);\n #boundEditorDivKeydown = this.editorDivKeydown.bind(this);\n #color;\n #content = \"\";\n #editorDivId = `${this.id}-editor`;\n #fontSize;\n #initialData = null;\n static _freeTextDefaultContent = \"\";\n static _internalPadding = 0;\n static _defaultColor = null;\n static _defaultFontSize = 10;\n static get _keyboardManager() {\n const proto = FreeTextEditor.prototype;\n const arrowChecker = self => self.isEmpty();\n const small = tools.AnnotationEditorUIManager.TRANSLATE_SMALL;\n const big = tools.AnnotationEditorUIManager.TRANSLATE_BIG;\n return (0,util.shadow)(this, \"_keyboardManager\", new tools.KeyboardManager([[[\"ctrl+s\", \"mac+meta+s\", \"ctrl+p\", \"mac+meta+p\"], proto.commitOrRemove, {\n bubbles: true\n }], [[\"ctrl+Enter\", \"mac+meta+Enter\", \"Escape\", \"mac+Escape\"], proto.commitOrRemove], [[\"ArrowLeft\", \"mac+ArrowLeft\"], proto._translateEmpty, {\n args: [-small, 0],\n checker: arrowChecker\n }], [[\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"], proto._translateEmpty, {\n args: [-big, 0],\n checker: arrowChecker\n }], [[\"ArrowRight\", \"mac+ArrowRight\"], proto._translateEmpty, {\n args: [small, 0],\n checker: arrowChecker\n }], [[\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"], proto._translateEmpty, {\n args: [big, 0],\n checker: arrowChecker\n }], [[\"ArrowUp\", \"mac+ArrowUp\"], proto._translateEmpty, {\n args: [0, -small],\n checker: arrowChecker\n }], [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], proto._translateEmpty, {\n args: [0, -big],\n checker: arrowChecker\n }], [[\"ArrowDown\", \"mac+ArrowDown\"], proto._translateEmpty, {\n args: [0, small],\n checker: arrowChecker\n }], [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], proto._translateEmpty, {\n args: [0, big],\n checker: arrowChecker\n }]]));\n }\n static _type = \"freetext\";\n static _editorType = util.AnnotationEditorType.FREETEXT;\n constructor(params) {\n super({\n ...params,\n name: \"freeTextEditor\"\n });\n this.#color = params.color || FreeTextEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor;\n this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize;\n }\n static initialize(l10n) {\n editor_editor.AnnotationEditor.initialize(l10n, {\n strings: [\"pdfjs-free-text-default-content\"]\n });\n const style = getComputedStyle(document.documentElement);\n this._internalPadding = parseFloat(style.getPropertyValue(\"--freetext-padding\"));\n }\n static updateDefaultParams(type, value) {\n switch (type) {\n case util.AnnotationEditorParamsType.FREETEXT_SIZE:\n FreeTextEditor._defaultFontSize = value;\n break;\n case util.AnnotationEditorParamsType.FREETEXT_COLOR:\n FreeTextEditor._defaultColor = value;\n break;\n }\n }\n updateParams(type, value) {\n switch (type) {\n case util.AnnotationEditorParamsType.FREETEXT_SIZE:\n this.#updateFontSize(value);\n break;\n case util.AnnotationEditorParamsType.FREETEXT_COLOR:\n this.#updateColor(value);\n break;\n }\n }\n static get defaultPropertiesToUpdate() {\n return [[util.AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [util.AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor]];\n }\n get propertiesToUpdate() {\n return [[util.AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [util.AnnotationEditorParamsType.FREETEXT_COLOR, this.#color]];\n }\n #updateFontSize(fontSize) {\n const setFontsize = size => {\n this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`;\n this.translate(0, -(size - this.#fontSize) * this.parentScale);\n this.#fontSize = size;\n this.#setEditorDimensions();\n };\n const savedFontsize = this.#fontSize;\n this.addCommands({\n cmd: () => {\n setFontsize(fontSize);\n },\n undo: () => {\n setFontsize(savedFontsize);\n },\n mustExec: true,\n type: util.AnnotationEditorParamsType.FREETEXT_SIZE,\n overwriteIfSameType: true,\n keepUndo: true\n });\n }\n #updateColor(color) {\n const savedColor = this.#color;\n this.addCommands({\n cmd: () => {\n this.#color = this.editorDiv.style.color = color;\n },\n undo: () => {\n this.#color = this.editorDiv.style.color = savedColor;\n },\n mustExec: true,\n type: util.AnnotationEditorParamsType.FREETEXT_COLOR,\n overwriteIfSameType: true,\n keepUndo: true\n });\n }\n _translateEmpty(x, y) {\n this._uiManager.translateSelectedEditors(x, y, true);\n }\n getInitialTranslation() {\n const scale = this.parentScale;\n return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale];\n }\n rebuild() {\n if (!this.parent) {\n return;\n }\n super.rebuild();\n if (this.div === null) {\n return;\n }\n if (!this.isAttachedToDOM) {\n this.parent.add(this);\n }\n }\n enableEditMode() {\n if (this.isInEditMode()) {\n return;\n }\n this.parent.setEditingState(false);\n this.parent.updateToolbar(util.AnnotationEditorType.FREETEXT);\n super.enableEditMode();\n this.overlayDiv.classList.remove(\"enabled\");\n this.editorDiv.contentEditable = true;\n this._isDraggable = false;\n this.div.removeAttribute(\"aria-activedescendant\");\n this.editorDiv.addEventListener(\"keydown\", this.#boundEditorDivKeydown);\n this.editorDiv.addEventListener(\"focus\", this.#boundEditorDivFocus);\n this.editorDiv.addEventListener(\"blur\", this.#boundEditorDivBlur);\n this.editorDiv.addEventListener(\"input\", this.#boundEditorDivInput);\n }\n disableEditMode() {\n if (!this.isInEditMode()) {\n return;\n }\n this.parent.setEditingState(true);\n super.disableEditMode();\n this.overlayDiv.classList.add(\"enabled\");\n this.editorDiv.contentEditable = false;\n this.div.setAttribute(\"aria-activedescendant\", this.#editorDivId);\n this._isDraggable = true;\n this.editorDiv.removeEventListener(\"keydown\", this.#boundEditorDivKeydown);\n this.editorDiv.removeEventListener(\"focus\", this.#boundEditorDivFocus);\n this.editorDiv.removeEventListener(\"blur\", this.#boundEditorDivBlur);\n this.editorDiv.removeEventListener(\"input\", this.#boundEditorDivInput);\n this.div.focus({\n preventScroll: true\n });\n this.isEditing = false;\n this.parent.div.classList.add(\"freetextEditing\");\n }\n focusin(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n super.focusin(event);\n if (event.target !== this.editorDiv) {\n this.editorDiv.focus();\n }\n }\n onceAdded() {\n if (this.width) {\n this.#cheatInitialRect();\n return;\n }\n this.enableEditMode();\n this.editorDiv.focus();\n if (this._initialOptions?.isCentered) {\n this.center();\n }\n this._initialOptions = null;\n }\n isEmpty() {\n return !this.editorDiv || this.editorDiv.innerText.trim() === \"\";\n }\n remove() {\n this.isEditing = false;\n if (this.parent) {\n this.parent.setEditingState(true);\n this.parent.div.classList.add(\"freetextEditing\");\n }\n super.remove();\n }\n #extractText() {\n const divs = this.editorDiv.getElementsByTagName(\"div\");\n if (divs.length === 0) {\n return this.editorDiv.innerText;\n }\n const buffer = [];\n for (const div of divs) {\n buffer.push(div.innerText.replace(/\\r\\n?|\\n/, \"\"));\n }\n return buffer.join(\"\\n\");\n }\n #setEditorDimensions() {\n const [parentWidth, parentHeight] = this.parentDimensions;\n let rect;\n if (this.isAttachedToDOM) {\n rect = this.div.getBoundingClientRect();\n } else {\n const {\n currentLayer,\n div\n } = this;\n const savedDisplay = div.style.display;\n div.style.display = \"hidden\";\n currentLayer.div.append(this.div);\n rect = div.getBoundingClientRect();\n div.remove();\n div.style.display = savedDisplay;\n }\n if (this.rotation % 180 === this.parentRotation % 180) {\n this.width = rect.width / parentWidth;\n this.height = rect.height / parentHeight;\n } else {\n this.width = rect.height / parentWidth;\n this.height = rect.width / parentHeight;\n }\n this.fixAndSetPosition();\n }\n commit() {\n if (!this.isInEditMode()) {\n return;\n }\n super.commit();\n this.disableEditMode();\n const savedText = this.#content;\n const newText = this.#content = this.#extractText().trimEnd();\n if (savedText === newText) {\n return;\n }\n const setText = text => {\n this.#content = text;\n if (!text) {\n this.remove();\n return;\n }\n this.#setContent();\n this._uiManager.rebuild(this);\n this.#setEditorDimensions();\n };\n this.addCommands({\n cmd: () => {\n setText(newText);\n },\n undo: () => {\n setText(savedText);\n },\n mustExec: false\n });\n this.#setEditorDimensions();\n }\n shouldGetKeyboardEvents() {\n return this.isInEditMode();\n }\n enterInEditMode() {\n this.enableEditMode();\n this.editorDiv.focus();\n }\n dblclick(event) {\n this.enterInEditMode();\n }\n keydown(event) {\n if (event.target === this.div && event.key === \"Enter\") {\n this.enterInEditMode();\n event.preventDefault();\n }\n }\n editorDivKeydown(event) {\n FreeTextEditor._keyboardManager.exec(this, event);\n }\n editorDivFocus(event) {\n this.isEditing = true;\n }\n editorDivBlur(event) {\n this.isEditing = false;\n }\n editorDivInput(event) {\n this.parent.div.classList.toggle(\"freetextEditing\", this.isEmpty());\n }\n disableEditing() {\n this.editorDiv.setAttribute(\"role\", \"comment\");\n this.editorDiv.removeAttribute(\"aria-multiline\");\n }\n enableEditing() {\n this.editorDiv.setAttribute(\"role\", \"textbox\");\n this.editorDiv.setAttribute(\"aria-multiline\", true);\n }\n render() {\n if (this.div) {\n return this.div;\n }\n let baseX, baseY;\n if (this.width) {\n baseX = this.x;\n baseY = this.y;\n }\n super.render();\n this.editorDiv = document.createElement(\"div\");\n this.editorDiv.className = \"internal\";\n this.editorDiv.setAttribute(\"id\", this.#editorDivId);\n this.editorDiv.setAttribute(\"data-l10n-id\", \"pdfjs-free-text\");\n this.enableEditing();\n editor_editor.AnnotationEditor._l10nPromise.get(\"pdfjs-free-text-default-content\").then(msg => this.editorDiv?.setAttribute(\"default-content\", msg));\n this.editorDiv.contentEditable = true;\n const {\n style\n } = this.editorDiv;\n style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`;\n style.color = this.#color;\n this.div.append(this.editorDiv);\n this.overlayDiv = document.createElement(\"div\");\n this.overlayDiv.classList.add(\"overlay\", \"enabled\");\n this.div.append(this.overlayDiv);\n (0,tools.bindEvents)(this, this.div, [\"dblclick\", \"keydown\"]);\n if (this.width) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (this.annotationElementId) {\n const {\n position\n } = this.#initialData;\n let [tx, ty] = this.getInitialTranslation();\n [tx, ty] = this.pageTranslationToScreen(tx, ty);\n const [pageWidth, pageHeight] = this.pageDimensions;\n const [pageX, pageY] = this.pageTranslation;\n let posX, posY;\n switch (this.rotation) {\n case 0:\n posX = baseX + (position[0] - pageX) / pageWidth;\n posY = baseY + this.height - (position[1] - pageY) / pageHeight;\n break;\n case 90:\n posX = baseX + (position[0] - pageX) / pageWidth;\n posY = baseY - (position[1] - pageY) / pageHeight;\n [tx, ty] = [ty, -tx];\n break;\n case 180:\n posX = baseX - this.width + (position[0] - pageX) / pageWidth;\n posY = baseY - (position[1] - pageY) / pageHeight;\n [tx, ty] = [-tx, -ty];\n break;\n case 270:\n posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth;\n posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight;\n [tx, ty] = [-ty, tx];\n break;\n }\n this.setAt(posX * parentWidth, posY * parentHeight, tx, ty);\n } else {\n this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);\n }\n this.#setContent();\n this._isDraggable = true;\n this.editorDiv.contentEditable = false;\n } else {\n this._isDraggable = false;\n this.editorDiv.contentEditable = true;\n }\n return this.div;\n }\n #setContent() {\n this.editorDiv.replaceChildren();\n if (!this.#content) {\n return;\n }\n for (const line of this.#content.split(\"\\n\")) {\n const div = document.createElement(\"div\");\n div.append(line ? document.createTextNode(line) : document.createElement(\"br\"));\n this.editorDiv.append(div);\n }\n }\n get contentDiv() {\n return this.editorDiv;\n }\n static deserialize(data, parent, uiManager) {\n let initialData = null;\n if (data instanceof annotation_layer.FreeTextAnnotationElement) {\n const {\n data: {\n defaultAppearanceData: {\n fontSize,\n fontColor\n },\n rect,\n rotation,\n id\n },\n textContent,\n textPosition,\n parent: {\n page: {\n pageNumber\n }\n }\n } = data;\n if (!textContent || textContent.length === 0) {\n return null;\n }\n initialData = data = {\n annotationType: util.AnnotationEditorType.FREETEXT,\n color: Array.from(fontColor),\n fontSize,\n value: textContent.join(\"\\n\"),\n position: textPosition,\n pageIndex: pageNumber - 1,\n rect,\n rotation,\n id,\n deleted: false\n };\n }\n const editor = super.deserialize(data, parent, uiManager);\n editor.#fontSize = data.fontSize;\n editor.#color = util.Util.makeHexColor(...data.color);\n editor.#content = data.value;\n editor.annotationElementId = data.id || null;\n editor.#initialData = initialData;\n return editor;\n }\n serialize() {\n let isForCopying = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (this.isEmpty()) {\n return null;\n }\n if (this.deleted) {\n return {\n pageIndex: this.pageIndex,\n id: this.annotationElementId,\n deleted: true\n };\n }\n const padding = FreeTextEditor._internalPadding * this.parentScale;\n const rect = this.getRect(padding, padding);\n const color = editor_editor.AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.#color);\n const serialized = {\n annotationType: util.AnnotationEditorType.FREETEXT,\n color,\n fontSize: this.#fontSize,\n value: this.#content,\n pageIndex: this.pageIndex,\n rect,\n rotation: this.rotation,\n structTreeParentId: this._structTreeParentId\n };\n if (isForCopying) {\n return serialized;\n }\n if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n return null;\n }\n serialized.id = this.annotationElementId;\n return serialized;\n }\n #hasElementChanged(serialized) {\n const {\n value,\n fontSize,\n color,\n rect,\n pageIndex\n } = this.#initialData;\n return serialized.value !== value || serialized.fontSize !== fontSize || serialized.rect.some((x, i) => Math.abs(x - rect[i]) >= 1) || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex;\n }\n #cheatInitialRect() {\n let delayed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (!this.annotationElementId) {\n return;\n }\n this.#setEditorDimensions();\n if (!delayed && (this.width === 0 || this.height === 0)) {\n setTimeout(() => this.#cheatInitialRect(true), 0);\n return;\n }\n const padding = FreeTextEditor._internalPadding * this.parentScale;\n this.#initialData.rect = this.getRect(padding, padding);\n }\n}\n\n// EXTERNAL MODULE: ./src/display/editor/color_picker.js\nvar color_picker = __nested_webpack_require_412124__(5097);\n// EXTERNAL MODULE: ./src/display/editor/outliner.js\nvar editor_outliner = __nested_webpack_require_412124__(7405);\n;// CONCATENATED MODULE: ./src/display/editor/highlight.js\n\n\n\n\n\n\nclass HighlightEditor extends editor_editor.AnnotationEditor {\n #boxes;\n #clipPathId = null;\n #colorPicker = null;\n #focusOutlines = null;\n #highlightDiv = null;\n #highlightOutlines = null;\n #id = null;\n #lastPoint = null;\n #opacity;\n #outlineId = null;\n static _defaultColor = null;\n static _defaultOpacity = 1;\n static _l10nPromise;\n static _type = \"highlight\";\n static _editorType = util.AnnotationEditorType.HIGHLIGHT;\n constructor(params) {\n super({\n ...params,\n name: \"highlightEditor\"\n });\n HighlightEditor._defaultColor ||= this._uiManager.highlightColors?.values().next().value || \"#fff066\";\n this.color = params.color || HighlightEditor._defaultColor;\n this.#opacity = params.opacity || HighlightEditor._defaultOpacity;\n this.#boxes = params.boxes || null;\n this._isDraggable = false;\n this.#createOutlines();\n this.#addToDrawLayer();\n this.rotate(this.rotation);\n }\n #createOutlines() {\n const outliner = new editor_outliner.Outliner(this.#boxes, 0.001);\n this.#highlightOutlines = outliner.getOutlines();\n ({\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height\n } = this.#highlightOutlines.box);\n const outlinerForOutline = new editor_outliner.Outliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === \"ltr\");\n this.#focusOutlines = outlinerForOutline.getOutlines();\n const {\n lastPoint\n } = this.#focusOutlines.box;\n this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height];\n }\n static initialize(l10n) {\n editor_editor.AnnotationEditor.initialize(l10n);\n }\n static updateDefaultParams(type, value) {\n switch (type) {\n case util.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:\n HighlightEditor._defaultColor = value;\n break;\n }\n }\n get toolbarPosition() {\n return this.#lastPoint;\n }\n updateParams(type, value) {\n switch (type) {\n case util.AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n this.#updateColor(value);\n break;\n }\n }\n static get defaultPropertiesToUpdate() {\n return [[util.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR, HighlightEditor._defaultColor]];\n }\n get propertiesToUpdate() {\n return [[util.AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor]];\n }\n #updateColor(color) {\n const savedColor = this.color;\n this.addCommands({\n cmd: () => {\n this.color = color;\n this.parent.drawLayer.changeColor(this.#id, color);\n this.#colorPicker?.updateColor(color);\n },\n undo: () => {\n this.color = savedColor;\n this.parent.drawLayer.changeColor(this.#id, savedColor);\n this.#colorPicker?.updateColor(savedColor);\n },\n mustExec: true,\n type: util.AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n overwriteIfSameType: true,\n keepUndo: true\n });\n }\n async addEditToolbar() {\n const toolbar = await super.addEditToolbar();\n if (!toolbar) {\n return null;\n }\n if (this._uiManager.highlightColors) {\n this.#colorPicker = new color_picker.ColorPicker({\n editor: this\n });\n toolbar.addColorPicker(this.#colorPicker);\n }\n return toolbar;\n }\n disableEditing() {\n super.disableEditing();\n this.div.classList.toggle(\"disabled\", true);\n }\n enableEditing() {\n super.enableEditing();\n this.div.classList.toggle(\"disabled\", false);\n }\n fixAndSetPosition() {\n return super.fixAndSetPosition(0);\n }\n getRect(tx, ty) {\n return super.getRect(tx, ty, 0);\n }\n onceAdded() {\n this.parent.addUndoableEditor(this);\n this.div.focus();\n }\n remove() {\n super.remove();\n this.#cleanDrawLayer();\n }\n rebuild() {\n if (!this.parent) {\n return;\n }\n super.rebuild();\n if (this.div === null) {\n return;\n }\n this.#addToDrawLayer();\n if (!this.isAttachedToDOM) {\n this.parent.add(this);\n }\n }\n setParent(parent) {\n let mustBeSelected = false;\n if (this.parent && !parent) {\n this.#cleanDrawLayer();\n } else if (parent) {\n this.#addToDrawLayer(parent);\n mustBeSelected = !this.parent && this.div?.classList.contains(\"selectedEditor\");\n }\n super.setParent(parent);\n if (mustBeSelected) {\n this.select();\n }\n }\n #cleanDrawLayer() {\n if (this.#id === null || !this.parent) {\n return;\n }\n this.parent.drawLayer.remove(this.#id);\n this.#id = null;\n this.parent.drawLayer.remove(this.#outlineId);\n this.#outlineId = null;\n }\n #addToDrawLayer() {\n let parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.parent;\n if (this.#id !== null) {\n return;\n }\n ({\n id: this.#id,\n clipPathId: this.#clipPathId\n } = parent.drawLayer.highlight(this.#highlightOutlines, this.color, this.#opacity));\n if (this.#highlightDiv) {\n this.#highlightDiv.style.clipPath = this.#clipPathId;\n }\n this.#outlineId = parent.drawLayer.highlightOutline(this.#focusOutlines);\n }\n static #rotateBbox(_ref, angle) {\n let {\n x,\n y,\n width,\n height\n } = _ref;\n switch (angle) {\n case 90:\n return {\n x: 1 - y - height,\n y: x,\n width: height,\n height: width\n };\n case 180:\n return {\n x: 1 - x - width,\n y: 1 - y - height,\n width,\n height\n };\n case 270:\n return {\n x: y,\n y: 1 - x - width,\n width: height,\n height: width\n };\n }\n return {\n x,\n y,\n width,\n height\n };\n }\n rotate(angle) {\n const {\n drawLayer\n } = this.parent;\n drawLayer.rotate(this.#id, angle);\n drawLayer.rotate(this.#outlineId, angle);\n drawLayer.updateBox(this.#id, HighlightEditor.#rotateBbox(this, angle));\n drawLayer.updateBox(this.#outlineId, HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle));\n }\n render() {\n if (this.div) {\n return this.div;\n }\n const div = super.render();\n const highlightDiv = this.#highlightDiv = document.createElement(\"div\");\n div.append(highlightDiv);\n highlightDiv.className = \"internal\";\n highlightDiv.style.clipPath = this.#clipPathId;\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setDims(this.width * parentWidth, this.height * parentHeight);\n (0,tools.bindEvents)(this, this.#highlightDiv, [\"pointerover\", \"pointerleave\"]);\n this.enableEditing();\n return div;\n }\n pointerover() {\n this.parent.drawLayer.addClass(this.#outlineId, \"hovered\");\n }\n pointerleave() {\n this.parent.drawLayer.removeClass(this.#outlineId, \"hovered\");\n }\n select() {\n super.select();\n this.parent?.drawLayer.removeClass(this.#outlineId, \"hovered\");\n this.parent?.drawLayer.addClass(this.#outlineId, \"selected\");\n }\n unselect() {\n super.unselect();\n this.parent?.drawLayer.removeClass(this.#outlineId, \"selected\");\n }\n #serializeBoxes() {\n const [pageWidth, pageHeight] = this.pageDimensions;\n const boxes = this.#boxes;\n const quadPoints = new Array(boxes.length * 8);\n let i = 0;\n for (const {\n x,\n y,\n width,\n height\n } of boxes) {\n const sx = x * pageWidth;\n const sy = (1 - y - height) * pageHeight;\n quadPoints[i] = quadPoints[i + 4] = sx;\n quadPoints[i + 1] = quadPoints[i + 3] = sy;\n quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth;\n quadPoints[i + 5] = quadPoints[i + 7] = sy + height * pageHeight;\n i += 8;\n }\n return quadPoints;\n }\n #serializeOutlines() {\n const [pageWidth, pageHeight] = this.pageDimensions;\n const width = this.width * pageWidth;\n const height = this.height * pageHeight;\n const tx = this.x * pageWidth;\n const ty = (1 - this.y - this.height) * pageHeight;\n const outlines = [];\n for (const outline of this.#highlightOutlines.outlines) {\n const points = new Array(outline.length);\n for (let i = 0; i < outline.length; i += 2) {\n points[i] = tx + outline[i] * width;\n points[i + 1] = ty + (1 - outline[i + 1]) * height;\n }\n outlines.push(points);\n }\n return outlines;\n }\n static deserialize(data, parent, uiManager) {\n const editor = super.deserialize(data, parent, uiManager);\n const {\n rect,\n color,\n quadPoints\n } = data;\n editor.color = util.Util.makeHexColor(...color);\n editor.#opacity = data.opacity;\n const [pageWidth, pageHeight] = editor.pageDimensions;\n editor.width = (rect[2] - rect[0]) / pageWidth;\n editor.height = (rect[3] - rect[1]) / pageHeight;\n const boxes = editor.#boxes = [];\n for (let i = 0; i < quadPoints.length; i += 8) {\n boxes.push({\n x: quadPoints[4] / pageWidth,\n y: 1 - quadPoints[i + 5] / pageHeight,\n width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth,\n height: (quadPoints[i + 5] - quadPoints[i + 1]) / pageHeight\n });\n }\n editor.#createOutlines();\n return editor;\n }\n serialize() {\n let isForCopying = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (this.isEmpty() || isForCopying) {\n return null;\n }\n const rect = this.getRect(0, 0);\n const color = editor_editor.AnnotationEditor._colorManager.convert(this.color);\n return {\n annotationType: util.AnnotationEditorType.HIGHLIGHT,\n color,\n opacity: this.#opacity,\n quadPoints: this.#serializeBoxes(),\n outlines: this.#serializeOutlines(),\n pageIndex: this.pageIndex,\n rect,\n rotation: 0,\n structTreeParentId: this._structTreeParentId\n };\n }\n static canCreateNewEmptyEditor() {\n return false;\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.error.cause.js\nvar es_error_cause = __nested_webpack_require_412124__(3352);\n// EXTERNAL MODULE: ./src/display/display_utils.js\nvar display_utils = __nested_webpack_require_412124__(473);\n;// CONCATENATED MODULE: ./src/display/editor/ink.js\n\n\n\n\n\n\n\n\nclass InkEditor extends editor_editor.AnnotationEditor {\n #baseHeight = 0;\n #baseWidth = 0;\n #boundCanvasPointermove = this.canvasPointermove.bind(this);\n #boundCanvasPointerleave = this.canvasPointerleave.bind(this);\n #boundCanvasPointerup = this.canvasPointerup.bind(this);\n #boundCanvasPointerdown = this.canvasPointerdown.bind(this);\n #canvasContextMenuTimeoutId = null;\n #currentPath2D = new Path2D();\n #disableEditing = false;\n #hasSomethingToDraw = false;\n #isCanvasInitialized = false;\n #observer = null;\n #realWidth = 0;\n #realHeight = 0;\n #requestFrameCallback = null;\n static _defaultColor = null;\n static _defaultOpacity = 1;\n static _defaultThickness = 1;\n static _type = \"ink\";\n static _editorType = util.AnnotationEditorType.INK;\n constructor(params) {\n super({\n ...params,\n name: \"inkEditor\"\n });\n this.color = params.color || null;\n this.thickness = params.thickness || null;\n this.opacity = params.opacity || null;\n this.paths = [];\n this.bezierPath2D = [];\n this.allRawPaths = [];\n this.currentPath = [];\n this.scaleFactor = 1;\n this.translationX = this.translationY = 0;\n this.x = 0;\n this.y = 0;\n this._willKeepAspectRatio = true;\n }\n static initialize(l10n) {\n editor_editor.AnnotationEditor.initialize(l10n);\n }\n static updateDefaultParams(type, value) {\n switch (type) {\n case util.AnnotationEditorParamsType.INK_THICKNESS:\n InkEditor._defaultThickness = value;\n break;\n case util.AnnotationEditorParamsType.INK_COLOR:\n InkEditor._defaultColor = value;\n break;\n case util.AnnotationEditorParamsType.INK_OPACITY:\n InkEditor._defaultOpacity = value / 100;\n break;\n }\n }\n updateParams(type, value) {\n switch (type) {\n case util.AnnotationEditorParamsType.INK_THICKNESS:\n this.#updateThickness(value);\n break;\n case util.AnnotationEditorParamsType.INK_COLOR:\n this.#updateColor(value);\n break;\n case util.AnnotationEditorParamsType.INK_OPACITY:\n this.#updateOpacity(value);\n break;\n }\n }\n static get defaultPropertiesToUpdate() {\n return [[util.AnnotationEditorParamsType.INK_THICKNESS, InkEditor._defaultThickness], [util.AnnotationEditorParamsType.INK_COLOR, InkEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor], [util.AnnotationEditorParamsType.INK_OPACITY, Math.round(InkEditor._defaultOpacity * 100)]];\n }\n get propertiesToUpdate() {\n return [[util.AnnotationEditorParamsType.INK_THICKNESS, this.thickness || InkEditor._defaultThickness], [util.AnnotationEditorParamsType.INK_COLOR, this.color || InkEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor], [util.AnnotationEditorParamsType.INK_OPACITY, Math.round(100 * (this.opacity ?? InkEditor._defaultOpacity))]];\n }\n #updateThickness(thickness) {\n const savedThickness = this.thickness;\n this.addCommands({\n cmd: () => {\n this.thickness = thickness;\n this.#fitToContent();\n },\n undo: () => {\n this.thickness = savedThickness;\n this.#fitToContent();\n },\n mustExec: true,\n type: util.AnnotationEditorParamsType.INK_THICKNESS,\n overwriteIfSameType: true,\n keepUndo: true\n });\n }\n #updateColor(color) {\n const savedColor = this.color;\n this.addCommands({\n cmd: () => {\n this.color = color;\n this.#redraw();\n },\n undo: () => {\n this.color = savedColor;\n this.#redraw();\n },\n mustExec: true,\n type: util.AnnotationEditorParamsType.INK_COLOR,\n overwriteIfSameType: true,\n keepUndo: true\n });\n }\n #updateOpacity(opacity) {\n opacity /= 100;\n const savedOpacity = this.opacity;\n this.addCommands({\n cmd: () => {\n this.opacity = opacity;\n this.#redraw();\n },\n undo: () => {\n this.opacity = savedOpacity;\n this.#redraw();\n },\n mustExec: true,\n type: util.AnnotationEditorParamsType.INK_OPACITY,\n overwriteIfSameType: true,\n keepUndo: true\n });\n }\n rebuild() {\n if (!this.parent) {\n return;\n }\n super.rebuild();\n if (this.div === null) {\n return;\n }\n if (!this.canvas) {\n this.#createCanvas();\n this.#createObserver();\n }\n if (!this.isAttachedToDOM) {\n this.parent.add(this);\n this.#setCanvasDims();\n }\n this.#fitToContent();\n }\n remove() {\n if (this.canvas === null) {\n return;\n }\n if (!this.isEmpty()) {\n this.commit();\n }\n this.canvas.width = this.canvas.height = 0;\n this.canvas.remove();\n this.canvas = null;\n if (this.#canvasContextMenuTimeoutId) {\n clearTimeout(this.#canvasContextMenuTimeoutId);\n this.#canvasContextMenuTimeoutId = null;\n }\n this.#observer.disconnect();\n this.#observer = null;\n super.remove();\n }\n setParent(parent) {\n if (!this.parent && parent) {\n this._uiManager.removeShouldRescale(this);\n } else if (this.parent && parent === null) {\n this._uiManager.addShouldRescale(this);\n }\n super.setParent(parent);\n }\n onScaleChanging() {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const width = this.width * parentWidth;\n const height = this.height * parentHeight;\n this.setDimensions(width, height);\n }\n enableEditMode() {\n if (this.#disableEditing || this.canvas === null) {\n return;\n }\n super.enableEditMode();\n this._isDraggable = false;\n this.canvas.addEventListener(\"pointerdown\", this.#boundCanvasPointerdown);\n }\n disableEditMode() {\n if (!this.isInEditMode() || this.canvas === null) {\n return;\n }\n super.disableEditMode();\n this._isDraggable = !this.isEmpty();\n this.div.classList.remove(\"editing\");\n this.canvas.removeEventListener(\"pointerdown\", this.#boundCanvasPointerdown);\n }\n onceAdded() {\n this._isDraggable = !this.isEmpty();\n }\n isEmpty() {\n return this.paths.length === 0 || this.paths.length === 1 && this.paths[0].length === 0;\n }\n #getInitialBBox() {\n const {\n parentRotation,\n parentDimensions: [width, height]\n } = this;\n switch (parentRotation) {\n case 90:\n return [0, height, height, width];\n case 180:\n return [width, height, width, height];\n case 270:\n return [width, 0, height, width];\n default:\n return [0, 0, width, height];\n }\n }\n #setStroke() {\n const {\n ctx,\n color,\n opacity,\n thickness,\n parentScale,\n scaleFactor\n } = this;\n ctx.lineWidth = thickness * parentScale / scaleFactor;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.miterLimit = 10;\n ctx.strokeStyle = `${color}${(0,tools.opacityToHex)(opacity)}`;\n }\n #startDrawing(x, y) {\n this.canvas.addEventListener(\"contextmenu\", display_utils.noContextMenu);\n this.canvas.addEventListener(\"pointerleave\", this.#boundCanvasPointerleave);\n this.canvas.addEventListener(\"pointermove\", this.#boundCanvasPointermove);\n this.canvas.addEventListener(\"pointerup\", this.#boundCanvasPointerup);\n this.canvas.removeEventListener(\"pointerdown\", this.#boundCanvasPointerdown);\n this.isEditing = true;\n if (!this.#isCanvasInitialized) {\n this.#isCanvasInitialized = true;\n this.#setCanvasDims();\n this.thickness ||= InkEditor._defaultThickness;\n this.color ||= InkEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor;\n this.opacity ??= InkEditor._defaultOpacity;\n }\n this.currentPath.push([x, y]);\n this.#hasSomethingToDraw = false;\n this.#setStroke();\n this.#requestFrameCallback = () => {\n this.#drawPoints();\n if (this.#requestFrameCallback) {\n window.requestAnimationFrame(this.#requestFrameCallback);\n }\n };\n window.requestAnimationFrame(this.#requestFrameCallback);\n }\n #draw(x, y) {\n const [lastX, lastY] = this.currentPath.at(-1);\n if (this.currentPath.length > 1 && x === lastX && y === lastY) {\n return;\n }\n const currentPath = this.currentPath;\n let path2D = this.#currentPath2D;\n currentPath.push([x, y]);\n this.#hasSomethingToDraw = true;\n if (currentPath.length <= 2) {\n path2D.moveTo(...currentPath[0]);\n path2D.lineTo(x, y);\n return;\n }\n if (currentPath.length === 3) {\n this.#currentPath2D = path2D = new Path2D();\n path2D.moveTo(...currentPath[0]);\n }\n this.#makeBezierCurve(path2D, ...currentPath.at(-3), ...currentPath.at(-2), x, y);\n }\n #endPath() {\n if (this.currentPath.length === 0) {\n return;\n }\n const lastPoint = this.currentPath.at(-1);\n this.#currentPath2D.lineTo(...lastPoint);\n }\n #stopDrawing(x, y) {\n this.#requestFrameCallback = null;\n x = Math.min(Math.max(x, 0), this.canvas.width);\n y = Math.min(Math.max(y, 0), this.canvas.height);\n this.#draw(x, y);\n this.#endPath();\n let bezier;\n if (this.currentPath.length !== 1) {\n bezier = this.#generateBezierPoints();\n } else {\n const xy = [x, y];\n bezier = [[xy, xy.slice(), xy.slice(), xy]];\n }\n const path2D = this.#currentPath2D;\n const currentPath = this.currentPath;\n this.currentPath = [];\n this.#currentPath2D = new Path2D();\n const cmd = () => {\n this.allRawPaths.push(currentPath);\n this.paths.push(bezier);\n this.bezierPath2D.push(path2D);\n this.rebuild();\n };\n const undo = () => {\n this.allRawPaths.pop();\n this.paths.pop();\n this.bezierPath2D.pop();\n if (this.paths.length === 0) {\n this.remove();\n } else {\n if (!this.canvas) {\n this.#createCanvas();\n this.#createObserver();\n }\n this.#fitToContent();\n }\n };\n this.addCommands({\n cmd,\n undo,\n mustExec: true\n });\n }\n #drawPoints() {\n if (!this.#hasSomethingToDraw) {\n return;\n }\n this.#hasSomethingToDraw = false;\n const thickness = Math.ceil(this.thickness * this.parentScale);\n const lastPoints = this.currentPath.slice(-3);\n const x = lastPoints.map(xy => xy[0]);\n const y = lastPoints.map(xy => xy[1]);\n const xMin = Math.min(...x) - thickness;\n const xMax = Math.max(...x) + thickness;\n const yMin = Math.min(...y) - thickness;\n const yMax = Math.max(...y) + thickness;\n const {\n ctx\n } = this;\n ctx.save();\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n for (const path of this.bezierPath2D) {\n ctx.stroke(path);\n }\n ctx.stroke(this.#currentPath2D);\n ctx.restore();\n }\n #makeBezierCurve(path2D, x0, y0, x1, y1, x2, y2) {\n const prevX = (x0 + x1) / 2;\n const prevY = (y0 + y1) / 2;\n const x3 = (x1 + x2) / 2;\n const y3 = (y1 + y2) / 2;\n path2D.bezierCurveTo(prevX + 2 * (x1 - prevX) / 3, prevY + 2 * (y1 - prevY) / 3, x3 + 2 * (x1 - x3) / 3, y3 + 2 * (y1 - y3) / 3, x3, y3);\n }\n #generateBezierPoints() {\n const path = this.currentPath;\n if (path.length <= 2) {\n return [[path[0], path[0], path.at(-1), path.at(-1)]];\n }\n const bezierPoints = [];\n let i;\n let [x0, y0] = path[0];\n for (i = 1; i < path.length - 2; i++) {\n const [x1, y1] = path[i];\n const [x2, y2] = path[i + 1];\n const x3 = (x1 + x2) / 2;\n const y3 = (y1 + y2) / 2;\n const control1 = [x0 + 2 * (x1 - x0) / 3, y0 + 2 * (y1 - y0) / 3];\n const control2 = [x3 + 2 * (x1 - x3) / 3, y3 + 2 * (y1 - y3) / 3];\n bezierPoints.push([[x0, y0], control1, control2, [x3, y3]]);\n [x0, y0] = [x3, y3];\n }\n const [x1, y1] = path[i];\n const [x2, y2] = path[i + 1];\n const control1 = [x0 + 2 * (x1 - x0) / 3, y0 + 2 * (y1 - y0) / 3];\n const control2 = [x2 + 2 * (x1 - x2) / 3, y2 + 2 * (y1 - y2) / 3];\n bezierPoints.push([[x0, y0], control1, control2, [x2, y2]]);\n return bezierPoints;\n }\n #redraw() {\n if (this.isEmpty()) {\n this.#updateTransform();\n return;\n }\n this.#setStroke();\n const {\n canvas,\n ctx\n } = this;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n this.#updateTransform();\n for (const path of this.bezierPath2D) {\n ctx.stroke(path);\n }\n }\n commit() {\n if (this.#disableEditing) {\n return;\n }\n super.commit();\n this.isEditing = false;\n this.disableEditMode();\n this.setInForeground();\n this.#disableEditing = true;\n this.div.classList.add(\"disabled\");\n this.#fitToContent(true);\n this.select();\n this.parent.addInkEditorIfNeeded(true);\n this.moveInDOM();\n this.div.focus({\n preventScroll: true\n });\n }\n focusin(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n super.focusin(event);\n this.enableEditMode();\n }\n canvasPointerdown(event) {\n if (event.button !== 0 || !this.isInEditMode() || this.#disableEditing) {\n return;\n }\n this.setInForeground();\n event.preventDefault();\n if (!this.div.contains(document.activeElement)) {\n this.div.focus({\n preventScroll: true\n });\n }\n this.#startDrawing(event.offsetX, event.offsetY);\n }\n canvasPointermove(event) {\n event.preventDefault();\n this.#draw(event.offsetX, event.offsetY);\n }\n canvasPointerup(event) {\n event.preventDefault();\n this.#endDrawing(event);\n }\n canvasPointerleave(event) {\n this.#endDrawing(event);\n }\n #endDrawing(event) {\n this.canvas.removeEventListener(\"pointerleave\", this.#boundCanvasPointerleave);\n this.canvas.removeEventListener(\"pointermove\", this.#boundCanvasPointermove);\n this.canvas.removeEventListener(\"pointerup\", this.#boundCanvasPointerup);\n this.canvas.addEventListener(\"pointerdown\", this.#boundCanvasPointerdown);\n if (this.#canvasContextMenuTimeoutId) {\n clearTimeout(this.#canvasContextMenuTimeoutId);\n }\n this.#canvasContextMenuTimeoutId = setTimeout(() => {\n this.#canvasContextMenuTimeoutId = null;\n this.canvas.removeEventListener(\"contextmenu\", display_utils.noContextMenu);\n }, 10);\n this.#stopDrawing(event.offsetX, event.offsetY);\n this.addToAnnotationStorage();\n this.setInBackground();\n }\n #createCanvas() {\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = this.canvas.height = 0;\n this.canvas.className = \"inkEditorCanvas\";\n this.canvas.setAttribute(\"data-l10n-id\", \"pdfjs-ink-canvas\");\n this.div.append(this.canvas);\n this.ctx = this.canvas.getContext(\"2d\");\n }\n #createObserver() {\n this.#observer = new ResizeObserver(entries => {\n const rect = entries[0].contentRect;\n if (rect.width && rect.height) {\n this.setDimensions(rect.width, rect.height);\n }\n });\n this.#observer.observe(this.div);\n }\n get isResizable() {\n return !this.isEmpty() && this.#disableEditing;\n }\n render() {\n if (this.div) {\n return this.div;\n }\n let baseX, baseY;\n if (this.width) {\n baseX = this.x;\n baseY = this.y;\n }\n super.render();\n this.div.setAttribute(\"data-l10n-id\", \"pdfjs-ink\");\n const [x, y, w, h] = this.#getInitialBBox();\n this.setAt(x, y, 0, 0);\n this.setDims(w, h);\n this.#createCanvas();\n if (this.width) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setAspectRatio(this.width * parentWidth, this.height * parentHeight);\n this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);\n this.#isCanvasInitialized = true;\n this.#setCanvasDims();\n this.setDims(this.width * parentWidth, this.height * parentHeight);\n this.#redraw();\n this.div.classList.add(\"disabled\");\n } else {\n this.div.classList.add(\"editing\");\n this.enableEditMode();\n }\n this.#createObserver();\n return this.div;\n }\n #setCanvasDims() {\n if (!this.#isCanvasInitialized) {\n return;\n }\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.canvas.width = Math.ceil(this.width * parentWidth);\n this.canvas.height = Math.ceil(this.height * parentHeight);\n this.#updateTransform();\n }\n setDimensions(width, height) {\n const roundedWidth = Math.round(width);\n const roundedHeight = Math.round(height);\n if (this.#realWidth === roundedWidth && this.#realHeight === roundedHeight) {\n return;\n }\n this.#realWidth = roundedWidth;\n this.#realHeight = roundedHeight;\n this.canvas.style.visibility = \"hidden\";\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.width = width / parentWidth;\n this.height = height / parentHeight;\n this.fixAndSetPosition();\n if (this.#disableEditing) {\n this.#setScaleFactor(width, height);\n }\n this.#setCanvasDims();\n this.#redraw();\n this.canvas.style.visibility = \"visible\";\n this.fixDims();\n }\n #setScaleFactor(width, height) {\n const padding = this.#getPadding();\n const scaleFactorW = (width - padding) / this.#baseWidth;\n const scaleFactorH = (height - padding) / this.#baseHeight;\n this.scaleFactor = Math.min(scaleFactorW, scaleFactorH);\n }\n #updateTransform() {\n const padding = this.#getPadding() / 2;\n this.ctx.setTransform(this.scaleFactor, 0, 0, this.scaleFactor, this.translationX * this.scaleFactor + padding, this.translationY * this.scaleFactor + padding);\n }\n static #buildPath2D(bezier) {\n const path2D = new Path2D();\n for (let i = 0, ii = bezier.length; i < ii; i++) {\n const [first, control1, control2, second] = bezier[i];\n if (i === 0) {\n path2D.moveTo(...first);\n }\n path2D.bezierCurveTo(control1[0], control1[1], control2[0], control2[1], second[0], second[1]);\n }\n return path2D;\n }\n static #toPDFCoordinates(points, rect, rotation) {\n const [blX, blY, trX, trY] = rect;\n switch (rotation) {\n case 0:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n points[i] += blX;\n points[i + 1] = trY - points[i + 1];\n }\n break;\n case 90:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n const x = points[i];\n points[i] = points[i + 1] + blX;\n points[i + 1] = x + blY;\n }\n break;\n case 180:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n points[i] = trX - points[i];\n points[i + 1] += blY;\n }\n break;\n case 270:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n const x = points[i];\n points[i] = trX - points[i + 1];\n points[i + 1] = trY - x;\n }\n break;\n default:\n throw new Error(\"Invalid rotation\");\n }\n return points;\n }\n static #fromPDFCoordinates(points, rect, rotation) {\n const [blX, blY, trX, trY] = rect;\n switch (rotation) {\n case 0:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n points[i] -= blX;\n points[i + 1] = trY - points[i + 1];\n }\n break;\n case 90:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n const x = points[i];\n points[i] = points[i + 1] - blY;\n points[i + 1] = x - blX;\n }\n break;\n case 180:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n points[i] = trX - points[i];\n points[i + 1] -= blY;\n }\n break;\n case 270:\n for (let i = 0, ii = points.length; i < ii; i += 2) {\n const x = points[i];\n points[i] = trY - points[i + 1];\n points[i + 1] = trX - x;\n }\n break;\n default:\n throw new Error(\"Invalid rotation\");\n }\n return points;\n }\n #serializePaths(s, tx, ty, rect) {\n const paths = [];\n const padding = this.thickness / 2;\n const shiftX = s * tx + padding;\n const shiftY = s * ty + padding;\n for (const bezier of this.paths) {\n const buffer = [];\n const points = [];\n for (let j = 0, jj = bezier.length; j < jj; j++) {\n const [first, control1, control2, second] = bezier[j];\n const p10 = s * first[0] + shiftX;\n const p11 = s * first[1] + shiftY;\n const p20 = s * control1[0] + shiftX;\n const p21 = s * control1[1] + shiftY;\n const p30 = s * control2[0] + shiftX;\n const p31 = s * control2[1] + shiftY;\n const p40 = s * second[0] + shiftX;\n const p41 = s * second[1] + shiftY;\n if (j === 0) {\n buffer.push(p10, p11);\n points.push(p10, p11);\n }\n buffer.push(p20, p21, p30, p31, p40, p41);\n points.push(p20, p21);\n if (j === jj - 1) {\n points.push(p40, p41);\n }\n }\n paths.push({\n bezier: InkEditor.#toPDFCoordinates(buffer, rect, this.rotation),\n points: InkEditor.#toPDFCoordinates(points, rect, this.rotation)\n });\n }\n return paths;\n }\n #getBbox() {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n for (const path of this.paths) {\n for (const [first, control1, control2, second] of path) {\n const bbox = util.Util.bezierBoundingBox(...first, ...control1, ...control2, ...second);\n xMin = Math.min(xMin, bbox[0]);\n yMin = Math.min(yMin, bbox[1]);\n xMax = Math.max(xMax, bbox[2]);\n yMax = Math.max(yMax, bbox[3]);\n }\n }\n return [xMin, yMin, xMax, yMax];\n }\n #getPadding() {\n return this.#disableEditing ? Math.ceil(this.thickness * this.parentScale) : 0;\n }\n #fitToContent() {\n let firstTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (this.isEmpty()) {\n return;\n }\n if (!this.#disableEditing) {\n this.#redraw();\n return;\n }\n const bbox = this.#getBbox();\n const padding = this.#getPadding();\n this.#baseWidth = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]);\n this.#baseHeight = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]);\n const width = Math.ceil(padding + this.#baseWidth * this.scaleFactor);\n const height = Math.ceil(padding + this.#baseHeight * this.scaleFactor);\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.width = width / parentWidth;\n this.height = height / parentHeight;\n this.setAspectRatio(width, height);\n const prevTranslationX = this.translationX;\n const prevTranslationY = this.translationY;\n this.translationX = -bbox[0];\n this.translationY = -bbox[1];\n this.#setCanvasDims();\n this.#redraw();\n this.#realWidth = width;\n this.#realHeight = height;\n this.setDims(width, height);\n const unscaledPadding = firstTime ? padding / this.scaleFactor / 2 : 0;\n this.translate(prevTranslationX - this.translationX - unscaledPadding, prevTranslationY - this.translationY - unscaledPadding);\n }\n static deserialize(data, parent, uiManager) {\n if (data instanceof annotation_layer.InkAnnotationElement) {\n return null;\n }\n const editor = super.deserialize(data, parent, uiManager);\n editor.thickness = data.thickness;\n editor.color = util.Util.makeHexColor(...data.color);\n editor.opacity = data.opacity;\n const [pageWidth, pageHeight] = editor.pageDimensions;\n const width = editor.width * pageWidth;\n const height = editor.height * pageHeight;\n const scaleFactor = editor.parentScale;\n const padding = data.thickness / 2;\n editor.#disableEditing = true;\n editor.#realWidth = Math.round(width);\n editor.#realHeight = Math.round(height);\n const {\n paths,\n rect,\n rotation\n } = data;\n for (let {\n bezier\n } of paths) {\n bezier = InkEditor.#fromPDFCoordinates(bezier, rect, rotation);\n const path = [];\n editor.paths.push(path);\n let p0 = scaleFactor * (bezier[0] - padding);\n let p1 = scaleFactor * (bezier[1] - padding);\n for (let i = 2, ii = bezier.length; i < ii; i += 6) {\n const p10 = scaleFactor * (bezier[i] - padding);\n const p11 = scaleFactor * (bezier[i + 1] - padding);\n const p20 = scaleFactor * (bezier[i + 2] - padding);\n const p21 = scaleFactor * (bezier[i + 3] - padding);\n const p30 = scaleFactor * (bezier[i + 4] - padding);\n const p31 = scaleFactor * (bezier[i + 5] - padding);\n path.push([[p0, p1], [p10, p11], [p20, p21], [p30, p31]]);\n p0 = p30;\n p1 = p31;\n }\n const path2D = this.#buildPath2D(path);\n editor.bezierPath2D.push(path2D);\n }\n const bbox = editor.#getBbox();\n editor.#baseWidth = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]);\n editor.#baseHeight = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]);\n editor.#setScaleFactor(width, height);\n return editor;\n }\n serialize() {\n if (this.isEmpty()) {\n return null;\n }\n const rect = this.getRect(0, 0);\n const color = editor_editor.AnnotationEditor._colorManager.convert(this.ctx.strokeStyle);\n return {\n annotationType: util.AnnotationEditorType.INK,\n color,\n thickness: this.thickness,\n opacity: this.opacity,\n paths: this.#serializePaths(this.scaleFactor / this.parentScale, this.translationX, this.translationY, rect),\n pageIndex: this.pageIndex,\n rect,\n rotation: this.rotation,\n structTreeParentId: this._structTreeParentId\n };\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js\nvar esnext_iterator_filter = __nested_webpack_require_412124__(2993);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js\nvar web_dom_exception_stack = __nested_webpack_require_412124__(9709);\n;// CONCATENATED MODULE: ./src/display/editor/stamp.js\n\n\n\n\n\n\n\nclass StampEditor extends editor_editor.AnnotationEditor {\n #bitmap = null;\n #bitmapId = null;\n #bitmapPromise = null;\n #bitmapUrl = null;\n #bitmapFile = null;\n #bitmapFileName = \"\";\n #canvas = null;\n #observer = null;\n #resizeTimeoutId = null;\n #isSvg = false;\n #hasBeenAddedInUndoStack = false;\n static _type = \"stamp\";\n static _editorType = util.AnnotationEditorType.STAMP;\n constructor(params) {\n super({\n ...params,\n name: \"stampEditor\"\n });\n this.#bitmapUrl = params.bitmapUrl;\n this.#bitmapFile = params.bitmapFile;\n }\n static initialize(l10n) {\n editor_editor.AnnotationEditor.initialize(l10n);\n }\n static get supportedTypes() {\n const types = [\"apng\", \"avif\", \"bmp\", \"gif\", \"jpeg\", \"png\", \"svg+xml\", \"webp\", \"x-icon\"];\n return (0,util.shadow)(this, \"supportedTypes\", types.map(type => `image/${type}`));\n }\n static get supportedTypesStr() {\n return (0,util.shadow)(this, \"supportedTypesStr\", this.supportedTypes.join(\",\"));\n }\n static isHandlingMimeForPasting(mime) {\n return this.supportedTypes.includes(mime);\n }\n static paste(item, parent) {\n parent.pasteEditor(util.AnnotationEditorType.STAMP, {\n bitmapFile: item.getAsFile()\n });\n }\n #getBitmapFetched(data) {\n let fromId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!data) {\n this.remove();\n return;\n }\n this.#bitmap = data.bitmap;\n if (!fromId) {\n this.#bitmapId = data.id;\n this.#isSvg = data.isSvg;\n }\n if (data.file) {\n this.#bitmapFileName = data.file.name;\n }\n this.#createCanvas();\n }\n #getBitmapDone() {\n this.#bitmapPromise = null;\n this._uiManager.enableWaiting(false);\n if (this.#canvas) {\n this.div.focus();\n }\n }\n #getBitmap() {\n if (this.#bitmapId) {\n this._uiManager.enableWaiting(true);\n this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone());\n return;\n }\n if (this.#bitmapUrl) {\n const url = this.#bitmapUrl;\n this.#bitmapUrl = null;\n this._uiManager.enableWaiting(true);\n this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone());\n return;\n }\n if (this.#bitmapFile) {\n const file = this.#bitmapFile;\n this.#bitmapFile = null;\n this._uiManager.enableWaiting(true);\n this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone());\n return;\n }\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = StampEditor.supportedTypesStr;\n this.#bitmapPromise = new Promise(resolve => {\n input.addEventListener(\"change\", async () => {\n if (!input.files || input.files.length === 0) {\n this.remove();\n } else {\n this._uiManager.enableWaiting(true);\n const data = await this._uiManager.imageManager.getFromFile(input.files[0]);\n this.#getBitmapFetched(data);\n }\n resolve();\n });\n input.addEventListener(\"cancel\", () => {\n this.remove();\n resolve();\n });\n }).finally(() => this.#getBitmapDone());\n input.click();\n }\n remove() {\n if (this.#bitmapId) {\n this.#bitmap = null;\n this._uiManager.imageManager.deleteId(this.#bitmapId);\n this.#canvas?.remove();\n this.#canvas = null;\n this.#observer?.disconnect();\n this.#observer = null;\n if (this.#resizeTimeoutId) {\n clearTimeout(this.#resizeTimeoutId);\n this.#resizeTimeoutId = null;\n }\n }\n super.remove();\n }\n rebuild() {\n if (!this.parent) {\n if (this.#bitmapId) {\n this.#getBitmap();\n }\n return;\n }\n super.rebuild();\n if (this.div === null) {\n return;\n }\n if (this.#bitmapId) {\n this.#getBitmap();\n }\n if (!this.isAttachedToDOM) {\n this.parent.add(this);\n }\n }\n onceAdded() {\n this._isDraggable = true;\n this.div.focus();\n }\n isEmpty() {\n return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile);\n }\n get isResizable() {\n return true;\n }\n render() {\n if (this.div) {\n return this.div;\n }\n let baseX, baseY;\n if (this.width) {\n baseX = this.x;\n baseY = this.y;\n }\n super.render();\n this.div.hidden = true;\n if (this.#bitmap) {\n this.#createCanvas();\n } else {\n this.#getBitmap();\n }\n if (this.width) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);\n }\n return this.div;\n }\n #createCanvas() {\n const {\n div\n } = this;\n let {\n width,\n height\n } = this.#bitmap;\n const [pageWidth, pageHeight] = this.pageDimensions;\n const MAX_RATIO = 0.75;\n if (this.width) {\n width = this.width * pageWidth;\n height = this.height * pageHeight;\n } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) {\n const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height);\n width *= factor;\n height *= factor;\n }\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setDims(width * parentWidth / pageWidth, height * parentHeight / pageHeight);\n this._uiManager.enableWaiting(false);\n const canvas = this.#canvas = document.createElement(\"canvas\");\n div.append(canvas);\n div.hidden = false;\n this.#drawBitmap(width, height);\n this.#createObserver();\n if (!this.#hasBeenAddedInUndoStack) {\n this.parent.addUndoableEditor(this);\n this.#hasBeenAddedInUndoStack = true;\n }\n this._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n subtype: this.editorType,\n data: {\n action: \"inserted_image\"\n }\n }\n });\n this.addAltTextButton();\n if (this.#bitmapFileName) {\n canvas.setAttribute(\"aria-label\", this.#bitmapFileName);\n }\n }\n #setDimensions(width, height) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.width = width / parentWidth;\n this.height = height / parentHeight;\n this.setDims(width, height);\n if (this._initialOptions?.isCentered) {\n this.center();\n } else {\n this.fixAndSetPosition();\n }\n this._initialOptions = null;\n if (this.#resizeTimeoutId !== null) {\n clearTimeout(this.#resizeTimeoutId);\n }\n const TIME_TO_WAIT = 200;\n this.#resizeTimeoutId = setTimeout(() => {\n this.#resizeTimeoutId = null;\n this.#drawBitmap(width, height);\n }, TIME_TO_WAIT);\n }\n #scaleBitmap(width, height) {\n const {\n width: bitmapWidth,\n height: bitmapHeight\n } = this.#bitmap;\n let newWidth = bitmapWidth;\n let newHeight = bitmapHeight;\n let bitmap = this.#bitmap;\n while (newWidth > 2 * width || newHeight > 2 * height) {\n const prevWidth = newWidth;\n const prevHeight = newHeight;\n if (newWidth > 2 * width) {\n newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2);\n }\n if (newHeight > 2 * height) {\n newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2);\n }\n const offscreen = new OffscreenCanvas(newWidth, newHeight);\n const ctx = offscreen.getContext(\"2d\");\n ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);\n bitmap = offscreen.transferToImageBitmap();\n }\n return bitmap;\n }\n #drawBitmap(width, height) {\n width = Math.ceil(width);\n height = Math.ceil(height);\n const canvas = this.#canvas;\n if (!canvas || canvas.width === width && canvas.height === height) {\n return;\n }\n canvas.width = width;\n canvas.height = height;\n const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(width, height);\n const ctx = canvas.getContext(\"2d\");\n ctx.filter = this._uiManager.hcmFilter;\n ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height);\n }\n getImageForAltText() {\n return this.#canvas;\n }\n #serializeBitmap(toUrl) {\n if (toUrl) {\n if (this.#isSvg) {\n const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId);\n if (url) {\n return url;\n }\n }\n const canvas = document.createElement(\"canvas\");\n ({\n width: canvas.width,\n height: canvas.height\n } = this.#bitmap);\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(this.#bitmap, 0, 0);\n return canvas.toDataURL();\n }\n if (this.#isSvg) {\n const [pageWidth, pageHeight] = this.pageDimensions;\n const width = Math.round(this.width * pageWidth * display_utils.PixelsPerInch.PDF_TO_CSS_UNITS);\n const height = Math.round(this.height * pageHeight * display_utils.PixelsPerInch.PDF_TO_CSS_UNITS);\n const offscreen = new OffscreenCanvas(width, height);\n const ctx = offscreen.getContext(\"2d\");\n ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height);\n return offscreen.transferToImageBitmap();\n }\n return structuredClone(this.#bitmap);\n }\n #createObserver() {\n this.#observer = new ResizeObserver(entries => {\n const rect = entries[0].contentRect;\n if (rect.width && rect.height) {\n this.#setDimensions(rect.width, rect.height);\n }\n });\n this.#observer.observe(this.div);\n }\n static deserialize(data, parent, uiManager) {\n if (data instanceof annotation_layer.StampAnnotationElement) {\n return null;\n }\n const editor = super.deserialize(data, parent, uiManager);\n const {\n rect,\n bitmapUrl,\n bitmapId,\n isSvg,\n accessibilityData\n } = data;\n if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) {\n editor.#bitmapId = bitmapId;\n } else {\n editor.#bitmapUrl = bitmapUrl;\n }\n editor.#isSvg = isSvg;\n const [parentWidth, parentHeight] = editor.pageDimensions;\n editor.width = (rect[2] - rect[0]) / parentWidth;\n editor.height = (rect[3] - rect[1]) / parentHeight;\n if (accessibilityData) {\n editor.altTextData = accessibilityData;\n }\n return editor;\n }\n serialize() {\n let isForCopying = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (this.isEmpty()) {\n return null;\n }\n const serialized = {\n annotationType: util.AnnotationEditorType.STAMP,\n bitmapId: this.#bitmapId,\n pageIndex: this.pageIndex,\n rect: this.getRect(0, 0),\n rotation: this.rotation,\n isSvg: this.#isSvg,\n structTreeParentId: this._structTreeParentId\n };\n if (isForCopying) {\n serialized.bitmapUrl = this.#serializeBitmap(true);\n serialized.accessibilityData = this.altTextData;\n return serialized;\n }\n const {\n decorative,\n altText\n } = this.altTextData;\n if (!decorative && altText) {\n serialized.accessibilityData = {\n type: \"Figure\",\n alt: altText\n };\n }\n if (context === null) {\n return serialized;\n }\n context.stamps ||= new Map();\n const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null;\n if (!context.stamps.has(this.#bitmapId)) {\n context.stamps.set(this.#bitmapId, {\n area,\n serialized\n });\n serialized.bitmap = this.#serializeBitmap(false);\n } else if (this.#isSvg) {\n const prevData = context.stamps.get(this.#bitmapId);\n if (area > prevData.area) {\n prevData.area = area;\n prevData.serialized.bitmap.close();\n prevData.serialized.bitmap = this.#serializeBitmap(false);\n }\n }\n return serialized;\n }\n}\n\n;// CONCATENATED MODULE: ./src/display/editor/annotation_editor_layer.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass AnnotationEditorLayer {\n #accessibilityManager;\n #allowClick = false;\n #annotationLayer = null;\n #boundPointerup = this.pointerup.bind(this);\n #boundPointerUpAfterSelection = this.pointerUpAfterSelection.bind(this);\n #boundPointerdown = this.pointerdown.bind(this);\n #editorFocusTimeoutId = null;\n #boundSelectionStart = this.selectionStart.bind(this);\n #editors = new Map();\n #hadPointerDown = false;\n #isCleaningUp = false;\n #isDisabling = false;\n #textLayer = null;\n #uiManager;\n static _initialized = false;\n static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor].map(type => [type._editorType, type]));\n constructor(_ref) {\n let {\n uiManager,\n pageIndex,\n div,\n accessibilityManager,\n annotationLayer,\n drawLayer,\n textLayer,\n viewport,\n l10n\n } = _ref;\n const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()];\n if (!AnnotationEditorLayer._initialized) {\n AnnotationEditorLayer._initialized = true;\n for (const editorType of editorTypes) {\n editorType.initialize(l10n);\n }\n }\n uiManager.registerEditorTypes(editorTypes);\n this.#uiManager = uiManager;\n this.pageIndex = pageIndex;\n this.div = div;\n this.#accessibilityManager = accessibilityManager;\n this.#annotationLayer = annotationLayer;\n this.viewport = viewport;\n this.#textLayer = textLayer;\n this.drawLayer = drawLayer;\n this.#uiManager.addLayer(this);\n }\n get isEmpty() {\n return this.#editors.size === 0;\n }\n updateToolbar(mode) {\n this.#uiManager.updateToolbar(mode);\n }\n updateMode() {\n let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.#uiManager.getMode();\n this.#cleanup();\n switch (mode) {\n case util.AnnotationEditorType.NONE:\n this.disableTextSelection();\n this.togglePointerEvents(false);\n this.disableClick();\n break;\n case util.AnnotationEditorType.INK:\n this.addInkEditorIfNeeded(false);\n this.disableTextSelection();\n this.togglePointerEvents(true);\n this.disableClick();\n break;\n case util.AnnotationEditorType.HIGHLIGHT:\n this.enableTextSelection();\n this.togglePointerEvents(false);\n this.disableClick();\n break;\n default:\n this.disableTextSelection();\n this.togglePointerEvents(true);\n this.enableClick();\n }\n if (mode !== util.AnnotationEditorType.NONE) {\n const {\n classList\n } = this.div;\n for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType);\n }\n this.div.hidden = false;\n }\n }\n addInkEditorIfNeeded(isCommitting) {\n if (this.#uiManager.getMode() !== util.AnnotationEditorType.INK) {\n return;\n }\n if (!isCommitting) {\n for (const editor of this.#editors.values()) {\n if (editor.isEmpty()) {\n editor.setInBackground();\n return;\n }\n }\n }\n const editor = this.#createAndAddNewEditor({\n offsetX: 0,\n offsetY: 0\n }, false);\n editor.setInBackground();\n }\n setEditingState(isEditing) {\n this.#uiManager.setEditingState(isEditing);\n }\n addCommands(params) {\n this.#uiManager.addCommands(params);\n }\n togglePointerEvents() {\n let enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this.div.classList.toggle(\"disabled\", !enabled);\n }\n enable() {\n this.togglePointerEvents(true);\n const annotationElementIds = new Set();\n for (const editor of this.#editors.values()) {\n editor.enableEditing();\n if (editor.annotationElementId) {\n annotationElementIds.add(editor.annotationElementId);\n }\n }\n if (!this.#annotationLayer) {\n return;\n }\n const editables = this.#annotationLayer.getEditableAnnotations();\n for (const editable of editables) {\n editable.hide();\n if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) {\n continue;\n }\n if (annotationElementIds.has(editable.data.id)) {\n continue;\n }\n const editor = this.deserialize(editable);\n if (!editor) {\n continue;\n }\n this.addOrRebuild(editor);\n editor.enableEditing();\n }\n }\n disable() {\n this.#isDisabling = true;\n this.togglePointerEvents(false);\n const hiddenAnnotationIds = new Set();\n for (const editor of this.#editors.values()) {\n editor.disableEditing();\n if (!editor.annotationElementId || editor.serialize() !== null) {\n hiddenAnnotationIds.add(editor.annotationElementId);\n continue;\n }\n this.getEditableAnnotation(editor.annotationElementId)?.show();\n editor.remove();\n }\n if (this.#annotationLayer) {\n const editables = this.#annotationLayer.getEditableAnnotations();\n for (const editable of editables) {\n const {\n id\n } = editable.data;\n if (hiddenAnnotationIds.has(id) || this.#uiManager.isDeletedAnnotationElement(id)) {\n continue;\n }\n editable.show();\n }\n }\n this.#cleanup();\n if (this.isEmpty) {\n this.div.hidden = true;\n }\n const {\n classList\n } = this.div;\n for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n classList.remove(`${editorType._type}Editing`);\n }\n this.disableTextSelection();\n this.#isDisabling = false;\n }\n getEditableAnnotation(id) {\n return this.#annotationLayer?.getEditableAnnotation(id) || null;\n }\n setActiveEditor(editor) {\n const currentActive = this.#uiManager.getActive();\n if (currentActive === editor) {\n return;\n }\n this.#uiManager.setActiveEditor(editor);\n }\n enableTextSelection() {\n if (this.#textLayer?.div) {\n document.addEventListener(\"selectstart\", this.#boundSelectionStart);\n }\n }\n disableTextSelection() {\n if (this.#textLayer?.div) {\n document.removeEventListener(\"selectstart\", this.#boundSelectionStart);\n }\n }\n enableClick() {\n this.div.addEventListener(\"pointerdown\", this.#boundPointerdown);\n this.div.addEventListener(\"pointerup\", this.#boundPointerup);\n }\n disableClick() {\n this.div.removeEventListener(\"pointerdown\", this.#boundPointerdown);\n this.div.removeEventListener(\"pointerup\", this.#boundPointerup);\n }\n attach(editor) {\n this.#editors.set(editor.id, editor);\n const {\n annotationElementId\n } = editor;\n if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) {\n this.#uiManager.removeDeletedAnnotationElement(editor);\n }\n }\n detach(editor) {\n this.#editors.delete(editor.id);\n this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n if (!this.#isDisabling && editor.annotationElementId) {\n this.#uiManager.addDeletedAnnotationElement(editor);\n }\n }\n remove(editor) {\n this.detach(editor);\n this.#uiManager.removeEditor(editor);\n editor.div.remove();\n editor.isAttachedToDOM = false;\n if (!this.#isCleaningUp) {\n this.addInkEditorIfNeeded(false);\n }\n }\n changeParent(editor) {\n if (editor.parent === this) {\n return;\n }\n if (editor.annotationElementId) {\n this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId);\n editor_editor.AnnotationEditor.deleteAnnotationElement(editor);\n editor.annotationElementId = null;\n }\n this.attach(editor);\n editor.parent?.detach(editor);\n editor.setParent(this);\n if (editor.div && editor.isAttachedToDOM) {\n editor.div.remove();\n this.div.append(editor.div);\n }\n }\n add(editor) {\n this.changeParent(editor);\n this.#uiManager.addEditor(editor);\n this.attach(editor);\n if (!editor.isAttachedToDOM) {\n const div = editor.render();\n this.div.append(div);\n editor.isAttachedToDOM = true;\n }\n editor.fixAndSetPosition();\n editor.onceAdded();\n this.#uiManager.addToAnnotationStorage(editor);\n }\n moveEditorInDOM(editor) {\n if (!editor.isAttachedToDOM) {\n return;\n }\n const {\n activeElement\n } = document;\n if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) {\n editor._focusEventsAllowed = false;\n this.#editorFocusTimeoutId = setTimeout(() => {\n this.#editorFocusTimeoutId = null;\n if (!editor.div.contains(document.activeElement)) {\n editor.div.addEventListener(\"focusin\", () => {\n editor._focusEventsAllowed = true;\n }, {\n once: true\n });\n activeElement.focus();\n } else {\n editor._focusEventsAllowed = true;\n }\n }, 0);\n }\n editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true);\n }\n addOrRebuild(editor) {\n if (editor.needsToBeRebuilt()) {\n editor.parent ||= this;\n editor.rebuild();\n } else {\n this.add(editor);\n }\n }\n addUndoableEditor(editor) {\n const cmd = () => editor._uiManager.rebuild(editor);\n const undo = () => {\n editor.remove();\n };\n this.addCommands({\n cmd,\n undo,\n mustExec: false\n });\n }\n getNextId() {\n return this.#uiManager.getId();\n }\n get #currentEditorType() {\n return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode());\n }\n #createNewEditor(params) {\n const editorType = this.#currentEditorType;\n return editorType ? new editorType.prototype.constructor(params) : null;\n }\n canCreateNewEmptyEditor() {\n return this.#currentEditorType?.canCreateNewEmptyEditor();\n }\n pasteEditor(mode, params) {\n this.#uiManager.updateToolbar(mode);\n this.#uiManager.updateMode(mode);\n const {\n offsetX,\n offsetY\n } = this.#getCenterPoint();\n const id = this.getNextId();\n const editor = this.#createNewEditor({\n parent: this,\n id,\n x: offsetX,\n y: offsetY,\n uiManager: this.#uiManager,\n isCentered: true,\n ...params\n });\n if (editor) {\n this.add(editor);\n }\n }\n deserialize(data) {\n return AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager) || null;\n }\n #createAndAddNewEditor(event, isCentered) {\n let data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const id = this.getNextId();\n const editor = this.#createNewEditor({\n parent: this,\n id,\n x: event.offsetX,\n y: event.offsetY,\n uiManager: this.#uiManager,\n isCentered,\n ...data\n });\n if (editor) {\n this.add(editor);\n }\n return editor;\n }\n #getCenterPoint() {\n const {\n x,\n y,\n width,\n height\n } = this.div.getBoundingClientRect();\n const tlX = Math.max(0, x);\n const tlY = Math.max(0, y);\n const brX = Math.min(window.innerWidth, x + width);\n const brY = Math.min(window.innerHeight, y + height);\n const centerX = (tlX + brX) / 2 - x;\n const centerY = (tlY + brY) / 2 - y;\n const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX];\n return {\n offsetX,\n offsetY\n };\n }\n addNewEditor() {\n this.#createAndAddNewEditor(this.#getCenterPoint(), true);\n }\n setSelected(editor) {\n this.#uiManager.setSelected(editor);\n }\n toggleSelected(editor) {\n this.#uiManager.toggleSelected(editor);\n }\n isSelected(editor) {\n return this.#uiManager.isSelected(editor);\n }\n unselect(editor) {\n this.#uiManager.unselect(editor);\n }\n selectionStart(_event) {\n this.#textLayer?.div.addEventListener(\"pointerup\", this.#boundPointerUpAfterSelection, {\n once: true\n });\n }\n pointerUpAfterSelection(event) {\n const selection = document.getSelection();\n if (selection.rangeCount === 0) {\n return;\n }\n const range = selection.getRangeAt(0);\n if (range.collapsed) {\n return;\n }\n if (!this.#textLayer?.div.contains(range.commonAncestorContainer)) {\n return;\n }\n const {\n x: layerX,\n y: layerY,\n width: parentWidth,\n height: parentHeight\n } = this.#textLayer.div.getBoundingClientRect();\n const bboxes = range.getClientRects();\n let rotator;\n switch (this.viewport.rotation) {\n case 90:\n rotator = (x, y, w, h) => ({\n x: (y - layerY) / parentHeight,\n y: 1 - (x + w - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth\n });\n break;\n case 180:\n rotator = (x, y, w, h) => ({\n x: 1 - (x + w - layerX) / parentWidth,\n y: 1 - (y + h - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight\n });\n break;\n case 270:\n rotator = (x, y, w, h) => ({\n x: 1 - (y + h - layerY) / parentHeight,\n y: (x - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth\n });\n break;\n default:\n rotator = (x, y, w, h) => ({\n x: (x - layerX) / parentWidth,\n y: (y - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight\n });\n break;\n }\n const boxes = [];\n for (const {\n x,\n y,\n width,\n height\n } of bboxes) {\n if (width === 0 || height === 0) {\n continue;\n }\n boxes.push(rotator(x, y, width, height));\n }\n if (boxes.length !== 0) {\n this.#createAndAddNewEditor(event, false, {\n boxes\n });\n }\n selection.empty();\n }\n pointerup(event) {\n const {\n isMac\n } = util.FeatureTest.platform;\n if (event.button !== 0 || event.ctrlKey && isMac) {\n return;\n }\n if (event.target !== this.div) {\n return;\n }\n if (!this.#hadPointerDown) {\n return;\n }\n this.#hadPointerDown = false;\n if (!this.#allowClick) {\n this.#allowClick = true;\n return;\n }\n if (this.#uiManager.getMode() === util.AnnotationEditorType.STAMP) {\n this.#uiManager.unselectAll();\n return;\n }\n this.#createAndAddNewEditor(event, false);\n }\n pointerdown(event) {\n if (this.#uiManager.getMode() === util.AnnotationEditorType.HIGHLIGHT) {\n this.enableTextSelection();\n }\n if (this.#hadPointerDown) {\n this.#hadPointerDown = false;\n return;\n }\n const {\n isMac\n } = util.FeatureTest.platform;\n if (event.button !== 0 || event.ctrlKey && isMac) {\n return;\n }\n if (event.target !== this.div) {\n return;\n }\n this.#hadPointerDown = true;\n const editor = this.#uiManager.getActive();\n this.#allowClick = !editor || editor.isEmpty();\n }\n findNewParent(editor, x, y) {\n const layer = this.#uiManager.findParent(x, y);\n if (layer === null || layer === this) {\n return false;\n }\n layer.changeParent(editor);\n return true;\n }\n destroy() {\n if (this.#uiManager.getActive()?.parent === this) {\n this.#uiManager.commitOrRemove();\n this.#uiManager.setActiveEditor(null);\n }\n if (this.#editorFocusTimeoutId) {\n clearTimeout(this.#editorFocusTimeoutId);\n this.#editorFocusTimeoutId = null;\n }\n for (const editor of this.#editors.values()) {\n this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n editor.setParent(null);\n editor.isAttachedToDOM = false;\n editor.div.remove();\n }\n this.div = null;\n this.#editors.clear();\n this.#uiManager.removeLayer(this);\n }\n #cleanup() {\n this.#isCleaningUp = true;\n for (const editor of this.#editors.values()) {\n if (editor.isEmpty()) {\n editor.remove();\n }\n }\n this.#isCleaningUp = false;\n }\n render(_ref2) {\n let {\n viewport\n } = _ref2;\n this.viewport = viewport;\n (0,display_utils.setLayerDimensions)(this.div, viewport);\n for (const editor of this.#uiManager.getEditors(this.pageIndex)) {\n this.add(editor);\n }\n this.updateMode();\n }\n update(_ref3) {\n let {\n viewport\n } = _ref3;\n this.#uiManager.commitOrRemove();\n const oldRotation = this.viewport.rotation;\n const rotation = viewport.rotation;\n this.viewport = viewport;\n (0,display_utils.setLayerDimensions)(this.div, {\n rotation\n });\n if (oldRotation !== rotation) {\n for (const editor of this.#editors.values()) {\n editor.rotate(rotation);\n }\n }\n this.updateMode();\n }\n get pageDimensions() {\n const {\n pageWidth,\n pageHeight\n } = this.viewport.rawDims;\n return [pageWidth, pageHeight];\n }\n}\n\n\n/***/ }),\n\n/***/ 5097:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_495869__) => {\n\n/* harmony export */ __nested_webpack_require_495869__.d(__nested_webpack_exports__, {\n/* harmony export */ ColorPicker: () => (/* binding */ ColorPicker)\n/* harmony export */ });\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_495869__(3266);\n/* harmony import */ var _tools_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_495869__(4812);\n/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_495869__(473);\n\n\n\nclass ColorPicker {\n #boundKeyDown = this.#keyDown.bind(this);\n #button = null;\n #buttonSwatch = null;\n #defaultColor;\n #dropdown = null;\n #dropdownWasFromKeyboard = false;\n #isMainColorPicker = false;\n #eventBus;\n #uiManager = null;\n static get _keyboardManager() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, \"_keyboardManager\", new _tools_js__WEBPACK_IMPORTED_MODULE_1__.KeyboardManager([[[\"Escape\", \"mac+Escape\"], ColorPicker.prototype._hideDropdownFromKeyboard], [[\" \", \"mac+ \"], ColorPicker.prototype._colorSelectFromKeyboard], [[\"ArrowDown\", \"ArrowRight\", \"mac+ArrowDown\", \"mac+ArrowRight\"], ColorPicker.prototype._moveToNext], [[\"ArrowUp\", \"ArrowLeft\", \"mac+ArrowUp\", \"mac+ArrowLeft\"], ColorPicker.prototype._moveToPrevious], [[\"Home\", \"mac+Home\"], ColorPicker.prototype._moveToBeginning], [[\"End\", \"mac+End\"], ColorPicker.prototype._moveToEnd]]));\n }\n constructor(_ref) {\n let {\n editor = null,\n uiManager = null\n } = _ref;\n this.#isMainColorPicker = !editor;\n this.#uiManager = editor?._uiManager || uiManager;\n this.#eventBus = this.#uiManager._eventBus;\n this.#defaultColor = editor?.color || this.#uiManager?.highlightColors.values().next().value || \"#FFFF98\";\n }\n renderButton() {\n const button = this.#button = document.createElement(\"button\");\n button.className = \"colorPicker\";\n button.tabIndex = \"0\";\n button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-button\");\n button.setAttribute(\"aria-haspopup\", true);\n button.addEventListener(\"click\", this.#openDropdown.bind(this));\n const swatch = this.#buttonSwatch = document.createElement(\"span\");\n swatch.className = \"swatch\";\n swatch.style.backgroundColor = this.#defaultColor;\n button.append(swatch);\n return button;\n }\n renderMainDropdown() {\n const dropdown = this.#dropdown = this.#getDropdownRoot(_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR);\n dropdown.setAttribute(\"aria-orientation\", \"horizontal\");\n dropdown.setAttribute(\"aria-labelledby\", \"highlightColorPickerLabel\");\n return dropdown;\n }\n #getDropdownRoot(paramType) {\n const div = document.createElement(\"div\");\n div.addEventListener(\"contextmenu\", _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.noContextMenu);\n div.className = \"dropdown\";\n div.role = \"listbox\";\n div.setAttribute(\"aria-multiselectable\", false);\n div.setAttribute(\"aria-orientation\", \"vertical\");\n div.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-dropdown\");\n for (const [name, color] of this.#uiManager.highlightColors) {\n const button = document.createElement(\"button\");\n button.tabIndex = \"0\";\n button.role = \"option\";\n button.setAttribute(\"data-color\", color);\n button.title = name;\n button.setAttribute(\"data-l10n-id\", `pdfjs-editor-colorpicker-${name}`);\n const swatch = document.createElement(\"span\");\n button.append(swatch);\n swatch.className = \"swatch\";\n swatch.style.backgroundColor = color;\n button.setAttribute(\"aria-selected\", color === this.#defaultColor);\n button.addEventListener(\"click\", this.#colorSelect.bind(this, paramType, color));\n div.append(button);\n }\n div.addEventListener(\"keydown\", this.#boundKeyDown);\n return div;\n }\n #colorSelect(type, color, event) {\n event.stopPropagation();\n this.#eventBus.dispatch(\"switchannotationeditorparams\", {\n source: this,\n type,\n value: color\n });\n }\n _colorSelectFromKeyboard(event) {\n const color = event.target.getAttribute(\"data-color\");\n if (!color) {\n return;\n }\n this.#colorSelect(color, event);\n }\n _moveToNext(event) {\n if (event.target === this.#button) {\n this.#dropdown.firstChild?.focus();\n return;\n }\n event.target.nextSibling?.focus();\n }\n _moveToPrevious(event) {\n event.target.previousSibling?.focus();\n }\n _moveToBeginning() {\n this.#dropdown.firstChild?.focus();\n }\n _moveToEnd() {\n this.#dropdown.lastChild?.focus();\n }\n #keyDown(event) {\n ColorPicker._keyboardManager.exec(this, event);\n }\n #openDropdown(event) {\n if (this.#dropdown && !this.#dropdown.classList.contains(\"hidden\")) {\n this.hideDropdown();\n return;\n }\n this.#button.addEventListener(\"keydown\", this.#boundKeyDown);\n this.#dropdownWasFromKeyboard = event.detail === 0;\n if (this.#dropdown) {\n this.#dropdown.classList.remove(\"hidden\");\n return;\n }\n const root = this.#dropdown = this.#getDropdownRoot(_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_COLOR);\n this.#button.append(root);\n }\n hideDropdown() {\n this.#dropdown?.classList.add(\"hidden\");\n }\n _hideDropdownFromKeyboard() {\n if (this.#isMainColorPicker || !this.#dropdown || this.#dropdown.classList.contains(\"hidden\")) {\n return;\n }\n this.hideDropdown();\n this.#button.removeEventListener(\"keydown\", this.#boundKeyDown);\n this.#button.focus({\n preventScroll: true,\n focusVisible: this.#dropdownWasFromKeyboard\n });\n }\n updateColor(color) {\n if (this.#buttonSwatch) {\n this.#buttonSwatch.style.backgroundColor = color;\n }\n if (!this.#dropdown) {\n return;\n }\n const i = this.#uiManager.highlightColors.values();\n for (const child of this.#dropdown.children) {\n child.setAttribute(\"aria-selected\", i.next().value === color);\n }\n }\n destroy() {\n this.#button?.remove();\n this.#button = null;\n this.#buttonSwatch = null;\n this.#dropdown?.remove();\n this.#dropdown = null;\n }\n}\n\n\n/***/ }),\n\n/***/ 9115:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_502071__) => {\n\n\n// EXPORTS\n__nested_webpack_require_502071__.d(__nested_webpack_exports__, {\n AnnotationEditor: () => (/* binding */ AnnotationEditor)\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.error.cause.js\nvar es_error_cause = __nested_webpack_require_502071__(3352);\n// EXTERNAL MODULE: ./src/display/editor/tools.js\nvar tools = __nested_webpack_require_502071__(4812);\n// EXTERNAL MODULE: ./src/shared/util.js\nvar util = __nested_webpack_require_502071__(3266);\n// EXTERNAL MODULE: ./src/display/display_utils.js\nvar display_utils = __nested_webpack_require_502071__(473);\n;// CONCATENATED MODULE: ./src/display/editor/alt_text.js\n\nclass AltText {\n #altText = \"\";\n #altTextDecorative = false;\n #altTextButton = null;\n #altTextTooltip = null;\n #altTextTooltipTimeout = null;\n #altTextWasFromKeyBoard = false;\n #editor = null;\n static _l10nPromise = null;\n constructor(editor) {\n this.#editor = editor;\n }\n static initialize(l10nPromise) {\n AltText._l10nPromise ||= l10nPromise;\n }\n async render() {\n const altText = this.#altTextButton = document.createElement(\"button\");\n altText.className = \"altText\";\n const msg = await AltText._l10nPromise.get(\"pdfjs-editor-alt-text-button-label\");\n altText.textContent = msg;\n altText.setAttribute(\"aria-label\", msg);\n altText.tabIndex = \"0\";\n altText.addEventListener(\"contextmenu\", display_utils.noContextMenu);\n altText.addEventListener(\"pointerdown\", event => event.stopPropagation());\n const onClick = event => {\n event.preventDefault();\n this.#editor._uiManager.editAltText(this.#editor);\n };\n altText.addEventListener(\"click\", onClick, {\n capture: true\n });\n altText.addEventListener(\"keydown\", event => {\n if (event.target === altText && event.key === \"Enter\") {\n this.#altTextWasFromKeyBoard = true;\n onClick(event);\n }\n });\n await this.#setState();\n return altText;\n }\n finish() {\n if (!this.#altTextButton) {\n return;\n }\n this.#altTextButton.focus({\n focusVisible: this.#altTextWasFromKeyBoard\n });\n this.#altTextWasFromKeyBoard = false;\n }\n get data() {\n return {\n altText: this.#altText,\n decorative: this.#altTextDecorative\n };\n }\n set data(_ref) {\n let {\n altText,\n decorative\n } = _ref;\n if (this.#altText === altText && this.#altTextDecorative === decorative) {\n return;\n }\n this.#altText = altText;\n this.#altTextDecorative = decorative;\n this.#setState();\n }\n toggle() {\n let enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (!this.#altTextButton) {\n return;\n }\n if (!enabled && this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextButton.disabled = !enabled;\n }\n destroy() {\n this.#altTextButton?.remove();\n this.#altTextButton = null;\n this.#altTextTooltip = null;\n }\n async #setState() {\n const button = this.#altTextButton;\n if (!button) {\n return;\n }\n if (!this.#altText && !this.#altTextDecorative) {\n button.classList.remove(\"done\");\n this.#altTextTooltip?.remove();\n return;\n }\n button.classList.add(\"done\");\n AltText._l10nPromise.get(\"pdfjs-editor-alt-text-edit-button-label\").then(msg => {\n button.setAttribute(\"aria-label\", msg);\n });\n let tooltip = this.#altTextTooltip;\n if (!tooltip) {\n this.#altTextTooltip = tooltip = document.createElement(\"span\");\n tooltip.className = \"tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n const id = tooltip.id = `alt-text-tooltip-${this.#editor.id}`;\n button.setAttribute(\"aria-describedby\", id);\n const DELAY_TO_SHOW_TOOLTIP = 100;\n button.addEventListener(\"mouseenter\", () => {\n this.#altTextTooltipTimeout = setTimeout(() => {\n this.#altTextTooltipTimeout = null;\n this.#altTextTooltip.classList.add(\"show\");\n this.#editor._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n subtype: this.#editor.editorType,\n data: {\n action: \"alt_text_tooltip\"\n }\n }\n });\n }, DELAY_TO_SHOW_TOOLTIP);\n });\n button.addEventListener(\"mouseleave\", () => {\n if (this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextTooltip?.classList.remove(\"show\");\n });\n }\n tooltip.innerText = this.#altTextDecorative ? await AltText._l10nPromise.get(\"pdfjs-editor-alt-text-decorative-tooltip\") : this.#altText;\n if (!tooltip.parentNode) {\n button.append(tooltip);\n }\n const element = this.#editor.getImageForAltText();\n element?.setAttribute(\"aria-describedby\", tooltip.id);\n }\n}\n\n;// CONCATENATED MODULE: ./src/display/editor/toolbar.js\n\nclass EditorToolbar {\n #toolbar = null;\n #colorPicker = null;\n #editor;\n #buttons = null;\n constructor(editor) {\n this.#editor = editor;\n }\n render() {\n const editToolbar = this.#toolbar = document.createElement(\"div\");\n editToolbar.className = \"editToolbar\";\n editToolbar.addEventListener(\"contextmenu\", display_utils.noContextMenu);\n editToolbar.addEventListener(\"pointerdown\", EditorToolbar.#pointerDown);\n const buttons = this.#buttons = document.createElement(\"div\");\n buttons.className = \"buttons\";\n editToolbar.append(buttons);\n const position = this.#editor.toolbarPosition;\n if (position) {\n const {\n style\n } = editToolbar;\n const x = this.#editor._uiManager.direction === \"ltr\" ? 1 - position[0] : position[0];\n style.insetInlineEnd = `${100 * x}%`;\n style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`;\n }\n this.#addDeleteButton();\n return editToolbar;\n }\n static #pointerDown(e) {\n e.stopPropagation();\n }\n #focusIn(e) {\n this.#editor._focusEventsAllowed = false;\n e.preventDefault();\n e.stopPropagation();\n }\n #focusOut(e) {\n this.#editor._focusEventsAllowed = true;\n e.preventDefault();\n e.stopPropagation();\n }\n #addListenersToElement(element) {\n element.addEventListener(\"focusin\", this.#focusIn.bind(this), {\n capture: true\n });\n element.addEventListener(\"focusout\", this.#focusOut.bind(this), {\n capture: true\n });\n element.addEventListener(\"contextmenu\", display_utils.noContextMenu);\n }\n hide() {\n this.#toolbar.classList.add(\"hidden\");\n this.#colorPicker?.hideDropdown();\n }\n show() {\n this.#toolbar.classList.remove(\"hidden\");\n }\n #addDeleteButton() {\n const button = document.createElement(\"button\");\n button.className = \"delete\";\n button.tabIndex = 0;\n button.setAttribute(\"data-l10n-id\", `pdfjs-editor-remove-${this.#editor.editorType}-button`);\n this.#addListenersToElement(button);\n button.addEventListener(\"click\", e => {\n this.#editor._uiManager.delete();\n });\n this.#buttons.append(button);\n }\n get #divider() {\n const divider = document.createElement(\"div\");\n divider.className = \"divider\";\n return divider;\n }\n addAltTextButton(button) {\n this.#addListenersToElement(button);\n this.#buttons.prepend(button, this.#divider);\n }\n addColorPicker(colorPicker) {\n this.#colorPicker = colorPicker;\n const button = colorPicker.renderButton();\n this.#addListenersToElement(button);\n this.#buttons.prepend(button, this.#divider);\n }\n remove() {\n this.#toolbar.remove();\n this.#colorPicker?.destroy();\n this.#colorPicker = null;\n }\n}\n\n;// CONCATENATED MODULE: ./src/display/editor/editor.js\n\n\n\n\n\n\nclass AnnotationEditor {\n #allResizerDivs = null;\n #altText = null;\n #keepAspectRatio = false;\n #resizersDiv = null;\n #savedDimensions = null;\n #boundFocusin = this.focusin.bind(this);\n #boundFocusout = this.focusout.bind(this);\n #editToolbar = null;\n #focusedResizerName = \"\";\n #hasBeenClicked = false;\n #isEditing = false;\n #isInEditMode = false;\n #isResizerEnabledForKeyboard = false;\n #moveInDOMTimeout = null;\n _initialOptions = Object.create(null);\n _uiManager = null;\n _focusEventsAllowed = true;\n _l10nPromise = null;\n #isDraggable = false;\n #zIndex = AnnotationEditor._zIndex++;\n static _borderLineWidth = -1;\n static _colorManager = new tools.ColorManager();\n static _zIndex = 1;\n static get _resizerKeyboardManager() {\n const resize = AnnotationEditor.prototype._resizeWithKeyboard;\n const small = tools.AnnotationEditorUIManager.TRANSLATE_SMALL;\n const big = tools.AnnotationEditorUIManager.TRANSLATE_BIG;\n return (0,util.shadow)(this, \"_resizerKeyboardManager\", new tools.KeyboardManager([[[\"ArrowLeft\", \"mac+ArrowLeft\"], resize, {\n args: [-small, 0]\n }], [[\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"], resize, {\n args: [-big, 0]\n }], [[\"ArrowRight\", \"mac+ArrowRight\"], resize, {\n args: [small, 0]\n }], [[\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"], resize, {\n args: [big, 0]\n }], [[\"ArrowUp\", \"mac+ArrowUp\"], resize, {\n args: [0, -small]\n }], [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], resize, {\n args: [0, -big]\n }], [[\"ArrowDown\", \"mac+ArrowDown\"], resize, {\n args: [0, small]\n }], [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], resize, {\n args: [0, big]\n }], [[\"Escape\", \"mac+Escape\"], AnnotationEditor.prototype._stopResizingWithKeyboard]]));\n }\n constructor(parameters) {\n if (this.constructor === AnnotationEditor) {\n (0,util.unreachable)(\"Cannot initialize AnnotationEditor.\");\n }\n this.parent = parameters.parent;\n this.id = parameters.id;\n this.width = this.height = null;\n this.pageIndex = parameters.parent.pageIndex;\n this.name = parameters.name;\n this.div = null;\n this._uiManager = parameters.uiManager;\n this.annotationElementId = null;\n this._willKeepAspectRatio = false;\n this._initialOptions.isCentered = parameters.isCentered;\n this._structTreeParentId = null;\n const {\n rotation,\n rawDims: {\n pageWidth,\n pageHeight,\n pageX,\n pageY\n }\n } = this.parent.viewport;\n this.rotation = rotation;\n this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360;\n this.pageDimensions = [pageWidth, pageHeight];\n this.pageTranslation = [pageX, pageY];\n const [width, height] = this.parentDimensions;\n this.x = parameters.x / width;\n this.y = parameters.y / height;\n this.isAttachedToDOM = false;\n this.deleted = false;\n }\n get editorType() {\n return Object.getPrototypeOf(this).constructor._type;\n }\n static get _defaultLineColor() {\n return (0,util.shadow)(this, \"_defaultLineColor\", this._colorManager.getHexCode(\"CanvasText\"));\n }\n static deleteAnnotationElement(editor) {\n const fakeEditor = new FakeEditor({\n id: editor.parent.getNextId(),\n parent: editor.parent,\n uiManager: editor._uiManager\n });\n fakeEditor.annotationElementId = editor.annotationElementId;\n fakeEditor.deleted = true;\n fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);\n }\n static initialize(l10n) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n AnnotationEditor._l10nPromise ||= new Map([\"pdfjs-editor-alt-text-button-label\", \"pdfjs-editor-alt-text-edit-button-label\", \"pdfjs-editor-alt-text-decorative-tooltip\", \"pdfjs-editor-resizer-label-topLeft\", \"pdfjs-editor-resizer-label-topMiddle\", \"pdfjs-editor-resizer-label-topRight\", \"pdfjs-editor-resizer-label-middleRight\", \"pdfjs-editor-resizer-label-bottomRight\", \"pdfjs-editor-resizer-label-bottomMiddle\", \"pdfjs-editor-resizer-label-bottomLeft\", \"pdfjs-editor-resizer-label-middleLeft\"].map(str => [str, l10n.get(str.replaceAll(/([A-Z])/g, c => `-${c.toLowerCase()}`))]));\n if (options?.strings) {\n for (const str of options.strings) {\n AnnotationEditor._l10nPromise.set(str, l10n.get(str));\n }\n }\n if (AnnotationEditor._borderLineWidth !== -1) {\n return;\n }\n const style = getComputedStyle(document.documentElement);\n AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue(\"--outline-width\")) || 0;\n }\n static updateDefaultParams(_type, _value) {}\n static get defaultPropertiesToUpdate() {\n return [];\n }\n static isHandlingMimeForPasting(mime) {\n return false;\n }\n static paste(item, parent) {\n (0,util.unreachable)(\"Not implemented\");\n }\n get propertiesToUpdate() {\n return [];\n }\n get _isDraggable() {\n return this.#isDraggable;\n }\n set _isDraggable(value) {\n this.#isDraggable = value;\n this.div?.classList.toggle(\"draggable\", value);\n }\n get isEnterHandled() {\n return true;\n }\n center() {\n const [pageWidth, pageHeight] = this.pageDimensions;\n switch (this.parentRotation) {\n case 90:\n this.x -= this.height * pageHeight / (pageWidth * 2);\n this.y += this.width * pageWidth / (pageHeight * 2);\n break;\n case 180:\n this.x += this.width / 2;\n this.y += this.height / 2;\n break;\n case 270:\n this.x += this.height * pageHeight / (pageWidth * 2);\n this.y -= this.width * pageWidth / (pageHeight * 2);\n break;\n default:\n this.x -= this.width / 2;\n this.y -= this.height / 2;\n break;\n }\n this.fixAndSetPosition();\n }\n addCommands(params) {\n this._uiManager.addCommands(params);\n }\n get currentLayer() {\n return this._uiManager.currentLayer;\n }\n setInBackground() {\n this.div.style.zIndex = 0;\n }\n setInForeground() {\n this.div.style.zIndex = this.#zIndex;\n }\n setParent(parent) {\n if (parent !== null) {\n this.pageIndex = parent.pageIndex;\n this.pageDimensions = parent.pageDimensions;\n } else {\n this.#stopResizing();\n }\n this.parent = parent;\n }\n focusin(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n if (!this.#hasBeenClicked) {\n this.parent.setSelected(this);\n } else {\n this.#hasBeenClicked = false;\n }\n }\n focusout(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n if (!this.isAttachedToDOM) {\n return;\n }\n const target = event.relatedTarget;\n if (target?.closest(`#${this.id}`)) {\n return;\n }\n event.preventDefault();\n if (!this.parent?.isMultipleSelection) {\n this.commitOrRemove();\n }\n }\n commitOrRemove() {\n if (this.isEmpty()) {\n this.remove();\n } else {\n this.commit();\n }\n }\n commit() {\n this.addToAnnotationStorage();\n }\n addToAnnotationStorage() {\n this._uiManager.addToAnnotationStorage(this);\n }\n setAt(x, y, tx, ty) {\n const [width, height] = this.parentDimensions;\n [tx, ty] = this.screenToPageTranslation(tx, ty);\n this.x = (x + tx) / width;\n this.y = (y + ty) / height;\n this.fixAndSetPosition();\n }\n #translate(_ref, x, y) {\n let [width, height] = _ref;\n [x, y] = this.screenToPageTranslation(x, y);\n this.x += x / width;\n this.y += y / height;\n this.fixAndSetPosition();\n }\n translate(x, y) {\n this.#translate(this.parentDimensions, x, y);\n }\n translateInPage(x, y) {\n this.#translate(this.pageDimensions, x, y);\n this.div.scrollIntoView({\n block: \"nearest\"\n });\n }\n drag(tx, ty) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.x += tx / parentWidth;\n this.y += ty / parentHeight;\n if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {\n const {\n x,\n y\n } = this.div.getBoundingClientRect();\n if (this.parent.findNewParent(this, x, y)) {\n this.x -= Math.floor(this.x);\n this.y -= Math.floor(this.y);\n }\n }\n let {\n x,\n y\n } = this;\n const [bx, by] = this.#getBaseTranslation();\n x += bx;\n y += by;\n this.div.style.left = `${(100 * x).toFixed(2)}%`;\n this.div.style.top = `${(100 * y).toFixed(2)}%`;\n this.div.scrollIntoView({\n block: \"nearest\"\n });\n }\n #getBaseTranslation() {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const {\n _borderLineWidth\n } = AnnotationEditor;\n const x = _borderLineWidth / parentWidth;\n const y = _borderLineWidth / parentHeight;\n switch (this.rotation) {\n case 90:\n return [-x, y];\n case 180:\n return [x, y];\n case 270:\n return [x, -y];\n default:\n return [-x, -y];\n }\n }\n fixAndSetPosition() {\n let rotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.rotation;\n const [pageWidth, pageHeight] = this.pageDimensions;\n let {\n x,\n y,\n width,\n height\n } = this;\n width *= pageWidth;\n height *= pageHeight;\n x *= pageWidth;\n y *= pageHeight;\n switch (rotation) {\n case 0:\n x = Math.max(0, Math.min(pageWidth - width, x));\n y = Math.max(0, Math.min(pageHeight - height, y));\n break;\n case 90:\n x = Math.max(0, Math.min(pageWidth - height, x));\n y = Math.min(pageHeight, Math.max(width, y));\n break;\n case 180:\n x = Math.min(pageWidth, Math.max(width, x));\n y = Math.min(pageHeight, Math.max(height, y));\n break;\n case 270:\n x = Math.min(pageWidth, Math.max(height, x));\n y = Math.max(0, Math.min(pageHeight - width, y));\n break;\n }\n this.x = x /= pageWidth;\n this.y = y /= pageHeight;\n const [bx, by] = this.#getBaseTranslation();\n x += bx;\n y += by;\n const {\n style\n } = this.div;\n style.left = `${(100 * x).toFixed(2)}%`;\n style.top = `${(100 * y).toFixed(2)}%`;\n this.moveInDOM();\n }\n static #rotatePoint(x, y, angle) {\n switch (angle) {\n case 90:\n return [y, -x];\n case 180:\n return [-x, -y];\n case 270:\n return [-y, x];\n default:\n return [x, y];\n }\n }\n screenToPageTranslation(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);\n }\n pageTranslationToScreen(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);\n }\n #getRotationMatrix(rotation) {\n switch (rotation) {\n case 90:\n {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];\n }\n case 180:\n return [-1, 0, 0, -1];\n case 270:\n {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];\n }\n default:\n return [1, 0, 0, 1];\n }\n }\n get parentScale() {\n return this._uiManager.viewParameters.realScale;\n }\n get parentRotation() {\n return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;\n }\n get parentDimensions() {\n const {\n parentScale,\n pageDimensions: [pageWidth, pageHeight]\n } = this;\n const scaledWidth = pageWidth * parentScale;\n const scaledHeight = pageHeight * parentScale;\n return util.FeatureTest.isCSSRoundSupported ? [Math.round(scaledWidth), Math.round(scaledHeight)] : [scaledWidth, scaledHeight];\n }\n setDims(width, height) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.div.style.width = `${(100 * width / parentWidth).toFixed(2)}%`;\n if (!this.#keepAspectRatio) {\n this.div.style.height = `${(100 * height / parentHeight).toFixed(2)}%`;\n }\n }\n fixDims() {\n const {\n style\n } = this.div;\n const {\n height,\n width\n } = style;\n const widthPercent = width.endsWith(\"%\");\n const heightPercent = !this.#keepAspectRatio && height.endsWith(\"%\");\n if (widthPercent && heightPercent) {\n return;\n }\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (!widthPercent) {\n style.width = `${(100 * parseFloat(width) / parentWidth).toFixed(2)}%`;\n }\n if (!this.#keepAspectRatio && !heightPercent) {\n style.height = `${(100 * parseFloat(height) / parentHeight).toFixed(2)}%`;\n }\n }\n getInitialTranslation() {\n return [0, 0];\n }\n #createResizers() {\n if (this.#resizersDiv) {\n return;\n }\n this.#resizersDiv = document.createElement(\"div\");\n this.#resizersDiv.classList.add(\"resizers\");\n const classes = this._willKeepAspectRatio ? [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"] : [\"topLeft\", \"topMiddle\", \"topRight\", \"middleRight\", \"bottomRight\", \"bottomMiddle\", \"bottomLeft\", \"middleLeft\"];\n for (const name of classes) {\n const div = document.createElement(\"div\");\n this.#resizersDiv.append(div);\n div.classList.add(\"resizer\", name);\n div.setAttribute(\"data-resizer-name\", name);\n div.addEventListener(\"pointerdown\", this.#resizerPointerdown.bind(this, name));\n div.addEventListener(\"contextmenu\", display_utils.noContextMenu);\n div.tabIndex = -1;\n }\n this.div.prepend(this.#resizersDiv);\n }\n #resizerPointerdown(name, event) {\n event.preventDefault();\n const {\n isMac\n } = util.FeatureTest.platform;\n if (event.button !== 0 || event.ctrlKey && isMac) {\n return;\n }\n this.#altText?.toggle(false);\n const boundResizerPointermove = this.#resizerPointermove.bind(this, name);\n const savedDraggable = this._isDraggable;\n this._isDraggable = false;\n const pointerMoveOptions = {\n passive: true,\n capture: true\n };\n this.parent.togglePointerEvents(false);\n window.addEventListener(\"pointermove\", boundResizerPointermove, pointerMoveOptions);\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n const savedParentCursor = this.parent.div.style.cursor;\n const savedCursor = this.div.style.cursor;\n this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor;\n const pointerUpCallback = () => {\n this.parent.togglePointerEvents(true);\n this.#altText?.toggle(true);\n this._isDraggable = savedDraggable;\n window.removeEventListener(\"pointerup\", pointerUpCallback);\n window.removeEventListener(\"blur\", pointerUpCallback);\n window.removeEventListener(\"pointermove\", boundResizerPointermove, pointerMoveOptions);\n this.parent.div.style.cursor = savedParentCursor;\n this.div.style.cursor = savedCursor;\n this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight);\n };\n window.addEventListener(\"pointerup\", pointerUpCallback);\n window.addEventListener(\"blur\", pointerUpCallback);\n }\n #addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight) {\n const newX = this.x;\n const newY = this.y;\n const newWidth = this.width;\n const newHeight = this.height;\n if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) {\n return;\n }\n this.addCommands({\n cmd: () => {\n this.width = newWidth;\n this.height = newHeight;\n this.x = newX;\n this.y = newY;\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n this.fixAndSetPosition();\n },\n undo: () => {\n this.width = savedWidth;\n this.height = savedHeight;\n this.x = savedX;\n this.y = savedY;\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setDims(parentWidth * savedWidth, parentHeight * savedHeight);\n this.fixAndSetPosition();\n },\n mustExec: true\n });\n }\n #resizerPointermove(name, event) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n const round = x => Math.round(x * 10000) / 10000;\n const rotationMatrix = this.#getRotationMatrix(this.rotation);\n const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y];\n const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);\n const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y];\n let getPoint;\n let getOpposite;\n let isDiagonal = false;\n let isHorizontal = false;\n switch (name) {\n case \"topLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, 0];\n getOpposite = (w, h) => [w, h];\n break;\n case \"topMiddle\":\n getPoint = (w, h) => [w / 2, 0];\n getOpposite = (w, h) => [w / 2, h];\n break;\n case \"topRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, 0];\n getOpposite = (w, h) => [0, h];\n break;\n case \"middleRight\":\n isHorizontal = true;\n getPoint = (w, h) => [w, h / 2];\n getOpposite = (w, h) => [0, h / 2];\n break;\n case \"bottomRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, h];\n getOpposite = (w, h) => [0, 0];\n break;\n case \"bottomMiddle\":\n getPoint = (w, h) => [w / 2, h];\n getOpposite = (w, h) => [w / 2, 0];\n break;\n case \"bottomLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, h];\n getOpposite = (w, h) => [w, 0];\n break;\n case \"middleLeft\":\n isHorizontal = true;\n getPoint = (w, h) => [0, h / 2];\n getOpposite = (w, h) => [w, h / 2];\n break;\n }\n const point = getPoint(savedWidth, savedHeight);\n const oppositePoint = getOpposite(savedWidth, savedHeight);\n let transfOppositePoint = transf(...oppositePoint);\n const oppositeX = round(savedX + transfOppositePoint[0]);\n const oppositeY = round(savedY + transfOppositePoint[1]);\n let ratioX = 1;\n let ratioY = 1;\n let [deltaX, deltaY] = this.screenToPageTranslation(event.movementX, event.movementY);\n [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);\n if (isDiagonal) {\n const oldDiag = Math.hypot(savedWidth, savedHeight);\n ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight);\n } else if (isHorizontal) {\n ratioX = Math.max(minWidth, Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))) / savedWidth;\n } else {\n ratioY = Math.max(minHeight, Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))) / savedHeight;\n }\n const newWidth = round(savedWidth * ratioX);\n const newHeight = round(savedHeight * ratioY);\n transfOppositePoint = transf(...getOpposite(newWidth, newHeight));\n const newX = oppositeX - transfOppositePoint[0];\n const newY = oppositeY - transfOppositePoint[1];\n this.width = newWidth;\n this.height = newHeight;\n this.x = newX;\n this.y = newY;\n this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n this.fixAndSetPosition();\n }\n altTextFinish() {\n this.#altText?.finish();\n }\n async addEditToolbar() {\n if (this.#editToolbar || this.#isInEditMode) {\n return this.#editToolbar;\n }\n this.#editToolbar = new EditorToolbar(this);\n this.div.append(this.#editToolbar.render());\n if (this.#altText) {\n this.#editToolbar.addAltTextButton(await this.#altText.render());\n }\n return this.#editToolbar;\n }\n removeEditToolbar() {\n if (!this.#editToolbar) {\n return;\n }\n this.#editToolbar.remove();\n this.#editToolbar = null;\n this.#altText?.destroy();\n }\n getClientDimensions() {\n return this.div.getBoundingClientRect();\n }\n async addAltTextButton() {\n if (this.#altText) {\n return;\n }\n AltText.initialize(AnnotationEditor._l10nPromise);\n this.#altText = new AltText(this);\n await this.addEditToolbar();\n }\n get altTextData() {\n return this.#altText?.data;\n }\n set altTextData(data) {\n if (!this.#altText) {\n return;\n }\n this.#altText.data = data;\n }\n render() {\n this.div = document.createElement(\"div\");\n this.div.setAttribute(\"data-editor-rotation\", (360 - this.rotation) % 360);\n this.div.className = this.name;\n this.div.setAttribute(\"id\", this.id);\n this.div.setAttribute(\"tabIndex\", 0);\n this.setInForeground();\n this.div.addEventListener(\"focusin\", this.#boundFocusin);\n this.div.addEventListener(\"focusout\", this.#boundFocusout);\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (this.parentRotation % 180 !== 0) {\n this.div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`;\n this.div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`;\n }\n const [tx, ty] = this.getInitialTranslation();\n this.translate(tx, ty);\n (0,tools.bindEvents)(this, this.div, [\"pointerdown\"]);\n return this.div;\n }\n pointerdown(event) {\n const {\n isMac\n } = util.FeatureTest.platform;\n if (event.button !== 0 || event.ctrlKey && isMac) {\n event.preventDefault();\n return;\n }\n this.#hasBeenClicked = true;\n if (this._isDraggable) {\n this.#setUpDragSession(event);\n return;\n }\n this.#selectOnPointerEvent(event);\n }\n #selectOnPointerEvent(event) {\n const {\n isMac\n } = util.FeatureTest.platform;\n if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) {\n this.parent.toggleSelected(this);\n } else {\n this.parent.setSelected(this);\n }\n }\n #setUpDragSession(event) {\n const isSelected = this._uiManager.isSelected(this);\n this._uiManager.setUpDragSession();\n let pointerMoveOptions, pointerMoveCallback;\n if (isSelected) {\n pointerMoveOptions = {\n passive: true,\n capture: true\n };\n pointerMoveCallback = e => {\n const [tx, ty] = this.screenToPageTranslation(e.movementX, e.movementY);\n this._uiManager.dragSelectedEditors(tx, ty);\n };\n window.addEventListener(\"pointermove\", pointerMoveCallback, pointerMoveOptions);\n }\n const pointerUpCallback = () => {\n window.removeEventListener(\"pointerup\", pointerUpCallback);\n window.removeEventListener(\"blur\", pointerUpCallback);\n if (isSelected) {\n window.removeEventListener(\"pointermove\", pointerMoveCallback, pointerMoveOptions);\n }\n this.#hasBeenClicked = false;\n if (!this._uiManager.endDragSession()) {\n this.#selectOnPointerEvent(event);\n }\n };\n window.addEventListener(\"pointerup\", pointerUpCallback);\n window.addEventListener(\"blur\", pointerUpCallback);\n }\n moveInDOM() {\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n }\n this.#moveInDOMTimeout = setTimeout(() => {\n this.#moveInDOMTimeout = null;\n this.parent?.moveEditorInDOM(this);\n }, 0);\n }\n _setParentAndPosition(parent, x, y) {\n parent.changeParent(this);\n this.x = x;\n this.y = y;\n this.fixAndSetPosition();\n }\n getRect(tx, ty) {\n let rotation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.rotation;\n const scale = this.parentScale;\n const [pageWidth, pageHeight] = this.pageDimensions;\n const [pageX, pageY] = this.pageTranslation;\n const shiftX = tx / scale;\n const shiftY = ty / scale;\n const x = this.x * pageWidth;\n const y = this.y * pageHeight;\n const width = this.width * pageWidth;\n const height = this.height * pageHeight;\n switch (rotation) {\n case 0:\n return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY];\n case 90:\n return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY];\n case 180:\n return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY];\n case 270:\n return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n getRectInCurrentCoords(rect, pageHeight) {\n const [x1, y1, x2, y2] = rect;\n const width = x2 - x1;\n const height = y2 - y1;\n switch (this.rotation) {\n case 0:\n return [x1, pageHeight - y2, width, height];\n case 90:\n return [x1, pageHeight - y1, height, width];\n case 180:\n return [x2, pageHeight - y1, width, height];\n case 270:\n return [x2, pageHeight - y2, height, width];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n onceAdded() {}\n isEmpty() {\n return false;\n }\n enableEditMode() {\n this.#isInEditMode = true;\n }\n disableEditMode() {\n this.#isInEditMode = false;\n }\n isInEditMode() {\n return this.#isInEditMode;\n }\n shouldGetKeyboardEvents() {\n return this.#isResizerEnabledForKeyboard;\n }\n needsToBeRebuilt() {\n return this.div && !this.isAttachedToDOM;\n }\n rebuild() {\n this.div?.addEventListener(\"focusin\", this.#boundFocusin);\n this.div?.addEventListener(\"focusout\", this.#boundFocusout);\n }\n rotate(_angle) {}\n serialize() {\n let isForCopying = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n (0,util.unreachable)(\"An editor must be serializable\");\n }\n static deserialize(data, parent, uiManager) {\n const editor = new this.prototype.constructor({\n parent,\n id: parent.getNextId(),\n uiManager\n });\n editor.rotation = data.rotation;\n const [pageWidth, pageHeight] = editor.pageDimensions;\n const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight);\n editor.x = x / pageWidth;\n editor.y = y / pageHeight;\n editor.width = width / pageWidth;\n editor.height = height / pageHeight;\n return editor;\n }\n remove() {\n this.div.removeEventListener(\"focusin\", this.#boundFocusin);\n this.div.removeEventListener(\"focusout\", this.#boundFocusout);\n if (!this.isEmpty()) {\n this.commit();\n }\n if (this.parent) {\n this.parent.remove(this);\n } else {\n this._uiManager.removeEditor(this);\n }\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n this.#moveInDOMTimeout = null;\n }\n this.#stopResizing();\n this.removeEditToolbar();\n }\n get isResizable() {\n return false;\n }\n makeResizable() {\n if (this.isResizable) {\n this.#createResizers();\n this.#resizersDiv.classList.remove(\"hidden\");\n (0,tools.bindEvents)(this, this.div, [\"keydown\"]);\n }\n }\n get toolbarPosition() {\n return null;\n }\n keydown(event) {\n if (!this.isResizable || event.target !== this.div || event.key !== \"Enter\") {\n return;\n }\n this._uiManager.setSelected(this);\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height\n };\n const children = this.#resizersDiv.children;\n if (!this.#allResizerDivs) {\n this.#allResizerDivs = Array.from(children);\n const boundResizerKeydown = this.#resizerKeydown.bind(this);\n const boundResizerBlur = this.#resizerBlur.bind(this);\n for (const div of this.#allResizerDivs) {\n const name = div.getAttribute(\"data-resizer-name\");\n div.setAttribute(\"role\", \"spinbutton\");\n div.addEventListener(\"keydown\", boundResizerKeydown);\n div.addEventListener(\"blur\", boundResizerBlur);\n div.addEventListener(\"focus\", this.#resizerFocus.bind(this, name));\n AnnotationEditor._l10nPromise.get(`pdfjs-editor-resizer-label-${name}`).then(msg => div.setAttribute(\"aria-label\", msg));\n }\n }\n const first = this.#allResizerDivs[0];\n let firstPosition = 0;\n for (const div of children) {\n if (div === first) {\n break;\n }\n firstPosition++;\n }\n const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4);\n if (nextFirstPosition !== firstPosition) {\n if (nextFirstPosition < firstPosition) {\n for (let i = 0; i < firstPosition - nextFirstPosition; i++) {\n this.#resizersDiv.append(this.#resizersDiv.firstChild);\n }\n } else if (nextFirstPosition > firstPosition) {\n for (let i = 0; i < nextFirstPosition - firstPosition; i++) {\n this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild);\n }\n }\n let i = 0;\n for (const child of children) {\n const div = this.#allResizerDivs[i++];\n const name = div.getAttribute(\"data-resizer-name\");\n AnnotationEditor._l10nPromise.get(`pdfjs-editor-resizer-label-${name}`).then(msg => child.setAttribute(\"aria-label\", msg));\n }\n }\n this.#setResizerTabIndex(0);\n this.#isResizerEnabledForKeyboard = true;\n this.#resizersDiv.firstChild.focus({\n focusVisible: true\n });\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n #resizerKeydown(event) {\n AnnotationEditor._resizerKeyboardManager.exec(this, event);\n }\n #resizerBlur(event) {\n if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) {\n this.#stopResizing();\n }\n }\n #resizerFocus(name) {\n this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : \"\";\n }\n #setResizerTabIndex(value) {\n if (!this.#allResizerDivs) {\n return;\n }\n for (const div of this.#allResizerDivs) {\n div.tabIndex = value;\n }\n }\n _resizeWithKeyboard(x, y) {\n if (!this.#isResizerEnabledForKeyboard) {\n return;\n }\n this.#resizerPointermove(this.#focusedResizerName, {\n movementX: x,\n movementY: y\n });\n }\n #stopResizing() {\n this.#isResizerEnabledForKeyboard = false;\n this.#setResizerTabIndex(-1);\n if (this.#savedDimensions) {\n const {\n savedX,\n savedY,\n savedWidth,\n savedHeight\n } = this.#savedDimensions;\n this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight);\n this.#savedDimensions = null;\n }\n }\n _stopResizingWithKeyboard() {\n this.#stopResizing();\n this.div.focus();\n }\n select() {\n this.makeResizable();\n this.div?.classList.add(\"selectedEditor\");\n if (!this.#editToolbar) {\n this.addEditToolbar().then(() => {\n if (this.div?.classList.contains(\"selectedEditor\")) {\n this.#editToolbar?.show();\n }\n });\n return;\n }\n this.#editToolbar?.show();\n }\n unselect() {\n this.#resizersDiv?.classList.add(\"hidden\");\n this.div?.classList.remove(\"selectedEditor\");\n if (this.div?.contains(document.activeElement)) {\n this._uiManager.currentLayer.div.focus();\n }\n this.#editToolbar?.hide();\n }\n updateParams(type, value) {}\n disableEditing() {}\n enableEditing() {}\n enterInEditMode() {}\n getImageForAltText() {\n return null;\n }\n get contentDiv() {\n return this.div;\n }\n get isEditing() {\n return this.#isEditing;\n }\n set isEditing(value) {\n this.#isEditing = value;\n if (!this.parent) {\n return;\n }\n if (value) {\n this.parent.setSelected(this);\n this.parent.setActiveEditor(this);\n } else {\n this.parent.setActiveEditor(null);\n }\n }\n setAspectRatio(width, height) {\n this.#keepAspectRatio = true;\n const aspectRatio = width / height;\n const {\n style\n } = this.div;\n style.aspectRatio = aspectRatio;\n style.height = \"auto\";\n }\n static get MIN_SIZE() {\n return 16;\n }\n static canCreateNewEmptyEditor() {\n return true;\n }\n}\nclass FakeEditor extends AnnotationEditor {\n constructor(params) {\n super(params);\n this.annotationElementId = params.annotationElementId;\n this.deleted = true;\n }\n serialize() {\n return {\n id: this.annotationElementId,\n deleted: true,\n pageIndex: this.pageIndex\n };\n }\n}\n\n\n/***/ }),\n\n/***/ 7405:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_542495__) => {\n\n/* harmony export */ __nested_webpack_require_542495__.d(__nested_webpack_exports__, {\n/* harmony export */ Outliner: () => (/* binding */ Outliner)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_542495__(4226);\n/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_542495__(5561);\n/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_542495__(8587);\n/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_542495__(3247);\n/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_542495__(3302);\n/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_542495__(9490);\n/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_542495__(5438);\n/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_542495__(7914);\n\n\n\n\n\n\n\n\nclass Outliner {\n #box;\n #verticalEdges = [];\n #intervals = [];\n constructor(boxes) {\n let borderWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n let innerMargin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n let isLTR = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n const NUMBER_OF_DIGITS = 4;\n const EPSILON = 10 ** -NUMBER_OF_DIGITS;\n for (const {\n x,\n y,\n width,\n height\n } of boxes) {\n const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON;\n const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON;\n const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON;\n const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON;\n const left = [x1, y1, y2, true];\n const right = [x2, y1, y2, false];\n this.#verticalEdges.push(left, right);\n minX = Math.min(minX, x1);\n maxX = Math.max(maxX, x2);\n minY = Math.min(minY, y1);\n maxY = Math.max(maxY, y2);\n }\n const bboxWidth = maxX - minX + 2 * innerMargin;\n const bboxHeight = maxY - minY + 2 * innerMargin;\n const shiftedMinX = minX - innerMargin;\n const shiftedMinY = minY - innerMargin;\n const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2);\n const lastPoint = [lastEdge[0], lastEdge[2]];\n for (const edge of this.#verticalEdges) {\n const [x, y1, y2] = edge;\n edge[0] = (x - shiftedMinX) / bboxWidth;\n edge[1] = (y1 - shiftedMinY) / bboxHeight;\n edge[2] = (y2 - shiftedMinY) / bboxHeight;\n }\n this.#box = {\n x: shiftedMinX,\n y: shiftedMinY,\n width: bboxWidth,\n height: bboxHeight,\n lastPoint\n };\n }\n getOutlines() {\n this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]);\n const outlineVerticalEdges = [];\n for (const edge of this.#verticalEdges) {\n if (edge[3]) {\n outlineVerticalEdges.push(...this.#breakEdge(edge));\n this.#insert(edge);\n } else {\n this.#remove(edge);\n outlineVerticalEdges.push(...this.#breakEdge(edge));\n }\n }\n return this.#getOutlines(outlineVerticalEdges);\n }\n #getOutlines(outlineVerticalEdges) {\n const edges = [];\n const allEdges = new Set();\n for (const edge of outlineVerticalEdges) {\n const [x, y1, y2] = edge;\n edges.push([x, y1, edge], [x, y2, edge]);\n }\n edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]);\n for (let i = 0, ii = edges.length; i < ii; i += 2) {\n const edge1 = edges[i][2];\n const edge2 = edges[i + 1][2];\n edge1.push(edge2);\n edge2.push(edge1);\n allEdges.add(edge1);\n allEdges.add(edge2);\n }\n const outlines = [];\n let outline;\n while (allEdges.size > 0) {\n const edge = allEdges.values().next().value;\n let [x, y1, y2, edge1, edge2] = edge;\n allEdges.delete(edge);\n let lastPointX = x;\n let lastPointY = y1;\n outline = [x, y2];\n outlines.push(outline);\n while (true) {\n let e;\n if (allEdges.has(edge1)) {\n e = edge1;\n } else if (allEdges.has(edge2)) {\n e = edge2;\n } else {\n break;\n }\n allEdges.delete(e);\n [x, y1, y2, edge1, edge2] = e;\n if (lastPointX !== x) {\n outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2);\n lastPointX = x;\n }\n lastPointY = lastPointY === y1 ? y2 : y1;\n }\n outline.push(lastPointX, lastPointY);\n }\n return {\n outlines,\n box: this.#box\n };\n }\n #binarySearch(y) {\n const array = this.#intervals;\n let start = 0;\n let end = array.length - 1;\n while (start <= end) {\n const middle = start + end >> 1;\n const y1 = array[middle][0];\n if (y1 === y) {\n return middle;\n }\n if (y1 < y) {\n start = middle + 1;\n } else {\n end = middle - 1;\n }\n }\n return end + 1;\n }\n #insert(_ref) {\n let [, y1, y2] = _ref;\n const index = this.#binarySearch(y1);\n this.#intervals.splice(index, 0, [y1, y2]);\n }\n #remove(_ref2) {\n let [, y1, y2] = _ref2;\n const index = this.#binarySearch(y1);\n for (let i = index; i < this.#intervals.length; i++) {\n const [start, end] = this.#intervals[i];\n if (start !== y1) {\n break;\n }\n if (start === y1 && end === y2) {\n this.#intervals.splice(i, 1);\n return;\n }\n }\n for (let i = index - 1; i >= 0; i--) {\n const [start, end] = this.#intervals[i];\n if (start !== y1) {\n break;\n }\n if (start === y1 && end === y2) {\n this.#intervals.splice(i, 1);\n return;\n }\n }\n }\n #breakEdge(edge) {\n const [x, y1, y2] = edge;\n const results = [[x, y1, y2]];\n const index = this.#binarySearch(y2);\n for (let i = 0; i < index; i++) {\n const [start, end] = this.#intervals[i];\n for (let j = 0, jj = results.length; j < jj; j++) {\n const [, y3, y4] = results[j];\n if (end <= y3 || y4 <= start) {\n continue;\n }\n if (y3 >= start) {\n if (y4 > end) {\n results[j][1] = end;\n } else {\n if (jj === 1) {\n return [];\n }\n results.splice(j, 1);\n j--;\n jj--;\n }\n continue;\n }\n results[j][2] = start;\n if (y4 > end) {\n results.push([x, end, y4]);\n }\n }\n }\n return results;\n }\n}\n\n\n/***/ }),\n\n/***/ 4812:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_549459__) => {\n\n/* harmony export */ __nested_webpack_require_549459__.d(__nested_webpack_exports__, {\n/* harmony export */ AnnotationEditorUIManager: () => (/* binding */ AnnotationEditorUIManager),\n/* harmony export */ ColorManager: () => (/* binding */ ColorManager),\n/* harmony export */ KeyboardManager: () => (/* binding */ KeyboardManager),\n/* harmony export */ bindEvents: () => (/* binding */ bindEvents),\n/* harmony export */ opacityToHex: () => (/* binding */ opacityToHex)\n/* harmony export */ });\n/* unused harmony export CommandManager */\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_549459__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_549459__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_549459__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_549459__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_549459__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_549459__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_549459__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_549459__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_549459__(7583);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_549459__(4226);\n/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_549459__(5561);\n/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_549459__(8587);\n/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __nested_webpack_require_549459__(3247);\n/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __nested_webpack_require_549459__(3302);\n/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __nested_webpack_require_549459__(9490);\n/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __nested_webpack_require_549459__(5438);\n/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_16__ = __nested_webpack_require_549459__(7914);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_17__ = __nested_webpack_require_549459__(7121);\n/* harmony import */ var core_js_modules_esnext_iterator_every_js__WEBPACK_IMPORTED_MODULE_18__ = __nested_webpack_require_549459__(385);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_19__ = __nested_webpack_require_549459__(7944);\n/* harmony import */ var core_js_modules_esnext_json_parse_js__WEBPACK_IMPORTED_MODULE_20__ = __nested_webpack_require_549459__(2808);\n/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_21__ = __nested_webpack_require_549459__(8518);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_22__ = __nested_webpack_require_549459__(3266);\n/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_23__ = __nested_webpack_require_549459__(473);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction bindEvents(obj, element, names) {\n for (const name of names) {\n element.addEventListener(name, obj[name].bind(obj));\n }\n}\nfunction opacityToHex(opacity) {\n return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, \"0\");\n}\nclass IdManager {\n #id = 0;\n getId() {\n return `${_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.AnnotationEditorPrefix}${this.#id++}`;\n }\n}\nclass ImageManager {\n #baseId = (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.getUuid)();\n #id = 0;\n #cache = null;\n static get _isSVGFittingCanvas() {\n const svg = `data:image/svg+xml;charset=UTF-8,`;\n const canvas = new OffscreenCanvas(1, 3);\n const ctx = canvas.getContext(\"2d\");\n const image = new Image();\n image.src = svg;\n const promise = image.decode().then(() => {\n ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);\n return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;\n });\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.shadow)(this, \"_isSVGFittingCanvas\", promise);\n }\n async #get(key, rawData) {\n this.#cache ||= new Map();\n let data = this.#cache.get(key);\n if (data === null) {\n return null;\n }\n if (data?.bitmap) {\n data.refCounter += 1;\n return data;\n }\n try {\n data ||= {\n bitmap: null,\n id: `image_${this.#baseId}_${this.#id++}`,\n refCounter: 0,\n isSvg: false\n };\n let image;\n if (typeof rawData === \"string\") {\n data.url = rawData;\n image = await (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_23__.fetchData)(rawData, \"blob\");\n } else {\n image = data.file = rawData;\n }\n if (image.type === \"image/svg+xml\") {\n const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;\n const fileReader = new FileReader();\n const imageElement = new Image();\n const imagePromise = new Promise((resolve, reject) => {\n imageElement.onload = () => {\n data.bitmap = imageElement;\n data.isSvg = true;\n resolve();\n };\n fileReader.onload = async () => {\n const url = data.svgUrl = fileReader.result;\n imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url;\n };\n imageElement.onerror = fileReader.onerror = reject;\n });\n fileReader.readAsDataURL(image);\n await imagePromise;\n } else {\n data.bitmap = await createImageBitmap(image);\n }\n data.refCounter = 1;\n } catch (e) {\n console.error(e);\n data = null;\n }\n this.#cache.set(key, data);\n if (data) {\n this.#cache.set(data.id, data);\n }\n return data;\n }\n async getFromFile(file) {\n const {\n lastModified,\n name,\n size,\n type\n } = file;\n return this.#get(`${lastModified}_${name}_${size}_${type}`, file);\n }\n async getFromUrl(url) {\n return this.#get(url, url);\n }\n async getFromId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return null;\n }\n if (data.bitmap) {\n data.refCounter += 1;\n return data;\n }\n if (data.file) {\n return this.getFromFile(data.file);\n }\n return this.getFromUrl(data.url);\n }\n getSvgUrl(id) {\n const data = this.#cache.get(id);\n if (!data?.isSvg) {\n return null;\n }\n return data.svgUrl;\n }\n deleteId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return;\n }\n data.refCounter -= 1;\n if (data.refCounter !== 0) {\n return;\n }\n data.bitmap = null;\n }\n isValidId(id) {\n return id.startsWith(`image_${this.#baseId}_`);\n }\n}\nclass CommandManager {\n #commands = [];\n #locked = false;\n #maxSize;\n #position = -1;\n constructor() {\n let maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 128;\n this.#maxSize = maxSize;\n }\n add(_ref) {\n let {\n cmd,\n undo,\n mustExec,\n type = NaN,\n overwriteIfSameType = false,\n keepUndo = false\n } = _ref;\n if (mustExec) {\n cmd();\n }\n if (this.#locked) {\n return;\n }\n const save = {\n cmd,\n undo,\n type\n };\n if (this.#position === -1) {\n if (this.#commands.length > 0) {\n this.#commands.length = 0;\n }\n this.#position = 0;\n this.#commands.push(save);\n return;\n }\n if (overwriteIfSameType && this.#commands[this.#position].type === type) {\n if (keepUndo) {\n save.undo = this.#commands[this.#position].undo;\n }\n this.#commands[this.#position] = save;\n return;\n }\n const next = this.#position + 1;\n if (next === this.#maxSize) {\n this.#commands.splice(0, 1);\n } else {\n this.#position = next;\n if (next < this.#commands.length) {\n this.#commands.splice(next);\n }\n }\n this.#commands.push(save);\n }\n undo() {\n if (this.#position === -1) {\n return;\n }\n this.#locked = true;\n this.#commands[this.#position].undo();\n this.#locked = false;\n this.#position -= 1;\n }\n redo() {\n if (this.#position < this.#commands.length - 1) {\n this.#position += 1;\n this.#locked = true;\n this.#commands[this.#position].cmd();\n this.#locked = false;\n }\n }\n hasSomethingToUndo() {\n return this.#position !== -1;\n }\n hasSomethingToRedo() {\n return this.#position < this.#commands.length - 1;\n }\n destroy() {\n this.#commands = null;\n }\n}\nclass KeyboardManager {\n constructor(callbacks) {\n this.buffer = [];\n this.callbacks = new Map();\n this.allKeys = new Set();\n const {\n isMac\n } = _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.FeatureTest.platform;\n for (const [keys, callback, options = {}] of callbacks) {\n for (const key of keys) {\n const isMacKey = key.startsWith(\"mac+\");\n if (isMac && isMacKey) {\n this.callbacks.set(key.slice(4), {\n callback,\n options\n });\n this.allKeys.add(key.split(\"+\").at(-1));\n } else if (!isMac && !isMacKey) {\n this.callbacks.set(key, {\n callback,\n options\n });\n this.allKeys.add(key.split(\"+\").at(-1));\n }\n }\n }\n }\n #serialize(event) {\n if (event.altKey) {\n this.buffer.push(\"alt\");\n }\n if (event.ctrlKey) {\n this.buffer.push(\"ctrl\");\n }\n if (event.metaKey) {\n this.buffer.push(\"meta\");\n }\n if (event.shiftKey) {\n this.buffer.push(\"shift\");\n }\n this.buffer.push(event.key);\n const str = this.buffer.join(\"+\");\n this.buffer.length = 0;\n return str;\n }\n exec(self, event) {\n if (!this.allKeys.has(event.key)) {\n return;\n }\n const info = this.callbacks.get(this.#serialize(event));\n if (!info) {\n return;\n }\n const {\n callback,\n options: {\n bubbles = false,\n args = [],\n checker = null\n }\n } = info;\n if (checker && !checker(self, event)) {\n return;\n }\n callback.bind(self, ...args, event)();\n if (!bubbles) {\n event.stopPropagation();\n event.preventDefault();\n }\n }\n}\nclass ColorManager {\n static _colorsMapping = new Map([[\"CanvasText\", [0, 0, 0]], [\"Canvas\", [255, 255, 255]]]);\n get _colors() {\n const colors = new Map([[\"CanvasText\", null], [\"Canvas\", null]]);\n (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_23__.getColorValues)(colors);\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.shadow)(this, \"_colors\", colors);\n }\n convert(color) {\n const rgb = (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_23__.getRGB)(color);\n if (!window.matchMedia(\"(forced-colors: active)\").matches) {\n return rgb;\n }\n for (const [name, RGB] of this._colors) {\n if (RGB.every((x, i) => x === rgb[i])) {\n return ColorManager._colorsMapping.get(name);\n }\n }\n return rgb;\n }\n getHexCode(name) {\n const rgb = this._colors.get(name);\n if (!rgb) {\n return name;\n }\n return _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.Util.makeHexColor(...rgb);\n }\n}\nclass AnnotationEditorUIManager {\n #activeEditor = null;\n #allEditors = new Map();\n #allLayers = new Map();\n #altTextManager = null;\n #annotationStorage = null;\n #commandManager = new CommandManager();\n #currentPageIndex = 0;\n #deletedAnnotationsElementIds = new Set();\n #draggingEditors = null;\n #editorTypes = null;\n #editorsToRescale = new Set();\n #filterFactory = null;\n #focusMainContainerTimeoutId = null;\n #highlightColors = null;\n #idManager = new IdManager();\n #isEnabled = false;\n #isWaiting = false;\n #lastActiveElement = null;\n #mainHighlightColorPicker = null;\n #mode = _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.AnnotationEditorType.NONE;\n #selectedEditors = new Set();\n #pageColors = null;\n #boundBlur = this.blur.bind(this);\n #boundFocus = this.focus.bind(this);\n #boundCopy = this.copy.bind(this);\n #boundCut = this.cut.bind(this);\n #boundPaste = this.paste.bind(this);\n #boundKeydown = this.keydown.bind(this);\n #boundOnEditingAction = this.onEditingAction.bind(this);\n #boundOnPageChanging = this.onPageChanging.bind(this);\n #boundOnScaleChanging = this.onScaleChanging.bind(this);\n #boundOnRotationChanging = this.onRotationChanging.bind(this);\n #previousStates = {\n isEditing: false,\n isEmpty: true,\n hasSomethingToUndo: false,\n hasSomethingToRedo: false,\n hasSelectedEditor: false\n };\n #translation = [0, 0];\n #translationTimeoutId = null;\n #container = null;\n #viewer = null;\n static TRANSLATE_SMALL = 1;\n static TRANSLATE_BIG = 10;\n static get _keyboardManager() {\n const proto = AnnotationEditorUIManager.prototype;\n const arrowChecker = self => {\n return self.#container.contains(document.activeElement) && document.activeElement.tagName !== \"BUTTON\" && self.hasSomethingToControl();\n };\n const textInputChecker = (_self, _ref2) => {\n let {\n target: el\n } = _ref2;\n if (el instanceof HTMLInputElement) {\n const {\n type\n } = el;\n return type !== \"text\" && type !== \"number\";\n }\n return true;\n };\n const small = this.TRANSLATE_SMALL;\n const big = this.TRANSLATE_BIG;\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.shadow)(this, \"_keyboardManager\", new KeyboardManager([[[\"ctrl+a\", \"mac+meta+a\"], proto.selectAll, {\n checker: textInputChecker\n }], [[\"ctrl+z\", \"mac+meta+z\"], proto.undo, {\n checker: textInputChecker\n }], [[\"ctrl+y\", \"ctrl+shift+z\", \"mac+meta+shift+z\", \"ctrl+shift+Z\", \"mac+meta+shift+Z\"], proto.redo, {\n checker: textInputChecker\n }], [[\"Backspace\", \"alt+Backspace\", \"ctrl+Backspace\", \"shift+Backspace\", \"mac+Backspace\", \"mac+alt+Backspace\", \"mac+ctrl+Backspace\", \"Delete\", \"ctrl+Delete\", \"shift+Delete\", \"mac+Delete\"], proto.delete, {\n checker: textInputChecker\n }], [[\"Enter\", \"mac+Enter\"], proto.addNewEditorFromKeyboard, {\n checker: (self, _ref3) => {\n let {\n target: el\n } = _ref3;\n return !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled;\n }\n }], [[\" \", \"mac+ \"], proto.addNewEditorFromKeyboard, {\n checker: self => self.#container.contains(document.activeElement)\n }], [[\"Escape\", \"mac+Escape\"], proto.unselectAll], [[\"ArrowLeft\", \"mac+ArrowLeft\"], proto.translateSelectedEditors, {\n args: [-small, 0],\n checker: arrowChecker\n }], [[\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"], proto.translateSelectedEditors, {\n args: [-big, 0],\n checker: arrowChecker\n }], [[\"ArrowRight\", \"mac+ArrowRight\"], proto.translateSelectedEditors, {\n args: [small, 0],\n checker: arrowChecker\n }], [[\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"], proto.translateSelectedEditors, {\n args: [big, 0],\n checker: arrowChecker\n }], [[\"ArrowUp\", \"mac+ArrowUp\"], proto.translateSelectedEditors, {\n args: [0, -small],\n checker: arrowChecker\n }], [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], proto.translateSelectedEditors, {\n args: [0, -big],\n checker: arrowChecker\n }], [[\"ArrowDown\", \"mac+ArrowDown\"], proto.translateSelectedEditors, {\n args: [0, small],\n checker: arrowChecker\n }], [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], proto.translateSelectedEditors, {\n args: [0, big],\n checker: arrowChecker\n }]]));\n }\n constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors) {\n this.#container = container;\n this.#viewer = viewer;\n this.#altTextManager = altTextManager;\n this._eventBus = eventBus;\n this._eventBus._on(\"editingaction\", this.#boundOnEditingAction);\n this._eventBus._on(\"pagechanging\", this.#boundOnPageChanging);\n this._eventBus._on(\"scalechanging\", this.#boundOnScaleChanging);\n this._eventBus._on(\"rotationchanging\", this.#boundOnRotationChanging);\n this.#annotationStorage = pdfDocument.annotationStorage;\n this.#filterFactory = pdfDocument.filterFactory;\n this.#pageColors = pageColors;\n this.#highlightColors = highlightColors || null;\n this.viewParameters = {\n realScale: _display_utils_js__WEBPACK_IMPORTED_MODULE_23__.PixelsPerInch.PDF_TO_CSS_UNITS,\n rotation: 0\n };\n }\n destroy() {\n this.#removeKeyboardManager();\n this.#removeFocusManager();\n this._eventBus._off(\"editingaction\", this.#boundOnEditingAction);\n this._eventBus._off(\"pagechanging\", this.#boundOnPageChanging);\n this._eventBus._off(\"scalechanging\", this.#boundOnScaleChanging);\n this._eventBus._off(\"rotationchanging\", this.#boundOnRotationChanging);\n for (const layer of this.#allLayers.values()) {\n layer.destroy();\n }\n this.#allLayers.clear();\n this.#allEditors.clear();\n this.#editorsToRescale.clear();\n this.#activeEditor = null;\n this.#selectedEditors.clear();\n this.#commandManager.destroy();\n this.#altTextManager?.destroy();\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n this.#focusMainContainerTimeoutId = null;\n }\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n this.#translationTimeoutId = null;\n }\n }\n get hcmFilter() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.shadow)(this, \"hcmFilter\", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : \"none\");\n }\n get direction() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.shadow)(this, \"direction\", getComputedStyle(this.#container).direction);\n }\n get highlightColors() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.shadow)(this, \"highlightColors\", this.#highlightColors ? new Map(this.#highlightColors.split(\",\").map(pair => pair.split(\"=\").map(x => x.trim()))) : null);\n }\n setMainHighlightColorPicker(colorPicker) {\n this.#mainHighlightColorPicker = colorPicker;\n }\n editAltText(editor) {\n this.#altTextManager?.editAltText(this, editor);\n }\n onPageChanging(_ref4) {\n let {\n pageNumber\n } = _ref4;\n this.#currentPageIndex = pageNumber - 1;\n }\n focusMainContainer() {\n this.#container.focus();\n }\n findParent(x, y) {\n for (const layer of this.#allLayers.values()) {\n const {\n x: layerX,\n y: layerY,\n width,\n height\n } = layer.div.getBoundingClientRect();\n if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) {\n return layer;\n }\n }\n return null;\n }\n disableUserSelect() {\n let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this.#viewer.classList.toggle(\"noUserSelect\", value);\n }\n addShouldRescale(editor) {\n this.#editorsToRescale.add(editor);\n }\n removeShouldRescale(editor) {\n this.#editorsToRescale.delete(editor);\n }\n onScaleChanging(_ref5) {\n let {\n scale\n } = _ref5;\n this.commitOrRemove();\n this.viewParameters.realScale = scale * _display_utils_js__WEBPACK_IMPORTED_MODULE_23__.PixelsPerInch.PDF_TO_CSS_UNITS;\n for (const editor of this.#editorsToRescale) {\n editor.onScaleChanging();\n }\n }\n onRotationChanging(_ref6) {\n let {\n pagesRotation\n } = _ref6;\n this.commitOrRemove();\n this.viewParameters.rotation = pagesRotation;\n }\n addToAnnotationStorage(editor) {\n if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) {\n this.#annotationStorage.setValue(editor.id, editor);\n }\n }\n #addFocusManager() {\n window.addEventListener(\"focus\", this.#boundFocus);\n window.addEventListener(\"blur\", this.#boundBlur);\n }\n #removeFocusManager() {\n window.removeEventListener(\"focus\", this.#boundFocus);\n window.removeEventListener(\"blur\", this.#boundBlur);\n }\n blur() {\n if (!this.hasSelection) {\n return;\n }\n const {\n activeElement\n } = document;\n for (const editor of this.#selectedEditors) {\n if (editor.div.contains(activeElement)) {\n this.#lastActiveElement = [editor, activeElement];\n editor._focusEventsAllowed = false;\n break;\n }\n }\n }\n focus() {\n if (!this.#lastActiveElement) {\n return;\n }\n const [lastEditor, lastActiveElement] = this.#lastActiveElement;\n this.#lastActiveElement = null;\n lastActiveElement.addEventListener(\"focusin\", () => {\n lastEditor._focusEventsAllowed = true;\n }, {\n once: true\n });\n lastActiveElement.focus();\n }\n #addKeyboardManager() {\n window.addEventListener(\"keydown\", this.#boundKeydown);\n }\n #removeKeyboardManager() {\n window.removeEventListener(\"keydown\", this.#boundKeydown);\n }\n #addCopyPasteListeners() {\n document.addEventListener(\"copy\", this.#boundCopy);\n document.addEventListener(\"cut\", this.#boundCut);\n document.addEventListener(\"paste\", this.#boundPaste);\n }\n #removeCopyPasteListeners() {\n document.removeEventListener(\"copy\", this.#boundCopy);\n document.removeEventListener(\"cut\", this.#boundCut);\n document.removeEventListener(\"paste\", this.#boundPaste);\n }\n addEditListeners() {\n this.#addKeyboardManager();\n this.#addCopyPasteListeners();\n }\n removeEditListeners() {\n this.#removeKeyboardManager();\n this.#removeCopyPasteListeners();\n }\n copy(event) {\n event.preventDefault();\n this.#activeEditor?.commitOrRemove();\n if (!this.hasSelection) {\n return;\n }\n const editors = [];\n for (const editor of this.#selectedEditors) {\n const serialized = editor.serialize(true);\n if (serialized) {\n editors.push(serialized);\n }\n }\n if (editors.length === 0) {\n return;\n }\n event.clipboardData.setData(\"application/pdfjs\", JSON.stringify(editors));\n }\n cut(event) {\n this.copy(event);\n this.delete();\n }\n paste(event) {\n event.preventDefault();\n const {\n clipboardData\n } = event;\n for (const item of clipboardData.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(item.type)) {\n editorType.paste(item, this.currentLayer);\n return;\n }\n }\n }\n let data = clipboardData.getData(\"application/pdfjs\");\n if (!data) {\n return;\n }\n try {\n data = JSON.parse(data);\n } catch (ex) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.warn)(`paste: \"${ex.message}\".`);\n return;\n }\n if (!Array.isArray(data)) {\n return;\n }\n this.unselectAll();\n const layer = this.currentLayer;\n try {\n const newEditors = [];\n for (const editor of data) {\n const deserializedEditor = layer.deserialize(editor);\n if (!deserializedEditor) {\n return;\n }\n newEditors.push(deserializedEditor);\n }\n const cmd = () => {\n for (const editor of newEditors) {\n this.#addEditorToLayer(editor);\n }\n this.#selectEditors(newEditors);\n };\n const undo = () => {\n for (const editor of newEditors) {\n editor.remove();\n }\n };\n this.addCommands({\n cmd,\n undo,\n mustExec: true\n });\n } catch (ex) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.warn)(`paste: \"${ex.message}\".`);\n }\n }\n keydown(event) {\n if (!this.isEditorHandlingKeyboard) {\n AnnotationEditorUIManager._keyboardManager.exec(this, event);\n }\n }\n onEditingAction(details) {\n if ([\"undo\", \"redo\", \"delete\", \"selectAll\"].includes(details.name)) {\n this[details.name]();\n }\n }\n #dispatchUpdateStates(details) {\n const hasChanged = Object.entries(details).some(_ref7 => {\n let [key, value] = _ref7;\n return this.#previousStates[key] !== value;\n });\n if (hasChanged) {\n this._eventBus.dispatch(\"annotationeditorstateschanged\", {\n source: this,\n details: Object.assign(this.#previousStates, details)\n });\n }\n }\n #dispatchUpdateUI(details) {\n this._eventBus.dispatch(\"annotationeditorparamschanged\", {\n source: this,\n details\n });\n }\n setEditingState(isEditing) {\n if (isEditing) {\n this.#addFocusManager();\n this.#addKeyboardManager();\n this.#addCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: this.#mode !== _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.AnnotationEditorType.NONE,\n isEmpty: this.#isEmpty(),\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n hasSelectedEditor: false\n });\n } else {\n this.#removeFocusManager();\n this.#removeKeyboardManager();\n this.#removeCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: false\n });\n this.disableUserSelect(false);\n }\n }\n registerEditorTypes(types) {\n if (this.#editorTypes) {\n return;\n }\n this.#editorTypes = types;\n for (const editorType of this.#editorTypes) {\n this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n }\n }\n getId() {\n return this.#idManager.getId();\n }\n get currentLayer() {\n return this.#allLayers.get(this.#currentPageIndex);\n }\n getLayer(pageIndex) {\n return this.#allLayers.get(pageIndex);\n }\n get currentPageIndex() {\n return this.#currentPageIndex;\n }\n addLayer(layer) {\n this.#allLayers.set(layer.pageIndex, layer);\n if (this.#isEnabled) {\n layer.enable();\n } else {\n layer.disable();\n }\n }\n removeLayer(layer) {\n this.#allLayers.delete(layer.pageIndex);\n }\n updateMode(mode) {\n let editId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n let isFromKeyboard = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (this.#mode === mode) {\n return;\n }\n this.#mode = mode;\n if (mode === _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.AnnotationEditorType.NONE) {\n this.setEditingState(false);\n this.#disableAll();\n return;\n }\n this.setEditingState(true);\n this.#enableAll();\n this.unselectAll();\n for (const layer of this.#allLayers.values()) {\n layer.updateMode(mode);\n }\n if (!editId && isFromKeyboard) {\n this.addNewEditorFromKeyboard();\n return;\n }\n if (!editId) {\n return;\n }\n for (const editor of this.#allEditors.values()) {\n if (editor.annotationElementId === editId) {\n this.setSelected(editor);\n editor.enterInEditMode();\n break;\n }\n }\n }\n addNewEditorFromKeyboard() {\n if (this.currentLayer.canCreateNewEmptyEditor()) {\n this.currentLayer.addNewEditor();\n }\n }\n updateToolbar(mode) {\n if (mode === this.#mode) {\n return;\n }\n this._eventBus.dispatch(\"switchannotationeditormode\", {\n source: this,\n mode\n });\n }\n updateParams(type, value) {\n if (!this.#editorTypes) {\n return;\n }\n switch (type) {\n case _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.AnnotationEditorParamsType.CREATE:\n this.currentLayer.addNewEditor();\n return;\n case _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:\n this.#mainHighlightColorPicker?.updateColor(value);\n break;\n }\n for (const editor of this.#selectedEditors) {\n editor.updateParams(type, value);\n }\n for (const editorType of this.#editorTypes) {\n editorType.updateDefaultParams(type, value);\n }\n }\n enableWaiting() {\n let mustWait = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n if (this.#isWaiting === mustWait) {\n return;\n }\n this.#isWaiting = mustWait;\n for (const layer of this.#allLayers.values()) {\n if (mustWait) {\n layer.disableClick();\n } else {\n layer.enableClick();\n }\n layer.div.classList.toggle(\"waiting\", mustWait);\n }\n }\n #enableAll() {\n if (!this.#isEnabled) {\n this.#isEnabled = true;\n for (const layer of this.#allLayers.values()) {\n layer.enable();\n }\n }\n }\n #disableAll() {\n this.unselectAll();\n if (this.#isEnabled) {\n this.#isEnabled = false;\n for (const layer of this.#allLayers.values()) {\n layer.disable();\n }\n }\n }\n getEditors(pageIndex) {\n const editors = [];\n for (const editor of this.#allEditors.values()) {\n if (editor.pageIndex === pageIndex) {\n editors.push(editor);\n }\n }\n return editors;\n }\n getEditor(id) {\n return this.#allEditors.get(id);\n }\n addEditor(editor) {\n this.#allEditors.set(editor.id, editor);\n }\n removeEditor(editor) {\n if (editor.div.contains(document.activeElement)) {\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n }\n this.#focusMainContainerTimeoutId = setTimeout(() => {\n this.focusMainContainer();\n this.#focusMainContainerTimeoutId = null;\n }, 0);\n }\n this.#allEditors.delete(editor.id);\n this.unselect(editor);\n if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) {\n this.#annotationStorage?.remove(editor.id);\n }\n }\n addDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.add(editor.annotationElementId);\n editor.deleted = true;\n }\n isDeletedAnnotationElement(annotationElementId) {\n return this.#deletedAnnotationsElementIds.has(annotationElementId);\n }\n removeDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);\n editor.deleted = false;\n }\n #addEditorToLayer(editor) {\n const layer = this.#allLayers.get(editor.pageIndex);\n if (layer) {\n layer.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n }\n }\n setActiveEditor(editor) {\n if (this.#activeEditor === editor) {\n return;\n }\n this.#activeEditor = editor;\n if (editor) {\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n }\n }\n toggleSelected(editor) {\n if (this.#selectedEditors.has(editor)) {\n this.#selectedEditors.delete(editor);\n editor.unselect();\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection\n });\n return;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true\n });\n }\n setSelected(editor) {\n for (const ed of this.#selectedEditors) {\n if (ed !== editor) {\n ed.unselect();\n }\n }\n this.#selectedEditors.clear();\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true\n });\n }\n isSelected(editor) {\n return this.#selectedEditors.has(editor);\n }\n get firstSelectedEditor() {\n return this.#selectedEditors.values().next().value;\n }\n unselect(editor) {\n editor.unselect();\n this.#selectedEditors.delete(editor);\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection\n });\n }\n get hasSelection() {\n return this.#selectedEditors.size !== 0;\n }\n get isEnterHandled() {\n return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled;\n }\n undo() {\n this.#commandManager.undo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: true,\n isEmpty: this.#isEmpty()\n });\n }\n redo() {\n this.#commandManager.redo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n isEmpty: this.#isEmpty()\n });\n }\n addCommands(params) {\n this.#commandManager.add(params);\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: false,\n isEmpty: this.#isEmpty()\n });\n }\n #isEmpty() {\n if (this.#allEditors.size === 0) {\n return true;\n }\n if (this.#allEditors.size === 1) {\n for (const editor of this.#allEditors.values()) {\n return editor.isEmpty();\n }\n }\n return false;\n }\n delete() {\n this.commitOrRemove();\n if (!this.hasSelection) {\n return;\n }\n const editors = [...this.#selectedEditors];\n const cmd = () => {\n for (const editor of editors) {\n editor.remove();\n }\n };\n const undo = () => {\n for (const editor of editors) {\n this.#addEditorToLayer(editor);\n }\n };\n this.addCommands({\n cmd,\n undo,\n mustExec: true\n });\n }\n commitOrRemove() {\n this.#activeEditor?.commitOrRemove();\n }\n hasSomethingToControl() {\n return this.#activeEditor || this.hasSelection;\n }\n #selectEditors(editors) {\n this.#selectedEditors.clear();\n for (const editor of editors) {\n if (editor.isEmpty()) {\n continue;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n }\n this.#dispatchUpdateStates({\n hasSelectedEditor: true\n });\n }\n selectAll() {\n for (const editor of this.#selectedEditors) {\n editor.commit();\n }\n this.#selectEditors(this.#allEditors.values());\n }\n unselectAll() {\n if (this.#activeEditor) {\n this.#activeEditor.commitOrRemove();\n if (this.#mode !== _shared_util_js__WEBPACK_IMPORTED_MODULE_22__.AnnotationEditorType.NONE) {\n return;\n }\n }\n if (!this.hasSelection) {\n return;\n }\n for (const editor of this.#selectedEditors) {\n editor.unselect();\n }\n this.#selectedEditors.clear();\n this.#dispatchUpdateStates({\n hasSelectedEditor: false\n });\n }\n translateSelectedEditors(x, y) {\n let noCommit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (!noCommit) {\n this.commitOrRemove();\n }\n if (!this.hasSelection) {\n return;\n }\n this.#translation[0] += x;\n this.#translation[1] += y;\n const [totalX, totalY] = this.#translation;\n const editors = [...this.#selectedEditors];\n const TIME_TO_WAIT = 1000;\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n }\n this.#translationTimeoutId = setTimeout(() => {\n this.#translationTimeoutId = null;\n this.#translation[0] = this.#translation[1] = 0;\n this.addCommands({\n cmd: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(totalX, totalY);\n }\n }\n },\n undo: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(-totalX, -totalY);\n }\n }\n },\n mustExec: false\n });\n }, TIME_TO_WAIT);\n for (const editor of editors) {\n editor.translateInPage(x, y);\n }\n }\n setUpDragSession() {\n if (!this.hasSelection) {\n return;\n }\n this.disableUserSelect(true);\n this.#draggingEditors = new Map();\n for (const editor of this.#selectedEditors) {\n this.#draggingEditors.set(editor, {\n savedX: editor.x,\n savedY: editor.y,\n savedPageIndex: editor.pageIndex,\n newX: 0,\n newY: 0,\n newPageIndex: -1\n });\n }\n }\n endDragSession() {\n if (!this.#draggingEditors) {\n return false;\n }\n this.disableUserSelect(false);\n const map = this.#draggingEditors;\n this.#draggingEditors = null;\n let mustBeAddedInUndoStack = false;\n for (const [{\n x,\n y,\n pageIndex\n }, value] of map) {\n value.newX = x;\n value.newY = y;\n value.newPageIndex = pageIndex;\n mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex;\n }\n if (!mustBeAddedInUndoStack) {\n return false;\n }\n const move = (editor, x, y, pageIndex) => {\n if (this.#allEditors.has(editor.id)) {\n const parent = this.#allLayers.get(pageIndex);\n if (parent) {\n editor._setParentAndPosition(parent, x, y);\n } else {\n editor.pageIndex = pageIndex;\n editor.x = x;\n editor.y = y;\n }\n }\n };\n this.addCommands({\n cmd: () => {\n for (const [editor, {\n newX,\n newY,\n newPageIndex\n }] of map) {\n move(editor, newX, newY, newPageIndex);\n }\n },\n undo: () => {\n for (const [editor, {\n savedX,\n savedY,\n savedPageIndex\n }] of map) {\n move(editor, savedX, savedY, savedPageIndex);\n }\n },\n mustExec: true\n });\n return true;\n }\n dragSelectedEditors(tx, ty) {\n if (!this.#draggingEditors) {\n return;\n }\n for (const editor of this.#draggingEditors.keys()) {\n editor.drag(tx, ty);\n }\n }\n rebuild(editor) {\n if (editor.parent === null) {\n const parent = this.getLayer(editor.pageIndex);\n if (parent) {\n parent.changeParent(editor);\n parent.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n this.addToAnnotationStorage(editor);\n editor.rebuild();\n }\n } else {\n editor.parent.addOrRebuild(editor);\n }\n }\n get isEditorHandlingKeyboard() {\n return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents();\n }\n isActive(editor) {\n return this.#activeEditor === editor;\n }\n getActive() {\n return this.#activeEditor;\n }\n getMode() {\n return this.#mode;\n }\n get imageManager() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_22__.shadow)(this, \"imageManager\", new ImageManager());\n }\n}\n\n\n/***/ }),\n\n/***/ 5171:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_588341__) => {\n\n/* harmony export */ __nested_webpack_require_588341__.d(__nested_webpack_exports__, {\n/* harmony export */ PDFFetchStream: () => (/* binding */ PDFFetchStream)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_588341__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_588341__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_588341__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_588341__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_588341__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_588341__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_588341__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_588341__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_588341__(7583);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_588341__(4226);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_588341__(3266);\n/* harmony import */ var _network_utils_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_588341__(8253);\n\n\n\n\n\n\n\n\n\n\n\n\n;\nfunction createFetchOptions(headers, withCredentials, abortController) {\n return {\n method: \"GET\",\n headers,\n signal: abortController.signal,\n mode: \"cors\",\n credentials: withCredentials ? \"include\" : \"same-origin\",\n redirect: \"follow\"\n };\n}\nfunction createHeaders(httpHeaders) {\n const headers = new Headers();\n for (const property in httpHeaders) {\n const value = httpHeaders[property];\n if (value === undefined) {\n continue;\n }\n headers.append(property, value);\n }\n return headers;\n}\nfunction getArrayBuffer(val) {\n if (val instanceof Uint8Array) {\n return val.buffer;\n }\n if (val instanceof ArrayBuffer) {\n return val;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_10__.warn)(`getArrayBuffer - unexpected data format: ${val}`);\n return new Uint8Array(val).buffer;\n}\nclass PDFFetchStream {\n constructor(source) {\n this.source = source;\n this.isHttp = /^https?:/i.test(source.url);\n this.httpHeaders = this.isHttp && source.httpHeaders || {};\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n getFullReader() {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_10__.assert)(!this._fullRequestReader, \"PDFFetchStream.getFullReader can only be called once.\");\n this._fullRequestReader = new PDFFetchStreamReader(this);\n return this._fullRequestReader;\n }\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFFetchStreamRangeReader(this, begin, end);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\nclass PDFFetchStreamReader {\n constructor(stream) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n this._filename = null;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._contentLength = source.length;\n this._headersCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.PromiseCapability();\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n this._abortController = new AbortController();\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n this._headers = createHeaders(this._stream.httpHeaders);\n const url = source.url;\n fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => {\n if (!(0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.validateResponseStatus)(response.status)) {\n throw (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.createResponseStatusError)(response.status, url);\n }\n this._reader = response.body.getReader();\n this._headersCapability.resolve();\n const getResponseHeader = name => {\n return response.headers.get(name);\n };\n const {\n allowRangeRequests,\n suggestedLength\n } = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.validateRangeRequestCapabilities)({\n getResponseHeader,\n isHttp: this._stream.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange\n });\n this._isRangeSupported = allowRangeRequests;\n this._contentLength = suggestedLength || this._contentLength;\n this._filename = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.extractFilenameFromHeader)(getResponseHeader);\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this.cancel(new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.AbortException(\"Streaming is disabled.\"));\n }\n }).catch(this._headersCapability.reject);\n this.onProgress = null;\n }\n get headersReady() {\n return this._headersCapability.promise;\n }\n get filename() {\n return this._filename;\n }\n get contentLength() {\n return this._contentLength;\n }\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n async read() {\n await this._headersCapability.promise;\n const {\n value,\n done\n } = await this._reader.read();\n if (done) {\n return {\n value,\n done\n };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength\n });\n return {\n value: getArrayBuffer(value),\n done: false\n };\n }\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\nclass PDFFetchStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._readCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.PromiseCapability();\n this._isStreamingSupported = !source.disableStream;\n this._abortController = new AbortController();\n this._headers = createHeaders(this._stream.httpHeaders);\n this._headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n const url = source.url;\n fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => {\n if (!(0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.validateResponseStatus)(response.status)) {\n throw (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.createResponseStatusError)(response.status, url);\n }\n this._readCapability.resolve();\n this._reader = response.body.getReader();\n }).catch(this._readCapability.reject);\n this.onProgress = null;\n }\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n async read() {\n await this._readCapability.promise;\n const {\n value,\n done\n } = await this._reader.read();\n if (done) {\n return {\n value,\n done\n };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({\n loaded: this._loaded\n });\n return {\n value: getArrayBuffer(value),\n done: false\n };\n }\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\n\n\n/***/ }),\n\n/***/ 3742:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_596650__) => {\n\n/* harmony export */ __nested_webpack_require_596650__.d(__nested_webpack_exports__, {\n/* harmony export */ FontFaceObject: () => (/* binding */ FontFaceObject),\n/* harmony export */ FontLoader: () => (/* binding */ FontLoader)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_596650__(5561);\n/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_596650__(8587);\n/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_596650__(3247);\n/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_596650__(3302);\n/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_596650__(9490);\n/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_596650__(5438);\n/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_596650__(7914);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_596650__(4226);\n/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_596650__(9709);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_596650__(3266);\n\n\n\n\n\n\n\n\n\n\nclass FontLoader {\n #systemFonts = new Set();\n constructor(_ref) {\n let {\n ownerDocument = globalThis.document,\n styleElement = null\n } = _ref;\n this._document = ownerDocument;\n this.nativeFontFaces = new Set();\n this.styleElement = null;\n this.loadingRequests = [];\n this.loadTestFontId = 0;\n }\n addNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.add(nativeFontFace);\n this._document.fonts.add(nativeFontFace);\n }\n removeNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.delete(nativeFontFace);\n this._document.fonts.delete(nativeFontFace);\n }\n insertRule(rule) {\n if (!this.styleElement) {\n this.styleElement = this._document.createElement(\"style\");\n this._document.documentElement.getElementsByTagName(\"head\")[0].append(this.styleElement);\n }\n const styleSheet = this.styleElement.sheet;\n styleSheet.insertRule(rule, styleSheet.cssRules.length);\n }\n clear() {\n for (const nativeFontFace of this.nativeFontFaces) {\n this._document.fonts.delete(nativeFontFace);\n }\n this.nativeFontFaces.clear();\n this.#systemFonts.clear();\n if (this.styleElement) {\n this.styleElement.remove();\n this.styleElement = null;\n }\n }\n async loadSystemFont(_ref2) {\n let {\n systemFontInfo: info,\n _inspectFont\n } = _ref2;\n if (!info || this.#systemFonts.has(info.loadedName)) {\n return;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.assert)(!this.disableFontFace, \"loadSystemFont shouldn't be called when `disableFontFace` is set.\");\n if (this.isFontLoadingAPISupported) {\n const {\n loadedName,\n src,\n style\n } = info;\n const fontFace = new FontFace(loadedName, src, style);\n this.addNativeFontFace(fontFace);\n try {\n await fontFace.load();\n this.#systemFonts.add(loadedName);\n _inspectFont?.(info);\n } catch {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.warn)(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`);\n this.removeNativeFontFace(fontFace);\n }\n return;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.unreachable)(\"Not implemented: loadSystemFont without the Font Loading API.\");\n }\n async bind(font) {\n if (font.attached || font.missingFile && !font.systemFontInfo) {\n return;\n }\n font.attached = true;\n if (font.systemFontInfo) {\n await this.loadSystemFont(font);\n return;\n }\n if (this.isFontLoadingAPISupported) {\n const nativeFontFace = font.createNativeFontFace();\n if (nativeFontFace) {\n this.addNativeFontFace(nativeFontFace);\n try {\n await nativeFontFace.loaded;\n } catch (ex) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.warn)(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n font.disableFontFace = true;\n throw ex;\n }\n }\n return;\n }\n const rule = font.createFontFaceRule();\n if (rule) {\n this.insertRule(rule);\n if (this.isSyncFontLoadingSupported) {\n return;\n }\n await new Promise(resolve => {\n const request = this._queueLoadingCallback(resolve);\n this._prepareFontLoadEvent(font, request);\n });\n }\n }\n get isFontLoadingAPISupported() {\n const hasFonts = !!this._document?.fonts;\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.shadow)(this, \"isFontLoadingAPISupported\", hasFonts);\n }\n get isSyncFontLoadingSupported() {\n let supported = false;\n if (_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.isNodeJS) {\n supported = true;\n } else if (typeof navigator !== \"undefined\" && typeof navigator?.userAgent === \"string\" && /Mozilla\\/5.0.*?rv:\\d+.*? Gecko/.test(navigator.userAgent)) {\n supported = true;\n }\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.shadow)(this, \"isSyncFontLoadingSupported\", supported);\n }\n _queueLoadingCallback(callback) {\n function completeRequest() {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.assert)(!request.done, \"completeRequest() cannot be called twice.\");\n request.done = true;\n while (loadingRequests.length > 0 && loadingRequests[0].done) {\n const otherRequest = loadingRequests.shift();\n setTimeout(otherRequest.callback, 0);\n }\n }\n const {\n loadingRequests\n } = this;\n const request = {\n done: false,\n complete: completeRequest,\n callback\n };\n loadingRequests.push(request);\n return request;\n }\n get _loadTestFont() {\n const testFont = atob(\"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" + \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" + \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" + \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" + \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" + \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" + \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" + \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" + \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" + \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" + \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" + \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" + \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" + \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" + \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" + \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" + \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" + \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\");\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.shadow)(this, \"_loadTestFont\", testFont);\n }\n _prepareFontLoadEvent(font, request) {\n function int32(data, offset) {\n return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;\n }\n function spliceString(s, offset, remove, insert) {\n const chunk1 = s.substring(0, offset);\n const chunk2 = s.substring(offset + remove);\n return chunk1 + insert + chunk2;\n }\n let i, ii;\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n let called = 0;\n function isFontReady(name, callback) {\n if (++called > 30) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.warn)(\"Load test font never loaded.\");\n callback();\n return;\n }\n ctx.font = \"30px \" + name;\n ctx.fillText(\".\", 0, 20);\n const imageData = ctx.getImageData(0, 0, 1, 1);\n if (imageData.data[3] > 0) {\n callback();\n return;\n }\n setTimeout(isFontReady.bind(null, name, callback));\n }\n const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n let data = this._loadTestFont;\n const COMMENT_OFFSET = 976;\n data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);\n const CFF_CHECKSUM_OFFSET = 16;\n const XXXX_VALUE = 0x58585858;\n let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;\n }\n if (i < loadTestFontId.length) {\n checksum = checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i) | 0;\n }\n data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.string32)(checksum));\n const url = `url(data:font/opentype;base64,${btoa(data)});`;\n const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n this.insertRule(rule);\n const div = this._document.createElement(\"div\");\n div.style.visibility = \"hidden\";\n div.style.width = div.style.height = \"10px\";\n div.style.position = \"absolute\";\n div.style.top = div.style.left = \"0px\";\n for (const name of [font.loadedName, loadTestFontId]) {\n const span = this._document.createElement(\"span\");\n span.textContent = \"Hi\";\n span.style.fontFamily = name;\n div.append(span);\n }\n this._document.body.append(div);\n isFontReady(loadTestFontId, () => {\n div.remove();\n request.complete();\n });\n }\n}\nclass FontFaceObject {\n constructor(translatedData, _ref3) {\n let {\n isEvalSupported = true,\n disableFontFace = false,\n ignoreErrors = false,\n inspectFont = null\n } = _ref3;\n this.compiledGlyphs = Object.create(null);\n for (const i in translatedData) {\n this[i] = translatedData[i];\n }\n this.isEvalSupported = isEvalSupported !== false;\n this.disableFontFace = disableFontFace === true;\n this.ignoreErrors = ignoreErrors === true;\n this._inspectFont = inspectFont;\n }\n createNativeFontFace() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n let nativeFontFace;\n if (!this.cssFontInfo) {\n nativeFontFace = new FontFace(this.loadedName, this.data, {});\n } else {\n const css = {\n weight: this.cssFontInfo.fontWeight\n };\n if (this.cssFontInfo.italicAngle) {\n css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;\n }\n nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css);\n }\n this._inspectFont?.(this);\n return nativeFontFace;\n }\n createFontFaceRule() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n const data = (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.bytesToString)(this.data);\n const url = `url(data:${this.mimetype};base64,${btoa(data)});`;\n let rule;\n if (!this.cssFontInfo) {\n rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n } else {\n let css = `font-weight: ${this.cssFontInfo.fontWeight};`;\n if (this.cssFontInfo.italicAngle) {\n css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;\n }\n rule = `@font-face {font-family:\"${this.cssFontInfo.fontFamily}\";${css}src:${url}}`;\n }\n this._inspectFont?.(this, url);\n return rule;\n }\n getPathGenerator(objs, character) {\n if (this.compiledGlyphs[character] !== undefined) {\n return this.compiledGlyphs[character];\n }\n let cmds;\n try {\n cmds = objs.get(this.loadedName + \"_path_\" + character);\n } catch (ex) {\n if (!this.ignoreErrors) {\n throw ex;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_9__.warn)(`getPathGenerator - ignoring character: \"${ex}\".`);\n return this.compiledGlyphs[character] = function (c, size) {};\n }\n if (this.isEvalSupported && _shared_util_js__WEBPACK_IMPORTED_MODULE_9__.FeatureTest.isEvalSupported) {\n const jsBuf = [];\n for (const current of cmds) {\n const args = current.args !== undefined ? current.args.join(\",\") : \"\";\n jsBuf.push(\"c.\", current.cmd, \"(\", args, \");\\n\");\n }\n return this.compiledGlyphs[character] = new Function(\"c\", \"size\", jsBuf.join(\"\"));\n }\n return this.compiledGlyphs[character] = function (c, size) {\n for (const current of cmds) {\n if (current.cmd === \"scale\") {\n current.args = [size, -size];\n }\n c[current.cmd].apply(c, current.args);\n }\n };\n }\n}\n\n\n/***/ }),\n\n/***/ 3472:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_610148__) => {\n\n/* harmony export */ __nested_webpack_require_610148__.d(__nested_webpack_exports__, {\n/* harmony export */ Metadata: () => (/* binding */ Metadata)\n/* harmony export */ });\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_610148__(3266);\n\nclass Metadata {\n #metadataMap;\n #data;\n constructor(_ref) {\n let {\n parsedData,\n rawData\n } = _ref;\n this.#metadataMap = parsedData;\n this.#data = rawData;\n }\n getRaw() {\n return this.#data;\n }\n get(name) {\n return this.#metadataMap.get(name) ?? null;\n }\n getAll() {\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.objectFromMap)(this.#metadataMap);\n }\n has(name) {\n return this.#metadataMap.has(name);\n }\n}\n\n\n/***/ }),\n\n/***/ 3474:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_610984__) => {\n\n/* harmony export */ __nested_webpack_require_610984__.d(__nested_webpack_exports__, {\n/* harmony export */ PDFNetworkStream: () => (/* binding */ PDFNetworkStream)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_610984__(4226);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_610984__(3266);\n/* harmony import */ var _network_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_610984__(8253);\n\n\n\n;\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\nfunction getArrayBuffer(xhr) {\n const data = xhr.response;\n if (typeof data !== \"string\") {\n return data;\n }\n return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.stringToBytes)(data).buffer;\n}\nclass NetworkManager {\n constructor(url) {\n let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.url = url;\n this.isHttp = /^https?:/i.test(url);\n this.httpHeaders = this.isHttp && args.httpHeaders || Object.create(null);\n this.withCredentials = args.withCredentials || false;\n this.currXhrId = 0;\n this.pendingRequests = Object.create(null);\n }\n requestRange(begin, end, listeners) {\n const args = {\n begin,\n end\n };\n for (const prop in listeners) {\n args[prop] = listeners[prop];\n }\n return this.request(args);\n }\n requestFull(listeners) {\n return this.request(listeners);\n }\n request(args) {\n const xhr = new XMLHttpRequest();\n const xhrId = this.currXhrId++;\n const pendingRequest = this.pendingRequests[xhrId] = {\n xhr\n };\n xhr.open(\"GET\", this.url);\n xhr.withCredentials = this.withCredentials;\n for (const property in this.httpHeaders) {\n const value = this.httpHeaders[property];\n if (value === undefined) {\n continue;\n }\n xhr.setRequestHeader(property, value);\n }\n if (this.isHttp && \"begin\" in args && \"end\" in args) {\n xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE;\n } else {\n pendingRequest.expectedStatus = OK_RESPONSE;\n }\n xhr.responseType = \"arraybuffer\";\n if (args.onError) {\n xhr.onerror = function (evt) {\n args.onError(xhr.status);\n };\n }\n xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n xhr.onprogress = this.onProgress.bind(this, xhrId);\n pendingRequest.onHeadersReceived = args.onHeadersReceived;\n pendingRequest.onDone = args.onDone;\n pendingRequest.onError = args.onError;\n pendingRequest.onProgress = args.onProgress;\n xhr.send(null);\n return xhrId;\n }\n onProgress(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return;\n }\n pendingRequest.onProgress?.(evt);\n }\n onStateChange(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return;\n }\n const xhr = pendingRequest.xhr;\n if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n pendingRequest.onHeadersReceived();\n delete pendingRequest.onHeadersReceived;\n }\n if (xhr.readyState !== 4) {\n return;\n }\n if (!(xhrId in this.pendingRequests)) {\n return;\n }\n delete this.pendingRequests[xhrId];\n if (xhr.status === 0 && this.isHttp) {\n pendingRequest.onError?.(xhr.status);\n return;\n }\n const xhrStatus = xhr.status || OK_RESPONSE;\n const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {\n pendingRequest.onError?.(xhr.status);\n return;\n }\n const chunk = getArrayBuffer(xhr);\n if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n const matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n pendingRequest.onDone({\n begin: parseInt(matches[1], 10),\n chunk\n });\n } else if (chunk) {\n pendingRequest.onDone({\n begin: 0,\n chunk\n });\n } else {\n pendingRequest.onError?.(xhr.status);\n }\n }\n getRequestXhr(xhrId) {\n return this.pendingRequests[xhrId].xhr;\n }\n isPendingRequest(xhrId) {\n return xhrId in this.pendingRequests;\n }\n abortRequest(xhrId) {\n const xhr = this.pendingRequests[xhrId].xhr;\n delete this.pendingRequests[xhrId];\n xhr.abort();\n }\n}\nclass PDFNetworkStream {\n constructor(source) {\n this._source = source;\n this._manager = new NetworkManager(source.url, {\n httpHeaders: source.httpHeaders,\n withCredentials: source.withCredentials\n });\n this._rangeChunkSize = source.rangeChunkSize;\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n _onRangeRequestReaderClosed(reader) {\n const i = this._rangeRequestReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeRequestReaders.splice(i, 1);\n }\n }\n getFullReader() {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.assert)(!this._fullRequestReader, \"PDFNetworkStream.getFullReader can only be called once.\");\n this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source);\n return this._fullRequestReader;\n }\n getRangeReader(begin, end) {\n const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);\n reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\nclass PDFNetworkStreamFullRequestReader {\n constructor(manager, source) {\n this._manager = manager;\n const args = {\n onHeadersReceived: this._onHeadersReceived.bind(this),\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this)\n };\n this._url = source.url;\n this._fullRequestId = manager.requestFull(args);\n this._headersReceivedCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this._disableRange = source.disableRange || false;\n this._contentLength = source.length;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n this._isStreamingSupported = false;\n this._isRangeSupported = false;\n this._cachedChunks = [];\n this._requests = [];\n this._done = false;\n this._storedError = undefined;\n this._filename = null;\n this.onProgress = null;\n }\n _onHeadersReceived() {\n const fullRequestXhrId = this._fullRequestId;\n const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);\n const getResponseHeader = name => {\n return fullRequestXhr.getResponseHeader(name);\n };\n const {\n allowRangeRequests,\n suggestedLength\n } = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_2__.validateRangeRequestCapabilities)({\n getResponseHeader,\n isHttp: this._manager.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange\n });\n if (allowRangeRequests) {\n this._isRangeSupported = true;\n }\n this._contentLength = suggestedLength || this._contentLength;\n this._filename = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_2__.extractFilenameFromHeader)(getResponseHeader);\n if (this._isRangeSupported) {\n this._manager.abortRequest(fullRequestXhrId);\n }\n this._headersReceivedCapability.resolve();\n }\n _onDone(data) {\n if (data) {\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({\n value: data.chunk,\n done: false\n });\n } else {\n this._cachedChunks.push(data.chunk);\n }\n }\n this._done = true;\n if (this._cachedChunks.length > 0) {\n return;\n }\n for (const requestCapability of this._requests) {\n requestCapability.resolve({\n value: undefined,\n done: true\n });\n }\n this._requests.length = 0;\n }\n _onError(status) {\n this._storedError = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_2__.createResponseStatusError)(status, this._url);\n this._headersReceivedCapability.reject(this._storedError);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._cachedChunks.length = 0;\n }\n _onProgress(evt) {\n this.onProgress?.({\n loaded: evt.loaded,\n total: evt.lengthComputable ? evt.total : this._contentLength\n });\n }\n get filename() {\n return this._filename;\n }\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n get contentLength() {\n return this._contentLength;\n }\n get headersReady() {\n return this._headersReceivedCapability.promise;\n }\n async read() {\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._cachedChunks.length > 0) {\n const chunk = this._cachedChunks.shift();\n return {\n value: chunk,\n done: false\n };\n }\n if (this._done) {\n return {\n value: undefined,\n done: true\n };\n }\n const requestCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n cancel(reason) {\n this._done = true;\n this._headersReceivedCapability.reject(reason);\n for (const requestCapability of this._requests) {\n requestCapability.resolve({\n value: undefined,\n done: true\n });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._fullRequestId)) {\n this._manager.abortRequest(this._fullRequestId);\n }\n this._fullRequestReader = null;\n }\n}\nclass PDFNetworkStreamRangeRequestReader {\n constructor(manager, begin, end) {\n this._manager = manager;\n const args = {\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this)\n };\n this._url = manager.url;\n this._requestId = manager.requestRange(begin, end, args);\n this._requests = [];\n this._queuedChunk = null;\n this._done = false;\n this._storedError = undefined;\n this.onProgress = null;\n this.onClosed = null;\n }\n _close() {\n this.onClosed?.(this);\n }\n _onDone(data) {\n const chunk = data.chunk;\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({\n value: chunk,\n done: false\n });\n } else {\n this._queuedChunk = chunk;\n }\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({\n value: undefined,\n done: true\n });\n }\n this._requests.length = 0;\n this._close();\n }\n _onError(status) {\n this._storedError = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_2__.createResponseStatusError)(status, this._url);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._queuedChunk = null;\n }\n _onProgress(evt) {\n if (!this.isStreamingSupported) {\n this.onProgress?.({\n loaded: evt.loaded\n });\n }\n }\n get isStreamingSupported() {\n return false;\n }\n async read() {\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._queuedChunk !== null) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return {\n value: chunk,\n done: false\n };\n }\n if (this._done) {\n return {\n value: undefined,\n done: true\n };\n }\n const requestCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({\n value: undefined,\n done: true\n });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._requestId)) {\n this._manager.abortRequest(this._requestId);\n }\n this._close();\n }\n}\n\n\n/***/ }),\n\n/***/ 8253:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_623719__) => {\n\n\n// EXPORTS\n__nested_webpack_require_623719__.d(__nested_webpack_exports__, {\n createResponseStatusError: () => (/* binding */ createResponseStatusError),\n extractFilenameFromHeader: () => (/* binding */ extractFilenameFromHeader),\n validateRangeRequestCapabilities: () => (/* binding */ validateRangeRequestCapabilities),\n validateResponseStatus: () => (/* binding */ validateResponseStatus)\n});\n\n// EXTERNAL MODULE: ./src/shared/util.js\nvar util = __nested_webpack_require_623719__(3266);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push = __nested_webpack_require_623719__(4226);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js\nvar web_dom_exception_stack = __nested_webpack_require_623719__(9709);\n;// CONCATENATED MODULE: ./src/display/content_disposition.js\n\n\n\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n let needsEncodingFixup = true;\n let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = unescape(filename);\n filename = rfc5987decode(filename);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n tmp = rfc2231getparam(contentDisposition);\n if (tmp) {\n const filename = rfc2047decode(tmp);\n return fixupEncoding(filename);\n }\n tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n function toParamRegExp(attributePattern, flags) {\n return new RegExp(\"(?:^|;)\\\\s*\" + attributePattern + \"\\\\s*=\\\\s*\" + \"(\" + '[^\";\\\\s][^;\\\\s]*' + \"|\" + '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' + \")\", flags);\n }\n function textdecode(encoding, value) {\n if (encoding) {\n if (!/^[\\x00-\\xFF]+$/.test(value)) {\n return value;\n }\n try {\n const decoder = new TextDecoder(encoding, {\n fatal: true\n });\n const buffer = (0,util.stringToBytes)(value);\n value = decoder.decode(buffer);\n needsEncodingFixup = false;\n } catch {}\n }\n return value;\n }\n function fixupEncoding(value) {\n if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n value = textdecode(\"utf-8\", value);\n if (needsEncodingFixup) {\n value = textdecode(\"iso-8859-1\", value);\n }\n }\n return value;\n }\n function rfc2231getparam(contentDispositionStr) {\n const matches = [];\n let match;\n const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n while ((match = iter.exec(contentDispositionStr)) !== null) {\n let [, n, quot, part] = match;\n n = parseInt(n, 10);\n if (n in matches) {\n if (n === 0) {\n break;\n }\n continue;\n }\n matches[n] = [quot, part];\n }\n const parts = [];\n for (let n = 0; n < matches.length; ++n) {\n if (!(n in matches)) {\n break;\n }\n let [quot, part] = matches[n];\n part = rfc2616unquote(part);\n if (quot) {\n part = unescape(part);\n if (n === 0) {\n part = rfc5987decode(part);\n }\n }\n parts.push(part);\n }\n return parts.join(\"\");\n }\n function rfc2616unquote(value) {\n if (value.startsWith('\"')) {\n const parts = value.slice(1).split('\\\\\"');\n for (let i = 0; i < parts.length; ++i) {\n const quotindex = parts[i].indexOf('\"');\n if (quotindex !== -1) {\n parts[i] = parts[i].slice(0, quotindex);\n parts.length = i + 1;\n }\n parts[i] = parts[i].replaceAll(/\\\\(.)/g, \"$1\");\n }\n value = parts.join('\"');\n }\n return value;\n }\n function rfc5987decode(extvalue) {\n const encodingend = extvalue.indexOf(\"'\");\n if (encodingend === -1) {\n return extvalue;\n }\n const encoding = extvalue.slice(0, encodingend);\n const langvalue = extvalue.slice(encodingend + 1);\n const value = langvalue.replace(/^[^']*'/, \"\");\n return textdecode(encoding, value);\n }\n function rfc2047decode(value) {\n if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n return value;\n }\n return value.replaceAll(/=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g, function (matches, charset, encoding, text) {\n if (encoding === \"q\" || encoding === \"Q\") {\n text = text.replaceAll(\"_\", \" \");\n text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) {\n return String.fromCharCode(parseInt(hex, 16));\n });\n return textdecode(charset, text);\n }\n try {\n text = atob(text);\n } catch {}\n return textdecode(charset, text);\n });\n }\n return \"\";\n}\n\n// EXTERNAL MODULE: ./src/display/display_utils.js\nvar display_utils = __nested_webpack_require_623719__(473);\n;// CONCATENATED MODULE: ./src/display/network_utils.js\n\n\n\nfunction validateRangeRequestCapabilities(_ref) {\n let {\n getResponseHeader,\n isHttp,\n rangeChunkSize,\n disableRange\n } = _ref;\n const returnValues = {\n allowRangeRequests: false,\n suggestedLength: undefined\n };\n const length = parseInt(getResponseHeader(\"Content-Length\"), 10);\n if (!Number.isInteger(length)) {\n return returnValues;\n }\n returnValues.suggestedLength = length;\n if (length <= 2 * rangeChunkSize) {\n return returnValues;\n }\n if (disableRange || !isHttp) {\n return returnValues;\n }\n if (getResponseHeader(\"Accept-Ranges\") !== \"bytes\") {\n return returnValues;\n }\n const contentEncoding = getResponseHeader(\"Content-Encoding\") || \"identity\";\n if (contentEncoding !== \"identity\") {\n return returnValues;\n }\n returnValues.allowRangeRequests = true;\n return returnValues;\n}\nfunction extractFilenameFromHeader(getResponseHeader) {\n const contentDisposition = getResponseHeader(\"Content-Disposition\");\n if (contentDisposition) {\n let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n if (filename.includes(\"%\")) {\n try {\n filename = decodeURIComponent(filename);\n } catch {}\n }\n if ((0,display_utils.isPdfFile)(filename)) {\n return filename;\n }\n }\n return null;\n}\nfunction createResponseStatusError(status, url) {\n if (status === 404 || status === 0 && url.startsWith(\"file:\")) {\n return new util.MissingPDFException('Missing PDF \"' + url + '\".');\n }\n return new util.UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF \"${url}\".`, status);\n}\nfunction validateResponseStatus(status) {\n return status === 200 || status === 206;\n}\n\n\n/***/ }),\n\n/***/ 3498:\n/***/ ((__webpack_module__, __nested_webpack_exports__, __nested_webpack_require_630359__) => {\n\n__nested_webpack_require_630359__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n/* harmony export */ __nested_webpack_require_630359__.d(__nested_webpack_exports__, {\n/* harmony export */ PDFNodeStream: () => (/* binding */ PDFNodeStream)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_630359__(4226);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_630359__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_630359__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_630359__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_630359__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_630359__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_630359__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_630359__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_630359__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_630359__(7583);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_630359__(3266);\n/* harmony import */ var _network_utils_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_630359__(8253);\n\n\n\n\n\n\n\n\n\n\n\n\n;\nlet fs, http, https, url;\nif (_shared_util_js__WEBPACK_IMPORTED_MODULE_10__.isNodeJS) {\n fs = await import(/* webpackIgnore: true */ \"fs\");\n http = await import(/* webpackIgnore: true */ \"http\");\n https = await import(/* webpackIgnore: true */ \"https\");\n url = await import(/* webpackIgnore: true */ \"url\");\n}\nconst fileUriRegex = /^file:\\/\\/\\/[a-zA-Z]:\\//;\nfunction parseUrl(sourceUrl) {\n const parsedUrl = url.parse(sourceUrl);\n if (parsedUrl.protocol === \"file:\" || parsedUrl.host) {\n return parsedUrl;\n }\n if (/^[a-z]:[/\\\\]/i.test(sourceUrl)) {\n return url.parse(`file:///${sourceUrl}`);\n }\n if (!parsedUrl.host) {\n parsedUrl.protocol = \"file:\";\n }\n return parsedUrl;\n}\nclass PDFNodeStream {\n constructor(source) {\n this.source = source;\n this.url = parseUrl(source.url);\n this.isHttp = this.url.protocol === \"http:\" || this.url.protocol === \"https:\";\n this.isFsUrl = this.url.protocol === \"file:\";\n this.httpHeaders = this.isHttp && source.httpHeaders || {};\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n getFullReader() {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_10__.assert)(!this._fullRequestReader, \"PDFNodeStream.getFullReader can only be called once.\");\n this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this);\n return this._fullRequestReader;\n }\n getRangeReader(start, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end);\n this._rangeRequestReaders.push(rangeReader);\n return rangeReader;\n }\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\nclass BaseFullReader {\n constructor(stream) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n const source = stream.source;\n this._contentLength = source.length;\n this._loaded = 0;\n this._filename = null;\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n this._readableStream = null;\n this._readCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.PromiseCapability();\n this._headersCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.PromiseCapability();\n }\n get headersReady() {\n return this._headersCapability.promise;\n }\n get filename() {\n return this._filename;\n }\n get contentLength() {\n return this._contentLength;\n }\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return {\n value: undefined,\n done: true\n };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.PromiseCapability();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength\n });\n const buffer = new Uint8Array(chunk).buffer;\n return {\n value: buffer,\n done: false\n };\n }\n cancel(reason) {\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n readableStream.on(\"end\", () => {\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this._error(new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.AbortException(\"streaming is disabled\"));\n }\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\nclass BaseRangeReader {\n constructor(stream) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n this._loaded = 0;\n this._readableStream = null;\n this._readCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.PromiseCapability();\n const source = stream.source;\n this._isStreamingSupported = !source.disableStream;\n }\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return {\n value: undefined,\n done: true\n };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.PromiseCapability();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({\n loaded: this._loaded\n });\n const buffer = new Uint8Array(chunk).buffer;\n return {\n value: buffer,\n done: false\n };\n }\n cancel(reason) {\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n readableStream.on(\"end\", () => {\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\nfunction createRequestOptions(parsedUrl, headers) {\n return {\n protocol: parsedUrl.protocol,\n auth: parsedUrl.auth,\n host: parsedUrl.hostname,\n port: parsedUrl.port,\n path: parsedUrl.path,\n method: \"GET\",\n headers\n };\n}\nclass PDFNodeStreamFullReader extends BaseFullReader {\n constructor(stream) {\n super(stream);\n const handleResponse = response => {\n if (response.statusCode === 404) {\n const error = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.MissingPDFException(`Missing PDF \"${this._url}\".`);\n this._storedError = error;\n this._headersCapability.reject(error);\n return;\n }\n this._headersCapability.resolve();\n this._setReadableStream(response);\n const getResponseHeader = name => {\n return this._readableStream.headers[name.toLowerCase()];\n };\n const {\n allowRangeRequests,\n suggestedLength\n } = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.validateRangeRequestCapabilities)({\n getResponseHeader,\n isHttp: stream.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange\n });\n this._isRangeSupported = allowRangeRequests;\n this._contentLength = suggestedLength || this._contentLength;\n this._filename = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_11__.extractFilenameFromHeader)(getResponseHeader);\n };\n this._request = null;\n if (this._url.protocol === \"http:\") {\n this._request = http.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse);\n } else {\n this._request = https.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse);\n }\n this._request.on(\"error\", reason => {\n this._storedError = reason;\n this._headersCapability.reject(reason);\n });\n this._request.end();\n }\n}\nclass PDFNodeStreamRangeReader extends BaseRangeReader {\n constructor(stream, start, end) {\n super(stream);\n this._httpHeaders = {};\n for (const property in stream.httpHeaders) {\n const value = stream.httpHeaders[property];\n if (value === undefined) {\n continue;\n }\n this._httpHeaders[property] = value;\n }\n this._httpHeaders.Range = `bytes=${start}-${end - 1}`;\n const handleResponse = response => {\n if (response.statusCode === 404) {\n const error = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.MissingPDFException(`Missing PDF \"${this._url}\".`);\n this._storedError = error;\n return;\n }\n this._setReadableStream(response);\n };\n this._request = null;\n if (this._url.protocol === \"http:\") {\n this._request = http.request(createRequestOptions(this._url, this._httpHeaders), handleResponse);\n } else {\n this._request = https.request(createRequestOptions(this._url, this._httpHeaders), handleResponse);\n }\n this._request.on(\"error\", reason => {\n this._storedError = reason;\n });\n this._request.end();\n }\n}\nclass PDFNodeStreamFsFullReader extends BaseFullReader {\n constructor(stream) {\n super(stream);\n let path = decodeURIComponent(this._url.path);\n if (fileUriRegex.test(this._url.href)) {\n path = path.replace(/^\\//, \"\");\n }\n fs.lstat(path, (error, stat) => {\n if (error) {\n if (error.code === \"ENOENT\") {\n error = new _shared_util_js__WEBPACK_IMPORTED_MODULE_10__.MissingPDFException(`Missing PDF \"${path}\".`);\n }\n this._storedError = error;\n this._headersCapability.reject(error);\n return;\n }\n this._contentLength = stat.size;\n this._setReadableStream(fs.createReadStream(path));\n this._headersCapability.resolve();\n });\n }\n}\nclass PDFNodeStreamFsRangeReader extends BaseRangeReader {\n constructor(stream, start, end) {\n super(stream);\n let path = decodeURIComponent(this._url.path);\n if (fileUriRegex.test(this._url.href)) {\n path = path.replace(/^\\//, \"\");\n }\n this._setReadableStream(fs.createReadStream(path, {\n start,\n end: end - 1\n }));\n }\n}\n\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } }, 1);\n\n/***/ }),\n\n/***/ 7738:\n/***/ ((__webpack_module__, __nested_webpack_exports__, __nested_webpack_require_642928__) => {\n\n__nested_webpack_require_642928__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n/* harmony export */ __nested_webpack_require_642928__.d(__nested_webpack_exports__, {\n/* harmony export */ NodeCMapReaderFactory: () => (/* binding */ NodeCMapReaderFactory),\n/* harmony export */ NodeCanvasFactory: () => (/* binding */ NodeCanvasFactory),\n/* harmony export */ NodeFilterFactory: () => (/* binding */ NodeFilterFactory),\n/* harmony export */ NodeStandardFontDataFactory: () => (/* binding */ NodeStandardFontDataFactory)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_642928__(3352);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_642928__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_642928__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_642928__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_642928__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_642928__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_642928__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_642928__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_642928__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_642928__(7583);\n/* harmony import */ var _base_factory_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_642928__(6822);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_642928__(3266);\n\n\n\n\n\n\n\n\n\n\n\n\n;\nlet fs, canvas, path2d_polyfill;\nif (_shared_util_js__WEBPACK_IMPORTED_MODULE_11__.isNodeJS) {\n fs = await import(/* webpackIgnore: true */ \"fs\");\n try {\n canvas = await import(/* webpackIgnore: true */ \"canvas\");\n } catch {}\n try {\n path2d_polyfill = await import(/* webpackIgnore: true */ \"path2d-polyfill\");\n } catch {}\n}\n{\n (function checkDOMMatrix() {\n if (globalThis.DOMMatrix || !_shared_util_js__WEBPACK_IMPORTED_MODULE_11__.isNodeJS) {\n return;\n }\n const DOMMatrix = canvas?.DOMMatrix;\n if (DOMMatrix) {\n globalThis.DOMMatrix = DOMMatrix;\n } else {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_11__.warn)(\"Cannot polyfill `DOMMatrix`, rendering may be broken.\");\n }\n })();\n (function checkPath2D() {\n if (globalThis.Path2D || !_shared_util_js__WEBPACK_IMPORTED_MODULE_11__.isNodeJS) {\n return;\n }\n const CanvasRenderingContext2D = canvas?.CanvasRenderingContext2D;\n const polyfillPath2D = path2d_polyfill?.polyfillPath2D;\n if (CanvasRenderingContext2D && polyfillPath2D) {\n globalThis.CanvasRenderingContext2D = CanvasRenderingContext2D;\n polyfillPath2D(globalThis);\n } else {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_11__.warn)(\"Cannot polyfill `Path2D`, rendering may be broken.\");\n }\n })();\n}\nconst fetchData = function (url) {\n return new Promise((resolve, reject) => {\n fs.readFile(url, (error, data) => {\n if (error || !data) {\n reject(new Error(error));\n return;\n }\n resolve(new Uint8Array(data));\n });\n });\n};\nclass NodeFilterFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_10__.BaseFilterFactory {}\nclass NodeCanvasFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_10__.BaseCanvasFactory {\n _createCanvas(width, height) {\n return canvas.createCanvas(width, height);\n }\n}\nclass NodeCMapReaderFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_10__.BaseCMapReaderFactory {\n _fetchData(url, compressionType) {\n return fetchData(url).then(data => {\n return {\n cMapData: data,\n compressionType\n };\n });\n }\n}\nclass NodeStandardFontDataFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_10__.BaseStandardFontDataFactory {\n _fetchData(url) {\n return fetchData(url);\n }\n}\n\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } }, 1);\n\n/***/ }),\n\n/***/ 3890:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_647482__) => {\n\n/* harmony export */ __nested_webpack_require_647482__.d(__nested_webpack_exports__, {\n/* harmony export */ OptionalContentConfig: () => (/* binding */ OptionalContentConfig)\n/* harmony export */ });\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_647482__(3266);\n/* harmony import */ var _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_647482__(2825);\n\n\nconst INTERNAL = Symbol(\"INTERNAL\");\nclass OptionalContentGroup {\n #visible = true;\n constructor(name, intent) {\n this.name = name;\n this.intent = intent;\n }\n get visible() {\n return this.#visible;\n }\n _setVisible(internal, visible) {\n if (internal !== INTERNAL) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)(\"Internal method `_setVisible` called.\");\n }\n this.#visible = visible;\n }\n}\nclass OptionalContentConfig {\n #cachedGetHash = null;\n #groups = new Map();\n #initialHash = null;\n #order = null;\n constructor(data) {\n this.name = null;\n this.creator = null;\n if (data === null) {\n return;\n }\n this.name = data.name;\n this.creator = data.creator;\n this.#order = data.order;\n for (const group of data.groups) {\n this.#groups.set(group.id, new OptionalContentGroup(group.name, group.intent));\n }\n if (data.baseState === \"OFF\") {\n for (const group of this.#groups.values()) {\n group._setVisible(INTERNAL, false);\n }\n }\n for (const on of data.on) {\n this.#groups.get(on)._setVisible(INTERNAL, true);\n }\n for (const off of data.off) {\n this.#groups.get(off)._setVisible(INTERNAL, false);\n }\n this.#initialHash = this.getHash();\n }\n #evaluateVisibilityExpression(array) {\n const length = array.length;\n if (length < 2) {\n return true;\n }\n const operator = array[0];\n for (let i = 1; i < length; i++) {\n const element = array[i];\n let state;\n if (Array.isArray(element)) {\n state = this.#evaluateVisibilityExpression(element);\n } else if (this.#groups.has(element)) {\n state = this.#groups.get(element).visible;\n } else {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${element}`);\n return true;\n }\n switch (operator) {\n case \"And\":\n if (!state) {\n return false;\n }\n break;\n case \"Or\":\n if (state) {\n return true;\n }\n break;\n case \"Not\":\n return !state;\n default:\n return true;\n }\n }\n return operator === \"And\";\n }\n isVisible(group) {\n if (this.#groups.size === 0) {\n return true;\n }\n if (!group) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(\"Optional content group not defined.\");\n return true;\n }\n if (group.type === \"OCG\") {\n if (!this.#groups.has(group.id)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${group.id}`);\n return true;\n }\n return this.#groups.get(group.id).visible;\n } else if (group.type === \"OCMD\") {\n if (group.expression) {\n return this.#evaluateVisibilityExpression(group.expression);\n }\n if (!group.policy || group.policy === \"AnyOn\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOn\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n } else if (group.policy === \"AnyOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Unknown optional content policy ${group.policy}.`);\n return true;\n }\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Unknown group type ${group.type}.`);\n return true;\n }\n setVisibility(id) {\n let visible = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n if (!this.#groups.has(id)) {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`);\n return;\n }\n this.#groups.get(id)._setVisible(INTERNAL, !!visible);\n this.#cachedGetHash = null;\n }\n get hasInitialVisibility() {\n return this.#initialHash === null || this.getHash() === this.#initialHash;\n }\n getOrder() {\n if (!this.#groups.size) {\n return null;\n }\n if (this.#order) {\n return this.#order.slice();\n }\n return [...this.#groups.keys()];\n }\n getGroups() {\n return this.#groups.size > 0 ? (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.objectFromMap)(this.#groups) : null;\n }\n getGroup(id) {\n return this.#groups.get(id) || null;\n }\n getHash() {\n if (this.#cachedGetHash !== null) {\n return this.#cachedGetHash;\n }\n const hash = new _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_1__.MurmurHash3_64();\n for (const [id, group] of this.#groups) {\n hash.update(`${id}:${group.visible}`);\n }\n return this.#cachedGetHash = hash.hexdigest();\n }\n}\n\n\n/***/ }),\n\n/***/ 5739:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_653841__) => {\n\n/* harmony export */ __nested_webpack_require_653841__.d(__nested_webpack_exports__, {\n/* harmony export */ renderTextLayer: () => (/* binding */ renderTextLayer),\n/* harmony export */ updateTextLayer: () => (/* binding */ updateTextLayer)\n/* harmony export */ });\n/* unused harmony export TextLayerRenderTask */\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_653841__(4226);\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_653841__(3352);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_653841__(3266);\n/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_653841__(473);\n\n\n\n\nconst MAX_TEXT_DIVS_TO_RENDER = 100000;\nconst DEFAULT_FONT_SIZE = 30;\nconst DEFAULT_FONT_ASCENT = 0.8;\nconst ascentCache = new Map();\nfunction getCtx(size, isOffscreenCanvasSupported) {\n let ctx;\n if (isOffscreenCanvasSupported && _shared_util_js__WEBPACK_IMPORTED_MODULE_2__.FeatureTest.isOffscreenCanvasSupported) {\n ctx = new OffscreenCanvas(size, size).getContext(\"2d\", {\n alpha: false\n });\n } else {\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = size;\n ctx = canvas.getContext(\"2d\", {\n alpha: false\n });\n }\n return ctx;\n}\nfunction getAscent(fontFamily, isOffscreenCanvasSupported) {\n const cachedAscent = ascentCache.get(fontFamily);\n if (cachedAscent) {\n return cachedAscent;\n }\n const ctx = getCtx(DEFAULT_FONT_SIZE, isOffscreenCanvasSupported);\n ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`;\n const metrics = ctx.measureText(\"\");\n let ascent = metrics.fontBoundingBoxAscent;\n let descent = Math.abs(metrics.fontBoundingBoxDescent);\n if (ascent) {\n const ratio = ascent / (ascent + descent);\n ascentCache.set(fontFamily, ratio);\n ctx.canvas.width = ctx.canvas.height = 0;\n return ratio;\n }\n ctx.strokeStyle = \"red\";\n ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n ctx.strokeText(\"g\", 0, 0);\n let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;\n descent = 0;\n for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) {\n if (pixels[i] > 0) {\n descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE);\n break;\n }\n }\n ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);\n ctx.strokeText(\"A\", 0, DEFAULT_FONT_SIZE);\n pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;\n ascent = 0;\n for (let i = 0, ii = pixels.length; i < ii; i += 4) {\n if (pixels[i] > 0) {\n ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE);\n break;\n }\n }\n ctx.canvas.width = ctx.canvas.height = 0;\n if (ascent) {\n const ratio = ascent / (ascent + descent);\n ascentCache.set(fontFamily, ratio);\n return ratio;\n }\n ascentCache.set(fontFamily, DEFAULT_FONT_ASCENT);\n return DEFAULT_FONT_ASCENT;\n}\nfunction appendText(task, geom, styles) {\n const textDiv = document.createElement(\"span\");\n const textDivProperties = {\n angle: 0,\n canvasWidth: 0,\n hasText: geom.str !== \"\",\n hasEOL: geom.hasEOL,\n fontSize: 0\n };\n task._textDivs.push(textDiv);\n const tx = _shared_util_js__WEBPACK_IMPORTED_MODULE_2__.Util.transform(task._transform, geom.transform);\n let angle = Math.atan2(tx[1], tx[0]);\n const style = styles[geom.fontName];\n if (style.vertical) {\n angle += Math.PI / 2;\n }\n const fontFamily = task._fontInspectorEnabled && style.fontSubstitution || style.fontFamily;\n const fontHeight = Math.hypot(tx[2], tx[3]);\n const fontAscent = fontHeight * getAscent(fontFamily, task._isOffscreenCanvasSupported);\n let left, top;\n if (angle === 0) {\n left = tx[4];\n top = tx[5] - fontAscent;\n } else {\n left = tx[4] + fontAscent * Math.sin(angle);\n top = tx[5] - fontAscent * Math.cos(angle);\n }\n const scaleFactorStr = \"calc(var(--scale-factor)*\";\n const divStyle = textDiv.style;\n if (task._container === task._rootContainer) {\n divStyle.left = `${(100 * left / task._pageWidth).toFixed(2)}%`;\n divStyle.top = `${(100 * top / task._pageHeight).toFixed(2)}%`;\n } else {\n divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`;\n divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`;\n }\n divStyle.fontSize = `${scaleFactorStr}${fontHeight.toFixed(2)}px)`;\n divStyle.fontFamily = fontFamily;\n textDivProperties.fontSize = fontHeight;\n textDiv.setAttribute(\"role\", \"presentation\");\n textDiv.textContent = geom.str;\n textDiv.dir = geom.dir;\n if (task._fontInspectorEnabled) {\n textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName;\n }\n if (angle !== 0) {\n textDivProperties.angle = angle * (180 / Math.PI);\n }\n let shouldScaleText = false;\n if (geom.str.length > 1) {\n shouldScaleText = true;\n } else if (geom.str !== \" \" && geom.transform[0] !== geom.transform[3]) {\n const absScaleX = Math.abs(geom.transform[0]),\n absScaleY = Math.abs(geom.transform[3]);\n if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) {\n shouldScaleText = true;\n }\n }\n if (shouldScaleText) {\n textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;\n }\n task._textDivProperties.set(textDiv, textDivProperties);\n if (task._isReadableStream) {\n task._layoutText(textDiv);\n }\n}\nfunction layout(params) {\n const {\n div,\n scale,\n properties,\n ctx,\n prevFontSize,\n prevFontFamily\n } = params;\n const {\n style\n } = div;\n let transform = \"\";\n if (properties.canvasWidth !== 0 && properties.hasText) {\n const {\n fontFamily\n } = style;\n const {\n canvasWidth,\n fontSize\n } = properties;\n if (prevFontSize !== fontSize || prevFontFamily !== fontFamily) {\n ctx.font = `${fontSize * scale}px ${fontFamily}`;\n params.prevFontSize = fontSize;\n params.prevFontFamily = fontFamily;\n }\n const {\n width\n } = ctx.measureText(div.textContent);\n if (width > 0) {\n transform = `scaleX(${canvasWidth * scale / width})`;\n }\n }\n if (properties.angle !== 0) {\n transform = `rotate(${properties.angle}deg) ${transform}`;\n }\n if (transform.length > 0) {\n style.transform = transform;\n }\n}\nfunction render(task) {\n if (task._canceled) {\n return;\n }\n const textDivs = task._textDivs;\n const capability = task._capability;\n const textDivsLength = textDivs.length;\n if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {\n capability.resolve();\n return;\n }\n if (!task._isReadableStream) {\n for (const textDiv of textDivs) {\n task._layoutText(textDiv);\n }\n }\n capability.resolve();\n}\nclass TextLayerRenderTask {\n constructor(_ref) {\n let {\n textContentSource,\n container,\n viewport,\n textDivs,\n textDivProperties,\n textContentItemsStr,\n isOffscreenCanvasSupported\n } = _ref;\n this._textContentSource = textContentSource;\n this._isReadableStream = textContentSource instanceof ReadableStream;\n this._container = this._rootContainer = container;\n this._textDivs = textDivs || [];\n this._textContentItemsStr = textContentItemsStr || [];\n this._isOffscreenCanvasSupported = isOffscreenCanvasSupported;\n this._fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n this._reader = null;\n this._textDivProperties = textDivProperties || new WeakMap();\n this._canceled = false;\n this._capability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_2__.PromiseCapability();\n this._layoutTextParams = {\n prevFontSize: null,\n prevFontFamily: null,\n div: null,\n scale: viewport.scale * (globalThis.devicePixelRatio || 1),\n properties: null,\n ctx: getCtx(0, isOffscreenCanvasSupported)\n };\n const {\n pageWidth,\n pageHeight,\n pageX,\n pageY\n } = viewport.rawDims;\n this._transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];\n this._pageWidth = pageWidth;\n this._pageHeight = pageHeight;\n (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_3__.setLayerDimensions)(container, viewport);\n this._capability.promise.finally(() => {\n this._layoutTextParams = null;\n }).catch(() => {});\n }\n get promise() {\n return this._capability.promise;\n }\n cancel() {\n this._canceled = true;\n if (this._reader) {\n this._reader.cancel(new _shared_util_js__WEBPACK_IMPORTED_MODULE_2__.AbortException(\"TextLayer task cancelled.\")).catch(() => {});\n this._reader = null;\n }\n this._capability.reject(new _shared_util_js__WEBPACK_IMPORTED_MODULE_2__.AbortException(\"TextLayer task cancelled.\"));\n }\n _processItems(items, styleCache) {\n for (const item of items) {\n if (item.str === undefined) {\n if (item.type === \"beginMarkedContentProps\" || item.type === \"beginMarkedContent\") {\n const parent = this._container;\n this._container = document.createElement(\"span\");\n this._container.classList.add(\"markedContent\");\n if (item.id !== null) {\n this._container.setAttribute(\"id\", `${item.id}`);\n }\n parent.append(this._container);\n } else if (item.type === \"endMarkedContent\") {\n this._container = this._container.parentNode;\n }\n continue;\n }\n this._textContentItemsStr.push(item.str);\n appendText(this, item, styleCache);\n }\n }\n _layoutText(textDiv) {\n const textDivProperties = this._layoutTextParams.properties = this._textDivProperties.get(textDiv);\n this._layoutTextParams.div = textDiv;\n layout(this._layoutTextParams);\n if (textDivProperties.hasText) {\n this._container.append(textDiv);\n }\n if (textDivProperties.hasEOL) {\n const br = document.createElement(\"br\");\n br.setAttribute(\"role\", \"presentation\");\n this._container.append(br);\n }\n }\n _render() {\n const capability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_2__.PromiseCapability();\n let styleCache = Object.create(null);\n if (this._isReadableStream) {\n const pump = () => {\n this._reader.read().then(_ref2 => {\n let {\n value,\n done\n } = _ref2;\n if (done) {\n capability.resolve();\n return;\n }\n Object.assign(styleCache, value.styles);\n this._processItems(value.items, styleCache);\n pump();\n }, capability.reject);\n };\n this._reader = this._textContentSource.getReader();\n pump();\n } else if (this._textContentSource) {\n const {\n items,\n styles\n } = this._textContentSource;\n this._processItems(items, styles);\n capability.resolve();\n } else {\n throw new Error('No \"textContentSource\" parameter specified.');\n }\n capability.promise.then(() => {\n styleCache = null;\n render(this);\n }, this._capability.reject);\n }\n}\nfunction renderTextLayer(params) {\n const task = new TextLayerRenderTask(params);\n task._render();\n return task;\n}\nfunction updateTextLayer(_ref3) {\n let {\n container,\n viewport,\n textDivs,\n textDivProperties,\n isOffscreenCanvasSupported,\n mustRotate = true,\n mustRescale = true\n } = _ref3;\n if (mustRotate) {\n (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_3__.setLayerDimensions)(container, {\n rotation: viewport.rotation\n });\n }\n if (mustRescale) {\n const ctx = getCtx(0, isOffscreenCanvasSupported);\n const scale = viewport.scale * (globalThis.devicePixelRatio || 1);\n const params = {\n prevFontSize: null,\n prevFontFamily: null,\n div: null,\n scale,\n properties: null,\n ctx\n };\n for (const div of textDivs) {\n params.properties = textDivProperties.get(div);\n params.div = div;\n layout(params);\n }\n }\n}\n\n\n/***/ }),\n\n/***/ 4092:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_665781__) => {\n\n/* harmony export */ __nested_webpack_require_665781__.d(__nested_webpack_exports__, {\n/* harmony export */ PDFDataTransportStream: () => (/* binding */ PDFDataTransportStream)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_665781__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_665781__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_665781__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_665781__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_665781__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_665781__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_665781__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_665781__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_665781__(7583);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_665781__(4226);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_665781__(7121);\n/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_665781__(8518);\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_12__ = __nested_webpack_require_665781__(3266);\n/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_13__ = __nested_webpack_require_665781__(473);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass PDFDataTransportStream {\n constructor(_ref, pdfDataRangeTransport) {\n let {\n length,\n initialData,\n progressiveDone = false,\n contentDispositionFilename = null,\n disableRange = false,\n disableStream = false\n } = _ref;\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_12__.assert)(pdfDataRangeTransport, 'PDFDataTransportStream - missing required \"pdfDataRangeTransport\" argument.');\n this._queuedChunks = [];\n this._progressiveDone = progressiveDone;\n this._contentDispositionFilename = contentDispositionFilename;\n if (initialData?.length > 0) {\n const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer;\n this._queuedChunks.push(buffer);\n }\n this._pdfDataRangeTransport = pdfDataRangeTransport;\n this._isStreamingSupported = !disableStream;\n this._isRangeSupported = !disableRange;\n this._contentLength = length;\n this._fullRequestReader = null;\n this._rangeReaders = [];\n this._pdfDataRangeTransport.addRangeListener((begin, chunk) => {\n this._onReceiveData({\n begin,\n chunk\n });\n });\n this._pdfDataRangeTransport.addProgressListener((loaded, total) => {\n this._onProgress({\n loaded,\n total\n });\n });\n this._pdfDataRangeTransport.addProgressiveReadListener(chunk => {\n this._onReceiveData({\n chunk\n });\n });\n this._pdfDataRangeTransport.addProgressiveDoneListener(() => {\n this._onProgressiveDone();\n });\n this._pdfDataRangeTransport.transportReady();\n }\n _onReceiveData(_ref2) {\n let {\n begin,\n chunk\n } = _ref2;\n const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer;\n if (begin === undefined) {\n if (this._fullRequestReader) {\n this._fullRequestReader._enqueue(buffer);\n } else {\n this._queuedChunks.push(buffer);\n }\n } else {\n const found = this._rangeReaders.some(function (rangeReader) {\n if (rangeReader._begin !== begin) {\n return false;\n }\n rangeReader._enqueue(buffer);\n return true;\n });\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_12__.assert)(found, \"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\");\n }\n }\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n _onProgress(evt) {\n if (evt.total === undefined) {\n this._rangeReaders[0]?.onProgress?.({\n loaded: evt.loaded\n });\n } else {\n this._fullRequestReader?.onProgress?.({\n loaded: evt.loaded,\n total: evt.total\n });\n }\n }\n _onProgressiveDone() {\n this._fullRequestReader?.progressiveDone();\n this._progressiveDone = true;\n }\n _removeRangeReader(reader) {\n const i = this._rangeReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeReaders.splice(i, 1);\n }\n }\n getFullReader() {\n (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_12__.assert)(!this._fullRequestReader, \"PDFDataTransportStream.getFullReader can only be called once.\");\n const queuedChunks = this._queuedChunks;\n this._queuedChunks = null;\n return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename);\n }\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n this._pdfDataRangeTransport.requestDataRange(begin, end);\n this._rangeReaders.push(reader);\n return reader;\n }\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n for (const reader of this._rangeReaders.slice(0)) {\n reader.cancel(reason);\n }\n this._pdfDataRangeTransport.abort();\n }\n}\nclass PDFDataTransportStreamReader {\n constructor(stream, queuedChunks) {\n let progressiveDone = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let contentDispositionFilename = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n this._stream = stream;\n this._done = progressiveDone || false;\n this._filename = (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_13__.isPdfFile)(contentDispositionFilename) ? contentDispositionFilename : null;\n this._queuedChunks = queuedChunks || [];\n this._loaded = 0;\n for (const chunk of this._queuedChunks) {\n this._loaded += chunk.byteLength;\n }\n this._requests = [];\n this._headersReady = Promise.resolve();\n stream._fullRequestReader = this;\n this.onProgress = null;\n }\n _enqueue(chunk) {\n if (this._done) {\n return;\n }\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({\n value: chunk,\n done: false\n });\n } else {\n this._queuedChunks.push(chunk);\n }\n this._loaded += chunk.byteLength;\n }\n get headersReady() {\n return this._headersReady;\n }\n get filename() {\n return this._filename;\n }\n get isRangeSupported() {\n return this._stream._isRangeSupported;\n }\n get isStreamingSupported() {\n return this._stream._isStreamingSupported;\n }\n get contentLength() {\n return this._stream._contentLength;\n }\n async read() {\n if (this._queuedChunks.length > 0) {\n const chunk = this._queuedChunks.shift();\n return {\n value: chunk,\n done: false\n };\n }\n if (this._done) {\n return {\n value: undefined,\n done: true\n };\n }\n const requestCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_12__.PromiseCapability();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({\n value: undefined,\n done: true\n });\n }\n this._requests.length = 0;\n }\n progressiveDone() {\n if (this._done) {\n return;\n }\n this._done = true;\n }\n}\nclass PDFDataTransportStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._begin = begin;\n this._end = end;\n this._queuedChunk = null;\n this._requests = [];\n this._done = false;\n this.onProgress = null;\n }\n _enqueue(chunk) {\n if (this._done) {\n return;\n }\n if (this._requests.length === 0) {\n this._queuedChunk = chunk;\n } else {\n const requestsCapability = this._requests.shift();\n requestsCapability.resolve({\n value: chunk,\n done: false\n });\n for (const requestCapability of this._requests) {\n requestCapability.resolve({\n value: undefined,\n done: true\n });\n }\n this._requests.length = 0;\n }\n this._done = true;\n this._stream._removeRangeReader(this);\n }\n get isStreamingSupported() {\n return false;\n }\n async read() {\n if (this._queuedChunk) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return {\n value: chunk,\n done: false\n };\n }\n if (this._done) {\n return {\n value: undefined,\n done: true\n };\n }\n const requestCapability = new _shared_util_js__WEBPACK_IMPORTED_MODULE_12__.PromiseCapability();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({\n value: undefined,\n done: true\n });\n }\n this._requests.length = 0;\n this._stream._removeRangeReader(this);\n }\n}\n\n\n/***/ }),\n\n/***/ 1368:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_675648__) => {\n\n/* harmony export */ __nested_webpack_require_675648__.d(__nested_webpack_exports__, {\n/* harmony export */ GlobalWorkerOptions: () => (/* binding */ GlobalWorkerOptions)\n/* harmony export */ });\nconst GlobalWorkerOptions = Object.create(null);\nGlobalWorkerOptions.workerPort = null;\nGlobalWorkerOptions.workerSrc = \"\";\n\n\n/***/ }),\n\n/***/ 8266:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_676067__) => {\n\n/* harmony export */ __nested_webpack_require_676067__.d(__nested_webpack_exports__, {\n/* harmony export */ XfaLayer: () => (/* binding */ XfaLayer)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_676067__(4226);\n/* harmony import */ var _xfa_text_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_676067__(1521);\n\n\nclass XfaLayer {\n static setupStorage(html, id, element, storage, intent) {\n const storedData = storage.getValue(id, {\n value: null\n });\n switch (element.name) {\n case \"textarea\":\n if (storedData.value !== null) {\n html.textContent = storedData.value;\n }\n if (intent === \"print\") {\n break;\n }\n html.addEventListener(\"input\", event => {\n storage.setValue(id, {\n value: event.target.value\n });\n });\n break;\n case \"input\":\n if (element.attributes.type === \"radio\" || element.attributes.type === \"checkbox\") {\n if (storedData.value === element.attributes.xfaOn) {\n html.setAttribute(\"checked\", true);\n } else if (storedData.value === element.attributes.xfaOff) {\n html.removeAttribute(\"checked\");\n }\n if (intent === \"print\") {\n break;\n }\n html.addEventListener(\"change\", event => {\n storage.setValue(id, {\n value: event.target.checked ? event.target.getAttribute(\"xfaOn\") : event.target.getAttribute(\"xfaOff\")\n });\n });\n } else {\n if (storedData.value !== null) {\n html.setAttribute(\"value\", storedData.value);\n }\n if (intent === \"print\") {\n break;\n }\n html.addEventListener(\"input\", event => {\n storage.setValue(id, {\n value: event.target.value\n });\n });\n }\n break;\n case \"select\":\n if (storedData.value !== null) {\n html.setAttribute(\"value\", storedData.value);\n for (const option of element.children) {\n if (option.attributes.value === storedData.value) {\n option.attributes.selected = true;\n } else if (option.attributes.hasOwnProperty(\"selected\")) {\n delete option.attributes.selected;\n }\n }\n }\n html.addEventListener(\"input\", event => {\n const options = event.target.options;\n const value = options.selectedIndex === -1 ? \"\" : options[options.selectedIndex].value;\n storage.setValue(id, {\n value\n });\n });\n break;\n }\n }\n static setAttributes(_ref) {\n let {\n html,\n element,\n storage = null,\n intent,\n linkService\n } = _ref;\n const {\n attributes\n } = element;\n const isHTMLAnchorElement = html instanceof HTMLAnchorElement;\n if (attributes.type === \"radio\") {\n attributes.name = `${attributes.name}-${intent}`;\n }\n for (const [key, value] of Object.entries(attributes)) {\n if (value === null || value === undefined) {\n continue;\n }\n switch (key) {\n case \"class\":\n if (value.length) {\n html.setAttribute(key, value.join(\" \"));\n }\n break;\n case \"dataId\":\n break;\n case \"id\":\n html.setAttribute(\"data-element-id\", value);\n break;\n case \"style\":\n Object.assign(html.style, value);\n break;\n case \"textContent\":\n html.textContent = value;\n break;\n default:\n if (!isHTMLAnchorElement || key !== \"href\" && key !== \"newWindow\") {\n html.setAttribute(key, value);\n }\n }\n }\n if (isHTMLAnchorElement) {\n linkService.addLinkAttributes(html, attributes.href, attributes.newWindow);\n }\n if (storage && attributes.dataId) {\n this.setupStorage(html, attributes.dataId, element, storage);\n }\n }\n static render(parameters) {\n const storage = parameters.annotationStorage;\n const linkService = parameters.linkService;\n const root = parameters.xfaHtml;\n const intent = parameters.intent || \"display\";\n const rootHtml = document.createElement(root.name);\n if (root.attributes) {\n this.setAttributes({\n html: rootHtml,\n element: root,\n intent,\n linkService\n });\n }\n const isNotForRichText = intent !== \"richText\";\n const rootDiv = parameters.div;\n rootDiv.append(rootHtml);\n if (parameters.viewport) {\n const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n rootDiv.style.transform = transform;\n }\n if (isNotForRichText) {\n rootDiv.setAttribute(\"class\", \"xfaLayer xfaFont\");\n }\n const textDivs = [];\n if (root.children.length === 0) {\n if (root.value) {\n const node = document.createTextNode(root.value);\n rootHtml.append(node);\n if (isNotForRichText && _xfa_text_js__WEBPACK_IMPORTED_MODULE_1__.XfaText.shouldBuildText(root.name)) {\n textDivs.push(node);\n }\n }\n return {\n textDivs\n };\n }\n const stack = [[root, -1, rootHtml]];\n while (stack.length > 0) {\n const [parent, i, html] = stack.at(-1);\n if (i + 1 === parent.children.length) {\n stack.pop();\n continue;\n }\n const child = parent.children[++stack.at(-1)[1]];\n if (child === null) {\n continue;\n }\n const {\n name\n } = child;\n if (name === \"#text\") {\n const node = document.createTextNode(child.value);\n textDivs.push(node);\n html.append(node);\n continue;\n }\n const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name);\n html.append(childHtml);\n if (child.attributes) {\n this.setAttributes({\n html: childHtml,\n element: child,\n storage,\n intent,\n linkService\n });\n }\n if (child.children?.length > 0) {\n stack.push([child, -1, childHtml]);\n } else if (child.value) {\n const node = document.createTextNode(child.value);\n if (isNotForRichText && _xfa_text_js__WEBPACK_IMPORTED_MODULE_1__.XfaText.shouldBuildText(name)) {\n textDivs.push(node);\n }\n childHtml.append(node);\n }\n }\n for (const el of rootDiv.querySelectorAll(\".xfaNonInteractive input, .xfaNonInteractive textarea\")) {\n el.setAttribute(\"readOnly\", true);\n }\n return {\n textDivs\n };\n }\n static update(parameters) {\n const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n parameters.div.style.transform = transform;\n parameters.div.hidden = false;\n }\n}\n\n\n/***/ }),\n\n/***/ 1521:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_683012__) => {\n\n/* harmony export */ __nested_webpack_require_683012__.d(__nested_webpack_exports__, {\n/* harmony export */ XfaText: () => (/* binding */ XfaText)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_683012__(4226);\n\nclass XfaText {\n static textContent(xfa) {\n const items = [];\n const output = {\n items,\n styles: Object.create(null)\n };\n function walk(node) {\n if (!node) {\n return;\n }\n let str = null;\n const name = node.name;\n if (name === \"#text\") {\n str = node.value;\n } else if (!XfaText.shouldBuildText(name)) {\n return;\n } else if (node?.attributes?.textContent) {\n str = node.attributes.textContent;\n } else if (node.value) {\n str = node.value;\n }\n if (str !== null) {\n items.push({\n str\n });\n }\n if (!node.children) {\n return;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n walk(xfa);\n return output;\n }\n static shouldBuildText(name) {\n return !(name === \"textarea\" || name === \"input\" || name === \"option\" || name === \"select\");\n }\n}\n\n\n/***/ }),\n\n/***/ 9907:\n/***/ ((__webpack_module__, __nested_webpack_exports__, __nested_webpack_require_684311__) => {\n\n__nested_webpack_require_684311__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n/* harmony export */ __nested_webpack_require_684311__.d(__nested_webpack_exports__, {\n/* harmony export */ AbortException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException),\n/* harmony export */ AnnotationEditorLayer: () => (/* reexport safe */ _display_editor_annotation_editor_layer_js__WEBPACK_IMPORTED_MODULE_4__.AnnotationEditorLayer),\n/* harmony export */ AnnotationEditorParamsType: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType),\n/* harmony export */ AnnotationEditorType: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType),\n/* harmony export */ AnnotationEditorUIManager: () => (/* reexport safe */ _display_editor_tools_js__WEBPACK_IMPORTED_MODULE_5__.AnnotationEditorUIManager),\n/* harmony export */ AnnotationLayer: () => (/* reexport safe */ _display_annotation_layer_js__WEBPACK_IMPORTED_MODULE_6__.AnnotationLayer),\n/* harmony export */ AnnotationMode: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode),\n/* harmony export */ CMapCompressionType: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.CMapCompressionType),\n/* harmony export */ ColorPicker: () => (/* reexport safe */ _display_editor_color_picker_js__WEBPACK_IMPORTED_MODULE_7__.ColorPicker),\n/* harmony export */ DOMSVGFactory: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMSVGFactory),\n/* harmony export */ DrawLayer: () => (/* reexport safe */ _display_draw_layer_js__WEBPACK_IMPORTED_MODULE_8__.DrawLayer),\n/* harmony export */ FeatureTest: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.FeatureTest),\n/* harmony export */ GlobalWorkerOptions: () => (/* reexport safe */ _display_worker_options_js__WEBPACK_IMPORTED_MODULE_9__.GlobalWorkerOptions),\n/* harmony export */ ImageKind: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.ImageKind),\n/* harmony export */ InvalidPDFException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.InvalidPDFException),\n/* harmony export */ MissingPDFException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.MissingPDFException),\n/* harmony export */ OPS: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.OPS),\n/* harmony export */ Outliner: () => (/* reexport safe */ _display_editor_outliner_js__WEBPACK_IMPORTED_MODULE_10__.Outliner),\n/* harmony export */ PDFDataRangeTransport: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.PDFDataRangeTransport),\n/* harmony export */ PDFDateString: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.PDFDateString),\n/* harmony export */ PDFWorker: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.PDFWorker),\n/* harmony export */ PasswordResponses: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.PasswordResponses),\n/* harmony export */ PermissionFlag: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.PermissionFlag),\n/* harmony export */ PixelsPerInch: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.PixelsPerInch),\n/* harmony export */ PromiseCapability: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.PromiseCapability),\n/* harmony export */ RenderingCancelledException: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.RenderingCancelledException),\n/* harmony export */ UnexpectedResponseException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.UnexpectedResponseException),\n/* harmony export */ Util: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.Util),\n/* harmony export */ VerbosityLevel: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.VerbosityLevel),\n/* harmony export */ XfaLayer: () => (/* reexport safe */ _display_xfa_layer_js__WEBPACK_IMPORTED_MODULE_11__.XfaLayer),\n/* harmony export */ build: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.build),\n/* harmony export */ createValidAbsoluteUrl: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.createValidAbsoluteUrl),\n/* harmony export */ fetchData: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.fetchData),\n/* harmony export */ getDocument: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.getDocument),\n/* harmony export */ getFilenameFromUrl: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.getFilenameFromUrl),\n/* harmony export */ getPdfFilenameFromUrl: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.getPdfFilenameFromUrl),\n/* harmony export */ getXfaPageViewport: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.getXfaPageViewport),\n/* harmony export */ isDataScheme: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isDataScheme),\n/* harmony export */ isPdfFile: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPdfFile),\n/* harmony export */ noContextMenu: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.noContextMenu),\n/* harmony export */ normalizeUnicode: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.normalizeUnicode),\n/* harmony export */ renderTextLayer: () => (/* reexport safe */ _display_text_layer_js__WEBPACK_IMPORTED_MODULE_3__.renderTextLayer),\n/* harmony export */ setLayerDimensions: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.setLayerDimensions),\n/* harmony export */ shadow: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow),\n/* harmony export */ updateTextLayer: () => (/* reexport safe */ _display_text_layer_js__WEBPACK_IMPORTED_MODULE_3__.updateTextLayer),\n/* harmony export */ version: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.version)\n/* harmony export */ });\n/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_684311__(3266);\n/* harmony import */ var _display_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_684311__(9406);\n/* harmony import */ var _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_684311__(473);\n/* harmony import */ var _display_text_layer_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_684311__(5739);\n/* harmony import */ var _display_editor_annotation_editor_layer_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_684311__(4629);\n/* harmony import */ var _display_editor_tools_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_684311__(4812);\n/* harmony import */ var _display_annotation_layer_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_684311__(7640);\n/* harmony import */ var _display_editor_color_picker_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_684311__(5097);\n/* harmony import */ var _display_draw_layer_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_684311__(9423);\n/* harmony import */ var _display_worker_options_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_684311__(1368);\n/* harmony import */ var _display_editor_outliner_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_684311__(7405);\n/* harmony import */ var _display_xfa_layer_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_684311__(8266);\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_display_api_js__WEBPACK_IMPORTED_MODULE_1__]);\n_display_api_js__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];\n\n\n\n\n\n\n\n\n\n\n\n\nconst pdfjsVersion = '4.0.379';\nconst pdfjsBuild = '9e14d04fd';\n\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } });\n\n/***/ }),\n\n/***/ 6694:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_692577__) => {\n\n/* harmony export */ __nested_webpack_require_692577__.d(__nested_webpack_exports__, {\n/* harmony export */ MessageHandler: () => (/* binding */ MessageHandler)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_692577__(3352);\n/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_692577__(3266);\n\n\nconst CallbackKind = {\n UNKNOWN: 0,\n DATA: 1,\n ERROR: 2\n};\nconst StreamKind = {\n UNKNOWN: 0,\n CANCEL: 1,\n CANCEL_COMPLETE: 2,\n CLOSE: 3,\n ENQUEUE: 4,\n ERROR: 5,\n PULL: 6,\n PULL_COMPLETE: 7,\n START_COMPLETE: 8\n};\nfunction wrapReason(reason) {\n if (!(reason instanceof Error || typeof reason === \"object\" && reason !== null)) {\n (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.unreachable)('wrapReason: Expected \"reason\" to be a (possibly cloned) Error.');\n }\n switch (reason.name) {\n case \"AbortException\":\n return new _util_js__WEBPACK_IMPORTED_MODULE_1__.AbortException(reason.message);\n case \"MissingPDFException\":\n return new _util_js__WEBPACK_IMPORTED_MODULE_1__.MissingPDFException(reason.message);\n case \"PasswordException\":\n return new _util_js__WEBPACK_IMPORTED_MODULE_1__.PasswordException(reason.message, reason.code);\n case \"UnexpectedResponseException\":\n return new _util_js__WEBPACK_IMPORTED_MODULE_1__.UnexpectedResponseException(reason.message, reason.status);\n case \"UnknownErrorException\":\n return new _util_js__WEBPACK_IMPORTED_MODULE_1__.UnknownErrorException(reason.message, reason.details);\n default:\n return new _util_js__WEBPACK_IMPORTED_MODULE_1__.UnknownErrorException(reason.message, reason.toString());\n }\n}\nclass MessageHandler {\n constructor(sourceName, targetName, comObj) {\n this.sourceName = sourceName;\n this.targetName = targetName;\n this.comObj = comObj;\n this.callbackId = 1;\n this.streamId = 1;\n this.streamSinks = Object.create(null);\n this.streamControllers = Object.create(null);\n this.callbackCapabilities = Object.create(null);\n this.actionHandler = Object.create(null);\n this._onComObjOnMessage = event => {\n const data = event.data;\n if (data.targetName !== this.sourceName) {\n return;\n }\n if (data.stream) {\n this.#processStreamMessage(data);\n return;\n }\n if (data.callback) {\n const callbackId = data.callbackId;\n const capability = this.callbackCapabilities[callbackId];\n if (!capability) {\n throw new Error(`Cannot resolve callback ${callbackId}`);\n }\n delete this.callbackCapabilities[callbackId];\n if (data.callback === CallbackKind.DATA) {\n capability.resolve(data.data);\n } else if (data.callback === CallbackKind.ERROR) {\n capability.reject(wrapReason(data.reason));\n } else {\n throw new Error(\"Unexpected callback case\");\n }\n return;\n }\n const action = this.actionHandler[data.action];\n if (!action) {\n throw new Error(`Unknown action from worker: ${data.action}`);\n }\n if (data.callbackId) {\n const cbSourceName = this.sourceName;\n const cbTargetName = data.sourceName;\n new Promise(function (resolve) {\n resolve(action(data.data));\n }).then(function (result) {\n comObj.postMessage({\n sourceName: cbSourceName,\n targetName: cbTargetName,\n callback: CallbackKind.DATA,\n callbackId: data.callbackId,\n data: result\n });\n }, function (reason) {\n comObj.postMessage({\n sourceName: cbSourceName,\n targetName: cbTargetName,\n callback: CallbackKind.ERROR,\n callbackId: data.callbackId,\n reason: wrapReason(reason)\n });\n });\n return;\n }\n if (data.streamId) {\n this.#createStreamSink(data);\n return;\n }\n action(data.data);\n };\n comObj.addEventListener(\"message\", this._onComObjOnMessage);\n }\n on(actionName, handler) {\n const ah = this.actionHandler;\n if (ah[actionName]) {\n throw new Error(`There is already an actionName called \"${actionName}\"`);\n }\n ah[actionName] = handler;\n }\n send(actionName, data, transfers) {\n this.comObj.postMessage({\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n data\n }, transfers);\n }\n sendWithPromise(actionName, data, transfers) {\n const callbackId = this.callbackId++;\n const capability = new _util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this.callbackCapabilities[callbackId] = capability;\n try {\n this.comObj.postMessage({\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n callbackId,\n data\n }, transfers);\n } catch (ex) {\n capability.reject(ex);\n }\n return capability.promise;\n }\n sendWithStream(actionName, data, queueingStrategy, transfers) {\n const streamId = this.streamId++,\n sourceName = this.sourceName,\n targetName = this.targetName,\n comObj = this.comObj;\n return new ReadableStream({\n start: controller => {\n const startCapability = new _util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this.streamControllers[streamId] = {\n controller,\n startCall: startCapability,\n pullCall: null,\n cancelCall: null,\n isClosed: false\n };\n comObj.postMessage({\n sourceName,\n targetName,\n action: actionName,\n streamId,\n data,\n desiredSize: controller.desiredSize\n }, transfers);\n return startCapability.promise;\n },\n pull: controller => {\n const pullCapability = new _util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this.streamControllers[streamId].pullCall = pullCapability;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL,\n streamId,\n desiredSize: controller.desiredSize\n });\n return pullCapability.promise;\n },\n cancel: reason => {\n (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.assert)(reason instanceof Error, \"cancel must have a valid reason\");\n const cancelCapability = new _util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this.streamControllers[streamId].cancelCall = cancelCapability;\n this.streamControllers[streamId].isClosed = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL,\n streamId,\n reason: wrapReason(reason)\n });\n return cancelCapability.promise;\n }\n }, queueingStrategy);\n }\n #createStreamSink(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const self = this,\n action = this.actionHandler[data.action];\n const streamSink = {\n enqueue(chunk) {\n let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n let transfers = arguments.length > 2 ? arguments[2] : undefined;\n if (this.isCancelled) {\n return;\n }\n const lastDesiredSize = this.desiredSize;\n this.desiredSize -= size;\n if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n this.sinkCapability = new _util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability();\n this.ready = this.sinkCapability.promise;\n }\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.ENQUEUE,\n streamId,\n chunk\n }, transfers);\n },\n close() {\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CLOSE,\n streamId\n });\n delete self.streamSinks[streamId];\n },\n error(reason) {\n (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.assert)(reason instanceof Error, \"error must have a valid reason\");\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.ERROR,\n streamId,\n reason: wrapReason(reason)\n });\n },\n sinkCapability: new _util_js__WEBPACK_IMPORTED_MODULE_1__.PromiseCapability(),\n onPull: null,\n onCancel: null,\n isCancelled: false,\n desiredSize: data.desiredSize,\n ready: null\n };\n streamSink.sinkCapability.resolve();\n streamSink.ready = streamSink.sinkCapability.promise;\n this.streamSinks[streamId] = streamSink;\n new Promise(function (resolve) {\n resolve(action(data.data, streamSink));\n }).then(function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n success: true\n });\n }, function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n reason: wrapReason(reason)\n });\n });\n }\n #processStreamMessage(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const streamController = this.streamControllers[streamId],\n streamSink = this.streamSinks[streamId];\n switch (data.stream) {\n case StreamKind.START_COMPLETE:\n if (data.success) {\n streamController.startCall.resolve();\n } else {\n streamController.startCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL_COMPLETE:\n if (data.success) {\n streamController.pullCall.resolve();\n } else {\n streamController.pullCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL:\n if (!streamSink) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true\n });\n break;\n }\n if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n streamSink.sinkCapability.resolve();\n }\n streamSink.desiredSize = data.desiredSize;\n new Promise(function (resolve) {\n resolve(streamSink.onPull?.());\n }).then(function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true\n });\n }, function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n reason: wrapReason(reason)\n });\n });\n break;\n case StreamKind.ENQUEUE:\n (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.assert)(streamController, \"enqueue should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.controller.enqueue(data.chunk);\n break;\n case StreamKind.CLOSE:\n (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.assert)(streamController, \"close should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.isClosed = true;\n streamController.controller.close();\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.ERROR:\n (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.assert)(streamController, \"error should have stream controller\");\n streamController.controller.error(wrapReason(data.reason));\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL_COMPLETE:\n if (data.success) {\n streamController.cancelCall.resolve();\n } else {\n streamController.cancelCall.reject(wrapReason(data.reason));\n }\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL:\n if (!streamSink) {\n break;\n }\n new Promise(function (resolve) {\n resolve(streamSink.onCancel?.(wrapReason(data.reason)));\n }).then(function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n success: true\n });\n }, function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n reason: wrapReason(reason)\n });\n });\n streamSink.sinkCapability.reject(wrapReason(data.reason));\n streamSink.isCancelled = true;\n delete this.streamSinks[streamId];\n break;\n default:\n throw new Error(\"Unexpected stream case\");\n }\n }\n async #deleteStreamController(streamController, streamId) {\n await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]);\n delete this.streamControllers[streamId];\n }\n destroy() {\n this.comObj.removeEventListener(\"message\", this._onComObjOnMessage);\n }\n}\n\n\n/***/ }),\n\n/***/ 2825:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_706328__) => {\n\n/* harmony export */ __nested_webpack_require_706328__.d(__nested_webpack_exports__, {\n/* harmony export */ MurmurHash3_64: () => (/* binding */ MurmurHash3_64)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_706328__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_706328__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_706328__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_706328__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_706328__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_706328__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_706328__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_706328__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_706328__(7583);\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_706328__(3352);\n/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_706328__(3266);\n\n\n\n\n\n\n\n\n\n\n\nconst SEED = 0xc3d2e1f0;\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\nclass MurmurHash3_64 {\n constructor(seed) {\n this.h1 = seed ? seed & 0xffffffff : SEED;\n this.h2 = seed ? seed & 0xffffffff : SEED;\n }\n update(input) {\n let data, length;\n if (typeof input === \"string\") {\n data = new Uint8Array(input.length * 2);\n length = 0;\n for (let i = 0, ii = input.length; i < ii; i++) {\n const code = input.charCodeAt(i);\n if (code <= 0xff) {\n data[length++] = code;\n } else {\n data[length++] = code >>> 8;\n data[length++] = code & 0xff;\n }\n }\n } else if ((0,_util_js__WEBPACK_IMPORTED_MODULE_10__.isArrayBuffer)(input)) {\n data = input.slice();\n length = data.byteLength;\n } else {\n throw new Error(\"Wrong data format in MurmurHash3_64_update. \" + \"Input must be a string or array.\");\n }\n const blockCounts = length >> 2;\n const tailLength = length - blockCounts * 4;\n const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n let k1 = 0,\n k2 = 0;\n let h1 = this.h1,\n h2 = this.h2;\n const C1 = 0xcc9e2d51,\n C2 = 0x1b873593;\n const C1_LOW = C1 & MASK_LOW,\n C2_LOW = C2 & MASK_LOW;\n for (let i = 0; i < blockCounts; i++) {\n if (i & 1) {\n k1 = dataUint32[i];\n k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n k1 = k1 << 15 | k1 >>> 17;\n k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n h1 ^= k1;\n h1 = h1 << 13 | h1 >>> 19;\n h1 = h1 * 5 + 0xe6546b64;\n } else {\n k2 = dataUint32[i];\n k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;\n k2 = k2 << 15 | k2 >>> 17;\n k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;\n h2 ^= k2;\n h2 = h2 << 13 | h2 >>> 19;\n h2 = h2 * 5 + 0xe6546b64;\n }\n }\n k1 = 0;\n switch (tailLength) {\n case 3:\n k1 ^= data[blockCounts * 4 + 2] << 16;\n case 2:\n k1 ^= data[blockCounts * 4 + 1] << 8;\n case 1:\n k1 ^= data[blockCounts * 4];\n k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n k1 = k1 << 15 | k1 >>> 17;\n k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n if (blockCounts & 1) {\n h1 ^= k1;\n } else {\n h2 ^= k1;\n }\n }\n this.h1 = h1;\n this.h2 = h2;\n }\n hexdigest() {\n let h1 = this.h1,\n h2 = this.h2;\n h1 ^= h2 >>> 1;\n h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;\n h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;\n h1 ^= h2 >>> 1;\n h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;\n h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;\n h1 ^= h2 >>> 1;\n return (h1 >>> 0).toString(16).padStart(8, \"0\") + (h2 >>> 0).toString(16).padStart(8, \"0\");\n }\n}\n\n\n/***/ }),\n\n/***/ 3266:\n/***/ ((__unused_webpack___webpack_module__, __nested_webpack_exports__, __nested_webpack_require_710922__) => {\n\n/* harmony export */ __nested_webpack_require_710922__.d(__nested_webpack_exports__, {\n/* harmony export */ AbortException: () => (/* binding */ AbortException),\n/* harmony export */ AnnotationBorderStyleType: () => (/* binding */ AnnotationBorderStyleType),\n/* harmony export */ AnnotationEditorParamsType: () => (/* binding */ AnnotationEditorParamsType),\n/* harmony export */ AnnotationEditorPrefix: () => (/* binding */ AnnotationEditorPrefix),\n/* harmony export */ AnnotationEditorType: () => (/* binding */ AnnotationEditorType),\n/* harmony export */ AnnotationMode: () => (/* binding */ AnnotationMode),\n/* harmony export */ AnnotationPrefix: () => (/* binding */ AnnotationPrefix),\n/* harmony export */ AnnotationType: () => (/* binding */ AnnotationType),\n/* harmony export */ BaseException: () => (/* binding */ BaseException),\n/* harmony export */ CMapCompressionType: () => (/* binding */ CMapCompressionType),\n/* harmony export */ FONT_IDENTITY_MATRIX: () => (/* binding */ FONT_IDENTITY_MATRIX),\n/* harmony export */ FeatureTest: () => (/* binding */ FeatureTest),\n/* harmony export */ FormatError: () => (/* binding */ FormatError),\n/* harmony export */ IDENTITY_MATRIX: () => (/* binding */ IDENTITY_MATRIX),\n/* harmony export */ ImageKind: () => (/* binding */ ImageKind),\n/* harmony export */ InvalidPDFException: () => (/* binding */ InvalidPDFException),\n/* harmony export */ LINE_FACTOR: () => (/* binding */ LINE_FACTOR),\n/* harmony export */ MAX_IMAGE_SIZE_TO_CACHE: () => (/* binding */ MAX_IMAGE_SIZE_TO_CACHE),\n/* harmony export */ MissingPDFException: () => (/* binding */ MissingPDFException),\n/* harmony export */ OPS: () => (/* binding */ OPS),\n/* harmony export */ PasswordException: () => (/* binding */ PasswordException),\n/* harmony export */ PasswordResponses: () => (/* binding */ PasswordResponses),\n/* harmony export */ PermissionFlag: () => (/* binding */ PermissionFlag),\n/* harmony export */ PromiseCapability: () => (/* binding */ PromiseCapability),\n/* harmony export */ RenderingIntentFlag: () => (/* binding */ RenderingIntentFlag),\n/* harmony export */ TextRenderingMode: () => (/* binding */ TextRenderingMode),\n/* harmony export */ UnexpectedResponseException: () => (/* binding */ UnexpectedResponseException),\n/* harmony export */ UnknownErrorException: () => (/* binding */ UnknownErrorException),\n/* harmony export */ Util: () => (/* binding */ Util),\n/* harmony export */ VerbosityLevel: () => (/* binding */ VerbosityLevel),\n/* harmony export */ assert: () => (/* binding */ assert),\n/* harmony export */ bytesToString: () => (/* binding */ bytesToString),\n/* harmony export */ createValidAbsoluteUrl: () => (/* binding */ createValidAbsoluteUrl),\n/* harmony export */ getUuid: () => (/* binding */ getUuid),\n/* harmony export */ getVerbosityLevel: () => (/* binding */ getVerbosityLevel),\n/* harmony export */ info: () => (/* binding */ info),\n/* harmony export */ isArrayBuffer: () => (/* binding */ isArrayBuffer),\n/* harmony export */ isNodeJS: () => (/* binding */ isNodeJS),\n/* harmony export */ normalizeUnicode: () => (/* binding */ normalizeUnicode),\n/* harmony export */ objectFromMap: () => (/* binding */ objectFromMap),\n/* harmony export */ setVerbosityLevel: () => (/* binding */ setVerbosityLevel),\n/* harmony export */ shadow: () => (/* binding */ shadow),\n/* harmony export */ string32: () => (/* binding */ string32),\n/* harmony export */ stringToBytes: () => (/* binding */ stringToBytes),\n/* harmony export */ unreachable: () => (/* binding */ unreachable),\n/* harmony export */ warn: () => (/* binding */ warn)\n/* harmony export */ });\n/* unused harmony exports AnnotationActionEventType, AnnotationFieldFlag, AnnotationFlag, AnnotationReplyType, BASELINE_FACTOR, DocumentActionEventType, getModificationDate, isArrayEqual, LINE_DESCENT_FACTOR, objectSize, PageActionEventType, stringToPDFString, stringToUTF8String, utf8StringToString */\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_710922__(3352);\n/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_710922__(3655);\n/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_2__ = __nested_webpack_require_710922__(2555);\n/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_3__ = __nested_webpack_require_710922__(2202);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_4__ = __nested_webpack_require_710922__(4226);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_js__WEBPACK_IMPORTED_MODULE_5__ = __nested_webpack_require_710922__(8837);\n/* harmony import */ var core_js_modules_es_typed_array_find_last_index_js__WEBPACK_IMPORTED_MODULE_6__ = __nested_webpack_require_710922__(9803);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_7__ = __nested_webpack_require_710922__(8347);\n/* harmony import */ var core_js_modules_es_typed_array_to_reversed_js__WEBPACK_IMPORTED_MODULE_8__ = __nested_webpack_require_710922__(7995);\n/* harmony import */ var core_js_modules_es_typed_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_9__ = __nested_webpack_require_710922__(62);\n/* harmony import */ var core_js_modules_es_typed_array_with_js__WEBPACK_IMPORTED_MODULE_10__ = __nested_webpack_require_710922__(4602);\n/* harmony import */ var core_js_modules_esnext_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_11__ = __nested_webpack_require_710922__(344);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_12__ = __nested_webpack_require_710922__(4305);\n/* harmony import */ var core_js_modules_esnext_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_13__ = __nested_webpack_require_710922__(7583);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_14__ = __nested_webpack_require_710922__(7944);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst isNodeJS = typeof process === \"object\" && process + \"\" === \"[object process]\" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== \"browser\");\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nconst MAX_IMAGE_SIZE_TO_CACHE = 10e6;\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\nconst RenderingIntentFlag = {\n ANY: 0x01,\n DISPLAY: 0x02,\n PRINT: 0x04,\n SAVE: 0x08,\n ANNOTATIONS_FORMS: 0x10,\n ANNOTATIONS_STORAGE: 0x20,\n ANNOTATIONS_DISABLE: 0x40,\n OPLIST: 0x100\n};\nconst AnnotationMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_FORMS: 2,\n ENABLE_STORAGE: 3\n};\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\nconst AnnotationEditorType = {\n DISABLE: -1,\n NONE: 0,\n FREETEXT: 3,\n HIGHLIGHT: 9,\n STAMP: 13,\n INK: 15\n};\nconst AnnotationEditorParamsType = {\n RESIZE: 1,\n CREATE: 2,\n FREETEXT_SIZE: 11,\n FREETEXT_COLOR: 12,\n FREETEXT_OPACITY: 13,\n INK_COLOR: 21,\n INK_THICKNESS: 22,\n INK_OPACITY: 23,\n HIGHLIGHT_COLOR: 31,\n HIGHLIGHT_DEFAULT_COLOR: 32\n};\nconst PermissionFlag = {\n PRINT: 0x04,\n MODIFY_CONTENTS: 0x08,\n COPY: 0x10,\n MODIFY_ANNOTATIONS: 0x20,\n FILL_INTERACTIVE_FORMS: 0x100,\n COPY_FOR_ACCESSIBILITY: 0x200,\n ASSEMBLE: 0x400,\n PRINT_HIGH_QUALITY: 0x800\n};\nconst TextRenderingMode = {\n FILL: 0,\n STROKE: 1,\n FILL_STROKE: 2,\n INVISIBLE: 3,\n FILL_ADD_TO_PATH: 4,\n STROKE_ADD_TO_PATH: 5,\n FILL_STROKE_ADD_TO_PATH: 6,\n ADD_TO_PATH: 7,\n FILL_STROKE_MASK: 3,\n ADD_TO_PATH_FLAG: 4\n};\nconst ImageKind = {\n GRAYSCALE_1BPP: 1,\n RGB_24BPP: 2,\n RGBA_32BPP: 3\n};\nconst AnnotationType = {\n TEXT: 1,\n LINK: 2,\n FREETEXT: 3,\n LINE: 4,\n SQUARE: 5,\n CIRCLE: 6,\n POLYGON: 7,\n POLYLINE: 8,\n HIGHLIGHT: 9,\n UNDERLINE: 10,\n SQUIGGLY: 11,\n STRIKEOUT: 12,\n STAMP: 13,\n CARET: 14,\n INK: 15,\n POPUP: 16,\n FILEATTACHMENT: 17,\n SOUND: 18,\n MOVIE: 19,\n WIDGET: 20,\n SCREEN: 21,\n PRINTERMARK: 22,\n TRAPNET: 23,\n WATERMARK: 24,\n THREED: 25,\n REDACT: 26\n};\nconst AnnotationReplyType = {\n GROUP: \"Group\",\n REPLY: \"R\"\n};\nconst AnnotationFlag = {\n INVISIBLE: 0x01,\n HIDDEN: 0x02,\n PRINT: 0x04,\n NOZOOM: 0x08,\n NOROTATE: 0x10,\n NOVIEW: 0x20,\n READONLY: 0x40,\n LOCKED: 0x80,\n TOGGLENOVIEW: 0x100,\n LOCKEDCONTENTS: 0x200\n};\nconst AnnotationFieldFlag = {\n READONLY: 0x0000001,\n REQUIRED: 0x0000002,\n NOEXPORT: 0x0000004,\n MULTILINE: 0x0001000,\n PASSWORD: 0x0002000,\n NOTOGGLETOOFF: 0x0004000,\n RADIO: 0x0008000,\n PUSHBUTTON: 0x0010000,\n COMBO: 0x0020000,\n EDIT: 0x0040000,\n SORT: 0x0080000,\n FILESELECT: 0x0100000,\n MULTISELECT: 0x0200000,\n DONOTSPELLCHECK: 0x0400000,\n DONOTSCROLL: 0x0800000,\n COMB: 0x1000000,\n RICHTEXT: 0x2000000,\n RADIOSINUNISON: 0x2000000,\n COMMITONSELCHANGE: 0x4000000\n};\nconst AnnotationBorderStyleType = {\n SOLID: 1,\n DASHED: 2,\n BEVELED: 3,\n INSET: 4,\n UNDERLINE: 5\n};\nconst AnnotationActionEventType = {\n E: \"Mouse Enter\",\n X: \"Mouse Exit\",\n D: \"Mouse Down\",\n U: \"Mouse Up\",\n Fo: \"Focus\",\n Bl: \"Blur\",\n PO: \"PageOpen\",\n PC: \"PageClose\",\n PV: \"PageVisible\",\n PI: \"PageInvisible\",\n K: \"Keystroke\",\n F: \"Format\",\n V: \"Validate\",\n C: \"Calculate\"\n};\nconst DocumentActionEventType = {\n WC: \"WillClose\",\n WS: \"WillSave\",\n DS: \"DidSave\",\n WP: \"WillPrint\",\n DP: \"DidPrint\"\n};\nconst PageActionEventType = {\n O: \"PageOpen\",\n C: \"PageClose\"\n};\nconst VerbosityLevel = {\n ERRORS: 0,\n WARNINGS: 1,\n INFOS: 5\n};\nconst CMapCompressionType = {\n NONE: 0,\n BINARY: 1\n};\nconst OPS = {\n dependency: 1,\n setLineWidth: 2,\n setLineCap: 3,\n setLineJoin: 4,\n setMiterLimit: 5,\n setDash: 6,\n setRenderingIntent: 7,\n setFlatness: 8,\n setGState: 9,\n save: 10,\n restore: 11,\n transform: 12,\n moveTo: 13,\n lineTo: 14,\n curveTo: 15,\n curveTo2: 16,\n curveTo3: 17,\n closePath: 18,\n rectangle: 19,\n stroke: 20,\n closeStroke: 21,\n fill: 22,\n eoFill: 23,\n fillStroke: 24,\n eoFillStroke: 25,\n closeFillStroke: 26,\n closeEOFillStroke: 27,\n endPath: 28,\n clip: 29,\n eoClip: 30,\n beginText: 31,\n endText: 32,\n setCharSpacing: 33,\n setWordSpacing: 34,\n setHScale: 35,\n setLeading: 36,\n setFont: 37,\n setTextRenderingMode: 38,\n setTextRise: 39,\n moveText: 40,\n setLeadingMoveText: 41,\n setTextMatrix: 42,\n nextLine: 43,\n showText: 44,\n showSpacedText: 45,\n nextLineShowText: 46,\n nextLineSetSpacingShowText: 47,\n setCharWidth: 48,\n setCharWidthAndBounds: 49,\n setStrokeColorSpace: 50,\n setFillColorSpace: 51,\n setStrokeColor: 52,\n setStrokeColorN: 53,\n setFillColor: 54,\n setFillColorN: 55,\n setStrokeGray: 56,\n setFillGray: 57,\n setStrokeRGBColor: 58,\n setFillRGBColor: 59,\n setStrokeCMYKColor: 60,\n setFillCMYKColor: 61,\n shadingFill: 62,\n beginInlineImage: 63,\n beginImageData: 64,\n endInlineImage: 65,\n paintXObject: 66,\n markPoint: 67,\n markPointProps: 68,\n beginMarkedContent: 69,\n beginMarkedContentProps: 70,\n endMarkedContent: 71,\n beginCompat: 72,\n endCompat: 73,\n paintFormXObjectBegin: 74,\n paintFormXObjectEnd: 75,\n beginGroup: 76,\n endGroup: 77,\n beginAnnotation: 80,\n endAnnotation: 81,\n paintImageMaskXObject: 83,\n paintImageMaskXObjectGroup: 84,\n paintImageXObject: 85,\n paintInlineImageXObject: 86,\n paintInlineImageXObjectGroup: 87,\n paintImageXObjectRepeat: 88,\n paintImageMaskXObjectRepeat: 89,\n paintSolidColorImageMask: 90,\n constructPath: 91\n};\nconst PasswordResponses = {\n NEED_PASSWORD: 1,\n INCORRECT_PASSWORD: 2\n};\nlet verbosity = VerbosityLevel.WARNINGS;\nfunction setVerbosityLevel(level) {\n if (Number.isInteger(level)) {\n verbosity = level;\n }\n}\nfunction getVerbosityLevel() {\n return verbosity;\n}\nfunction info(msg) {\n if (verbosity >= VerbosityLevel.INFOS) {\n console.log(`Info: ${msg}`);\n }\n}\nfunction warn(msg) {\n if (verbosity >= VerbosityLevel.WARNINGS) {\n console.log(`Warning: ${msg}`);\n }\n}\nfunction unreachable(msg) {\n throw new Error(msg);\n}\nfunction assert(cond, msg) {\n if (!cond) {\n unreachable(msg);\n }\n}\nfunction _isValidProtocol(url) {\n switch (url?.protocol) {\n case \"http:\":\n case \"https:\":\n case \"ftp:\":\n case \"mailto:\":\n case \"tel:\":\n return true;\n default:\n return false;\n }\n}\nfunction createValidAbsoluteUrl(url) {\n let baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n if (!url) {\n return null;\n }\n try {\n if (options && typeof url === \"string\") {\n if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n const dots = url.match(/\\./g);\n if (dots?.length >= 2) {\n url = `http://${url}`;\n }\n }\n if (options.tryConvertEncoding) {\n try {\n url = stringToUTF8String(url);\n } catch {}\n }\n }\n const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n if (_isValidProtocol(absoluteUrl)) {\n return absoluteUrl;\n }\n } catch {}\n return null;\n}\nfunction shadow(obj, prop, value) {\n let nonSerializable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n Object.defineProperty(obj, prop, {\n value,\n enumerable: !nonSerializable,\n configurable: true,\n writable: false\n });\n return value;\n}\nconst BaseException = function BaseExceptionClosure() {\n function BaseException(message, name) {\n if (this.constructor === BaseException) {\n unreachable(\"Cannot initialize BaseException.\");\n }\n this.message = message;\n this.name = name;\n }\n BaseException.prototype = new Error();\n BaseException.constructor = BaseException;\n return BaseException;\n}();\nclass PasswordException extends BaseException {\n constructor(msg, code) {\n super(msg, \"PasswordException\");\n this.code = code;\n }\n}\nclass UnknownErrorException extends BaseException {\n constructor(msg, details) {\n super(msg, \"UnknownErrorException\");\n this.details = details;\n }\n}\nclass InvalidPDFException extends BaseException {\n constructor(msg) {\n super(msg, \"InvalidPDFException\");\n }\n}\nclass MissingPDFException extends BaseException {\n constructor(msg) {\n super(msg, \"MissingPDFException\");\n }\n}\nclass UnexpectedResponseException extends BaseException {\n constructor(msg, status) {\n super(msg, \"UnexpectedResponseException\");\n this.status = status;\n }\n}\nclass FormatError extends BaseException {\n constructor(msg) {\n super(msg, \"FormatError\");\n }\n}\nclass AbortException extends BaseException {\n constructor(msg) {\n super(msg, \"AbortException\");\n }\n}\nfunction bytesToString(bytes) {\n if (typeof bytes !== \"object\" || bytes?.length === undefined) {\n unreachable(\"Invalid argument for bytesToString\");\n }\n const length = bytes.length;\n const MAX_ARGUMENT_COUNT = 8192;\n if (length < MAX_ARGUMENT_COUNT) {\n return String.fromCharCode.apply(null, bytes);\n }\n const strBuf = [];\n for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n const chunk = bytes.subarray(i, chunkEnd);\n strBuf.push(String.fromCharCode.apply(null, chunk));\n }\n return strBuf.join(\"\");\n}\nfunction stringToBytes(str) {\n if (typeof str !== \"string\") {\n unreachable(\"Invalid argument for stringToBytes\");\n }\n const length = str.length;\n const bytes = new Uint8Array(length);\n for (let i = 0; i < length; ++i) {\n bytes[i] = str.charCodeAt(i) & 0xff;\n }\n return bytes;\n}\nfunction string32(value) {\n return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n}\nfunction objectSize(obj) {\n return Object.keys(obj).length;\n}\nfunction objectFromMap(map) {\n const obj = Object.create(null);\n for (const [key, value] of map) {\n obj[key] = value;\n }\n return obj;\n}\nfunction isLittleEndian() {\n const buffer8 = new Uint8Array(4);\n buffer8[0] = 1;\n const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n return view32[0] === 1;\n}\nfunction isEvalSupported() {\n try {\n new Function(\"\");\n return true;\n } catch {\n return false;\n }\n}\nclass FeatureTest {\n static get isLittleEndian() {\n return shadow(this, \"isLittleEndian\", isLittleEndian());\n }\n static get isEvalSupported() {\n return shadow(this, \"isEvalSupported\", isEvalSupported());\n }\n static get isOffscreenCanvasSupported() {\n return shadow(this, \"isOffscreenCanvasSupported\", typeof OffscreenCanvas !== \"undefined\");\n }\n static get platform() {\n if (typeof navigator !== \"undefined\" && typeof navigator?.platform === \"string\") {\n return shadow(this, \"platform\", {\n isMac: navigator.platform.includes(\"Mac\")\n });\n }\n return shadow(this, \"platform\", {\n isMac: false\n });\n }\n static get isCSSRoundSupported() {\n return shadow(this, \"isCSSRoundSupported\", globalThis.CSS?.supports?.(\"width: round(1.5px, 1px)\"));\n }\n}\nconst hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, \"0\"));\nclass Util {\n static makeHexColor(r, g, b) {\n return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;\n }\n static scaleMinMax(transform, minMax) {\n let temp;\n if (transform[0]) {\n if (transform[0] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[1];\n minMax[1] = temp;\n }\n minMax[0] *= transform[0];\n minMax[1] *= transform[0];\n if (transform[3] < 0) {\n temp = minMax[2];\n minMax[2] = minMax[3];\n minMax[3] = temp;\n }\n minMax[2] *= transform[3];\n minMax[3] *= transform[3];\n } else {\n temp = minMax[0];\n minMax[0] = minMax[2];\n minMax[2] = temp;\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n if (transform[1] < 0) {\n temp = minMax[2];\n minMax[2] = minMax[3];\n minMax[3] = temp;\n }\n minMax[2] *= transform[1];\n minMax[3] *= transform[1];\n if (transform[2] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[1];\n minMax[1] = temp;\n }\n minMax[0] *= transform[2];\n minMax[1] *= transform[2];\n }\n minMax[0] += transform[4];\n minMax[1] += transform[4];\n minMax[2] += transform[5];\n minMax[3] += transform[5];\n }\n static transform(m1, m2) {\n return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n }\n static applyTransform(p, m) {\n const xt = p[0] * m[0] + p[1] * m[2] + m[4];\n const yt = p[0] * m[1] + p[1] * m[3] + m[5];\n return [xt, yt];\n }\n static applyInverseTransform(p, m) {\n const d = m[0] * m[3] - m[1] * m[2];\n const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n return [xt, yt];\n }\n static getAxialAlignedBoundingBox(r, m) {\n const p1 = this.applyTransform(r, m);\n const p2 = this.applyTransform(r.slice(2, 4), m);\n const p3 = this.applyTransform([r[0], r[3]], m);\n const p4 = this.applyTransform([r[2], r[1]], m);\n return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];\n }\n static inverseTransform(m) {\n const d = m[0] * m[3] - m[1] * m[2];\n return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n }\n static singularValueDecompose2dScale(m) {\n const transpose = [m[0], m[2], m[1], m[3]];\n const a = m[0] * transpose[0] + m[1] * transpose[2];\n const b = m[0] * transpose[1] + m[1] * transpose[3];\n const c = m[2] * transpose[0] + m[3] * transpose[2];\n const d = m[2] * transpose[1] + m[3] * transpose[3];\n const first = (a + d) / 2;\n const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;\n const sx = first + second || 1;\n const sy = first - second || 1;\n return [Math.sqrt(sx), Math.sqrt(sy)];\n }\n static normalizeRect(rect) {\n const r = rect.slice(0);\n if (rect[0] > rect[2]) {\n r[0] = rect[2];\n r[2] = rect[0];\n }\n if (rect[1] > rect[3]) {\n r[1] = rect[3];\n r[3] = rect[1];\n }\n return r;\n }\n static intersect(rect1, rect2) {\n const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2]));\n const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2]));\n if (xLow > xHigh) {\n return null;\n }\n const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3]));\n const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3]));\n if (yLow > yHigh) {\n return null;\n }\n return [xLow, yLow, xHigh, yHigh];\n }\n static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3) {\n const tvalues = [],\n bounds = [[], []];\n let a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n for (let i = 0; i < 2; ++i) {\n if (i === 0) {\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n } else {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n sqrtb2ac = Math.sqrt(b2ac);\n if (b2ac < 0) {\n continue;\n }\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n let j = tvalues.length,\n mt;\n const jlen = j;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3;\n bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3;\n }\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n bounds[0].length = bounds[1].length = jlen + 2;\n return [Math.min(...bounds[0]), Math.min(...bounds[1]), Math.max(...bounds[0]), Math.max(...bounds[1])];\n }\n}\nconst PDFStringTranslateTable = (/* unused pure expression or super */ null && (0));\nfunction stringToPDFString(str) {\n if (str[0] >= \"\\xEF\") {\n let encoding;\n if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n encoding = \"utf-16be\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\n } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n encoding = \"utf-16le\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\n } else if (str[0] === \"\\xEF\" && str[1] === \"\\xBB\" && str[2] === \"\\xBF\") {\n encoding = \"utf-8\";\n }\n if (encoding) {\n try {\n const decoder = new TextDecoder(encoding, {\n fatal: true\n });\n const buffer = stringToBytes(str);\n const decoded = decoder.decode(buffer);\n if (!decoded.includes(\"\\x1b\")) {\n return decoded;\n }\n return decoded.replaceAll(/\\x1b[^\\x1b]*(?:\\x1b|$)/g, \"\");\n } catch (ex) {\n warn(`stringToPDFString: \"${ex}\".`);\n }\n }\n }\n const strBuf = [];\n for (let i = 0, ii = str.length; i < ii; i++) {\n const charCode = str.charCodeAt(i);\n if (charCode === 0x1b) {\n while (++i < ii && str.charCodeAt(i) !== 0x1b) {}\n continue;\n }\n const code = PDFStringTranslateTable[charCode];\n strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n }\n return strBuf.join(\"\");\n}\nfunction stringToUTF8String(str) {\n return decodeURIComponent(escape(str));\n}\nfunction utf8StringToString(str) {\n return unescape(encodeURIComponent(str));\n}\nfunction isArrayBuffer(v) {\n return typeof v === \"object\" && v?.byteLength !== undefined;\n}\nfunction isArrayEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n for (let i = 0, ii = arr1.length; i < ii; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\nfunction getModificationDate() {\n let date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, \"0\"), date.getUTCDate().toString().padStart(2, \"0\"), date.getUTCHours().toString().padStart(2, \"0\"), date.getUTCMinutes().toString().padStart(2, \"0\"), date.getUTCSeconds().toString().padStart(2, \"0\")];\n return buffer.join(\"\");\n}\nclass PromiseCapability {\n #settled = false;\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = data => {\n this.#settled = true;\n resolve(data);\n };\n this.reject = reason => {\n this.#settled = true;\n reject(reason);\n };\n });\n }\n get settled() {\n return this.#settled;\n }\n}\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n if (!NormalizeRegex) {\n NormalizeRegex = /([\\u00a0\\u00b5\\u037e\\u0eb3\\u2000-\\u200a\\u202f\\u2126\\ufb00-\\ufb04\\ufb06\\ufb20-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufba1\\ufba4-\\ufba9\\ufbae-\\ufbb1\\ufbd3-\\ufbdc\\ufbde-\\ufbe7\\ufbea-\\ufbf8\\ufbfc-\\ufbfd\\ufc00-\\ufc5d\\ufc64-\\ufcf1\\ufcf5-\\ufd3d\\ufd88\\ufdf4\\ufdfa-\\ufdfb\\ufe71\\ufe77\\ufe79\\ufe7b\\ufe7d]+)|(\\ufb05+)/gu;\n NormalizationMap = new Map([[\"ſt\", \"ſt\"]]);\n }\n return str.replaceAll(NormalizeRegex, (_, p1, p2) => {\n return p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2);\n });\n}\nfunction getUuid() {\n if (typeof crypto !== \"undefined\" && typeof crypto?.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const buf = new Uint8Array(32);\n if (typeof crypto !== \"undefined\" && typeof crypto?.getRandomValues === \"function\") {\n crypto.getRandomValues(buf);\n } else {\n for (let i = 0; i < 32; i++) {\n buf[i] = Math.floor(Math.random() * 255);\n }\n }\n return bytesToString(buf);\n}\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\n\n\n/***/ })\n\n/******/ });\n/************************************************************************/\n/******/ // The module cache\n/******/ var __webpack_module_cache__ = {};\n/******/ \n/******/ // The require function\n/******/ function __nested_webpack_require_737957__(moduleId) {\n/******/ \t// Check if module is in cache\n/******/ \tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \tif (cachedModule !== undefined) {\n/******/ \t\treturn cachedModule.exports;\n/******/ \t}\n/******/ \t// Create a new module (and put it into the cache)\n/******/ \tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t// no module.id needed\n/******/ \t\t// no module.loaded needed\n/******/ \t\texports: {}\n/******/ \t};\n/******/ \n/******/ \t// Execute the module function\n/******/ \t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_737957__);\n/******/ \n/******/ \t// Return the exports of the module\n/******/ \treturn module.exports;\n/******/ }\n/******/ \n/************************************************************************/\n/******/ /* webpack/runtime/async module */\n/******/ (() => {\n/******/ \tvar webpackQueues = typeof Symbol === \"function\" ? Symbol(\"webpack queues\") : \"__webpack_queues__\";\n/******/ \tvar webpackExports = typeof Symbol === \"function\" ? Symbol(\"webpack exports\") : \"__webpack_exports__\";\n/******/ \tvar webpackError = typeof Symbol === \"function\" ? Symbol(\"webpack error\") : \"__webpack_error__\";\n/******/ \tvar resolveQueue = (queue) => {\n/******/ \t\tif(queue && queue.d < 1) {\n/******/ \t\t\tqueue.d = 1;\n/******/ \t\t\tqueue.forEach((fn) => (fn.r--));\n/******/ \t\t\tqueue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));\n/******/ \t\t}\n/******/ \t}\n/******/ \tvar wrapDeps = (deps) => (deps.map((dep) => {\n/******/ \t\tif(dep !== null && typeof dep === \"object\") {\n/******/ \t\t\tif(dep[webpackQueues]) return dep;\n/******/ \t\t\tif(dep.then) {\n/******/ \t\t\t\tvar queue = [];\n/******/ \t\t\t\tqueue.d = 0;\n/******/ \t\t\t\tdep.then((r) => {\n/******/ \t\t\t\t\tobj[webpackExports] = r;\n/******/ \t\t\t\t\tresolveQueue(queue);\n/******/ \t\t\t\t}, (e) => {\n/******/ \t\t\t\t\tobj[webpackError] = e;\n/******/ \t\t\t\t\tresolveQueue(queue);\n/******/ \t\t\t\t});\n/******/ \t\t\t\tvar obj = {};\n/******/ \t\t\t\tobj[webpackQueues] = (fn) => (fn(queue));\n/******/ \t\t\t\treturn obj;\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tvar ret = {};\n/******/ \t\tret[webpackQueues] = x => {};\n/******/ \t\tret[webpackExports] = dep;\n/******/ \t\treturn ret;\n/******/ \t}));\n/******/ \t__nested_webpack_require_737957__.a = (module, body, hasAwait) => {\n/******/ \t\tvar queue;\n/******/ \t\thasAwait && ((queue = []).d = -1);\n/******/ \t\tvar depQueues = new Set();\n/******/ \t\tvar exports = module.exports;\n/******/ \t\tvar currentDeps;\n/******/ \t\tvar outerResolve;\n/******/ \t\tvar reject;\n/******/ \t\tvar promise = new Promise((resolve, rej) => {\n/******/ \t\t\treject = rej;\n/******/ \t\t\touterResolve = resolve;\n/******/ \t\t});\n/******/ \t\tpromise[webpackExports] = exports;\n/******/ \t\tpromise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise[\"catch\"](x => {}));\n/******/ \t\tmodule.exports = promise;\n/******/ \t\tbody((deps) => {\n/******/ \t\t\tcurrentDeps = wrapDeps(deps);\n/******/ \t\t\tvar fn;\n/******/ \t\t\tvar getResult = () => (currentDeps.map((d) => {\n/******/ \t\t\t\tif(d[webpackError]) throw d[webpackError];\n/******/ \t\t\t\treturn d[webpackExports];\n/******/ \t\t\t}))\n/******/ \t\t\tvar promise = new Promise((resolve) => {\n/******/ \t\t\t\tfn = () => (resolve(getResult));\n/******/ \t\t\t\tfn.r = 0;\n/******/ \t\t\t\tvar fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))));\n/******/ \t\t\t\tcurrentDeps.map((dep) => (dep[webpackQueues](fnQueue)));\n/******/ \t\t\t});\n/******/ \t\t\treturn fn.r ? promise : getResult();\n/******/ \t\t}, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)));\n/******/ \t\tqueue && queue.d < 0 && (queue.d = 0);\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/define property getters */\n/******/ (() => {\n/******/ \t// define getter functions for harmony exports\n/******/ \t__nested_webpack_require_737957__.d = (exports, definition) => {\n/******/ \t\tfor(var key in definition) {\n/******/ \t\t\tif(__nested_webpack_require_737957__.o(definition, key) && !__nested_webpack_require_737957__.o(exports, key)) {\n/******/ \t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t};\n/******/ })();\n/******/ \n/******/ /* webpack/runtime/hasOwnProperty shorthand */\n/******/ (() => {\n/******/ \t__nested_webpack_require_737957__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ })();\n/******/ \n/************************************************************************/\n/******/ \n/******/ // startup\n/******/ // Load entry module and return exports\n/******/ // This entry module used 'module' so it can't be inlined\n/******/ var __nested_webpack_exports__ = __nested_webpack_require_737957__(9907);\n/******/ __nested_webpack_exports__ = globalThis.pdfjsLib = await (globalThis.pdfjsLibPromise = __nested_webpack_exports__);\n/******/ var __webpack_exports__AbortException = __nested_webpack_exports__.AbortException;\n/******/ var __webpack_exports__AnnotationEditorLayer = __nested_webpack_exports__.AnnotationEditorLayer;\n/******/ var __webpack_exports__AnnotationEditorParamsType = __nested_webpack_exports__.AnnotationEditorParamsType;\n/******/ var __webpack_exports__AnnotationEditorType = __nested_webpack_exports__.AnnotationEditorType;\n/******/ var __webpack_exports__AnnotationEditorUIManager = __nested_webpack_exports__.AnnotationEditorUIManager;\n/******/ var __webpack_exports__AnnotationLayer = __nested_webpack_exports__.AnnotationLayer;\n/******/ var __webpack_exports__AnnotationMode = __nested_webpack_exports__.AnnotationMode;\n/******/ var __webpack_exports__CMapCompressionType = __nested_webpack_exports__.CMapCompressionType;\n/******/ var __webpack_exports__ColorPicker = __nested_webpack_exports__.ColorPicker;\n/******/ var __webpack_exports__DOMSVGFactory = __nested_webpack_exports__.DOMSVGFactory;\n/******/ var __webpack_exports__DrawLayer = __nested_webpack_exports__.DrawLayer;\n/******/ var __webpack_exports__FeatureTest = __nested_webpack_exports__.FeatureTest;\n/******/ var __webpack_exports__GlobalWorkerOptions = __nested_webpack_exports__.GlobalWorkerOptions;\n/******/ var __webpack_exports__ImageKind = __nested_webpack_exports__.ImageKind;\n/******/ var __webpack_exports__InvalidPDFException = __nested_webpack_exports__.InvalidPDFException;\n/******/ var __webpack_exports__MissingPDFException = __nested_webpack_exports__.MissingPDFException;\n/******/ var __webpack_exports__OPS = __nested_webpack_exports__.OPS;\n/******/ var __webpack_exports__Outliner = __nested_webpack_exports__.Outliner;\n/******/ var __webpack_exports__PDFDataRangeTransport = __nested_webpack_exports__.PDFDataRangeTransport;\n/******/ var __webpack_exports__PDFDateString = __nested_webpack_exports__.PDFDateString;\n/******/ var __webpack_exports__PDFWorker = __nested_webpack_exports__.PDFWorker;\n/******/ var __webpack_exports__PasswordResponses = __nested_webpack_exports__.PasswordResponses;\n/******/ var __webpack_exports__PermissionFlag = __nested_webpack_exports__.PermissionFlag;\n/******/ var __webpack_exports__PixelsPerInch = __nested_webpack_exports__.PixelsPerInch;\n/******/ var __webpack_exports__PromiseCapability = __nested_webpack_exports__.PromiseCapability;\n/******/ var __webpack_exports__RenderingCancelledException = __nested_webpack_exports__.RenderingCancelledException;\n/******/ var __webpack_exports__UnexpectedResponseException = __nested_webpack_exports__.UnexpectedResponseException;\n/******/ var __webpack_exports__Util = __nested_webpack_exports__.Util;\n/******/ var __webpack_exports__VerbosityLevel = __nested_webpack_exports__.VerbosityLevel;\n/******/ var __webpack_exports__XfaLayer = __nested_webpack_exports__.XfaLayer;\n/******/ var __webpack_exports__build = __nested_webpack_exports__.build;\n/******/ var __webpack_exports__createValidAbsoluteUrl = __nested_webpack_exports__.createValidAbsoluteUrl;\n/******/ var __webpack_exports__fetchData = __nested_webpack_exports__.fetchData;\n/******/ var __webpack_exports__getDocument = __nested_webpack_exports__.getDocument;\n/******/ var __webpack_exports__getFilenameFromUrl = __nested_webpack_exports__.getFilenameFromUrl;\n/******/ var __webpack_exports__getPdfFilenameFromUrl = __nested_webpack_exports__.getPdfFilenameFromUrl;\n/******/ var __webpack_exports__getXfaPageViewport = __nested_webpack_exports__.getXfaPageViewport;\n/******/ var __webpack_exports__isDataScheme = __nested_webpack_exports__.isDataScheme;\n/******/ var __webpack_exports__isPdfFile = __nested_webpack_exports__.isPdfFile;\n/******/ var __webpack_exports__noContextMenu = __nested_webpack_exports__.noContextMenu;\n/******/ var __webpack_exports__normalizeUnicode = __nested_webpack_exports__.normalizeUnicode;\n/******/ var __webpack_exports__renderTextLayer = __nested_webpack_exports__.renderTextLayer;\n/******/ var __webpack_exports__setLayerDimensions = __nested_webpack_exports__.setLayerDimensions;\n/******/ var __webpack_exports__shadow = __nested_webpack_exports__.shadow;\n/******/ var __webpack_exports__updateTextLayer = __nested_webpack_exports__.updateTextLayer;\n/******/ var __webpack_exports__version = __nested_webpack_exports__.version;\n/******/ \n/******/ \n\n//# sourceMappingURL=pdf.mjs.map\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } }, 1);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdmVuZG9yL3BkZmpzLTQuMC4zNzktbGVnYWN5LWRpc3QvYnVpbGQvcGRmLm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDBDQUEwQyw4QkFBbUI7OztBQUc3RCxpQkFBaUIsOEJBQW1CO0FBQ3BDLGtCQUFrQiw4QkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsK0JBQW1COzs7QUFHN0QsaUJBQWlCLCtCQUFtQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLCtCQUFtQjs7O0FBRzdELFdBQVcsK0JBQW1CO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsK0JBQW1COzs7QUFHN0Qsb0JBQW9CLCtCQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQywrQkFBbUI7OztBQUc3RCxlQUFlLCtCQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsK0JBQW1COzs7QUFHN0QsMEJBQTBCLCtCQUFtQjtBQUM3QyxjQUFjLCtCQUFtQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQywrQkFBbUI7OztBQUc3RCxrQkFBa0IsK0JBQW1CO0FBQ3JDLDRCQUE0QiwrQkFBbUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsK0JBQW1COzs7QUFHN0QsYUFBYSwrQkFBbUI7QUFDaEMsa0JBQWtCLCtCQUFtQjtBQUNyQywwQkFBMEIsK0JBQW1CO0FBQzdDLGNBQWMsK0JBQW1CO0FBQ2pDLGlCQUFpQiwrQkFBbUI7QUFDcEMsNEJBQTRCLCtCQUFtQjtBQUMvQyx5QkFBeUIsK0JBQW1CO0FBQzVDLHVDQUF1QywrQkFBbUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyx5QkFBeUI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCwwRUFBMEUsNENBQTRDO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQywrQkFBbUI7OztBQUc3RCwwQkFBMEIsK0JBQW1CO0FBQzdDLGtCQUFrQiwrQkFBbUI7QUFDckMsYUFBYSwrQkFBbUI7QUFDaEMsaUJBQWlCLCtCQUFtQjtBQUNwQyxlQUFlLCtCQUFtQjtBQUNsQyxhQUFhLCtCQUFtQjtBQUNoQyxjQUFjLCtCQUFtQjtBQUNqQyxrQkFBa0IsK0JBQW1CO0FBQ3JDLGtDQUFrQywrQkFBbUI7QUFDckQsb0JBQW9CLCtCQUFtQjtBQUN2Qyw0QkFBNEIsK0JBQW1CO0FBQy9DLG9CQUFvQiwrQkFBbUI7QUFDdkMscUJBQXFCLCtCQUFtQjtBQUN4QyxxQkFBcUIsK0JBQW1CO0FBQ3hDLHNCQUFzQiwrQkFBbUI7QUFDekMsVUFBVSwrQkFBbUI7QUFDN0IsMEJBQTBCLCtCQUFtQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsc0JBQXNCLGdDQUFtQjtBQUN6QyxzQkFBc0IsZ0NBQW1CO0FBQ3pDLHdCQUF3QixnQ0FBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELFdBQVcsZ0NBQW1CO0FBQzlCLG9CQUFvQixnQ0FBbUI7QUFDdkMsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQyxjQUFjLGdDQUFtQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsaUJBQWlCO0FBQ3pELEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELHdCQUF3QixnQ0FBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFNBQVM7QUFDakI7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsd0JBQXdCLGdDQUFtQjtBQUMzQywwQkFBMEIsZ0NBQW1CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUztBQUNqQjtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxlQUFlLGdDQUFtQjtBQUNsQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELDRCQUE0QixnQ0FBbUI7QUFDL0MsaUJBQWlCLGdDQUFtQjtBQUNwQyxpQkFBaUIsZ0NBQW1CO0FBQ3BDLHNCQUFzQixnQ0FBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGFBQWEsZ0NBQW1CO0FBQ2hDLGNBQWMsZ0NBQW1CO0FBQ2pDLHFDQUFxQyxnQ0FBbUI7QUFDeEQsMkJBQTJCLGdDQUFtQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixpQkFBaUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsWUFBWSxnQ0FBbUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDLDJCQUEyQixnQ0FBbUI7QUFDOUMsK0JBQStCLGdDQUFtQjtBQUNsRDtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLDJCQUEyQixnQ0FBbUI7QUFDOUMsK0JBQStCLGdDQUFtQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMscUJBQXFCLGdDQUFtQjtBQUN4QztBQUNBO0FBQ0Esc0NBQXNDLGNBQWM7QUFDcEQ7QUFDQSxzQ0FBc0MsY0FBYztBQUNwRDtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsaUJBQWlCLGdDQUFtQjtBQUNwQywyQkFBMkIsZ0NBQW1CO0FBQzlDLGtCQUFrQixnQ0FBbUI7QUFDckMsMkJBQTJCLGdDQUFtQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsb0JBQW9CLGdDQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsYUFBYSxnQ0FBbUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsWUFBWSxnQ0FBbUI7QUFDL0I7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxhQUFhLGdDQUFtQjtBQUNoQyxxQkFBcUIsZ0NBQW1CO0FBQ3hDLHVDQUF1QyxnQ0FBbUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsMEJBQTBCO0FBQzVEO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsYUFBYSxnQ0FBbUI7QUFDaEMsZUFBZSxnQ0FBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxjQUFjLGdDQUFtQjtBQUNqQyxjQUFjLGdDQUFtQjtBQUNqQzs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsYUFBYSxnQ0FBbUI7QUFDaEMsY0FBYyxnQ0FBbUI7QUFDakM7O0FBRUEsT0FBTzs7QUFFUDtBQUNBOzs7QUFHQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGFBQWEsZ0NBQW1CO0FBQ2hDLGdCQUFnQixnQ0FBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQ0FBa0MsZ0NBQW1CO0FBQ3JELHNCQUFzQixnQ0FBbUI7QUFDekMsOEJBQThCLGdDQUFtQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxZQUFZLGdDQUFtQjtBQUMvQiwrQkFBK0IsZ0NBQW1CO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxhQUFhLGdDQUFtQjtBQUNoQyxnQ0FBZ0MsZ0NBQW1CO0FBQ25ELGtDQUFrQyxnQ0FBbUI7QUFDckQsb0JBQW9CLGdDQUFtQjtBQUN2QywyQkFBMkIsZ0NBQW1CO0FBQzlDLGdDQUFnQyxnQ0FBbUI7QUFDbkQsZUFBZSxnQ0FBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsNERBQTREO0FBQzVELEdBQUc7QUFDSCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsWUFBWSxnQ0FBbUI7QUFDL0I7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQyxhQUFhLGdDQUFtQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDLGdCQUFnQixnQ0FBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxpQkFBaUIsZ0NBQW1CO0FBQ3BDLGtCQUFrQixnQ0FBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxhQUFhLGdDQUFtQjtBQUNoQyxpQkFBaUIsZ0NBQW1CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsV0FBVyxnQ0FBbUI7QUFDOUIsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQyx3QkFBd0IsZ0NBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGNBQWMsZ0NBQW1CO0FBQ2pDLGdCQUFnQixnQ0FBbUI7QUFDbkMsd0JBQXdCLGdDQUFtQjtBQUMzQyxnQkFBZ0IsZ0NBQW1CO0FBQ25DLHNCQUFzQixnQ0FBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELFdBQVcsZ0NBQW1CO0FBQzlCLGdCQUFnQixnQ0FBbUI7QUFDbkMsZUFBZSxnQ0FBbUI7QUFDbEMsa0JBQWtCLGdDQUFtQjtBQUNyQyx3QkFBd0IsZ0NBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsZ0JBQWdCLGdDQUFtQjtBQUNuQyx3QkFBd0IsZ0NBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsZ0JBQWdCLGdDQUFtQjtBQUNuQyxlQUFlLGdDQUFtQjtBQUNsQyxXQUFXLGdDQUFtQjtBQUM5QiwwQkFBMEIsZ0NBQW1CO0FBQzdDLHdCQUF3QixnQ0FBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQyxlQUFlLGdDQUFtQjtBQUNsQyxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQTs7O0FBR0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxpQkFBaUIsZ0NBQW1CO0FBQ3BDOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQyxZQUFZLGdDQUFtQjtBQUMvQixvQkFBb0IsZ0NBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMsWUFBWSxnQ0FBbUI7QUFDL0IsY0FBYyxnQ0FBbUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxFQUFFOztBQUVGLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsaUJBQWlCLGdDQUFtQjtBQUNwQyxlQUFlLGdDQUFtQjtBQUNsQyxxQkFBcUIsZ0NBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMsaUJBQWlCLGdDQUFtQjtBQUNwQyxZQUFZLGdDQUFtQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGVBQWUsZ0NBQW1CO0FBQ2xDLGtDQUFrQyxnQ0FBbUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELHNCQUFzQixnQ0FBbUI7QUFDekMsYUFBYSxnQ0FBbUI7QUFDaEMsZUFBZSxnQ0FBbUI7QUFDbEMsa0NBQWtDLGdDQUFtQjtBQUNyRCxhQUFhLGdDQUFtQjtBQUNoQyxhQUFhLGdDQUFtQjtBQUNoQyxnQkFBZ0IsZ0NBQW1CO0FBQ25DLGlCQUFpQixnQ0FBbUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsc0JBQXNCLGdDQUFtQjtBQUN6QyxnQkFBZ0IsZ0NBQW1CO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxjQUFjLGdDQUFtQjtBQUNqQztBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxjQUFjLGdDQUFtQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELG1CQUFtQixnQ0FBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxZQUFZLGdDQUFtQjtBQUMvQixpQkFBaUIsZ0NBQW1CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGlCQUFpQixnQ0FBbUI7QUFDcEMsbUJBQW1CLGdDQUFtQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsaUJBQWlCLGdDQUFtQjtBQUNwQyxpQkFBaUIsZ0NBQW1CO0FBQ3BDLG9CQUFvQixnQ0FBbUI7QUFDdkMsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsV0FBVyxnQ0FBbUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixXQUFXLGdDQUFtQjtBQUM5QixlQUFlLGdDQUFtQjtBQUNsQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDLDRCQUE0QixnQ0FBbUI7QUFDL0Msd0JBQXdCLGdDQUFtQjtBQUMzQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLGtCQUFrQixnQ0FBbUI7QUFDckMsd0JBQXdCLGdDQUFtQjtBQUMzQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELGdCQUFnQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixlQUFlLGdDQUFtQjtBQUNsQyxnQkFBZ0IsZ0NBQW1CO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixhQUFhLGdDQUFtQjtBQUNoQyxrQ0FBa0MsZ0NBQW1CO0FBQ3JELHFCQUFxQixnQ0FBbUI7QUFDeEMsc0JBQXNCLGdDQUFtQjtBQUN6QywwQkFBMEIsZ0NBQW1CO0FBQzdDLGdCQUFnQixnQ0FBbUI7QUFDbkMseUJBQXlCLGdDQUFtQjtBQUM1Qyw2QkFBNkIsZ0NBQW1CO0FBQ2hELG9CQUFvQixnQ0FBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELFdBQVcsZ0NBQW1CO0FBQzlCLGdCQUFnQixnQ0FBbUI7QUFDbkMsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQywwQkFBMEIsZ0NBQW1CO0FBQzdDLG1DQUFtQyxnQ0FBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckU7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxZQUFZLGdDQUFtQjtBQUMvQixpQkFBaUIsZ0NBQW1CO0FBQ3BDLGVBQWUsZ0NBQW1CO0FBQ2xDLGFBQWEsZ0NBQW1CO0FBQ2hDLHFCQUFxQixnQ0FBbUI7QUFDeEMsb0JBQW9CLGdDQUFtQjtBQUN2QyxzQkFBc0IsZ0NBQW1CO0FBQ3pDLGNBQWMsZ0NBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBOzs7QUFHQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGVBQWUsZ0NBQW1CO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMsWUFBWSxnQ0FBbUI7QUFDL0IsaUJBQWlCLGdDQUFtQjtBQUNwQyxhQUFhLGdDQUFtQjtBQUNoQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDLGtDQUFrQyxnQ0FBbUI7QUFDckQsb0JBQW9CLGdDQUFtQjtBQUN2QywwQkFBMEIsZ0NBQW1CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsY0FBYyxVQUFVO0FBQzFCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHNCQUFzQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxpQkFBaUI7QUFDMUQsSUFBSTtBQUNKO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxlQUFlLGdDQUFtQjtBQUNsQztBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxlQUFlLGdDQUFtQjtBQUNsQyw2QkFBNkIsZ0NBQW1CO0FBQ2hELGtCQUFrQixnQ0FBbUI7QUFDckMsaUJBQWlCLGdDQUFtQjtBQUNwQyxXQUFXLGdDQUFtQjtBQUM5Qiw0QkFBNEIsZ0NBQW1CO0FBQy9DLGdCQUFnQixnQ0FBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMsOEJBQThCLGdDQUFtQjtBQUNqRCwyQkFBMkIsZ0NBQW1CO0FBQzlDLGVBQWUsZ0NBQW1CO0FBQ2xDLHNCQUFzQixnQ0FBbUI7QUFDekMsaUJBQWlCLGdDQUFtQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQyxxQkFBcUIsZ0NBQW1CO0FBQ3hDLDhCQUE4QixnQ0FBbUI7QUFDakQsZUFBZSxnQ0FBbUI7QUFDbEMsb0JBQW9CLGdDQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDLFdBQVcsZ0NBQW1CO0FBQzlCLGlDQUFpQyxnQ0FBbUI7QUFDcEQsK0JBQStCLGdDQUFtQjtBQUNsRCxzQkFBc0IsZ0NBQW1CO0FBQ3pDLG9CQUFvQixnQ0FBbUI7QUFDdkMsYUFBYSxnQ0FBbUI7QUFDaEMscUJBQXFCLGdDQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELHlCQUF5QixnQ0FBbUI7QUFDNUMsa0JBQWtCLGdDQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsYUFBYSxnQ0FBbUI7QUFDaEMsaUJBQWlCLGdDQUFtQjtBQUNwQyxlQUFlLGdDQUFtQjtBQUNsQyxnQkFBZ0IsZ0NBQW1CO0FBQ25DLCtCQUErQixnQ0FBbUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDLCtCQUErQjs7QUFFL0IsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDLGFBQWEsZ0NBQW1CO0FBQ2hDLHNCQUFzQixnQ0FBbUI7QUFDekMsZUFBZSxnQ0FBbUI7QUFDbEMsaUJBQWlCLGdDQUFtQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QseUJBQXlCLGdDQUFtQjtBQUM1QyxrQkFBa0IsZ0NBQW1CO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBLDhCQUE4QjtBQUM5QjtBQUNBLDRFQUE0RSxNQUFNO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUYsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCwwQkFBMEIsZ0NBQW1CO0FBQzdDLGVBQWUsZ0NBQW1CO0FBQ2xDLHlCQUF5QixnQ0FBbUI7QUFDNUMsNkRBQTZEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELFdBQVcsZ0NBQW1CO0FBQzlCLGlCQUFpQixnQ0FBbUI7QUFDcEMsZUFBZSxnQ0FBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGlCQUFpQixnQ0FBbUI7QUFDcEMsa0JBQWtCLGdDQUFtQjtBQUNyQyxnQ0FBZ0MsZ0NBQW1CO0FBQ25ELGtDQUFrQyxnQ0FBbUI7QUFDckQsZUFBZSxnQ0FBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQyxhQUFhLGdDQUFtQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxFQUFFO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELHNCQUFzQixnQ0FBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCx3QkFBd0IsZ0NBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGlCQUFpQixnQ0FBbUI7QUFDcEMsY0FBYyxnQ0FBbUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixpQkFBaUIsZ0NBQW1CO0FBQ3BDLFlBQVksZ0NBQW1CO0FBQy9CLFdBQVcsZ0NBQW1CO0FBQzlCLG1CQUFtQixnQ0FBbUI7QUFDdEMsaUJBQWlCLGdDQUFtQjtBQUNwQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixpQkFBaUIsZ0NBQW1CO0FBQ3BDLFdBQVcsZ0NBQW1CO0FBQzlCLG1CQUFtQixnQ0FBbUI7QUFDdEMsaUJBQWlCLGdDQUFtQjtBQUNwQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixXQUFXLGdDQUFtQjtBQUM5QixXQUFXLGdDQUFtQjtBQUM5QixtQkFBbUIsZ0NBQW1CO0FBQ3RDLGlCQUFpQixnQ0FBbUI7QUFDcEMsb0JBQW9CLGdDQUFtQjtBQUN2QyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsV0FBVyxnQ0FBbUI7QUFDOUIsV0FBVyxnQ0FBbUI7QUFDOUIsY0FBYyxnQ0FBbUI7QUFDakMsbUJBQW1CLGdDQUFtQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsV0FBVyxnQ0FBbUI7QUFDOUIsV0FBVyxnQ0FBbUI7QUFDOUIsV0FBVyxnQ0FBbUI7QUFDOUIsbUJBQW1CLGdDQUFtQjtBQUN0QyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLG9CQUFvQixnQ0FBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsa0JBQWtCLGdDQUFtQjtBQUNyQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLGlCQUFpQixnQ0FBbUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsaUJBQWlCLGdDQUFtQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCwwQkFBMEIsZ0NBQW1CO0FBQzdDLGlCQUFpQixnQ0FBbUI7QUFDcEM7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsV0FBVyxnQ0FBbUI7QUFDOUIsaUJBQWlCLGdDQUFtQjtBQUNwQyxZQUFZLGdDQUFtQjtBQUMvQixtQkFBbUIsZ0NBQW1CO0FBQ3RDLG9CQUFvQixnQ0FBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixXQUFXLGdDQUFtQjtBQUM5QixZQUFZLGdDQUFtQjtBQUMvQixtQkFBbUIsZ0NBQW1CO0FBQ3RDLG9CQUFvQixnQ0FBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxhQUFhLGdDQUFtQjtBQUNoQyxVQUFVLGdDQUFtQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGFBQWEsZ0NBQW1CO0FBQ2hDLDJCQUEyQixnQ0FBbUI7QUFDOUM7QUFDQSw2REFBNkQ7QUFDN0Q7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxjQUFjLGdDQUFtQjtBQUNqQyxZQUFZLGdDQUFtQjtBQUMvQjtBQUNBLG9FQUFvRTtBQUNwRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxhQUFhLGdDQUFtQjtBQUNoQyxZQUFZLGdDQUFtQjtBQUMvQixTQUFTLGdDQUFtQjtBQUM1QixpQkFBaUIsZ0NBQW1CO0FBQ3BDLGNBQWMsZ0NBQW1CO0FBQ2pDLGNBQWMsZ0NBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsb0JBQW9CO0FBQzNEO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGlCQUFpQixnQ0FBbUI7QUFDcEMsWUFBWSxnQ0FBbUI7QUFDL0IsYUFBYSxnQ0FBbUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsMEJBQTBCLGdDQUFtQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxrQkFBa0IsZ0NBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsMEJBQTBCLGdDQUFtQjtBQUM3QyxlQUFlLGdDQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELG9CQUFvQixnQ0FBbUI7QUFDdkMsNkJBQTZCLGdDQUFtQjtBQUNoRDtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxZQUFZLGdDQUFtQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELDBCQUEwQixnQ0FBbUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCw2QkFBNkIsZ0NBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELDBCQUEwQixnQ0FBbUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxXQUFXLGdDQUFtQjtBQUM5QixlQUFlLGdDQUFtQjtBQUNsQyxlQUFlLGdDQUFtQjtBQUNsQyxnQkFBZ0IsZ0NBQW1CO0FBQ25DLDBCQUEwQixnQ0FBbUI7QUFDN0Msc0JBQXNCLGdDQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMsZUFBZSxnQ0FBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxzQkFBc0IsZ0NBQW1CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsY0FBYyxnQ0FBbUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsY0FBYyxnQ0FBbUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0Qsb0JBQW9CLGdDQUFtQjtBQUN2Qzs7QUFFQSxPQUFPOztBQUVQO0FBQ0EsMENBQTBDLGdDQUFtQjs7O0FBRzdELGtCQUFrQixnQ0FBbUI7QUFDckMsWUFBWSxnQ0FBbUI7QUFDL0I7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxhQUFhLGdDQUFtQjtBQUNoQyxpQkFBaUIsZ0NBQW1CO0FBQ3BDO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDBDQUEwQyxnQ0FBbUI7OztBQUc3RCxhQUFhLGdDQUFtQjtBQUNoQyxhQUFhLGdDQUFtQjtBQUNoQyxhQUFhLGdDQUFtQjtBQUNoQyxVQUFVLGdDQUFtQjtBQUM3QixvQkFBb0IsZ0NBQW1CO0FBQ3ZDLHdCQUF3QixnQ0FBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwwQ0FBMEMsZ0NBQW1COzs7QUFHN0QsaUJBQWlCLGdDQUFtQjtBQUNwQyxhQUFhLGdDQUFtQjtBQUNoQyxrQ0FBa0MsZ0NBQW1CO0FBQ3JELG9CQUFvQixnQ0FBbUI7QUFDdkMscUJBQXFCLGdDQUFtQjtBQUN4QyxnQ0FBZ0MsZ0NBQW1CO0FBQ25ELG9CQUFvQixnQ0FBbUI7QUFDdkMsd0JBQXdCLGdDQUFtQjtBQUMzQyw4QkFBOEIsZ0NBQW1CO0FBQ2pELHdCQUF3QixnQ0FBbUI7QUFDM0Msd0JBQXdCLGdDQUFtQjtBQUMzQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDLGNBQWMsZ0NBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsWUFBWTtBQUNwRSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsZ0NBQW1COzs7QUFHOUUsUUFBUSxnQ0FBbUI7QUFDM0IsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQyxxQkFBcUIsZ0NBQW1CO0FBQ3hDLCtCQUErQixnQ0FBbUI7QUFDbEQsWUFBWSxnQ0FBbUI7QUFDL0I7QUFDQSx1QkFBdUIscUJBQXFCO0FBQzVDLENBQUM7QUFDRDtBQUNBO0FBQ0Esd0NBQXdDLGlCQUFpQjtBQUN6RCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELE9BQU87O0FBRVA7QUFDQSwyREFBMkQsZ0NBQW1COzs7QUFHOUUsUUFBUSxnQ0FBbUI7QUFDM0IsYUFBYSxnQ0FBbUI7QUFDaEMsWUFBWSxnQ0FBbUI7QUFDL0Isb0NBQW9DLGdDQUFtQjtBQUN2RDtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxnQ0FBbUI7OztBQUc5RSwwQkFBMEIsZ0NBQW1CO0FBQzdDLHNCQUFzQixnQ0FBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELE9BQU87O0FBRVA7QUFDQSwyREFBMkQsZ0NBQW1COzs7QUFHOUUsMEJBQTBCLGdDQUFtQjtBQUM3QyxpQkFBaUIsZ0NBQW1CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGdDQUFtQjs7O0FBRzlFLGFBQWEsZ0NBQW1CO0FBQ2hDLFdBQVcsZ0NBQW1CO0FBQzlCLDBCQUEwQixnQ0FBbUI7QUFDN0Msd0JBQXdCLGdDQUFtQjtBQUMzQyxlQUFlLGdDQUFtQjtBQUNsQyxzQkFBc0IsZ0NBQW1CO0FBQ3pDLFlBQVksZ0NBQW1CO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxnQ0FBbUI7OztBQUc5RSxzQkFBc0IsZ0NBQW1CO0FBQ3pDLDBCQUEwQixnQ0FBbUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxnQ0FBbUI7OztBQUc5RSwwQkFBMEIsZ0NBQW1CO0FBQzdDLGtCQUFrQixnQ0FBbUI7QUFDckMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxrQ0FBa0MsZ0NBQW1CO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGdDQUFtQjs7O0FBRzlFLGdCQUFnQixnQ0FBbUI7QUFDbkMsMEJBQTBCLGdDQUFtQjtBQUM3QyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLDBCQUEwQixnQ0FBbUI7QUFDN0MsZUFBZSxnQ0FBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGdDQUFtQjs7O0FBRzlFLGtCQUFrQixnQ0FBbUI7QUFDckMsNEJBQTRCLGdDQUFtQjtBQUMvQyxpQkFBaUIsZ0NBQW1CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsZ0NBQW1COzs7QUFHOUUsUUFBUSxnQ0FBbUI7QUFDM0IsZ0JBQWdCLGdDQUFtQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsZ0NBQW1COzs7QUFHOUUsUUFBUSxnQ0FBbUI7QUFDM0IsZ0JBQWdCLGdDQUFtQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsaUNBQW1COzs7QUFHOUUsUUFBUSxpQ0FBbUI7QUFDM0IsYUFBYSxpQ0FBbUI7QUFDaEMsaUJBQWlCLGlDQUFtQjtBQUNwQyxlQUFlLGlDQUFtQjtBQUNsQyxpQkFBaUIsaUNBQW1CO0FBQ3BDLHFCQUFxQixpQ0FBbUI7QUFDeEMsNEJBQTRCLGlDQUFtQjtBQUMvQyxxQkFBcUIsaUNBQW1CO0FBQ3hDLFlBQVksaUNBQW1CO0FBQy9CLGFBQWEsaUNBQW1CO0FBQ2hDLHNCQUFzQixpQ0FBbUI7QUFDekMseUJBQXlCLGlDQUFtQjtBQUM1QyxrQkFBa0IsaUNBQW1CO0FBQ3JDLGNBQWMsaUNBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSSwrQkFBK0I7O0FBRXBDLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsaUNBQW1COzs7QUFHOUUsUUFBUSxpQ0FBbUI7QUFDM0IsY0FBYyxpQ0FBbUI7QUFDakMsZ0JBQWdCLGlDQUFtQjtBQUNuQyxlQUFlLGlDQUFtQjtBQUNsQyx3QkFBd0IsaUNBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxpQ0FBbUI7OztBQUc5RSxRQUFRLGlDQUFtQjtBQUMzQixXQUFXLGlDQUFtQjtBQUM5QixnQkFBZ0IsaUNBQW1CO0FBQ25DLGVBQWUsaUNBQW1CO0FBQ2xDLHdCQUF3QixpQ0FBbUI7QUFDM0MsMEJBQTBCLGlDQUFtQjtBQUM3QyxtQ0FBbUMsaUNBQW1CO0FBQ3RELGNBQWMsaUNBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxzREFBc0Qsc0JBQXNCO0FBQzVFO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGlDQUFtQjs7O0FBRzlFLFFBQVEsaUNBQW1CO0FBQzNCLFdBQVcsaUNBQW1CO0FBQzlCLGdCQUFnQixpQ0FBbUI7QUFDbkMsZUFBZSxpQ0FBbUI7QUFDbEMsd0JBQXdCLGlDQUFtQjtBQUMzQyw2QkFBNkIsaUNBQW1CO0FBQ2hELDBCQUEwQixpQ0FBbUI7QUFDN0Msb0JBQW9CLGlDQUFtQjtBQUN2QyxjQUFjLGlDQUFtQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxpQ0FBbUI7OztBQUc5RSxRQUFRLGlDQUFtQjtBQUMzQixVQUFVLGlDQUFtQjtBQUM3QixjQUFjLGlDQUFtQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxJQUFJLFVBQVU7O0FBRWYsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxpQ0FBbUI7OztBQUc5RSxRQUFRLGlDQUFtQjtBQUMzQixjQUFjLGlDQUFtQjtBQUNqQyxnQkFBZ0IsaUNBQW1CO0FBQ25DLGVBQWUsaUNBQW1CO0FBQ2xDLHdCQUF3QixpQ0FBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGlDQUFtQjs7O0FBRzlFLFFBQVEsaUNBQW1CO0FBQzNCLGtCQUFrQixpQ0FBbUI7QUFDckMsYUFBYSxpQ0FBbUI7QUFDaEMsaUJBQWlCLGlDQUFtQjtBQUNwQyxrQkFBa0IsaUNBQW1CO0FBQ3JDLFdBQVcsaUNBQW1CO0FBQzlCLGlCQUFpQixpQ0FBbUI7QUFDcEMsZUFBZSxpQ0FBbUI7QUFDbEMsY0FBYyxpQ0FBbUI7QUFDakMsYUFBYSxpQ0FBbUI7QUFDaEMsZUFBZSxpQ0FBbUI7QUFDbEMsd0JBQXdCLGlDQUFtQjtBQUMzQyxxQkFBcUIsaUNBQW1CO0FBQ3hDLFlBQVksaUNBQW1CO0FBQy9CLHNCQUFzQixpQ0FBbUI7QUFDekMsb0JBQW9CLGlDQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxXQUFXO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLHNCQUFzQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxtQkFBbUI7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsU0FBUyxtQkFBbUI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELE9BQU87O0FBRVA7QUFDQSwyREFBMkQsaUNBQW1COzs7QUFHOUUsUUFBUSxpQ0FBbUI7QUFDM0IsaUJBQWlCLGlDQUFtQjtBQUNwQyw2QkFBNkIsaUNBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUksd0JBQXdCOztBQUU3QixPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGlDQUFtQjs7O0FBRzlFLFFBQVEsaUNBQW1CO0FBQzNCLFlBQVksaUNBQW1CO0FBQy9CLG1CQUFtQixpQ0FBbUI7QUFDdEMsNkJBQTZCLGlDQUFtQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSSw0QkFBNEI7O0FBRWpDLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsaUNBQW1COzs7QUFHOUUsUUFBUSxpQ0FBbUI7QUFDM0IscUJBQXFCLGlDQUFtQjtBQUN4Qyw2QkFBNkIsaUNBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUksZ0NBQWdDOztBQUVyQyxPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGlDQUFtQjs7O0FBRzlFLFFBQVEsaUNBQW1CO0FBQzNCLGlCQUFpQixpQ0FBbUI7QUFDcEMsNkJBQTZCLGlDQUFtQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxJQUFJLHdCQUF3Qjs7QUFFN0IsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxpQ0FBbUI7OztBQUc5RSxRQUFRLGlDQUFtQjtBQUMzQixtQkFBbUIsaUNBQW1CO0FBQ3RDLDZCQUE2QixpQ0FBbUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSSw0QkFBNEI7O0FBRWpDLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsaUNBQW1COzs7QUFHOUUsUUFBUSxpQ0FBbUI7QUFDM0IsMEJBQTBCLGlDQUFtQjtBQUM3Qyw2QkFBNkIsaUNBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUksMENBQTBDOztBQUUvQyxPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGlDQUFtQjs7O0FBRzlFLFFBQVEsaUNBQW1CO0FBQzNCLFlBQVksaUNBQW1CO0FBQy9CLDZCQUE2QixpQ0FBbUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSSxjQUFjOztBQUVuQixPQUFPOztBQUVQO0FBQ0EsMkRBQTJELGlDQUFtQjs7O0FBRzlFLFFBQVEsaUNBQW1CO0FBQzNCLGFBQWEsaUNBQW1CO0FBQ2hDLGlCQUFpQixpQ0FBbUI7QUFDcEMsK0JBQStCLGlDQUFtQjtBQUNsRCxzQkFBc0IsaUNBQW1CO0FBQ3pDLGFBQWEsaUNBQW1CO0FBQ2hDLGlCQUFpQixpQ0FBbUI7QUFDcEMsd0JBQXdCLGlDQUFtQjtBQUMzQyw4QkFBOEIsaUNBQW1CO0FBQ2pELDRCQUE0QixpQ0FBbUI7QUFDL0Msc0JBQXNCLGlDQUFtQjtBQUN6QyxrQkFBa0IsaUNBQW1CO0FBQ3JDLGNBQWMsaUNBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxJQUFJLHVFQUF1RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTzs7QUFFUDtBQUNBLDJEQUEyRCxpQ0FBbUI7OztBQUc5RSxvQkFBb0IsaUNBQW1CO0FBQ3ZDLGtCQUFrQixpQ0FBbUI7QUFDckMsZUFBZSxpQ0FBbUI7QUFDbEMsOEJBQThCLGlDQUFtQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsaUNBQW1COzs7QUFHOUUsb0JBQW9CLGlDQUFtQjtBQUN2QyxrQkFBa0IsaUNBQW1CO0FBQ3JDLGVBQWUsaUNBQW1CO0FBQ2xDLDhCQUE4QixpQ0FBbUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSwyREFBMkQsaUNBQW1COzs7QUFHOUUsa0JBQWtCLGlDQUFtQjtBQUNyQyxrQkFBa0IsaUNBQW1CO0FBQ3JDLDRCQUE0QixpQ0FBbUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLE9BQU87O0FBRVA7QUFDQSw2Q0FBNkMsMEJBQW1CLEVBQUUsaUNBQW1COzs7QUFHckY7QUFDQSxpQ0FBbUIsR0FBRywwQkFBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0Esb0JBQW9CLGlDQUFtQjtBQUN2QztBQUNBLCtCQUErQixpQ0FBbUI7QUFDbEQ7QUFDQSxpQ0FBaUMsaUNBQW1CO0FBQ3BEO0FBQ0EscUNBQXFDLGlDQUFtQjtBQUN4RDtBQUNBLGlDQUFpQyxpQ0FBbUI7QUFDcEQ7QUFDQSxtQ0FBbUMsaUNBQW1CO0FBQ3REO0FBQ0EseUNBQXlDLGlDQUFtQjtBQUM1RDtBQUNBLDBCQUEwQixpQ0FBbUI7QUFDN0M7QUFDQSwwQkFBMEIsaUNBQW1CO0FBQzdDO0FBQ0Esa0NBQWtDLGlDQUFtQjtBQUNyRDtBQUNBLCtCQUErQixpQ0FBbUI7QUFDbEQ7QUFDQSxXQUFXLGlDQUFtQjtBQUM5QjtBQUNBLG9CQUFvQixpQ0FBbUI7QUFDdkM7QUFDQSx5QkFBeUIsaUNBQW1CO0FBQzVDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQ0FBa0M7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsaUNBQW1CO0FBQ25DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsdUNBQXVDLHVCQUF1QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsaUJBQWlCLG1DQUFtQyxlQUFlO0FBQ2xHO0FBQ0EsUUFBUTtBQUNSLCtCQUErQixNQUFNLG1DQUFtQyxPQUFPO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixvQ0FBb0M7QUFDbEUsNkJBQTZCLHFDQUFxQztBQUNsRTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsaUNBQWlDLHdCQUF3QjtBQUN6RCxrQ0FBa0MsMEJBQTBCO0FBQzVELE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixhQUFhO0FBQzVDLGdDQUFnQyxjQUFjO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELFVBQVU7QUFDbkU7QUFDQSx3Q0FBd0MsVUFBVTtBQUNsRCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsNENBQTRDLHNJQUFzSSxZQUFZLGtCQUFrQixZQUFZO0FBQzVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixhQUFhO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsVUFBVSxZQUFZLFdBQVc7QUFDNUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLEdBQUc7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixRQUFRO0FBQzdCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFLEdBQUc7QUFDNUU7QUFDQSx1RUFBdUUsR0FBRztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLEdBQUc7QUFDMUU7QUFDQTtBQUNBLFVBQVU7QUFDVix1RUFBdUUsR0FBRztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsaUJBQWlCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFVBQVU7QUFDeEQ7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFLHNCQUFzQixFQUFFLEdBQUc7QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsV0FBVztBQUN2RSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixvQkFBb0Isc0NBQXNDO0FBQzFELG1CQUFtQixzQ0FBc0M7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLHVCQUF1Qix3QkFBd0IsYUFBYSx1REFBdUQ7QUFDbkg7QUFDQSwyQ0FBMkMsaUNBQWlDLEdBQUc7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCLEVBQUUsR0FBRztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsR0FBRztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIseUZBQXlGLGlDQUFtQjtBQUM1RywrRkFBK0YsaUNBQW1CO0FBQ2xILG1HQUFtRyxpQ0FBbUI7QUFDdEgsd0VBQXdFLGlDQUFtQjtBQUMzRiwwRUFBMEUsaUNBQW1CO0FBQzdGLCtFQUErRSxpQ0FBbUI7Ozs7Ozs7QUFPbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsSUFBSSxHQUFHLDJCQUEyQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSw0QkFBNEIsMEJBQW1CLEVBQUUsaUNBQW1COztBQUVwRSxpQ0FBbUIsb0dBQW9HO0FBQ3ZILHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLHdHQUF3RyxpQ0FBbUI7QUFDM0gscUdBQXFHLGlDQUFtQjtBQUN4SCxzR0FBc0csaUNBQW1CO0FBQ3pILDBGQUEwRixpQ0FBbUI7QUFDN0csb0dBQW9HLGlDQUFtQjtBQUN2SCwwR0FBMEcsaUNBQW1CO0FBQzdILDhGQUE4RixpQ0FBbUI7QUFDakgsc0dBQXNHLGlDQUFtQjtBQUN6SCxvR0FBb0csaUNBQW1CO0FBQ3ZILCtGQUErRixpQ0FBbUI7QUFDbEgseUdBQXlHLGlDQUFtQjtBQUM1SCx5R0FBeUcsaUNBQW1CO0FBQzVILHlIQUF5SCxpQ0FBbUI7QUFDNUksMEZBQTBGLGlDQUFtQjtBQUM3RyxxR0FBcUcsaUNBQW1CO0FBQ3hILHVHQUF1RyxpQ0FBbUI7QUFDMUgsMkdBQTJHLGlDQUFtQjtBQUM5SCx1R0FBdUcsaUNBQW1CO0FBQzFILHlHQUF5RyxpQ0FBbUI7QUFDNUgsK0dBQStHLGlDQUFtQjtBQUNsSSxnR0FBZ0csaUNBQW1CO0FBQ25ILGdHQUFnRyxpQ0FBbUI7QUFDbkgsb0dBQW9HLGlDQUFtQjtBQUN2SCx5RUFBeUUsaUNBQW1CO0FBQzVGLGdGQUFnRixpQ0FBbUI7QUFDbkcsMkVBQTJFLGlDQUFtQjtBQUM5Rix5RUFBeUUsaUNBQW1CO0FBQzVGLDRFQUE0RSxpQ0FBbUI7QUFDL0Ysb0VBQW9FLGlDQUFtQjtBQUN2Riw0RUFBNEUsaUNBQW1CO0FBQy9GLG9GQUFvRixpQ0FBbUI7QUFDdkcsc0VBQXNFLGlDQUFtQjtBQUN6RixxRkFBcUYsaUNBQW1CO0FBQ3hHLDhFQUE4RSxpQ0FBbUI7QUFDakcsOEVBQThFLGlDQUFtQjtBQUNqRyx5RUFBeUUsaUNBQW1CO0FBQzVGLDZFQUE2RSxpQ0FBbUI7QUFDaEcsc0VBQXNFLGlDQUFtQjtBQUN6RjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixnQ0FBZ0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxvSUFBb0k7QUFDcEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsSUFBSSxHQUFHO0FBQzVDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNkJBQTZCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxnRkFBZ0YsZUFBZTtBQUMvRixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHLE9BQU87QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrR0FBK0csZUFBZTtBQUM5SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCLEdBQUcsbUNBQW1DO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpR0FBaUcsY0FBYztBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELEtBQUs7QUFDakU7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsS0FBSztBQUMxRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsaUJBQWlCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxNQUFNO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3SUFBd0ksb0JBQW9CO0FBQzVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSxXQUFXLGdDQUFnQzs7QUFFN0MsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXJGLHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QiwwRkFBMEYsaUNBQW1CO0FBQzdHLHdFQUF3RSxpQ0FBbUI7OztBQUczRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxtQ0FBbUMsV0FBVyxJQUFJO0FBQzFGLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsYUFBYSxFQUFFLFNBQVM7QUFDM0M7QUFDQSxzREFBc0QsSUFBSTtBQUMxRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsTUFBTTtBQUN6QyxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0EsdUNBQXVDLE9BQU8sRUFBRSxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7OztBQUdyRjtBQUNBLGlDQUFtQixHQUFHLDBCQUFtQjtBQUN6QztBQUNBLENBQUM7O0FBRUQ7QUFDQSxxQkFBcUIsaUNBQW1CO0FBQ3hDO0FBQ0EsK0JBQStCLGlDQUFtQjtBQUNsRDtBQUNBLHFDQUFxQyxpQ0FBbUI7QUFDeEQ7QUFDQSx5QkFBeUIsaUNBQW1CO0FBQzVDO0FBQ0EsaUNBQWlDLGlDQUFtQjtBQUNwRDtBQUNBLCtCQUErQixpQ0FBbUI7QUFDbEQ7QUFDQSwwQkFBMEIsaUNBQW1CO0FBQzdDO0FBQ0EsbUNBQW1DLGlDQUFtQjtBQUN0RDtBQUNBLG1DQUFtQyxpQ0FBbUI7QUFDdEQ7QUFDQSxtREFBbUQsaUNBQW1CO0FBQ3RFO0FBQ0Esa0NBQWtDLGlDQUFtQjtBQUNyRDtBQUNBLDZCQUE2QixpQ0FBbUI7QUFDaEQ7QUFDQSxvQkFBb0IsaUNBQW1CO0FBQ3ZDO0FBQ0EsMEJBQTBCLGlDQUFtQjtBQUM3QztBQUNBLFdBQVcsaUNBQW1CO0FBQzlCO0FBQ0Esb0JBQW9CLGlDQUFtQjtBQUN2QyxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsV0FBVztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixVQUFVO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsVUFBVTtBQUM1QjtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLE1BQU07QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxVQUFVO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FBV0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUIsNkNBQTZDLGNBQWM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQSxJQUFJO0FBQ0osV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQSxJQUFJO0FBQ0oscUNBQXFDLFFBQVE7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFlBQVk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxzQkFBc0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxJQUFJO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLHVDQUF1QyxhQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxLQUFLLEtBQUsscUJBQXFCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVEsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEtBQUssU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHFCQUFxQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxRQUFRO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXJGLHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLCtGQUErRixpQ0FBbUI7QUFDbEgsMEZBQTBGLGlDQUFtQjtBQUM3RyxvR0FBb0csaUNBQW1CO0FBQ3ZILDBHQUEwRyxpQ0FBbUI7QUFDN0gsOEZBQThGLGlDQUFtQjtBQUNqSCxzR0FBc0csaUNBQW1CO0FBQ3pILG9HQUFvRyxpQ0FBbUI7QUFDdkgsK0ZBQStGLGlDQUFtQjtBQUNsSCx3R0FBd0csaUNBQW1CO0FBQzNILHdHQUF3RyxpQ0FBbUI7QUFDM0gseUhBQXlILGlDQUFtQjtBQUM1SSwwRkFBMEYsaUNBQW1CO0FBQzdHLHlHQUF5RyxpQ0FBbUI7QUFDNUgsc0dBQXNHLGlDQUFtQjtBQUN6SCx1R0FBdUcsaUNBQW1CO0FBQzFILDBFQUEwRSxpQ0FBbUI7QUFDN0YseUVBQXlFLGlDQUFtQjs7Ozs7Ozs7Ozs7Ozs7OztBQWdCNUYsNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9CO0FBQy9OLDZCQUE2QixtQ0FBbUM7QUFDaEUsOEJBQThCLDBDQUEwQywrQkFBK0Isb0JBQW9CLG1DQUFtQyxvQ0FBb0MsdUVBQXVFOzs7QUFHelE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWSxnQkFBZ0IsV0FBVztBQUMzRCx3QkFBd0IsR0FBRztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixRQUFRLEdBQUcsUUFBUTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixHQUFHO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixRQUFRLEdBQUcsUUFBUSxHQUFHLFdBQVcsR0FBRyxXQUFXO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsUUFBUTtBQUM5QjtBQUNBO0FBQ0EsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxHQUFHO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGLEtBQUs7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtGQUErRixLQUFLO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHFCQUFxQixzQkFBc0IsRUFBRSxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSwyQkFBMkIsRUFBRSxtQkFBbUIsRUFBRTtBQUM3SztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RixNQUFNO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLHVDQUF1QyxVQUFVO0FBQ2pELG1DQUFtQyxXQUFXO0FBQzlDLHlDQUF5QyxFQUFFLGtCQUFrQixFQUFFO0FBQy9ELHNDQUFzQyxFQUFFLGtCQUFrQixFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0Qix5RkFBeUYsaUNBQW1CO0FBQzVHLDBFQUEwRSxpQ0FBbUI7QUFDN0Ysd0VBQXdFLGlDQUFtQjs7OztBQUkzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ04sbUJBQW1CLFFBQVE7QUFDM0Isb0JBQW9CLFFBQVE7QUFDNUIscUJBQXFCLFlBQVk7QUFDakMsc0JBQXNCLGFBQWE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixlQUFlLEdBQUcsR0FBRztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixPQUFPO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE9BQU87QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixXQUFXO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixlQUFlLEdBQUcsR0FBRztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLE9BQU87QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixPQUFPLEVBQUUsTUFBTTtBQUNyQyxzQkFBc0Isb0JBQW9CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixFQUFFO0FBQzVCO0FBQ0EsVUFBVTtBQUNWLDBCQUEwQixFQUFFO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7O0FBR3JGO0FBQ0EsaUNBQW1CLEdBQUcsMEJBQW1CO0FBQ3pDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBLDBCQUEwQixpQ0FBbUI7QUFDN0M7QUFDQSwrQkFBK0IsaUNBQW1CO0FBQ2xEO0FBQ0EsaUNBQWlDLGlDQUFtQjtBQUNwRDtBQUNBLHFDQUFxQyxpQ0FBbUI7QUFDeEQ7QUFDQSxpQ0FBaUMsaUNBQW1CO0FBQ3BEO0FBQ0EsbUNBQW1DLGlDQUFtQjtBQUN0RDtBQUNBLHlDQUF5QyxpQ0FBbUI7QUFDNUQ7QUFDQSwwQkFBMEIsaUNBQW1CO0FBQzdDO0FBQ0Esb0JBQW9CLGlDQUFtQjtBQUN2QztBQUNBLFdBQVcsaUNBQW1CO0FBQzlCO0FBQ0Esb0JBQW9CLGlDQUFtQjtBQUN2QztBQUNBLGtDQUFrQyxpQ0FBbUI7QUFDckQ7QUFDQSwyQkFBMkIsaUNBQW1CO0FBQzlDO0FBQ0EsWUFBWSxpQ0FBbUI7QUFDL0I7QUFDQSx1QkFBdUIsaUNBQW1CO0FBQzFDLENBQUM7Ozs7Ozs7O0FBUUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLEtBQUs7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixpQ0FBbUI7QUFDdEM7QUFDQSxzQkFBc0IsaUNBQW1CO0FBQ3pDLENBQUM7Ozs7Ozs7QUFPRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG9CQUFvQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLGlDQUFtQjtBQUN4QztBQUNBLG9CQUFvQixpQ0FBbUI7QUFDdkMsQ0FBQzs7Ozs7Ozs7O0FBU0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTSxFQUFFLGdDQUFnQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxQkFBcUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixpQ0FBbUI7QUFDaEQ7QUFDQSw4QkFBOEIsaUNBQW1CO0FBQ2pELENBQUM7Ozs7Ozs7O0FBUUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEUsS0FBSztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLDRCQUE0QixpQkFBaUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXJGLHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQSxzQkFBc0I7QUFDdEIsd0VBQXdFLGlDQUFtQjtBQUMzRixrRUFBa0UsaUNBQW1CO0FBQ3JGLDBFQUEwRSxpQ0FBbUI7Ozs7QUFJN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLEtBQUs7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7OztBQUdyRjtBQUNBLGlDQUFtQixHQUFHLDBCQUFtQjtBQUN6QztBQUNBLENBQUM7O0FBRUQ7QUFDQSxxQkFBcUIsaUNBQW1CO0FBQ3hDO0FBQ0EsWUFBWSxpQ0FBbUI7QUFDL0I7QUFDQSxXQUFXLGlDQUFtQjtBQUM5QjtBQUNBLG9CQUFvQixpQ0FBbUI7QUFDdkMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGdCQUFnQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLGdDQUFnQyxRQUFRO0FBQ3hDLDBCQUEwQixrQkFBa0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELHdCQUF3QjtBQUN2RjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7O0FBT0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ2pCQUFnakIsZ0JBQWdCO0FBQ2hrQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscUJBQXFCO0FBQ2xELDRCQUE0QixxQkFBcUI7QUFDakQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLG9CQUFvQixxQkFBcUI7QUFDekMsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHVDQUF1QztBQUNyRTtBQUNBLGlDQUFpQyx5Q0FBeUM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsbURBQW1EO0FBQzFFO0FBQ0E7QUFDQSx3QkFBd0IscURBQXFEO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyw4Q0FBOEM7QUFDakYsb0NBQW9DLDhDQUE4QztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsS0FBSztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1Q0FBdUM7QUFDL0Q7QUFDQTtBQUNBLFFBQVE7QUFDUix3QkFBd0IsdUNBQXVDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLEtBQUs7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0Qix5RkFBeUYsaUNBQW1CO0FBQzVHLG9HQUFvRyxpQ0FBbUI7QUFDdkgsc0dBQXNHLGlDQUFtQjtBQUN6SCwwR0FBMEcsaUNBQW1CO0FBQzdILHNHQUFzRyxpQ0FBbUI7QUFDekgsd0dBQXdHLGlDQUFtQjtBQUMzSCw4R0FBOEcsaUNBQW1CO0FBQ2pJLCtGQUErRixpQ0FBbUI7Ozs7Ozs7OztBQVNsSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFdBQVc7QUFDL0I7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSw2Q0FBNkMsMEJBQW1CLEVBQUUsaUNBQW1COztBQUVyRixxQkFBcUIsaUNBQW1CLEdBQUcsMEJBQW1CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxvR0FBb0csaUNBQW1CO0FBQ3ZILDBHQUEwRyxpQ0FBbUI7QUFDN0gsOEZBQThGLGlDQUFtQjtBQUNqSCxzR0FBc0csaUNBQW1CO0FBQ3pILG9HQUFvRyxpQ0FBbUI7QUFDdkgsK0ZBQStGLGlDQUFtQjtBQUNsSCx3R0FBd0csaUNBQW1CO0FBQzNILHdHQUF3RyxpQ0FBbUI7QUFDM0gsd0hBQXdILGlDQUFtQjtBQUMzSSx5RkFBeUYsaUNBQW1CO0FBQzVHLHFHQUFxRyxpQ0FBbUI7QUFDeEgsdUdBQXVHLGlDQUFtQjtBQUMxSCwyR0FBMkcsaUNBQW1CO0FBQzlILHVHQUF1RyxpQ0FBbUI7QUFDMUgseUdBQXlHLGlDQUFtQjtBQUM1SCwrR0FBK0csaUNBQW1CO0FBQ2xJLGdHQUFnRyxpQ0FBbUI7QUFDbkgsd0dBQXdHLGlDQUFtQjtBQUMzSCxrR0FBa0csaUNBQW1CO0FBQ3JILGdHQUFnRyxpQ0FBbUI7QUFDbkgsOEZBQThGLGlDQUFtQjtBQUNqSCxpR0FBaUcsaUNBQW1CO0FBQ3BILHlFQUF5RSxpQ0FBbUI7QUFDNUYsMkVBQTJFLGlDQUFtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMscUVBQXFFLEVBQUUsV0FBVztBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyx3SUFBd0k7QUFDNUs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGFBQWEsR0FBRyxXQUFXO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsSUFBSTtBQUM3RTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTix3QkFBd0IsYUFBYSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsYUFBYTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTix3RUFBd0UsV0FBVztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ04sd0VBQXdFLFdBQVc7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXJGLHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQSxzQkFBc0I7QUFDdEIsb0dBQW9HLGlDQUFtQjtBQUN2SCwwR0FBMEcsaUNBQW1CO0FBQzdILDhGQUE4RixpQ0FBbUI7QUFDakgsc0dBQXNHLGlDQUFtQjtBQUN6SCxvR0FBb0csaUNBQW1CO0FBQ3ZILCtGQUErRixpQ0FBbUI7QUFDbEgsd0dBQXdHLGlDQUFtQjtBQUMzSCx3R0FBd0csaUNBQW1CO0FBQzNILHdIQUF3SCxpQ0FBbUI7QUFDM0kseUZBQXlGLGlDQUFtQjtBQUM1Ryx5RUFBeUUsaUNBQW1CO0FBQzVGLDJFQUEyRSxpQ0FBbUI7Ozs7Ozs7Ozs7Ozs7QUFhOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFHQUFxRyxJQUFJO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxNQUFNLEdBQUcsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSw2Q0FBNkMsMEJBQW1CLEVBQUUsaUNBQW1COztBQUVyRixxQkFBcUIsaUNBQW1CLEdBQUcsMEJBQW1CO0FBQzlEO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsb0dBQW9HLGlDQUFtQjtBQUN2SCxzR0FBc0csaUNBQW1CO0FBQ3pILDBHQUEwRyxpQ0FBbUI7QUFDN0gsc0dBQXNHLGlDQUFtQjtBQUN6SCx3R0FBd0csaUNBQW1CO0FBQzNILDhHQUE4RyxpQ0FBbUI7QUFDakksK0ZBQStGLGlDQUFtQjtBQUNsSCx5RkFBeUYsaUNBQW1CO0FBQzVHLG1HQUFtRyxpQ0FBbUI7QUFDdEgsd0VBQXdFLGlDQUFtQjs7Ozs7Ozs7Ozs7QUFXM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsMEZBQTBGLGtCQUFrQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Ysd0ZBQXdGLHNCQUFzQixNQUFNLEdBQUc7QUFDdkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVyxFQUFFLHNCQUFzQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsUUFBUTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUyxXQUFXLEVBQUU7QUFDOUQsOEJBQThCLGVBQWUsZUFBZSxFQUFFLE1BQU0sS0FBSztBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw2QkFBNkI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixlQUFlLFNBQVMsV0FBVyxFQUFFO0FBQ2pFO0FBQ0E7QUFDQSwwQkFBMEIsZUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFDdEUsTUFBTTtBQUNOLGdDQUFnQyw2QkFBNkI7QUFDN0Q7QUFDQSxzQ0FBc0MsNkJBQTZCLElBQUk7QUFDdkU7QUFDQSwwQkFBMEIsZUFBZSw0QkFBNEIsRUFBRSxFQUFFLElBQUksTUFBTSxLQUFLO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsdUdBQXVHLEdBQUc7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0Qix3RUFBd0UsaUNBQW1COztBQUUzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXJGLHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQSxzQkFBc0I7QUFDdEIseUZBQXlGLGlDQUFtQjtBQUM1Ryx3RUFBd0UsaUNBQW1CO0FBQzNGLDBFQUEwRSxpQ0FBbUI7Ozs7QUFJN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVyxHQUFHLGFBQWE7QUFDeEU7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7OztBQUdyRjtBQUNBLGlDQUFtQixHQUFHLDBCQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSxXQUFXLGlDQUFtQjtBQUM5QjtBQUNBLG9CQUFvQixpQ0FBbUI7QUFDdkM7QUFDQSw4QkFBOEIsaUNBQW1CO0FBQ2pELENBQUM7Ozs7QUFJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscURBQXFELE9BQU87QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxFQUFFO0FBQ2hEO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixpQ0FBbUI7QUFDdkMsQ0FBQzs7OztBQUlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsT0FBTywwQkFBMEIsSUFBSTtBQUNsSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDRCQUE0QiwwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXBFLGlDQUFtQixvR0FBb0c7QUFDdkgscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0Qix5RkFBeUYsaUNBQW1CO0FBQzVHLG9HQUFvRyxpQ0FBbUI7QUFDdkgsMEdBQTBHLGlDQUFtQjtBQUM3SCw4RkFBOEYsaUNBQW1CO0FBQ2pILHNHQUFzRyxpQ0FBbUI7QUFDekgsb0dBQW9HLGlDQUFtQjtBQUN2SCwrRkFBK0YsaUNBQW1CO0FBQ2xILHdHQUF3RyxpQ0FBbUI7QUFDM0gsd0dBQXdHLGlDQUFtQjtBQUMzSCx3SEFBd0gsaUNBQW1CO0FBQzNJLHlFQUF5RSxpQ0FBbUI7QUFDNUYsMkVBQTJFLGlDQUFtQjs7Ozs7Ozs7Ozs7OztBQWE5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsVUFBVTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0R0FBNEcsVUFBVTtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLE1BQU0sR0FBRyxRQUFRO0FBQ3hEO0FBQ0E7QUFDQSw0R0FBNEcsVUFBVTtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0dBQXdHLEtBQUs7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEVBQUUsV0FBVyxnQ0FBZ0M7O0FBRTdDLE9BQU87O0FBRVA7QUFDQSw0QkFBNEIsMEJBQW1CLEVBQUUsaUNBQW1COztBQUVwRSxpQ0FBbUIsb0dBQW9HO0FBQ3ZILHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsMEZBQTBGLGlDQUFtQjtBQUM3RyxvR0FBb0csaUNBQW1CO0FBQ3ZILDBHQUEwRyxpQ0FBbUI7QUFDN0gsOEZBQThGLGlDQUFtQjtBQUNqSCxzR0FBc0csaUNBQW1CO0FBQ3pILG9HQUFvRyxpQ0FBbUI7QUFDdkgsK0ZBQStGLGlDQUFtQjtBQUNsSCx3R0FBd0csaUNBQW1CO0FBQzNILHdHQUF3RyxpQ0FBbUI7QUFDM0gsd0hBQXdILGlDQUFtQjtBQUMzSSwwRUFBMEUsaUNBQW1CO0FBQzdGLHlFQUF5RSxpQ0FBbUI7Ozs7Ozs7Ozs7Ozs7QUFhNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSxXQUFXLGdDQUFnQzs7QUFFN0MsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXJGLHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQSxzQkFBc0I7QUFDdEIsd0VBQXdFLGlDQUFtQjtBQUMzRiwrRUFBK0UsaUNBQW1COzs7QUFHbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSLG1HQUFtRyxRQUFRO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HLFNBQVM7QUFDNUc7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVHQUF1RyxHQUFHO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSx1R0FBdUcsR0FBRztBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsdUdBQXVHLEdBQUc7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLHVHQUF1RyxHQUFHO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRkFBK0YsYUFBYTtBQUM1RztBQUNBO0FBQ0EsZ0ZBQWdGLFdBQVc7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRyxHQUFHO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsR0FBRyxHQUFHLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSw2Q0FBNkMsMEJBQW1CLEVBQUUsaUNBQW1COztBQUVyRixxQkFBcUIsaUNBQW1CLEdBQUcsMEJBQW1CO0FBQzlEO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSx5RkFBeUYsaUNBQW1CO0FBQzVHLDBGQUEwRixpQ0FBbUI7QUFDN0csd0VBQXdFLGlDQUFtQjtBQUMzRiwwRUFBMEUsaUNBQW1COzs7OztBQUs3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0IsS0FBSyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMENBQTBDO0FBQ2pFLHNCQUFzQiwwQ0FBMEM7QUFDaEUsSUFBSTtBQUNKLHVCQUF1QixlQUFlLEVBQUUsZ0JBQWdCO0FBQ3hELHNCQUFzQixlQUFlLEVBQUUsZUFBZTtBQUN0RDtBQUNBLHlCQUF5QixlQUFlLEVBQUUsc0JBQXNCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxvQkFBb0IsaUJBQWlCLEtBQUssV0FBVztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsNEJBQTRCLDRCQUE0QjtBQUN4RDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsaUJBQWlCLE9BQU8sVUFBVTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssZ0JBQWdCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0lBQXNJO0FBQ3RJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxRQUFRO0FBQzFEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUDtBQUNBLDZDQUE2QywwQkFBbUIsRUFBRSxpQ0FBbUI7O0FBRXJGLHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQSxzQkFBc0I7QUFDdEIsb0dBQW9HLGlDQUFtQjtBQUN2SCwwR0FBMEcsaUNBQW1CO0FBQzdILDhGQUE4RixpQ0FBbUI7QUFDakgsc0dBQXNHLGlDQUFtQjtBQUN6SCxvR0FBb0csaUNBQW1CO0FBQ3ZILCtGQUErRixpQ0FBbUI7QUFDbEgsd0dBQXdHLGlDQUFtQjtBQUMzSCx3R0FBd0csaUNBQW1CO0FBQzNILHdIQUF3SCxpQ0FBbUI7QUFDM0kseUZBQXlGLGlDQUFtQjtBQUM1Ryx3R0FBd0csaUNBQW1CO0FBQzNILGlHQUFpRyxpQ0FBbUI7QUFDcEgseUVBQXlFLGlDQUFtQjtBQUM1RiwyRUFBMkUsaUNBQW1COzs7Ozs7Ozs7Ozs7Ozs7QUFlOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSw2Q0FBNkMsMEJBQW1CLEVBQUUsaUNBQW1COztBQUVyRixxQkFBcUIsaUNBQW1CLEdBQUcsMEJBQW1CO0FBQzlEO0FBQ0Esc0JBQXNCO0FBQ3RCLHlGQUF5RixpQ0FBbUI7QUFDNUcscUVBQXFFLGlDQUFtQjs7O0FBR3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDJCQUEyQixnQkFBZ0IsR0FBRyxPQUFPO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx3Q0FBd0M7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0NBQXdDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0Qix5RkFBeUYsaUNBQW1COztBQUU1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVA7QUFDQSw0QkFBNEIsMEJBQW1CLEVBQUUsaUNBQW1COztBQUVwRSxpQ0FBbUIsb0dBQW9HO0FBQ3ZILHFCQUFxQixpQ0FBbUIsR0FBRywwQkFBbUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsd0VBQXdFLGlDQUFtQjtBQUMzRix3RUFBd0UsaUNBQW1CO0FBQzNGLGtGQUFrRixpQ0FBbUI7QUFDckcsK0VBQStFLGlDQUFtQjtBQUNsRyxtR0FBbUcsaUNBQW1CO0FBQ3RILGlGQUFpRixpQ0FBbUI7QUFDcEcscUZBQXFGLGlDQUFtQjtBQUN4Ryx3RkFBd0YsaUNBQW1CO0FBQzNHLCtFQUErRSxpQ0FBbUI7QUFDbEcsbUZBQW1GLGlDQUFtQjtBQUN0RyxxRkFBcUYsaUNBQW1CO0FBQ3hHLCtFQUErRSxpQ0FBbUI7QUFDbEc7QUFDQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFLFdBQVcsZ0NBQWdDOztBQUU3QyxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0QiwwRkFBMEYsaUNBQW1CO0FBQzdHLGlFQUFpRSxpQ0FBbUI7OztBQUdwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFdBQVc7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFlBQVk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxXQUFXO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBLHNCQUFzQjtBQUN0QixvR0FBb0csaUNBQW1CO0FBQ3ZILDBHQUEwRyxpQ0FBbUI7QUFDN0gsOEZBQThGLGlDQUFtQjtBQUNqSCxzR0FBc0csaUNBQW1CO0FBQ3pILG9HQUFvRyxpQ0FBbUI7QUFDdkgsK0ZBQStGLGlDQUFtQjtBQUNsSCx3R0FBd0csaUNBQW1CO0FBQzNILHdHQUF3RyxpQ0FBbUI7QUFDM0gsd0hBQXdILGlDQUFtQjtBQUMzSSwwRkFBMEYsaUNBQW1CO0FBQzdHLGtFQUFrRSxpQ0FBbUI7Ozs7Ozs7Ozs7OztBQVlyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPOztBQUVQO0FBQ0EsNkNBQTZDLDBCQUFtQixFQUFFLGlDQUFtQjs7QUFFckYscUJBQXFCLGlDQUFtQixHQUFHLDBCQUFtQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLDBGQUEwRixpQ0FBbUI7QUFDN0csd0dBQXdHLGlDQUFtQjtBQUMzSCxxR0FBcUcsaUNBQW1CO0FBQ3hILHNHQUFzRyxpQ0FBbUI7QUFDekgseUZBQXlGLGlDQUFtQjtBQUM1RyxvR0FBb0csaUNBQW1CO0FBQ3ZILDBHQUEwRyxpQ0FBbUI7QUFDN0gsOEZBQThGLGlDQUFtQjtBQUNqSCxzR0FBc0csaUNBQW1CO0FBQ3pILG9HQUFvRyxpQ0FBbUI7QUFDdkgsZ0dBQWdHLGlDQUFtQjtBQUNuSCx5R0FBeUcsaUNBQW1CO0FBQzVILHlHQUF5RyxpQ0FBbUI7QUFDNUgseUhBQXlILGlDQUFtQjtBQUM1SSxnR0FBZ0csaUNBQW1COzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JuSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLElBQUk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsSUFBSTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsSUFBSTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdGQUFnRixDQUF3cEI7QUFDeHVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixvQ0FBb0MsR0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVAsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUNBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGLGlDQUFtQjtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVSxpQ0FBbUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxnSEFBZ0g7QUFDaEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxpQ0FBbUI7QUFDN0I7QUFDQSxlQUFlLGlDQUFtQix3QkFBd0IsaUNBQW1CO0FBQzdFLG1EQUFtRCx3Q0FBd0M7QUFDM0Y7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUNBQW1CO0FBQzdCLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDBCQUFtQixHQUFHLGlDQUFtQjtBQUN0RCxTQUFTLDBCQUFtQiw2REFBNkQsMEJBQW1CO0FBQzVHLGlEQUFpRCwwQkFBbUI7QUFDcEUsd0RBQXdELDBCQUFtQjtBQUMzRSw2REFBNkQsMEJBQW1CO0FBQ2hGLHVEQUF1RCwwQkFBbUI7QUFDMUUsNERBQTRELDBCQUFtQjtBQUMvRSxrREFBa0QsMEJBQW1CO0FBQ3JFLGlEQUFpRCwwQkFBbUI7QUFDcEUsc0RBQXNELDBCQUFtQjtBQUN6RSw4Q0FBOEMsMEJBQW1CO0FBQ2pFLGdEQUFnRCwwQkFBbUI7QUFDbkUsNENBQTRDLDBCQUFtQjtBQUMvRCw4Q0FBOEMsMEJBQW1CO0FBQ2pFLHNEQUFzRCwwQkFBbUI7QUFDekUsNENBQTRDLDBCQUFtQjtBQUMvRCxzREFBc0QsMEJBQW1CO0FBQ3pFLHNEQUFzRCwwQkFBbUI7QUFDekUsc0NBQXNDLDBCQUFtQjtBQUN6RCwyQ0FBMkMsMEJBQW1CO0FBQzlELHdEQUF3RCwwQkFBbUI7QUFDM0UsZ0RBQWdELDBCQUFtQjtBQUNuRSw0Q0FBNEMsMEJBQW1CO0FBQy9ELG9EQUFvRCwwQkFBbUI7QUFDdkUsaURBQWlELDBCQUFtQjtBQUNwRSxnREFBZ0QsMEJBQW1CO0FBQ25FLG9EQUFvRCwwQkFBbUI7QUFDdkUsOERBQThELDBCQUFtQjtBQUNqRiw4REFBOEQsMEJBQW1CO0FBQ2pGLHVDQUF1QywwQkFBbUI7QUFDMUQsaURBQWlELDBCQUFtQjtBQUNwRSwyQ0FBMkMsMEJBQW1CO0FBQzlELHdDQUF3QywwQkFBbUI7QUFDM0QseURBQXlELDBCQUFtQjtBQUM1RSw0Q0FBNEMsMEJBQW1CO0FBQy9ELDhDQUE4QywwQkFBbUI7QUFDakUscURBQXFELDBCQUFtQjtBQUN4RSx3REFBd0QsMEJBQW1CO0FBQzNFLHFEQUFxRCwwQkFBbUI7QUFDeEUsK0NBQStDLDBCQUFtQjtBQUNsRSw0Q0FBNEMsMEJBQW1CO0FBQy9ELGdEQUFnRCwwQkFBbUI7QUFDbkUsbURBQW1ELDBCQUFtQjtBQUN0RSxrREFBa0QsMEJBQW1CO0FBQ3JFLHFEQUFxRCwwQkFBbUI7QUFDeEUseUNBQXlDLDBCQUFtQjtBQUM1RCxrREFBa0QsMEJBQW1CO0FBQ3JFLDBDQUEwQywwQkFBbUI7QUFDN0QsU0FBcTlFO0FBQ3I5RTs7QUFFQSxnQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BjYXNwaW5ndXMvbHQvLi9zcmMvdmVuZG9yL3BkZmpzLTQuMC4zNzktbGVnYWN5LWRpc3QvYnVpbGQvcGRmLm1qcz8yYTg5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlXG4gKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlXG4gKlxuICogQ29weXJpZ2h0IDIwMjMgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZVxuICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZVxuICovXG5cbi8qKioqKiovIHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gMTc4Mjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzMxNik7XG52YXIgdHJ5VG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3NjIpO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuIGlmIChpc0NhbGxhYmxlKGFyZ3VtZW50KSlcbiAgcmV0dXJuIGFyZ3VtZW50O1xuIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0OTU4OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzE2KTtcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ29iamVjdCcgfHwgaXNDYWxsYWJsZShhcmd1bWVudCkpXG4gIHJldHVybiBhcmd1bWVudDtcbiB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU2OTA6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGhhcyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKS5oYXMpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiBoYXMoaXQpO1xuIHJldHVybiBpdDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1ODM0OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjU4KTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFByb3RvdHlwZSkge1xuIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKVxuICByZXR1cm4gaXQ7XG4gdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDcxOTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2MzMpO1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gaWYgKGlzT2JqZWN0KGFyZ3VtZW50KSlcbiAgcmV0dXJuIGFyZ3VtZW50O1xuIHRocm93IG5ldyAkVHlwZUVycm9yKCRTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTExNTpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIERhdGFWaWV3ICE9ICd1bmRlZmluZWQnO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzU4NTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdW5jdXJyeVRoaXNBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5OSk7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oODM3NCk7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXNBY2Nlc3NvcihBcnJheUJ1ZmZlci5wcm90b3R5cGUsICdieXRlTGVuZ3RoJywgJ2dldCcpIHx8IGZ1bmN0aW9uIChPKSB7XG4gaWYgKGNsYXNzb2YoTykgIT09ICdBcnJheUJ1ZmZlcicpXG4gIHRocm93IG5ldyAkVHlwZUVycm9yKCdBcnJheUJ1ZmZlciBleHBlY3RlZCcpO1xuIHJldHVybiBPLmJ5dGVMZW5ndGg7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTgyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTg1KTtcbnZhciBzbGljZSA9IHVuY3VycnlUaGlzKEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPKSB7XG4gaWYgKGFycmF5QnVmZmVyQnl0ZUxlbmd0aChPKSAhPT0gMClcbiAgcmV0dXJuIGZhbHNlO1xuIHRyeSB7XG4gIHNsaWNlKE8sIDAsIDApO1xuICByZXR1cm4gZmFsc2U7XG4gfSBjYXRjaCAoZXJyb3IpIHtcbiAgcmV0dXJuIHRydWU7XG4gfVxufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDQzNTg6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5OCk7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0MDMpO1xudmFyIHVuY3VycnlUaGlzQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOTkpO1xudmFyIHRvSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1NDgpO1xudmFyIGlzRGV0YWNoZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4Mik7XG52YXIgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTg1KTtcbnZhciBkZXRhY2hUcmFuc2ZlcmFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxMjYpO1xudmFyIFBST1BFUl9TVFJVQ1RVUkVEX0NMT05FX1RSQU5TRkVSID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODM3KTtcbnZhciBzdHJ1Y3R1cmVkQ2xvbmUgPSBnbG9iYWwuc3RydWN0dXJlZENsb25lO1xudmFyIEFycmF5QnVmZmVyID0gZ2xvYmFsLkFycmF5QnVmZmVyO1xudmFyIERhdGFWaWV3ID0gZ2xvYmFsLkRhdGFWaWV3O1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGU7XG52YXIgRGF0YVZpZXdQcm90b3R5cGUgPSBEYXRhVmlldy5wcm90b3R5cGU7XG52YXIgc2xpY2UgPSB1bmN1cnJ5VGhpcyhBcnJheUJ1ZmZlclByb3RvdHlwZS5zbGljZSk7XG52YXIgaXNSZXNpemFibGUgPSB1bmN1cnJ5VGhpc0FjY2Vzc29yKEFycmF5QnVmZmVyUHJvdG90eXBlLCAncmVzaXphYmxlJywgJ2dldCcpO1xudmFyIG1heEJ5dGVMZW5ndGggPSB1bmN1cnJ5VGhpc0FjY2Vzc29yKEFycmF5QnVmZmVyUHJvdG90eXBlLCAnbWF4Qnl0ZUxlbmd0aCcsICdnZXQnKTtcbnZhciBnZXRJbnQ4ID0gdW5jdXJyeVRoaXMoRGF0YVZpZXdQcm90b3R5cGUuZ2V0SW50OCk7XG52YXIgc2V0SW50OCA9IHVuY3VycnlUaGlzKERhdGFWaWV3UHJvdG90eXBlLnNldEludDgpO1xubW9kdWxlLmV4cG9ydHMgPSAoUFJPUEVSX1NUUlVDVFVSRURfQ0xPTkVfVFJBTlNGRVIgfHwgZGV0YWNoVHJhbnNmZXJhYmxlKSAmJiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIsIG5ld0xlbmd0aCwgcHJlc2VydmVSZXNpemFiaWxpdHkpIHtcbiB2YXIgYnl0ZUxlbmd0aCA9IGFycmF5QnVmZmVyQnl0ZUxlbmd0aChhcnJheUJ1ZmZlcik7XG4gdmFyIG5ld0J5dGVMZW5ndGggPSBuZXdMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ5dGVMZW5ndGggOiB0b0luZGV4KG5ld0xlbmd0aCk7XG4gdmFyIGZpeGVkTGVuZ3RoID0gIWlzUmVzaXphYmxlIHx8ICFpc1Jlc2l6YWJsZShhcnJheUJ1ZmZlcik7XG4gdmFyIG5ld0J1ZmZlcjtcbiBpZiAoaXNEZXRhY2hlZChhcnJheUJ1ZmZlcikpXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5QnVmZmVyIGlzIGRldGFjaGVkJyk7XG4gaWYgKFBST1BFUl9TVFJVQ1RVUkVEX0NMT05FX1RSQU5TRkVSKSB7XG4gIGFycmF5QnVmZmVyID0gc3RydWN0dXJlZENsb25lKGFycmF5QnVmZmVyLCB7IHRyYW5zZmVyOiBbYXJyYXlCdWZmZXJdIH0pO1xuICBpZiAoYnl0ZUxlbmd0aCA9PT0gbmV3Qnl0ZUxlbmd0aCAmJiAocHJlc2VydmVSZXNpemFiaWxpdHkgfHwgZml4ZWRMZW5ndGgpKVxuICAgcmV0dXJuIGFycmF5QnVmZmVyO1xuIH1cbiBpZiAoYnl0ZUxlbmd0aCA+PSBuZXdCeXRlTGVuZ3RoICYmICghcHJlc2VydmVSZXNpemFiaWxpdHkgfHwgZml4ZWRMZW5ndGgpKSB7XG4gIG5ld0J1ZmZlciA9IHNsaWNlKGFycmF5QnVmZmVyLCAwLCBuZXdCeXRlTGVuZ3RoKTtcbiB9IGVsc2Uge1xuICB2YXIgb3B0aW9ucyA9IHByZXNlcnZlUmVzaXphYmlsaXR5ICYmICFmaXhlZExlbmd0aCAmJiBtYXhCeXRlTGVuZ3RoID8geyBtYXhCeXRlTGVuZ3RoOiBtYXhCeXRlTGVuZ3RoKGFycmF5QnVmZmVyKSB9IDogdW5kZWZpbmVkO1xuICBuZXdCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobmV3Qnl0ZUxlbmd0aCwgb3B0aW9ucyk7XG4gIHZhciBhID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgdmFyIGIgPSBuZXcgRGF0YVZpZXcobmV3QnVmZmVyKTtcbiAgdmFyIGNvcHlMZW5ndGggPSBtaW4obmV3Qnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29weUxlbmd0aDsgaSsrKVxuICAgc2V0SW50OChiLCBpLCBnZXRJbnQ4KGEsIGkpKTtcbiB9XG4gaWYgKCFQUk9QRVJfU1RSVUNUVVJFRF9DTE9ORV9UUkFOU0ZFUilcbiAgZGV0YWNoVHJhbnNmZXJhYmxlKGFycmF5QnVmZmVyKTtcbiByZXR1cm4gbmV3QnVmZmVyO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU4NjE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIE5BVElWRV9BUlJBWV9CVUZGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxMTUpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDApO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5OCk7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzMxNik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2MzMpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MzI5KTtcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oOTc2Mik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MjkzKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDQxKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2OTEpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2NTgpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTc2KTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oOTc2Myk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMjkyKTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1NjEpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NDkpO1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5O1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlO1xudmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTtcbnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgVFlQRURfQVJSQVlfVEFHID0gdWlkKCdUWVBFRF9BUlJBWV9UQUcnKTtcbnZhciBUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUiA9ICdUeXBlZEFycmF5Q29uc3RydWN0b3InO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBOQVRJVkVfQVJSQVlfQlVGRkVSICYmICEhc2V0UHJvdG90eXBlT2YgJiYgY2xhc3NvZihnbG9iYWwub3BlcmEpICE9PSAnT3BlcmEnO1xudmFyIFRZUEVEX0FSUkFZX1RBR19SRVFVSVJFRCA9IGZhbHNlO1xudmFyIE5BTUUsIENvbnN0cnVjdG9yLCBQcm90b3R5cGU7XG52YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gSW50OEFycmF5OiAxLFxuIFVpbnQ4QXJyYXk6IDEsXG4gVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gSW50MTZBcnJheTogMixcbiBVaW50MTZBcnJheTogMixcbiBJbnQzMkFycmF5OiA0LFxuIFVpbnQzMkFycmF5OiA0LFxuIEZsb2F0MzJBcnJheTogNCxcbiBGbG9hdDY0QXJyYXk6IDhcbn07XG52YXIgQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0ID0ge1xuIEJpZ0ludDY0QXJyYXk6IDgsXG4gQmlnVWludDY0QXJyYXk6IDhcbn07XG52YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gaWYgKCFpc09iamVjdChpdCkpXG4gIHJldHVybiBmYWxzZTtcbiB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTtcbiByZXR1cm4ga2xhc3MgPT09ICdEYXRhVmlldycgfHwgaGFzT3duKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBrbGFzcykgfHwgaGFzT3duKEJpZ0ludEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoaXQpIHtcbiB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihpdCk7XG4gaWYgKCFpc09iamVjdChwcm90bykpXG4gIHJldHVybjtcbiB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb3RvKTtcbiByZXR1cm4gc3RhdGUgJiYgaGFzT3duKHN0YXRlLCBUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUikgPyBzdGF0ZVtUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUl0gOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IocHJvdG8pO1xufTtcbnZhciBpc1R5cGVkQXJyYXkgPSBmdW5jdGlvbiAoaXQpIHtcbiBpZiAoIWlzT2JqZWN0KGl0KSlcbiAgcmV0dXJuIGZhbHNlO1xuIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuIHJldHVybiBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKSB8fCBoYXNPd24oQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBrbGFzcyk7XG59O1xudmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gaWYgKGlzVHlwZWRBcnJheShpdCkpXG4gIHJldHVybiBpdDtcbiB0aHJvdyBuZXcgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXknKTtcbn07XG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7XG4gaWYgKGlzQ2FsbGFibGUoQykgJiYgKCFzZXRQcm90b3R5cGVPZiB8fCBpc1Byb3RvdHlwZU9mKFR5cGVkQXJyYXksIEMpKSlcbiAgcmV0dXJuIEM7XG4gdGhyb3cgbmV3IFR5cGVFcnJvcih0cnlUb1N0cmluZyhDKSArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3InKTtcbn07XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQsIG9wdGlvbnMpIHtcbiBpZiAoIURFU0NSSVBUT1JTKVxuICByZXR1cm47XG4gaWYgKGZvcmNlZClcbiAgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZSwgS0VZKSlcbiAgICB0cnkge1xuICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgIHRyeSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlW0tFWV0gPSBwcm9wZXJ0eTtcbiAgICAgfSBjYXRjaCAoZXJyb3IyKSB7XG4gICAgIH1cbiAgICB9XG4gIH1cbiBpZiAoIVR5cGVkQXJyYXlQcm90b3R5cGVbS0VZXSB8fCBmb3JjZWQpIHtcbiAgZGVmaW5lQnVpbHRJbihUeXBlZEFycmF5UHJvdG90eXBlLCBLRVksIGZvcmNlZCA/IHByb3BlcnR5IDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSwgb3B0aW9ucyk7XG4gfVxufTtcbnZhciBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuIHZhciBBUlJBWSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuIGlmICghREVTQ1JJUFRPUlMpXG4gIHJldHVybjtcbiBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgaWYgKGZvcmNlZClcbiAgIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzT3duKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgS0VZKSlcbiAgICAgdHJ5IHtcbiAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXTtcbiAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgfVxuICAgfVxuICBpZiAoIVR5cGVkQXJyYXlbS0VZXSB8fCBmb3JjZWQpIHtcbiAgIHRyeSB7XG4gICAgcmV0dXJuIGRlZmluZUJ1aWx0SW4oVHlwZWRBcnJheSwgS0VZLCBmb3JjZWQgPyBwcm9wZXJ0eSA6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgVHlwZWRBcnJheVtLRVldIHx8IHByb3BlcnR5KTtcbiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICB9XG4gIH0gZWxzZVxuICAgcmV0dXJuO1xuIH1cbiBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07XG4gIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKCFUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXSB8fCBmb3JjZWQpKSB7XG4gICBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgS0VZLCBwcm9wZXJ0eSk7XG4gIH1cbiB9XG59O1xuZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gQ29uc3RydWN0b3IgPSBnbG9iYWxbTkFNRV07XG4gUHJvdG90eXBlID0gQ29uc3RydWN0b3IgJiYgQ29uc3RydWN0b3IucHJvdG90eXBlO1xuIGlmIChQcm90b3R5cGUpXG4gIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG4gZWxzZVxuICBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gZmFsc2U7XG59XG5mb3IgKE5BTUUgaW4gQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gQ29uc3RydWN0b3IgPSBnbG9iYWxbTkFNRV07XG4gUHJvdG90eXBlID0gQ29uc3RydWN0b3IgJiYgQ29uc3RydWN0b3IucHJvdG90eXBlO1xuIGlmIChQcm90b3R5cGUpXG4gIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG59XG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWlzQ2FsbGFibGUoVHlwZWRBcnJheSkgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gVHlwZWRBcnJheSA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG4gfTtcbiBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUylcbiAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICBpZiAoZ2xvYmFsW05BTUVdKVxuICAgIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXSwgVHlwZWRBcnJheSk7XG4gIH1cbn1cbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhVHlwZWRBcnJheVByb3RvdHlwZSB8fCBUeXBlZEFycmF5UHJvdG90eXBlID09PSBPYmplY3RQcm90b3R5cGUpIHtcbiBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheS5wcm90b3R5cGU7XG4gaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpXG4gIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgaWYgKGdsb2JhbFtOQU1FXSlcbiAgICBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0ucHJvdG90eXBlLCBUeXBlZEFycmF5UHJvdG90eXBlKTtcbiAgfVxufVxuaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUpICE9PSBUeXBlZEFycmF5UHJvdG90eXBlKSB7XG4gc2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpO1xufVxuaWYgKERFU0NSSVBUT1JTICYmICFoYXNPd24oVHlwZWRBcnJheVByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiBUWVBFRF9BUlJBWV9UQUdfUkVRVUlSRUQgPSB0cnVlO1xuIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gaXNPYmplY3QodGhpcykgPyB0aGlzW1RZUEVEX0FSUkFZX1RBR10gOiB1bmRlZmluZWQ7XG4gIH1cbiB9KTtcbiBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpXG4gIGlmIChnbG9iYWxbTkFNRV0pIHtcbiAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWxbTkFNRV0sIFRZUEVEX0FSUkFZX1RBRywgTkFNRSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MsXG4gVFlQRURfQVJSQVlfVEFHOiBUWVBFRF9BUlJBWV9UQUdfUkVRVUlSRUQgJiYgVFlQRURfQVJSQVlfVEFHLFxuIGFUeXBlZEFycmF5OiBhVHlwZWRBcnJheSxcbiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yOiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yLFxuIGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlNZXRob2QsXG4gZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDogZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCxcbiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3I6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiBpc1ZpZXc6IGlzVmlldyxcbiBpc1R5cGVkQXJyYXk6IGlzVHlwZWRBcnJheSxcbiBUeXBlZEFycmF5OiBUeXBlZEFycmF5LFxuIFR5cGVkQXJyYXlQcm90b3R5cGU6IFR5cGVkQXJyYXlQcm90b3R5cGVcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MDAzOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDUxKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBsaXN0LCAkbGVuZ3RoKSB7XG4gdmFyIGluZGV4ID0gMDtcbiB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyAkbGVuZ3RoIDogbGVuZ3RoT2ZBcnJheUxpa2UobGlzdCk7XG4gdmFyIHJlc3VsdCA9IG5ldyBDb25zdHJ1Y3RvcihsZW5ndGgpO1xuIHdoaWxlIChsZW5ndGggPiBpbmRleClcbiAgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5NzczOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxMTUpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oNjk4NSk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7XG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgdmFyIHZhbHVlO1xuICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT09IGVsKVxuICAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpXG4gICAgIHJldHVybiB0cnVlO1xuICAgfVxuICBlbHNlXG4gICBmb3IgKDsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbClcbiAgICAgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICB9XG4gIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gfTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0MDI2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Nzg5KTtcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNjIyKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjAwNyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7XG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiB2YXIgSVNfRklORF9MQVNUX0lOREVYID0gVFlQRSA9PT0gMTtcbiByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gIHZhciBpbmRleCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCk7XG4gIHZhciB2YWx1ZSwgcmVzdWx0O1xuICB3aGlsZSAoaW5kZXgtLSA+IDApIHtcbiAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICBpZiAocmVzdWx0KVxuICAgIHN3aXRjaCAoVFlQRSkge1xuICAgIGNhc2UgMDpcbiAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNhc2UgMTpcbiAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gSVNfRklORF9MQVNUX0lOREVYID8gLTEgOiB1bmRlZmluZWQ7XG4gfTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiBmaW5kTGFzdDogY3JlYXRlTWV0aG9kKDApLFxuIGZpbmRMYXN0SW5kZXg6IGNyZWF0ZU1ldGhvZCgxKVxufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDY2NjE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDApO1xudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5OTgpO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhKGZ1bmN0aW9uICgpIHtcbiBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKVxuICByZXR1cm4gdHJ1ZTtcbiB0cnkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5sZW5ndGggPSAxO1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiB9XG59KCkpO1xubW9kdWxlLmV4cG9ydHMgPSBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPyBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gaWYgKGlzQXJyYXkoTykgJiYgIWdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCAnbGVuZ3RoJykud3JpdGFibGUpIHtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTtcbiB9XG4gcmV0dXJuIE8ubGVuZ3RoID0gbGVuZ3RoO1xufSA6IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjMwNDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBDKSB7XG4gdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuIHZhciBBID0gbmV3IEMobGVuKTtcbiB2YXIgayA9IDA7XG4gZm9yICg7IGsgPCBsZW47IGsrKylcbiAgQVtrXSA9IE9bbGVuIC0gayAtIDFdO1xuIHJldHVybiBBO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU4ODY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NTEpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMDMpO1xudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEMsIGluZGV4LCB2YWx1ZSkge1xuIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiB2YXIgcmVsYXRpdmVJbmRleCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuIHZhciBhY3R1YWxJbmRleCA9IHJlbGF0aXZlSW5kZXggPCAwID8gbGVuICsgcmVsYXRpdmVJbmRleCA6IHJlbGF0aXZlSW5kZXg7XG4gaWYgKGFjdHVhbEluZGV4ID49IGxlbiB8fCBhY3R1YWxJbmRleCA8IDApXG4gIHRocm93IG5ldyAkUmFuZ2VFcnJvcignSW5jb3JyZWN0IGluZGV4Jyk7XG4gdmFyIEEgPSBuZXcgQyhsZW4pO1xuIHZhciBrID0gMDtcbiBmb3IgKDsgayA8IGxlbjsgaysrKVxuICBBW2tdID0gayA9PT0gYWN0dWFsSW5kZXggPyB2YWx1ZSA6IE9ba107XG4gcmV0dXJuIEE7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTcyMzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMTYpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuIHRyeSB7XG4gIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gfSBjYXRjaCAoZXJyb3IpIHtcbiAgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ3Rocm93JywgZXJyb3IpO1xuIH1cbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4Mzc0OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyh7fS50b1N0cmluZyk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuIHJldHVybiBzdHJpbmdTbGljZSh0b1N0cmluZyhpdCksIDgsIC0xKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MzI5OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwNzcpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIGNsYXNzb2ZSYXcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNzQpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjI5Mik7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdygoZnVuY3Rpb24gKCkge1xuIHJldHVybiBhcmd1bWVudHM7XG59KCkpKSA9PT0gJ0FyZ3VtZW50cyc7XG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiB0cnkge1xuICByZXR1cm4gaXRba2V5XTtcbiB9IGNhdGNoIChlcnJvcikge1xuIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiB2YXIgTywgdGFnLCByZXN1bHQ7XG4gcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9ICRPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWcgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTykgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT09ICdPYmplY3QnICYmIGlzQ2FsbGFibGUoTy5jYWxsZWUpID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTQyNTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzYpO1xudmFyIG93bktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg5NTMpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTc2NCk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3NDQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UsIGV4Y2VwdGlvbnMpIHtcbiB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIGtleSA9IGtleXNbaV07XG4gIGlmICghaGFzT3duKHRhcmdldCwga2V5KSAmJiAhKGV4Y2VwdGlvbnMgJiYgaGFzT3duKGV4Y2VwdGlvbnMsIGtleSkpKSB7XG4gICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gIH1cbiB9XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzg4ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuIGZ1bmN0aW9uIEYoKSB7XG4gfVxuIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTExMTpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIGRvbmUpIHtcbiByZXR1cm4ge1xuICB2YWx1ZTogdmFsdWUsXG4gIGRvbmU6IGRvbmVcbiB9O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDkyOTM6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDApO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzQ0KTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExOTgpO1xubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuIG9iamVjdFtrZXldID0gdmFsdWU7XG4gcmV0dXJuIG9iamVjdDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMTk4OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gcmV0dXJuIHtcbiAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgdmFsdWU6IHZhbHVlXG4gfTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4OTQ3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB0b1Byb3BlcnR5S2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODcxKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzc0NCk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTk4KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KVxuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuIGVsc2VcbiAgb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk2OTE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIG1ha2VCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Njg3KTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oNzc0NCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpIHtcbiBpZiAoZGVzY3JpcHRvci5nZXQpXG4gIG1ha2VCdWlsdEluKGRlc2NyaXB0b3IuZ2V0LCBuYW1lLCB7IGdldHRlcjogdHJ1ZSB9KTtcbiBpZiAoZGVzY3JpcHRvci5zZXQpXG4gIG1ha2VCdWlsdEluKGRlc2NyaXB0b3Iuc2V0LCBuYW1lLCB7IHNldHRlcjogdHJ1ZSB9KTtcbiByZXR1cm4gZGVmaW5lUHJvcGVydHkuZih0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDcwNDE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzQ0KTtcbnZhciBtYWtlQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oOTY4Nyk7XG52YXIgZGVmaW5lR2xvYmFsUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwMDApO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuIGlmICghb3B0aW9ucylcbiAgb3B0aW9ucyA9IHt9O1xuIHZhciBzaW1wbGUgPSBvcHRpb25zLmVudW1lcmFibGU7XG4gdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiBpZiAoaXNDYWxsYWJsZSh2YWx1ZSkpXG4gIG1ha2VCdWlsdEluKHZhbHVlLCBuYW1lLCBvcHRpb25zKTtcbiBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgaWYgKHNpbXBsZSlcbiAgIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlXG4gICBkZWZpbmVHbG9iYWxQcm9wZXJ0eShrZXksIHZhbHVlKTtcbiB9IGVsc2Uge1xuICB0cnkge1xuICAgaWYgKCFvcHRpb25zLnVuc2FmZSlcbiAgICBkZWxldGUgT1trZXldO1xuICAgZWxzZSBpZiAoT1trZXldKVxuICAgIHNpbXBsZSA9IHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gIH1cbiAgaWYgKHNpbXBsZSlcbiAgIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlXG4gICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSwge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6ICFvcHRpb25zLm5vbkNvbmZpZ3VyYWJsZSxcbiAgICB3cml0YWJsZTogIW9wdGlvbnMubm9uV3JpdGFibGVcbiAgIH0pO1xuIH1cbiByZXR1cm4gTztcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA2ODgwOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDQxKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gZm9yICh2YXIga2V5IGluIHNyYylcbiAgZGVmaW5lQnVpbHRJbih0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuIHJldHVybiB0YXJnZXQ7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjAwMDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk4KTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiB0cnkge1xuICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwge1xuICAgdmFsdWU6IHZhbHVlLFxuICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgd3JpdGFibGU6IHRydWVcbiAgfSk7XG4gfSBjYXRjaCAoZXJyb3IpIHtcbiAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiB9XG4gcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk0MDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gNztcbiAgfVxuIH0pWzFdICE9PSA3O1xufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MTI2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTgpO1xudmFyIHRyeU5vZGVSZXF1aXJlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMjc2KTtcbnZhciBQUk9QRVJfU1RSVUNUVVJFRF9DTE9ORV9UUkFOU0ZFUiA9IF9fd2VicGFja19yZXF1aXJlX18oNDgzNyk7XG52YXIgc3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcbnZhciAkQXJyYXlCdWZmZXIgPSBnbG9iYWwuQXJyYXlCdWZmZXI7XG52YXIgJE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIGRldGFjaCA9IGZhbHNlO1xudmFyIFdvcmtlclRocmVhZHMsIGNoYW5uZWwsIGJ1ZmZlciwgJGRldGFjaDtcbmlmIChQUk9QRVJfU1RSVUNUVVJFRF9DTE9ORV9UUkFOU0ZFUikge1xuIGRldGFjaCA9IGZ1bmN0aW9uICh0cmFuc2ZlcmFibGUpIHtcbiAgc3RydWN0dXJlZENsb25lKHRyYW5zZmVyYWJsZSwgeyB0cmFuc2ZlcjogW3RyYW5zZmVyYWJsZV0gfSk7XG4gfTtcbn0gZWxzZSBpZiAoJEFycmF5QnVmZmVyKVxuIHRyeSB7XG4gIGlmICghJE1lc3NhZ2VDaGFubmVsKSB7XG4gICBXb3JrZXJUaHJlYWRzID0gdHJ5Tm9kZVJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJyk7XG4gICBpZiAoV29ya2VyVGhyZWFkcylcbiAgICAkTWVzc2FnZUNoYW5uZWwgPSBXb3JrZXJUaHJlYWRzLk1lc3NhZ2VDaGFubmVsO1xuICB9XG4gIGlmICgkTWVzc2FnZUNoYW5uZWwpIHtcbiAgIGNoYW5uZWwgPSBuZXcgJE1lc3NhZ2VDaGFubmVsKCk7XG4gICBidWZmZXIgPSBuZXcgJEFycmF5QnVmZmVyKDIpO1xuICAgJGRldGFjaCA9IGZ1bmN0aW9uICh0cmFuc2ZlcmFibGUpIHtcbiAgICBjaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKG51bGwsIFt0cmFuc2ZlcmFibGVdKTtcbiAgIH07XG4gICBpZiAoYnVmZmVyLmJ5dGVMZW5ndGggPT09IDIpIHtcbiAgICAkZGV0YWNoKGJ1ZmZlcik7XG4gICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKVxuICAgICBkZXRhY2ggPSAkZGV0YWNoO1xuICAgfVxuICB9XG4gfSBjYXRjaCAoZXJyb3IpIHtcbiB9XG5tb2R1bGUuZXhwb3J0cyA9IGRldGFjaDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDE1NTg6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cbnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7XG52YXIgSVNfSFRNTEREQSA9IHR5cGVvZiBkb2N1bWVudEFsbCA9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudEFsbCAhPT0gdW5kZWZpbmVkO1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gYWxsOiBkb2N1bWVudEFsbCxcbiBJU19IVE1MRERBOiBJU19IVE1MRERBXG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTU4NDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk4KTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzYzMyk7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0Mjg3OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUilcbiAgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gcmV0dXJuIGl0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDUwNTA6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuIEluZGV4U2l6ZUVycm9yOiB7XG4gIHM6ICdJTkRFWF9TSVpFX0VSUicsXG4gIGM6IDEsXG4gIG06IDFcbiB9LFxuIERPTVN0cmluZ1NpemVFcnJvcjoge1xuICBzOiAnRE9NU1RSSU5HX1NJWkVfRVJSJyxcbiAgYzogMixcbiAgbTogMFxuIH0sXG4gSGllcmFyY2h5UmVxdWVzdEVycm9yOiB7XG4gIHM6ICdISUVSQVJDSFlfUkVRVUVTVF9FUlInLFxuICBjOiAzLFxuICBtOiAxXG4gfSxcbiBXcm9uZ0RvY3VtZW50RXJyb3I6IHtcbiAgczogJ1dST05HX0RPQ1VNRU5UX0VSUicsXG4gIGM6IDQsXG4gIG06IDFcbiB9LFxuIEludmFsaWRDaGFyYWN0ZXJFcnJvcjoge1xuICBzOiAnSU5WQUxJRF9DSEFSQUNURVJfRVJSJyxcbiAgYzogNSxcbiAgbTogMVxuIH0sXG4gTm9EYXRhQWxsb3dlZEVycm9yOiB7XG4gIHM6ICdOT19EQVRBX0FMTE9XRURfRVJSJyxcbiAgYzogNixcbiAgbTogMFxuIH0sXG4gTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3I6IHtcbiAgczogJ05PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUicsXG4gIGM6IDcsXG4gIG06IDFcbiB9LFxuIE5vdEZvdW5kRXJyb3I6IHtcbiAgczogJ05PVF9GT1VORF9FUlInLFxuICBjOiA4LFxuICBtOiAxXG4gfSxcbiBOb3RTdXBwb3J0ZWRFcnJvcjoge1xuICBzOiAnTk9UX1NVUFBPUlRFRF9FUlInLFxuICBjOiA5LFxuICBtOiAxXG4gfSxcbiBJblVzZUF0dHJpYnV0ZUVycm9yOiB7XG4gIHM6ICdJTlVTRV9BVFRSSUJVVEVfRVJSJyxcbiAgYzogMTAsXG4gIG06IDFcbiB9LFxuIEludmFsaWRTdGF0ZUVycm9yOiB7XG4gIHM6ICdJTlZBTElEX1NUQVRFX0VSUicsXG4gIGM6IDExLFxuICBtOiAxXG4gfSxcbiBTeW50YXhFcnJvcjoge1xuICBzOiAnU1lOVEFYX0VSUicsXG4gIGM6IDEyLFxuICBtOiAxXG4gfSxcbiBJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3I6IHtcbiAgczogJ0lOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUicsXG4gIGM6IDEzLFxuICBtOiAxXG4gfSxcbiBOYW1lc3BhY2VFcnJvcjoge1xuICBzOiAnTkFNRVNQQUNFX0VSUicsXG4gIGM6IDE0LFxuICBtOiAxXG4gfSxcbiBJbnZhbGlkQWNjZXNzRXJyb3I6IHtcbiAgczogJ0lOVkFMSURfQUNDRVNTX0VSUicsXG4gIGM6IDE1LFxuICBtOiAxXG4gfSxcbiBWYWxpZGF0aW9uRXJyb3I6IHtcbiAgczogJ1ZBTElEQVRJT05fRVJSJyxcbiAgYzogMTYsXG4gIG06IDBcbiB9LFxuIFR5cGVNaXNtYXRjaEVycm9yOiB7XG4gIHM6ICdUWVBFX01JU01BVENIX0VSUicsXG4gIGM6IDE3LFxuICBtOiAxXG4gfSxcbiBTZWN1cml0eUVycm9yOiB7XG4gIHM6ICdTRUNVUklUWV9FUlInLFxuICBjOiAxOCxcbiAgbTogMVxuIH0sXG4gTmV0d29ya0Vycm9yOiB7XG4gIHM6ICdORVRXT1JLX0VSUicsXG4gIGM6IDE5LFxuICBtOiAxXG4gfSxcbiBBYm9ydEVycm9yOiB7XG4gIHM6ICdBQk9SVF9FUlInLFxuICBjOiAyMCxcbiAgbTogMVxuIH0sXG4gVVJMTWlzbWF0Y2hFcnJvcjoge1xuICBzOiAnVVJMX01JU01BVENIX0VSUicsXG4gIGM6IDIxLFxuICBtOiAxXG4gfSxcbiBRdW90YUV4Y2VlZGVkRXJyb3I6IHtcbiAgczogJ1FVT1RBX0VYQ0VFREVEX0VSUicsXG4gIGM6IDIyLFxuICBtOiAxXG4gfSxcbiBUaW1lb3V0RXJyb3I6IHtcbiAgczogJ1RJTUVPVVRfRVJSJyxcbiAgYzogMjMsXG4gIG06IDFcbiB9LFxuIEludmFsaWROb2RlVHlwZUVycm9yOiB7XG4gIHM6ICdJTlZBTElEX05PREVfVFlQRV9FUlInLFxuICBjOiAyNCxcbiAgbTogMVxuIH0sXG4gRGF0YUNsb25lRXJyb3I6IHtcbiAgczogJ0RBVEFfQ0xPTkVfRVJSJyxcbiAgYzogMjUsXG4gIG06IDFcbiB9XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzQxMzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgSVNfREVOTyA9IF9fd2VicGFja19yZXF1aXJlX18oODQ3MSk7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oNDg2NCk7XG5tb2R1bGUuZXhwb3J0cyA9ICFJU19ERU5PICYmICFJU19OT0RFICYmIHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGRvY3VtZW50ID09ICdvYmplY3QnO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODQ3MTpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgRGVubyA9PSAnb2JqZWN0JyAmJiBEZW5vICYmIHR5cGVvZiBEZW5vLnZlcnNpb24gPT0gJ29iamVjdCc7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0ODY0OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTgpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNzQpO1xubW9kdWxlLmV4cG9ydHMgPSBjbGFzc29mKGdsb2JhbC5wcm9jZXNzKSA9PT0gJ3Byb2Nlc3MnO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjM0OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gJ3VuZGVmaW5lZCcgJiYgU3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICcnO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjE3MTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk4KTtcbnZhciB1c2VyQWdlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzNCk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERlbm8gPSBnbG9iYWwuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuaWYgKHY4KSB7XG4gbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgaWYgKG1hdGNoKVxuICAgdmVyc2lvbiA9ICttYXRjaFsxXTtcbiB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyOTg6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cbm1vZHVsZS5leHBvcnRzID0gW1xuICdjb25zdHJ1Y3RvcicsXG4gJ2hhc093blByb3BlcnR5JyxcbiAnaXNQcm90b3R5cGVPZicsXG4gJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAndG9Mb2NhbGVTdHJpbmcnLFxuICd0b1N0cmluZycsXG4gJ3ZhbHVlT2YnXG5dO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzQ6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDAzKTtcbnZhciAkRXJyb3IgPSBFcnJvcjtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgVEVTVCA9IGZ1bmN0aW9uIChhcmcpIHtcbiByZXR1cm4gU3RyaW5nKG5ldyAkRXJyb3IoYXJnKS5zdGFjayk7XG59KCd6eGNhc2QnKTtcbnZhciBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkgPSAvXFxuXFxzKmF0IFteOl0qOlteXFxuXSovO1xudmFyIElTX1Y4X09SX0NIQUtSQV9TVEFDSyA9IFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWS50ZXN0KFRFU1QpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gaWYgKElTX1Y4X09SX0NIQUtSQV9TVEFDSyAmJiB0eXBlb2Ygc3RhY2sgPT0gJ3N0cmluZycgJiYgISRFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSkge1xuICB3aGlsZSAoZHJvcEVudHJpZXMtLSlcbiAgIHN0YWNrID0gcmVwbGFjZShzdGFjaywgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZLCAnJyk7XG4gfVxuIHJldHVybiBzdGFjaztcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxOTMxOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTMpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xudmFyIEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNDM3KTtcbnZhciBjYXB0dXJlU3RhY2tUcmFjZSA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXJyb3IsIEMsIHN0YWNrLCBkcm9wRW50cmllcykge1xuIGlmIChFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSkge1xuICBpZiAoY2FwdHVyZVN0YWNrVHJhY2UpXG4gICBjYXB0dXJlU3RhY2tUcmFjZShlcnJvciwgQyk7XG4gIGVsc2VcbiAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHN0YWNrLCBkcm9wRW50cmllcykpO1xuIH1cbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNDM3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oODE1NCk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTk4KTtcbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ2EnKTtcbiBpZiAoISgnc3RhY2snIGluIGVycm9yKSlcbiAgcmV0dXJuIHRydWU7XG4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgNykpO1xuIHJldHVybiBlcnJvci5zdGFjayAhPT0gNztcbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDk3ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk4KTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg1NzY0KS5mKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTMpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwNDEpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDAwKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDI1KTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzAwNyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiBpZiAoR0xPQkFMKSB7XG4gIHRhcmdldCA9IGdsb2JhbDtcbiB9IGVsc2UgaWYgKFNUQVRJQykge1xuICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShUQVJHRVQsIHt9KTtcbiB9IGVsc2Uge1xuICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiB9XG4gaWYgKHRhcmdldClcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgaWYgKG9wdGlvbnMuZG9udENhbGxHZXRTZXQpIHtcbiAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgIH0gZWxzZVxuICAgIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KVxuICAgICBjb250aW51ZTtcbiAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICB9XG4gICBpZiAob3B0aW9ucy5zaGFtIHx8IHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICB9XG4gICBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MTU0OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gdHJ5IHtcbiAgcmV0dXJuICEhZXhlYygpO1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gIHJldHVybiB0cnVlO1xuIH1cbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3Mjk0OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oMjQ4Nik7XG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgYXBwbHkgPSBGdW5jdGlvblByb3RvdHlwZS5hcHBseTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFJlZmxlY3QgPT0gJ29iamVjdCcgJiYgUmVmbGVjdC5hcHBseSB8fCAoTkFUSVZFX0JJTkQgPyBjYWxsLmJpbmQoYXBwbHkpIDogZnVuY3Rpb24gKCkge1xuIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3Nzg5OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNjIxOCk7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgyKTtcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oMjQ4Nik7XG52YXIgYmluZCA9IHVuY3VycnlUaGlzKHVuY3VycnlUaGlzLmJpbmQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQpIHtcbiBhQ2FsbGFibGUoZm4pO1xuIHJldHVybiB0aGF0ID09PSB1bmRlZmluZWQgPyBmbiA6IE5BVElWRV9CSU5EID8gYmluZChmbiwgdGhhdCkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuIH07XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjQ4Njpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuIHZhciB0ZXN0ID0gZnVuY3Rpb24gKCkge1xuIH0uYmluZCgpO1xuIHJldHVybiB0eXBlb2YgdGVzdCAhPSAnZnVuY3Rpb24nIHx8IHRlc3QuaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpO1xufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMDI2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oMjQ4Nik7XG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IGNhbGwuYmluZChjYWxsKSA6IGZ1bmN0aW9uICgpIHtcbiByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDUxNDU6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDApO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBnZXREZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG52YXIgUFJPUEVSID0gRVhJU1RTICYmIGZ1bmN0aW9uIHNvbWV0aGluZygpIHtcbn0ubmFtZSA9PT0gJ3NvbWV0aGluZyc7XG52YXIgQ09ORklHVVJBQkxFID0gRVhJU1RTICYmICghREVTQ1JJUFRPUlMgfHwgREVTQ1JJUFRPUlMgJiYgZ2V0RGVzY3JpcHRvcihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKS5jb25maWd1cmFibGUpO1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gRVhJU1RTOiBFWElTVFMsXG4gUFJPUEVSOiBQUk9QRVIsXG4gQ09ORklHVVJBQkxFOiBDT05GSUdVUkFCTEVcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMjk5OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgyKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCBtZXRob2QpIHtcbiB0cnkge1xuICByZXR1cm4gdW5jdXJyeVRoaXMoYUNhbGxhYmxlKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpW21ldGhvZF0pKTtcbiB9IGNhdGNoIChlcnJvcikge1xuIH1cbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA2MjE4OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBjbGFzc29mUmF3ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4Mzc0KTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbikge1xuIGlmIChjbGFzc29mUmF3KGZuKSA9PT0gJ0Z1bmN0aW9uJylcbiAgcmV0dXJuIHVuY3VycnlUaGlzKGZuKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4NDAzOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oMjQ4Nik7XG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG52YXIgdW5jdXJyeVRoaXNXaXRoQmluZCA9IE5BVElWRV9CSU5EICYmIEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQuYmluZChjYWxsLCBjYWxsKTtcbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyB1bmN1cnJ5VGhpc1dpdGhCaW5kIDogZnVuY3Rpb24gKGZuKSB7XG4gcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoZm4sIGFyZ3VtZW50cyk7XG4gfTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MTg3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTgpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuIHJldHVybiBpc0NhbGxhYmxlKGFyZ3VtZW50KSA/IGFyZ3VtZW50IDogdW5kZWZpbmVkO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKSA6IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTIzNTpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gcmV0dXJuIHtcbiAgaXRlcmF0b3I6IG9iaixcbiAgbmV4dDogb2JqLm5leHQsXG4gIGRvbmU6IGZhbHNlXG4gfTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5MDc6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMjYpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzE5KTtcbnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTIzNSk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3Myk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmosIHN0cmluZ0hhbmRsaW5nKSB7XG4gaWYgKCFzdHJpbmdIYW5kbGluZyB8fCB0eXBlb2Ygb2JqICE9PSAnc3RyaW5nJylcbiAgYW5PYmplY3Qob2JqKTtcbiB2YXIgbWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2Qob2JqKTtcbiByZXR1cm4gZ2V0SXRlcmF0b3JEaXJlY3QoYW5PYmplY3QobWV0aG9kICE9PSB1bmRlZmluZWQgPyBjYWxsKG1ldGhvZCwgb2JqKSA6IG9iaikpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI3Mzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oODMyOSk7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDg2KTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzczNCk7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTk2KTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyOTIpO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0KSlcbiAgcmV0dXJuIGdldE1ldGhvZChpdCwgSVRFUkFUT1IpIHx8IGdldE1ldGhvZChpdCwgJ0BAaXRlcmF0b3InKSB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc2MTI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMjYpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTc4Mik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzYyKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oMjczKTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsIHVzaW5nSXRlcmF0b3IpIHtcbiB2YXIgaXRlcmF0b3JNZXRob2QgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGdldEl0ZXJhdG9yTWV0aG9kKGFyZ3VtZW50KSA6IHVzaW5nSXRlcmF0b3I7XG4gaWYgKGFDYWxsYWJsZShpdGVyYXRvck1ldGhvZCkpXG4gIHJldHVybiBhbk9iamVjdChjYWxsKGl0ZXJhdG9yTWV0aG9kLCBhcmd1bWVudCkpO1xuIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODQ4Njpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgyKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzczNCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gdmFyIGZ1bmMgPSBWW1BdO1xuIHJldHVybiBpc051bGxPclVuZGVmaW5lZChmdW5jKSA/IHVuZGVmaW5lZCA6IGFDYWxsYWJsZShmdW5jKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMDk2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3ODIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzE5KTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDI2KTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDAzKTtcbnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTIzNSk7XG52YXIgSU5WQUxJRF9TSVpFID0gJ0ludmFsaWQgc2l6ZSc7XG52YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgU2V0UmVjb3JkID0gZnVuY3Rpb24gKHNldCwgc2l6ZSwgaGFzLCBrZXlzKSB7XG4gdGhpcy5zZXQgPSBzZXQ7XG4gdGhpcy5zaXplID0gc2l6ZTtcbiB0aGlzLmhhcyA9IGhhcztcbiB0aGlzLmtleXMgPSBrZXlzO1xufTtcblNldFJlY29yZC5wcm90b3R5cGUgPSB7XG4gZ2V0SXRlcmF0b3I6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGdldEl0ZXJhdG9yRGlyZWN0KGFuT2JqZWN0KGNhbGwodGhpcy5rZXlzLCB0aGlzLnNldCkpKTtcbiB9LFxuIGluY2x1ZGVzOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNhbGwodGhpcy5oYXMsIHRoaXMuc2V0LCBpdCk7XG4gfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuIGFuT2JqZWN0KG9iaik7XG4gdmFyIG51bVNpemUgPSArb2JqLnNpemU7XG4gaWYgKG51bVNpemUgIT09IG51bVNpemUpXG4gIHRocm93IG5ldyAkVHlwZUVycm9yKElOVkFMSURfU0laRSk7XG4gdmFyIGludFNpemUgPSB0b0ludGVnZXJPckluZmluaXR5KG51bVNpemUpO1xuIGlmIChpbnRTaXplIDwgMClcbiAgdGhyb3cgbmV3ICRSYW5nZUVycm9yKElOVkFMSURfU0laRSk7XG4gcmV0dXJuIG5ldyBTZXRSZWNvcmQob2JqLCBtYXgoaW50U2l6ZSwgMCksIGFDYWxsYWJsZShvYmouaGFzKSwgYUNhbGxhYmxlKG9iai5rZXlzKSk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTI5ODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxuXG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PT0gTWF0aCAmJiBpdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8IGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fCBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fCBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHwgY2hlY2sodHlwZW9mIHRoaXMgPT0gJ29iamVjdCcgJiYgdGhpcykgfHwgKGZ1bmN0aW9uICgpIHtcbiByZXR1cm4gdGhpcztcbn0oKSkgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDkzNjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0MDMpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDA3KTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuIHJldHVybiBoYXNPd25Qcm9wZXJ0eSh0b09iamVjdChpdCksIGtleSk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjAxMDpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDUxOTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oNzE4Nyk7XG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTM5NDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MCk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1ODQpO1xubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gNztcbiAgfVxuIH0pLmEgIT09IDc7XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDM2MjI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDAzKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oODE1NCk7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oODM3NCk7XG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiByZXR1cm4gY2xhc3NvZihpdCkgPT09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NTIzOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzE2KTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzYzMyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3NjMpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7XG4gdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuIGlmIChzZXRQcm90b3R5cGVPZiAmJiBpc0NhbGxhYmxlKE5ld1RhcmdldCA9IGR1bW15LmNvbnN0cnVjdG9yKSAmJiBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiYgaXNPYmplY3QoTmV3VGFyZ2V0UHJvdG90eXBlID0gTmV3VGFyZ2V0LnByb3RvdHlwZSkgJiYgTmV3VGFyZ2V0UHJvdG90eXBlICE9PSBXcmFwcGVyLnByb3RvdHlwZSlcbiAgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7XG4gcmV0dXJuICR0aGlzO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDQ5OTM6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDAzKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzE2KTtcbnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzU0Mik7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHVuY3VycnlUaGlzKEZ1bmN0aW9uLnRvU3RyaW5nKTtcbmlmICghaXNDYWxsYWJsZShzdG9yZS5pbnNwZWN0U291cmNlKSkge1xuIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcoaXQpO1xuIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4NDIyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzYzMyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MjkzKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIG9wdGlvbnMpIHtcbiBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NhdXNlJyBpbiBvcHRpb25zKSB7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCAnY2F1c2UnLCBvcHRpb25zLmNhdXNlKTtcbiB9XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTY0OTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgTkFUSVZFX1dFQUtfTUFQID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDQzKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTgpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjMzKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTMpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1NDIpO1xudmFyIHNoYXJlZEtleSA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNyk7XG52YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNjAxMCk7XG52YXIgT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQgPSAnT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHN0YXRlO1xuICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICB9XG4gIHJldHVybiBzdGF0ZTtcbiB9O1xufTtcbmlmIChOQVRJVkVfV0VBS19NQVAgfHwgc2hhcmVkLnN0YXRlKSB7XG4gdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7XG4gc3RvcmUuaGFzID0gc3RvcmUuaGFzO1xuIHN0b3JlLnNldCA9IHN0b3JlLnNldDtcbiBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gIGlmIChzdG9yZS5oYXMoaXQpKVxuICAgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICBzdG9yZS5zZXQoaXQsIG1ldGFkYXRhKTtcbiAgcmV0dXJuIG1ldGFkYXRhO1xuIH07XG4gZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBzdG9yZS5nZXQoaXQpIHx8IHt9O1xuIH07XG4gaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBzdG9yZS5oYXMoaXQpO1xuIH07XG59IGVsc2Uge1xuIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICBpZiAoaGFzT3duKGl0LCBTVEFURSkpXG4gICB0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgcmV0dXJuIG1ldGFkYXRhO1xuIH07XG4gZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuIH07XG4gaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gc2V0OiBzZXQsXG4gZ2V0OiBnZXQsXG4gaGFzOiBoYXMsXG4gZW5mb3JjZTogZW5mb3JjZSxcbiBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDUxOTE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjI5Mik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTk2KTtcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjk5ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oODM3NCk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmd1bWVudCkge1xuIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ0FycmF5Jztcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1OTg2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MzI5KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gdmFyIGtsYXNzID0gY2xhc3NvZihpdCk7XG4gcmV0dXJuIGtsYXNzID09PSAnQmlnSW50NjRBcnJheScgfHwga2xhc3MgPT09ICdCaWdVaW50NjRBcnJheSc7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzMxNjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgJGRvY3VtZW50QWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTU4KTtcbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5tb2R1bGUuZXhwb3J0cyA9ICRkb2N1bWVudEFsbC5JU19IVE1MRERBID8gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50ID09PSBkb2N1bWVudEFsbDtcbn0gOiBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbic7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzAwNzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIHJlcGxhY2VtZW50ID0gLyN8XFwucHJvdG90eXBlXFwuLztcbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07XG4gcmV0dXJuIHZhbHVlID09PSBQT0xZRklMTCA/IHRydWUgOiB2YWx1ZSA9PT0gTkFUSVZFID8gZmFsc2UgOiBpc0NhbGxhYmxlKGRldGVjdGlvbikgPyBmYWlscyhkZXRlY3Rpb24pIDogISFkZXRlY3Rpb247XG59O1xudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xubW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDM3MzQ6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gcmV0dXJuIGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQ7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzYzMzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzMxNik7XG52YXIgJGRvY3VtZW50QWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTU4KTtcbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5tb2R1bGUuZXhwb3J0cyA9ICRkb2N1bWVudEFsbC5JU19IVE1MRERBID8gZnVuY3Rpb24gKGl0KSB7XG4gcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCkgfHwgaXQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuIHJldHVybiB0eXBlb2YgaXQgPT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IGlzQ2FsbGFibGUoaXQpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI1NTQ6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3ODE0OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MTg3KTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MzE2KTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjU4KTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oNzk2MCk7XG52YXIgJE9iamVjdCA9IE9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHtcbiByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuIHZhciAkU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG4gcmV0dXJuIGlzQ2FsbGFibGUoJFN5bWJvbCkgJiYgaXNQcm90b3R5cGVPZigkU3ltYm9sLnByb3RvdHlwZSwgJE9iamVjdChpdCkpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU1MDQ6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMjYpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVjb3JkLCBmbiwgSVRFUkFUT1JfSU5TVEVBRF9PRl9SRUNPUkQpIHtcbiB2YXIgaXRlcmF0b3IgPSBJVEVSQVRPUl9JTlNURUFEX09GX1JFQ09SRCA/IHJlY29yZCA6IHJlY29yZC5pdGVyYXRvcjtcbiB2YXIgbmV4dCA9IHJlY29yZC5uZXh0O1xuIHZhciBzdGVwLCByZXN1bHQ7XG4gd2hpbGUgKCEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lKSB7XG4gIHJlc3VsdCA9IGZuKHN0ZXAudmFsdWUpO1xuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICByZXR1cm4gcmVzdWx0O1xuIH1cbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA2ODM3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Nzg5KTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDI2KTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNDcxOSk7XG52YXIgdHJ5VG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3NjIpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTE5MSk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7XG52YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMjY1OCk7XG52YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2MTIpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzMpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMTYpO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7XG4gdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xudmFyIFJlc3VsdFByb3RvdHlwZSA9IFJlc3VsdC5wcm90b3R5cGU7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gdmFyIHRoYXQgPSBvcHRpb25zICYmIG9wdGlvbnMudGhhdDtcbiB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiB2YXIgSVNfUkVDT1JEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX1JFQ09SRCk7XG4gdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTtcbiB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuIHZhciBmbiA9IGJpbmQodW5ib3VuZEZ1bmN0aW9uLCB0aGF0KTtcbiB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICBpZiAoaXRlcmF0b3IpXG4gICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgY29uZGl0aW9uKTtcbiB9O1xuIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgaWYgKEFTX0VOVFJJRVMpIHtcbiAgIGFuT2JqZWN0KHZhbHVlKTtcbiAgIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSwgc3RvcCkgOiBmbih2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICB9XG4gIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlLCBzdG9wKSA6IGZuKHZhbHVlKTtcbiB9O1xuIGlmIChJU19SRUNPUkQpIHtcbiAgaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcjtcbiB9IGVsc2UgaWYgKElTX0lURVJBVE9SKSB7XG4gIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gfSBlbHNlIHtcbiAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICBpZiAoIWl0ZXJGbilcbiAgIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGl0ZXJhYmxlKSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG4gIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZXJhYmxlKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKVxuICAgICByZXR1cm4gcmVzdWx0O1xuICAgfVxuICAgcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICB9XG4gIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoaXRlcmFibGUsIGl0ZXJGbik7XG4gfVxuIG5leHQgPSBJU19SRUNPUkQgPyBpdGVyYWJsZS5uZXh0IDogaXRlcmF0b3IubmV4dDtcbiB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgdHJ5IHtcbiAgIHJlc3VsdCA9IGNhbGxGbihzdGVwLnZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgaXNQcm90b3R5cGVPZihSZXN1bHRQcm90b3R5cGUsIHJlc3VsdCkpXG4gICByZXR1cm4gcmVzdWx0O1xuIH1cbiByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzMxNjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyNik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oODQ4Nik7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwga2luZCwgdmFsdWUpIHtcbiB2YXIgaW5uZXJSZXN1bHQsIGlubmVyRXJyb3I7XG4gYW5PYmplY3QoaXRlcmF0b3IpO1xuIHRyeSB7XG4gIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gIGlmICghaW5uZXJSZXN1bHQpIHtcbiAgIGlmIChraW5kID09PSAndGhyb3cnKVxuICAgIHRocm93IHZhbHVlO1xuICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlubmVyUmVzdWx0ID0gY2FsbChpbm5lclJlc3VsdCwgaXRlcmF0b3IpO1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gIGlubmVyRXJyb3IgPSB0cnVlO1xuICBpbm5lclJlc3VsdCA9IGVycm9yO1xuIH1cbiBpZiAoa2luZCA9PT0gJ3Rocm93JylcbiAgdGhyb3cgdmFsdWU7XG4gaWYgKGlubmVyRXJyb3IpXG4gIHRocm93IGlubmVyUmVzdWx0O1xuIGFuT2JqZWN0KGlubmVyUmVzdWx0KTtcbiByZXR1cm4gdmFsdWU7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzc1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDI2KTtcbnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5NDEpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5Myk7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4ODApO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjI5Mik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0OSk7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDg2KTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDUyMzgpLkl0ZXJhdG9yUHJvdG90eXBlKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTExKTtcbnZhciBpdGVyYXRvckNsb3NlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzE2KTtcbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIElURVJBVE9SX0hFTFBFUiA9ICdJdGVyYXRvckhlbHBlcic7XG52YXIgV1JBUF9GT1JfVkFMSURfSVRFUkFUT1IgPSAnV3JhcEZvclZhbGlkSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBjcmVhdGVJdGVyYXRvclByb3h5UHJvdG90eXBlID0gZnVuY3Rpb24gKElTX0lURVJBVE9SKSB7XG4gdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihJU19JVEVSQVRPUiA/IFdSQVBfRk9SX1ZBTElEX0lURVJBVE9SIDogSVRFUkFUT1JfSEVMUEVSKTtcbiByZXR1cm4gZGVmaW5lQnVpbHRJbnMoY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKSwge1xuICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgIGlmIChJU19JVEVSQVRPUilcbiAgICByZXR1cm4gc3RhdGUubmV4dEhhbmRsZXIoKTtcbiAgIHRyeSB7XG4gICAgdmFyIHJlc3VsdCA9IHN0YXRlLmRvbmUgPyB1bmRlZmluZWQgOiBzdGF0ZS5uZXh0SGFuZGxlcigpO1xuICAgIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHJlc3VsdCwgc3RhdGUuZG9uZSk7XG4gICB9IGNhdGNoIChlcnJvcikge1xuICAgIHN0YXRlLmRvbmUgPSB0cnVlO1xuICAgIHRocm93IGVycm9yO1xuICAgfVxuICB9LFxuICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgIHZhciBpdGVyYXRvciA9IHN0YXRlLml0ZXJhdG9yO1xuICAgc3RhdGUuZG9uZSA9IHRydWU7XG4gICBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICB2YXIgcmV0dXJuTWV0aG9kID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgcmV0dXJuIHJldHVybk1ldGhvZCA/IGNhbGwocmV0dXJuTWV0aG9kLCBpdGVyYXRvcikgOiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICB9XG4gICBpZiAoc3RhdGUuaW5uZXIpXG4gICAgdHJ5IHtcbiAgICAgaXRlcmF0b3JDbG9zZShzdGF0ZS5pbm5lci5pdGVyYXRvciwgJ25vcm1hbCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgIHJldHVybiBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcpO1xuICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuIH0pO1xufTtcbnZhciBXcmFwRm9yVmFsaWRJdGVyYXRvclByb3RvdHlwZSA9IGNyZWF0ZUl0ZXJhdG9yUHJveHlQcm90b3R5cGUodHJ1ZSk7XG52YXIgSXRlcmF0b3JIZWxwZXJQcm90b3R5cGUgPSBjcmVhdGVJdGVyYXRvclByb3h5UHJvdG90eXBlKGZhbHNlKTtcbmNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvckhlbHBlclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0l0ZXJhdG9yIEhlbHBlcicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmV4dEhhbmRsZXIsIElTX0lURVJBVE9SKSB7XG4gdmFyIEl0ZXJhdG9yUHJveHkgPSBmdW5jdGlvbiBJdGVyYXRvcihyZWNvcmQsIHN0YXRlKSB7XG4gIGlmIChzdGF0ZSkge1xuICAgc3RhdGUuaXRlcmF0b3IgPSByZWNvcmQuaXRlcmF0b3I7XG4gICBzdGF0ZS5uZXh0ID0gcmVjb3JkLm5leHQ7XG4gIH0gZWxzZVxuICAgc3RhdGUgPSByZWNvcmQ7XG4gIHN0YXRlLnR5cGUgPSBJU19JVEVSQVRPUiA/IFdSQVBfRk9SX1ZBTElEX0lURVJBVE9SIDogSVRFUkFUT1JfSEVMUEVSO1xuICBzdGF0ZS5uZXh0SGFuZGxlciA9IG5leHRIYW5kbGVyO1xuICBzdGF0ZS5jb3VudGVyID0gMDtcbiAgc3RhdGUuZG9uZSA9IGZhbHNlO1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHN0YXRlKTtcbiB9O1xuIEl0ZXJhdG9yUHJveHkucHJvdG90eXBlID0gSVNfSVRFUkFUT1IgPyBXcmFwRm9yVmFsaWRJdGVyYXRvclByb3RvdHlwZSA6IEl0ZXJhdG9ySGVscGVyUHJvdG90eXBlO1xuIHJldHVybiBJdGVyYXRvclByb3h5O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgxNDI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMjYpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTc4Mik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGdldEl0ZXJhdG9yRGlyZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MjM1KTtcbnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzUpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3MjMpO1xudmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uICgpIHtcbiB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuIHZhciByZXN1bHQgPSBhbk9iamVjdChjYWxsKHRoaXMubmV4dCwgaXRlcmF0b3IpKTtcbiB2YXIgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7XG4gaWYgKCFkb25lKVxuICByZXR1cm4gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgdGhpcy5tYXBwZXIsIFtcbiAgIHJlc3VsdC52YWx1ZSxcbiAgIHRoaXMuY291bnRlcisrXG4gIF0sIHRydWUpO1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hcChtYXBwZXIpIHtcbiBhbk9iamVjdCh0aGlzKTtcbiBhQ2FsbGFibGUobWFwcGVyKTtcbiByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoZ2V0SXRlcmF0b3JEaXJlY3QodGhpcyksIHsgbWFwcGVyOiBtYXBwZXIgfSk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTIzODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjMzKTtcbnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5NDEpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTc2KTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDQxKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyOTIpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1NTQpO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuaWYgKFtdLmtleXMpIHtcbiBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSlcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gZWxzZSB7XG4gIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSlcbiAgIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuIH1cbn1cbnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gIWlzT2JqZWN0KEl0ZXJhdG9yUHJvdG90eXBlKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gdmFyIHRlc3QgPSB7fTtcbiByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKVxuIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5lbHNlIGlmIChJU19QVVJFKVxuIEl0ZXJhdG9yUHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbmlmICghaXNDYWxsYWJsZShJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gZGVmaW5lQnVpbHRJbihJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7XG4gfSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDY1OTY6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0NTE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MjkzKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuIHJldHVybiB0b0xlbmd0aChvYmoubGVuZ3RoKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5Njg3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQwKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDUxNDUpLkNPTkZJR1VSQUJMRSk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDk5Myk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0OSk7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcbnZhciBDT05GSUdVUkFCTEVfTEVOR1RIID0gREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkge1xuIH0sICdsZW5ndGgnLCB7IHZhbHVlOiA4IH0pLmxlbmd0aCAhPT0gODtcbn0pO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xudmFyIG1ha2VCdWlsdEluID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIG5hbWUsIG9wdGlvbnMpIHtcbiBpZiAoc3RyaW5nU2xpY2UoJFN0cmluZyhuYW1lKSwgMCwgNykgPT09ICdTeW1ib2woJykge1xuICBuYW1lID0gJ1snICsgcmVwbGFjZSgkU3RyaW5nKG5hbWUpLCAvXlN5bWJvbFxcKChbXildKilcXCkvLCAnJDEnKSArICddJztcbiB9XG4gaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5nZXR0ZXIpXG4gIG5hbWUgPSAnZ2V0ICcgKyBuYW1lO1xuIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2V0dGVyKVxuICBuYW1lID0gJ3NldCAnICsgbmFtZTtcbiBpZiAoIWhhc093bih2YWx1ZSwgJ25hbWUnKSB8fCBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSB7XG4gIGlmIChERVNDUklQVE9SUylcbiAgIGRlZmluZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIHtcbiAgICB2YWx1ZTogbmFtZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgIH0pO1xuICBlbHNlXG4gICB2YWx1ZS5uYW1lID0gbmFtZTtcbiB9XG4gaWYgKENPTkZJR1VSQUJMRV9MRU5HVEggJiYgb3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgJ2FyaXR5JykgJiYgdmFsdWUubGVuZ3RoICE9PSBvcHRpb25zLmFyaXR5KSB7XG4gIGRlZmluZVByb3BlcnR5KHZhbHVlLCAnbGVuZ3RoJywgeyB2YWx1ZTogb3B0aW9ucy5hcml0eSB9KTtcbiB9XG4gdHJ5IHtcbiAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsICdjb25zdHJ1Y3RvcicpICYmIG9wdGlvbnMuY29uc3RydWN0b3IpIHtcbiAgIGlmIChERVNDUklQVE9SUylcbiAgICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ3Byb3RvdHlwZScsIHsgd3JpdGFibGU6IGZhbHNlIH0pO1xuICB9IGVsc2UgaWYgKHZhbHVlLnByb3RvdHlwZSlcbiAgIHZhbHVlLnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiB9IGNhdGNoIChlcnJvcikge1xuIH1cbiB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSk7XG4gaWYgKCFoYXNPd24oc3RhdGUsICdzb3VyY2UnKSkge1xuICBzdGF0ZS5zb3VyY2UgPSBqb2luKFRFTVBMQVRFLCB0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7XG4gfVxuIHJldHVybiB2YWx1ZTtcbn07XG5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBtYWtlQnVpbHRJbihmdW5jdGlvbiB0b1N0cmluZygpIHtcbiByZXR1cm4gaXNDYWxsYWJsZSh0aGlzKSAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpO1xufSwgJ3RvU3RyaW5nJyk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4NTM3OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgudHJ1bmMgfHwgZnVuY3Rpb24gdHJ1bmMoeCkge1xuIHZhciBuID0gK3g7XG4gcmV0dXJuIChuID4gMCA/IGZsb29yIDogY2VpbCkobik7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTI2NDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3MzApO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsICRkZWZhdWx0KSB7XG4gcmV0dXJuIGFyZ3VtZW50ID09PSB1bmRlZmluZWQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/ICcnIDogJGRlZmF1bHQgOiB0b1N0cmluZyhhcmd1bWVudCk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjk0MTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGRlZmluZVByb3BlcnRpZXNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2MTcpO1xudmFyIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOTgpO1xudmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwMTApO1xudmFyIGh0bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxOSk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTg0KTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MjcpO1xudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG59O1xudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiBhY3RpdmVYRG9jdW1lbnQgPSBudWxsO1xuIHJldHVybiB0ZW1wO1xufTtcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuIHZhciBpZnJhbWVEb2N1bWVudDtcbiBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuIHRyeSB7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gfVxuIE51bGxQcm90b09iamVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPSAndW5kZWZpbmVkJyA/IGRvY3VtZW50LmRvbWFpbiAmJiBhY3RpdmVYRG9jdW1lbnQgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKSA6IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KTtcbiB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuIHdoaWxlIChsZW5ndGgtLSlcbiAgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiB2YXIgcmVzdWx0O1xuIGlmIChPICE9PSBudWxsKSB7XG4gIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiB9IGVsc2VcbiAgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZihyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDY2MTc6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDApO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NjEwKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzc0NCk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNDExNSk7XG52YXIgb2JqZWN0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcwNik7XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyAmJiAhVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuIGFuT2JqZWN0KE8pO1xuIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuIHZhciBpbmRleCA9IDA7XG4gdmFyIGtleTtcbiB3aGlsZSAobGVuZ3RoID4gaW5kZXgpXG4gIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpbmRleCsrXSwgcHJvcHNba2V5XSk7XG4gcmV0dXJuIE87XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNzc0NDpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MCk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzOTQpO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NjEwKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNDcxOSk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oNDg3MSk7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgRU5VTUVSQUJMRSA9ICdlbnVtZXJhYmxlJztcbnZhciBDT05GSUdVUkFCTEUgPSAnY29uZmlndXJhYmxlJztcbnZhciBXUklUQUJMRSA9ICd3cml0YWJsZSc7XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuIGFuT2JqZWN0KE8pO1xuIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuIGlmICh0eXBlb2YgTyA9PT0gJ2Z1bmN0aW9uJyAmJiBQID09PSAncHJvdG90eXBlJyAmJiAndmFsdWUnIGluIEF0dHJpYnV0ZXMgJiYgV1JJVEFCTEUgaW4gQXR0cmlidXRlcyAmJiAhQXR0cmlidXRlc1tXUklUQUJMRV0pIHtcbiAgdmFyIGN1cnJlbnQgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICBpZiAoY3VycmVudCAmJiBjdXJyZW50W1dSSVRBQkxFXSkge1xuICAgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gICBBdHRyaWJ1dGVzID0ge1xuICAgIGNvbmZpZ3VyYWJsZTogQ09ORklHVVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0NPTkZJR1VSQUJMRV0gOiBjdXJyZW50W0NPTkZJR1VSQUJMRV0sXG4gICAgZW51bWVyYWJsZTogRU5VTUVSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tFTlVNRVJBQkxFXSA6IGN1cnJlbnRbRU5VTUVSQUJMRV0sXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gICB9O1xuICB9XG4gfVxuIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG59IDogJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuIGFuT2JqZWN0KE8pO1xuIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuIGlmIChJRThfRE9NX0RFRklORSlcbiAgdHJ5IHtcbiAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gIH1cbiBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKVxuICB0aHJvdyBuZXcgJFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKVxuICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiByZXR1cm4gTztcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NzY0OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQwKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDI2KTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTg3OSk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTk4KTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxMTUpO1xudmFyIHRvUHJvcGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4NzEpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oOTM5NCk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gaWYgKElFOF9ET01fREVGSU5FKVxuICB0cnkge1xuICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gIH1cbiBpZiAoaGFzT3duKE8sIFApKVxuICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYsIE8sIFApLCBPW1BdKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NDU1OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkxMzgpO1xudmFyIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOTgpO1xudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTk2Mzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHtcblxuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjE3Njpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzYpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDA3KTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MjcpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IF9fd2VicGFja19yZXF1aXJlX18oNzg4OCk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciBPYmplY3RQcm90b3R5cGUgPSAkT2JqZWN0LnByb3RvdHlwZTtcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gJE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pO1xuIGlmIChoYXNPd24ob2JqZWN0LCBJRV9QUk9UTykpXG4gIHJldHVybiBvYmplY3RbSUVfUFJPVE9dO1xuIHZhciBjb25zdHJ1Y3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiBpZiAoaXNDYWxsYWJsZShjb25zdHJ1Y3RvcikgJiYgb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcbiAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiB9XG4gcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mICRPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI2NTg6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDAzKTtcbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5MTM4OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzYpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNDExNSk7XG52YXIgaW5kZXhPZiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDk3NzMpLmluZGV4T2YpO1xudmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwMTApO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuIHZhciBpID0gMDtcbiB2YXIgcmVzdWx0ID0gW107XG4gdmFyIGtleTtcbiBmb3IgKGtleSBpbiBPKVxuICAhaGFzT3duKGhpZGRlbktleXMsIGtleSkgJiYgaGFzT3duKE8sIGtleSkgJiYgcHVzaChyZXN1bHQsIGtleSk7XG4gd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpXG4gIGlmIChoYXNPd24oTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCBwdXNoKHJlc3VsdCwga2V5KTtcbiAgfVxuIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTcwNjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MTM4KTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjk4KTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTg3OTpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHtcblxuXG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTc2Mzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdW5jdXJyeVRoaXNBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5OSk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDk1OCk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAoZnVuY3Rpb24gKCkge1xuIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuIHZhciB0ZXN0ID0ge307XG4gdmFyIHNldHRlcjtcbiB0cnkge1xuICBzZXR0ZXIgPSB1bmN1cnJ5VGhpc0FjY2Vzc29yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nLCAnc2V0Jyk7XG4gIHNldHRlcih0ZXN0LCBbXSk7XG4gIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gfVxuIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgaWYgKENPUlJFQ1RfU0VUVEVSKVxuICAgc2V0dGVyKE8sIHByb3RvKTtcbiAgZWxzZVxuICAgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgcmV0dXJuIE87XG4gfTtcbn0oKSkgOiB1bmRlZmluZWQpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjkyMzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyNik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzMxNik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2MzMpO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuIHZhciBmbiwgdmFsO1xuIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKVxuICByZXR1cm4gdmFsO1xuIGlmIChpc0NhbGxhYmxlKGZuID0gaW5wdXQudmFsdWVPZikgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpXG4gIHJldHVybiB2YWw7XG4gaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpXG4gIHJldHVybiB2YWw7XG4gdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODk1Mzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oNzE4Nyk7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0MDMpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0NTUpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTk2Myk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KGtleXMsIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNzEzOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzYpO1xudmFyICRTeW50YXhFcnJvciA9IFN5bnRheEVycm9yO1xudmFyICRwYXJzZUludCA9IHBhcnNlSW50O1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgYXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIHNsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgY29kZVBvaW50cyA9IHtcbiAnXFxcXFwiJzogJ1wiJyxcbiAnXFxcXFxcXFwnOiAnXFxcXCcsXG4gJ1xcXFwvJzogJy8nLFxuICdcXFxcYic6ICdcXGInLFxuICdcXFxcZic6ICdcXGYnLFxuICdcXFxcbic6ICdcXG4nLFxuICdcXFxccic6ICdcXHInLFxuICdcXFxcdCc6ICdcXHQnXG59O1xudmFyIElTXzRfSEVYX0RJR0lUUyA9IC9eW1xcZGEtZl17NH0kL2k7XG52YXIgSVNfQzBfQ09OVFJPTF9DT0RFID0gL15bXFx1MDAwMC1cXHUwMDFGXSQvO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc291cmNlLCBpKSB7XG4gdmFyIHVudGVybWluYXRlZCA9IHRydWU7XG4gdmFyIHZhbHVlID0gJyc7XG4gd2hpbGUgKGkgPCBzb3VyY2UubGVuZ3RoKSB7XG4gIHZhciBjaHIgPSBhdChzb3VyY2UsIGkpO1xuICBpZiAoY2hyID09PSAnXFxcXCcpIHtcbiAgIHZhciB0d29DaGFycyA9IHNsaWNlKHNvdXJjZSwgaSwgaSArIDIpO1xuICAgaWYgKGhhc093bihjb2RlUG9pbnRzLCB0d29DaGFycykpIHtcbiAgICB2YWx1ZSArPSBjb2RlUG9pbnRzW3R3b0NoYXJzXTtcbiAgICBpICs9IDI7XG4gICB9IGVsc2UgaWYgKHR3b0NoYXJzID09PSAnXFxcXHUnKSB7XG4gICAgaSArPSAyO1xuICAgIHZhciBmb3VySGV4RGlnaXRzID0gc2xpY2Uoc291cmNlLCBpLCBpICsgNCk7XG4gICAgaWYgKCFleGVjKElTXzRfSEVYX0RJR0lUUywgZm91ckhleERpZ2l0cykpXG4gICAgIHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ0JhZCBVbmljb2RlIGVzY2FwZSBhdDogJyArIGkpO1xuICAgIHZhbHVlICs9IGZyb21DaGFyQ29kZSgkcGFyc2VJbnQoZm91ckhleERpZ2l0cywgMTYpKTtcbiAgICBpICs9IDQ7XG4gICB9IGVsc2VcbiAgICB0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdVbmtub3duIGVzY2FwZSBzZXF1ZW5jZTogXCInICsgdHdvQ2hhcnMgKyAnXCInKTtcbiAgfSBlbHNlIGlmIChjaHIgPT09ICdcIicpIHtcbiAgIHVudGVybWluYXRlZCA9IGZhbHNlO1xuICAgaSsrO1xuICAgYnJlYWs7XG4gIH0gZWxzZSB7XG4gICBpZiAoZXhlYyhJU19DMF9DT05UUk9MX0NPREUsIGNocikpXG4gICAgdGhyb3cgbmV3ICRTeW50YXhFcnJvcignQmFkIGNvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZyBsaXRlcmFsIGF0OiAnICsgaSk7XG4gICB2YWx1ZSArPSBjaHI7XG4gICBpKys7XG4gIH1cbiB9XG4gaWYgKHVudGVybWluYXRlZClcbiAgdGhyb3cgbmV3ICRTeW50YXhFcnJvcignVW50ZXJtaW5hdGVkIHN0cmluZyBhdDogJyArIGkpO1xuIHJldHVybiB7XG4gIHZhbHVlOiB2YWx1ZSxcbiAgZW5kOiBpXG4gfTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA2MDg1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDc3NDQpLmYpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVGFyZ2V0LCBTb3VyY2UsIGtleSkge1xuIGtleSBpbiBUYXJnZXQgfHwgZGVmaW5lUHJvcGVydHkoVGFyZ2V0LCBrZXksIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiBTb3VyY2Vba2V5XTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoaXQpIHtcbiAgIFNvdXJjZVtrZXldID0gaXQ7XG4gIH1cbiB9KTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NjQ1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzczNCk7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSlcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiByZXR1cm4gaXQ7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDA1Nzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgU2V0SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xudmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4NDgpO1xudmFyIFNldCA9IFNldEhlbHBlcnMuU2V0O1xudmFyIGFkZCA9IFNldEhlbHBlcnMuYWRkO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0KSB7XG4gdmFyIHJlc3VsdCA9IG5ldyBTZXQoKTtcbiBpdGVyYXRlKHNldCwgZnVuY3Rpb24gKGl0KSB7XG4gIGFkZChyZXN1bHQsIGl0KTtcbiB9KTtcbiByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU2NTY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGFTZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2OTApO1xudmFyIFNldEhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTtcbnZhciBjbG9uZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDA1Nyk7XG52YXIgc2l6ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjA5OCk7XG52YXIgZ2V0U2V0UmVjb3JkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDk2KTtcbnZhciBpdGVyYXRlU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODQ4KTtcbnZhciBpdGVyYXRlU2ltcGxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTA0KTtcbnZhciBoYXMgPSBTZXRIZWxwZXJzLmhhcztcbnZhciByZW1vdmUgPSBTZXRIZWxwZXJzLnJlbW92ZTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlmZmVyZW5jZShvdGhlcikge1xuIHZhciBPID0gYVNldCh0aGlzKTtcbiB2YXIgb3RoZXJSZWMgPSBnZXRTZXRSZWNvcmQob3RoZXIpO1xuIHZhciByZXN1bHQgPSBjbG9uZShPKTtcbiBpZiAoc2l6ZShPKSA8PSBvdGhlclJlYy5zaXplKVxuICBpdGVyYXRlU2V0KE8sIGZ1bmN0aW9uIChlKSB7XG4gICBpZiAob3RoZXJSZWMuaW5jbHVkZXMoZSkpXG4gICAgcmVtb3ZlKHJlc3VsdCwgZSk7XG4gIH0pO1xuIGVsc2VcbiAgaXRlcmF0ZVNpbXBsZShvdGhlclJlYy5nZXRJdGVyYXRvcigpLCBmdW5jdGlvbiAoZSkge1xuICAgaWYgKGhhcyhPLCBlKSlcbiAgICByZW1vdmUocmVzdWx0LCBlKTtcbiAgfSk7XG4gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0MDMpO1xudmFyIFNldFByb3RvdHlwZSA9IFNldC5wcm90b3R5cGU7XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiBTZXQ6IFNldCxcbiBhZGQ6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5hZGQpLFxuIGhhczogdW5jdXJyeVRoaXMoU2V0UHJvdG90eXBlLmhhcyksXG4gcmVtb3ZlOiB1bmN1cnJ5VGhpcyhTZXRQcm90b3R5cGVbJ2RlbGV0ZSddKSxcbiBwcm90bzogU2V0UHJvdG90eXBlXG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODQ2MTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgYVNldCA9IF9fd2VicGFja19yZXF1aXJlX18oNTY5MCk7XG52YXIgU2V0SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xudmFyIHNpemUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwOTgpO1xudmFyIGdldFNldFJlY29yZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTA5Nik7XG52YXIgaXRlcmF0ZVNldCA9IF9fd2VicGFja19yZXF1aXJlX18oODg0OCk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUwNCk7XG52YXIgU2V0ID0gU2V0SGVscGVycy5TZXQ7XG52YXIgYWRkID0gU2V0SGVscGVycy5hZGQ7XG52YXIgaGFzID0gU2V0SGVscGVycy5oYXM7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbihvdGhlcikge1xuIHZhciBPID0gYVNldCh0aGlzKTtcbiB2YXIgb3RoZXJSZWMgPSBnZXRTZXRSZWNvcmQob3RoZXIpO1xuIHZhciByZXN1bHQgPSBuZXcgU2V0KCk7XG4gaWYgKHNpemUoTykgPiBvdGhlclJlYy5zaXplKSB7XG4gIGl0ZXJhdGVTaW1wbGUob3RoZXJSZWMuZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKGUpIHtcbiAgIGlmIChoYXMoTywgZSkpXG4gICAgYWRkKHJlc3VsdCwgZSk7XG4gIH0pO1xuIH0gZWxzZSB7XG4gIGl0ZXJhdGVTZXQoTywgZnVuY3Rpb24gKGUpIHtcbiAgIGlmIChvdGhlclJlYy5pbmNsdWRlcyhlKSlcbiAgICBhZGQocmVzdWx0LCBlKTtcbiAgfSk7XG4gfVxuIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODU1MDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgYVNldCA9IF9fd2VicGFja19yZXF1aXJlX18oNTY5MCk7XG52YXIgaGFzID0gKF9fd2VicGFja19yZXF1aXJlX18oMjMpLmhhcyk7XG52YXIgc2l6ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjA5OCk7XG52YXIgZ2V0U2V0UmVjb3JkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDk2KTtcbnZhciBpdGVyYXRlU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODQ4KTtcbnZhciBpdGVyYXRlU2ltcGxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTA0KTtcbnZhciBpdGVyYXRvckNsb3NlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzE2KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNEaXNqb2ludEZyb20ob3RoZXIpIHtcbiB2YXIgTyA9IGFTZXQodGhpcyk7XG4gdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiBpZiAoc2l6ZShPKSA8PSBvdGhlclJlYy5zaXplKVxuICByZXR1cm4gaXRlcmF0ZVNldChPLCBmdW5jdGlvbiAoZSkge1xuICAgaWYgKG90aGVyUmVjLmluY2x1ZGVzKGUpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgdHJ1ZSkgIT09IGZhbHNlO1xuIHZhciBpdGVyYXRvciA9IG90aGVyUmVjLmdldEl0ZXJhdG9yKCk7XG4gcmV0dXJuIGl0ZXJhdGVTaW1wbGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChlKSB7XG4gIGlmIChoYXMoTywgZSkpXG4gICByZXR1cm4gaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGZhbHNlKTtcbiB9KSAhPT0gZmFsc2U7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTkwOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBhU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NjkwKTtcbnZhciBzaXplID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDk4KTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODQ4KTtcbnZhciBnZXRTZXRSZWNvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOTYpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1YnNldE9mKG90aGVyKSB7XG4gdmFyIE8gPSBhU2V0KHRoaXMpO1xuIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gaWYgKHNpemUoTykgPiBvdGhlclJlYy5zaXplKVxuICByZXR1cm4gZmFsc2U7XG4gcmV0dXJuIGl0ZXJhdGUoTywgZnVuY3Rpb24gKGUpIHtcbiAgaWYgKCFvdGhlclJlYy5pbmNsdWRlcyhlKSlcbiAgIHJldHVybiBmYWxzZTtcbiB9LCB0cnVlKSAhPT0gZmFsc2U7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTk0OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBhU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NjkwKTtcbnZhciBoYXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygyMykuaGFzKTtcbnZhciBzaXplID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDk4KTtcbnZhciBnZXRTZXRSZWNvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOTYpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MDQpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMTYpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1cGVyc2V0T2Yob3RoZXIpIHtcbiB2YXIgTyA9IGFTZXQodGhpcyk7XG4gdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiBpZiAoc2l6ZShPKSA8IG90aGVyUmVjLnNpemUpXG4gIHJldHVybiBmYWxzZTtcbiB2YXIgaXRlcmF0b3IgPSBvdGhlclJlYy5nZXRJdGVyYXRvcigpO1xuIHJldHVybiBpdGVyYXRlU2ltcGxlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoZSkge1xuICBpZiAoIWhhcyhPLCBlKSlcbiAgIHJldHVybiBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgZmFsc2UpO1xuIH0pICE9PSBmYWxzZTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4ODQ4OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUwNCk7XG52YXIgU2V0SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xudmFyIFNldCA9IFNldEhlbHBlcnMuU2V0O1xudmFyIFNldFByb3RvdHlwZSA9IFNldEhlbHBlcnMucHJvdG87XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5mb3JFYWNoKTtcbnZhciBrZXlzID0gdW5jdXJyeVRoaXMoU2V0UHJvdG90eXBlLmtleXMpO1xudmFyIG5leHQgPSBrZXlzKG5ldyBTZXQoKSkubmV4dDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldCwgZm4sIGludGVycnVwdGlibGUpIHtcbiByZXR1cm4gaW50ZXJydXB0aWJsZSA/IGl0ZXJhdGVTaW1wbGUoe1xuICBpdGVyYXRvcjoga2V5cyhzZXQpLFxuICBuZXh0OiBuZXh0XG4gfSwgZm4pIDogZm9yRWFjaChzZXQsIGZuKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1MDc6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxODcpO1xudmFyIGNyZWF0ZVNldExpa2UgPSBmdW5jdGlvbiAoc2l6ZSkge1xuIHJldHVybiB7XG4gIHNpemU6IHNpemUsXG4gIGhhczogZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBrZXlzOiBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbiAgIH07XG4gIH1cbiB9O1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiB2YXIgU2V0ID0gZ2V0QnVpbHRJbignU2V0Jyk7XG4gdHJ5IHtcbiAgbmV3IFNldCgpW25hbWVdKGNyZWF0ZVNldExpa2UoMCkpO1xuICB0cnkge1xuICAgbmV3IFNldCgpW25hbWVdKGNyZWF0ZVNldExpa2UoLTEpKTtcbiAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IyKSB7XG4gICByZXR1cm4gdHJ1ZTtcbiAgfVxuIH0gY2F0Y2ggKGVycm9yKSB7XG4gIHJldHVybiBmYWxzZTtcbiB9XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjA5ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdW5jdXJyeVRoaXNBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5OSk7XG52YXIgU2V0SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpc0FjY2Vzc29yKFNldEhlbHBlcnMucHJvdG8sICdzaXplJywgJ2dldCcpIHx8IGZ1bmN0aW9uIChzZXQpIHtcbiByZXR1cm4gc2V0LnNpemU7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzE5NDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgYVNldCA9IF9fd2VicGFja19yZXF1aXJlX18oNTY5MCk7XG52YXIgU2V0SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xudmFyIGNsb25lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MDU3KTtcbnZhciBnZXRTZXRSZWNvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOTYpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MDQpO1xudmFyIGFkZCA9IFNldEhlbHBlcnMuYWRkO1xudmFyIGhhcyA9IFNldEhlbHBlcnMuaGFzO1xudmFyIHJlbW92ZSA9IFNldEhlbHBlcnMucmVtb3ZlO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlKG90aGVyKSB7XG4gdmFyIE8gPSBhU2V0KHRoaXMpO1xuIHZhciBrZXlzSXRlciA9IGdldFNldFJlY29yZChvdGhlcikuZ2V0SXRlcmF0b3IoKTtcbiB2YXIgcmVzdWx0ID0gY2xvbmUoTyk7XG4gaXRlcmF0ZVNpbXBsZShrZXlzSXRlciwgZnVuY3Rpb24gKGUpIHtcbiAgaWYgKGhhcyhPLCBlKSlcbiAgIHJlbW92ZShyZXN1bHQsIGUpO1xuICBlbHNlXG4gICBhZGQocmVzdWx0LCBlKTtcbiB9KTtcbiByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3MDM6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGFTZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU2OTApO1xudmFyIGFkZCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKS5hZGQpO1xudmFyIGNsb25lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MDU3KTtcbnZhciBnZXRTZXRSZWNvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOTYpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MDQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1bmlvbihvdGhlcikge1xuIHZhciBPID0gYVNldCh0aGlzKTtcbiB2YXIga2V5c0l0ZXIgPSBnZXRTZXRSZWNvcmQob3RoZXIpLmdldEl0ZXJhdG9yKCk7XG4gdmFyIHJlc3VsdCA9IGNsb25lKE8pO1xuIGl0ZXJhdGVTaW1wbGUoa2V5c0l0ZXIsIGZ1bmN0aW9uIChpdCkge1xuICBhZGQocmVzdWx0LCBpdCk7XG4gfSk7XG4gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNzI3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4MDcpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzU2MSk7XG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc1NDI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5OCk7XG52YXIgZGVmaW5lR2xvYmFsUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYwMDApO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjgwNzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMjU1NCk7XG52YXIgc3RvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1NDIpO1xuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiB2ZXJzaW9uOiAnMy4zNC4wJyxcbiBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gY29weXJpZ2h0OiAnwqkgMjAxNC0yMDIzIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJyxcbiBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zNC4wL0xJQ0VOU0UnLFxuIHNvdXJjZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzJ1xufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0ODM3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTgpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTU0KTtcbnZhciBWOCA9IF9fd2VicGFja19yZXF1aXJlX18oMjE3MSk7XG52YXIgSVNfQlJPV1NFUiA9IF9fd2VicGFja19yZXF1aXJlX18oMzQxMyk7XG52YXIgSVNfREVOTyA9IF9fd2VicGFja19yZXF1aXJlX18oODQ3MSk7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oNDg2NCk7XG52YXIgc3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcbm1vZHVsZS5leHBvcnRzID0gISFzdHJ1Y3R1cmVkQ2xvbmUgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiBpZiAoSVNfREVOTyAmJiBWOCA+IDkyIHx8IElTX05PREUgJiYgVjggPiA5NCB8fCBJU19CUk9XU0VSICYmIFY4ID4gOTcpXG4gIHJldHVybiBmYWxzZTtcbiB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgpO1xuIHZhciBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShidWZmZXIsIHsgdHJhbnNmZXI6IFtidWZmZXJdIH0pO1xuIHJldHVybiBidWZmZXIuYnl0ZUxlbmd0aCAhPT0gMCB8fCBjbG9uZS5ieXRlTGVuZ3RoICE9PSA4O1xufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNjYzOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBWOF9WRVJTSU9OID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTcxKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oODE1NCk7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk4KTtcbnZhciAkU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gdmFyIHN5bWJvbCA9IFN5bWJvbCgnc3ltYm9sIGRldGVjdGlvbicpO1xuIHJldHVybiAhJFN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8ICFTeW1ib2wuc2hhbSAmJiBWOF9WRVJTSU9OICYmIFY4X1ZFUlNJT04gPCA0MTtcbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjk4NTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMTAwMyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMTI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MTUxKTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiB2YXIgcHJpbSA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCAnbnVtYmVyJyk7XG4gaWYgKHR5cGVvZiBwcmltID09ICdudW1iZXInKVxuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgbnVtYmVyIHRvIGJpZ2ludFwiKTtcbiByZXR1cm4gQmlnSW50KHByaW0pO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk1NDg6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMDMpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MjkzKTtcbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuIGlmIChpdCA9PT0gdW5kZWZpbmVkKVxuICByZXR1cm4gMDtcbiB2YXIgbnVtYmVyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpdCk7XG4gdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKG51bWJlcik7XG4gaWYgKG51bWJlciAhPT0gbGVuZ3RoKVxuICB0aHJvdyBuZXcgJFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCBvciBpbmRleCcpO1xuIHJldHVybiBsZW5ndGg7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDExNTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzYyMik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTY0NSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAxMDAzOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB0cnVuYyA9IF9fd2VicGFja19yZXF1aXJlX18oODUzNyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuIHZhciBudW1iZXIgPSArYXJndW1lbnQ7XG4gcmV0dXJuIG51bWJlciAhPT0gbnVtYmVyIHx8IG51bWJlciA9PT0gMCA/IDAgOiB0cnVuYyhudW1iZXIpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgyOTM6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMDMpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjAwNzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTY0NSk7XG52YXIgJE9iamVjdCA9IE9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk4OTI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHRvUG9zaXRpdmVJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5ODE3KTtcbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQllURVMpIHtcbiB2YXIgb2Zmc2V0ID0gdG9Qb3NpdGl2ZUludGVnZXIoaXQpO1xuIGlmIChvZmZzZXQgJSBCWVRFUylcbiAgdGhyb3cgbmV3ICRSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQnKTtcbiByZXR1cm4gb2Zmc2V0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk4MTc6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMDMpO1xudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gdmFyIHJlc3VsdCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaXQpO1xuIGlmIChyZXN1bHQgPCAwKVxuICB0aHJvdyBuZXcgJFJhbmdlRXJyb3IoXCJUaGUgYXJndW1lbnQgY2FuJ3QgYmUgbGVzcyB0aGFuIDBcIik7XG4gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0MTUxOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDI2KTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzYzMyk7XG52YXIgaXNTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4MTQpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oODQ4Nik7XG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjkyMyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMjkyKTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gaWYgKCFpc09iamVjdChpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKVxuICByZXR1cm4gaW5wdXQ7XG4gdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiB2YXIgcmVzdWx0O1xuIGlmIChleG90aWNUb1ByaW0pIHtcbiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZClcbiAgIHByZWYgPSAnZGVmYXVsdCc7XG4gIHJlc3VsdCA9IGNhbGwoZXhvdGljVG9QcmltLCBpbnB1dCwgcHJlZik7XG4gIGlmICghaXNPYmplY3QocmVzdWx0KSB8fCBpc1N5bWJvbChyZXN1bHQpKVxuICAgcmV0dXJuIHJlc3VsdDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gfVxuIGlmIChwcmVmID09PSB1bmRlZmluZWQpXG4gIHByZWYgPSAnbnVtYmVyJztcbiByZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgcHJlZik7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDg3MTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxNTEpO1xudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODE0KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCAnc3RyaW5nJyk7XG4gcmV0dXJuIGlzU3ltYm9sKGtleSkgPyBrZXkgOiBrZXkgKyAnJztcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMDc3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyOTIpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6Jztcbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpID09PSAnW29iamVjdCB6XSc7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NzMwOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MzI5KTtcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZycpO1xuIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyAyMjc2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBJU19OT0RFID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODY0KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiB0cnkge1xuICBpZiAoSVNfTk9ERSlcbiAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHJlcXVpcmUoXCInICsgbmFtZSArICdcIiknKSgpO1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gfVxufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk3NjI6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiB0cnkge1xuICByZXR1cm4gJFN0cmluZyhhcmd1bWVudCk7XG4gfSBjYXRjaCAoZXJyb3IpIHtcbiAgcmV0dXJuICdPYmplY3QnO1xuIH1cbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NTYxOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3OTYwOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBOQVRJVkVfU1lNQk9MID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNjYzKTtcbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTCAmJiAhU3ltYm9sLnNoYW0gJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcblxuLyoqKi8gfSksXG5cbi8qKiovIDk2MTA6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDApO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTU0KTtcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkge1xuIH0sICdwcm90b3R5cGUnLCB7XG4gIHZhbHVlOiA0MixcbiAgd3JpdGFibGU6IGZhbHNlXG4gfSkucHJvdG90eXBlICE9PSA0Mjtcbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjc0Mzpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gaWYgKHBhc3NlZCA8IHJlcXVpcmVkKVxuICB0aHJvdyBuZXcgJFR5cGVFcnJvcignTm90IGVub3VnaCBhcmd1bWVudHMnKTtcbiByZXR1cm4gcGFzc2VkO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDg0NDM6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5OCk7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzMxNik7XG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xubW9kdWxlLmV4cG9ydHMgPSBpc0NhbGxhYmxlKFdlYWtNYXApICYmIC9uYXRpdmUgY29kZS8udGVzdChTdHJpbmcoV2Vha01hcCkpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjI5Mjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk4KTtcbnZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4MDcpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1NjEpO1xudmFyIE5BVElWRV9TWU1CT0wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2NjMpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTYwKTtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2xbJ2ZvciddIHx8IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpID8gU3ltYm9sW25hbWVdIDogY3JlYXRlV2VsbEtub3duU3ltYm9sKCdTeW1ib2wuJyArIG5hbWUpO1xuIH1cbiByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDczNDI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxODcpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTMpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2NTgpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NzYzKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDI1KTtcbnZhciBwcm94eUFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDg1KTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzUyMyk7XG52YXIgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNjQpO1xudmFyIGluc3RhbGxFcnJvckNhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDIyKTtcbnZhciBpbnN0YWxsRXJyb3JTdGFjayA9IF9fd2VicGFja19yZXF1aXJlX18oMTkzMSk7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MCk7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMjU1NCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChGVUxMX05BTUUsIHdyYXBwZXIsIEZPUkNFRCwgSVNfQUdHUkVHQVRFX0VSUk9SKSB7XG4gdmFyIFNUQUNLX1RSQUNFX0xJTUlUID0gJ3N0YWNrVHJhY2VMaW1pdCc7XG4gdmFyIE9QVElPTlNfUE9TSVRJT04gPSBJU19BR0dSRUdBVEVfRVJST1IgPyAyIDogMTtcbiB2YXIgcGF0aCA9IEZVTExfTkFNRS5zcGxpdCgnLicpO1xuIHZhciBFUlJPUl9OQU1FID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuIHZhciBPcmlnaW5hbEVycm9yID0gZ2V0QnVpbHRJbi5hcHBseShudWxsLCBwYXRoKTtcbiBpZiAoIU9yaWdpbmFsRXJyb3IpXG4gIHJldHVybjtcbiB2YXIgT3JpZ2luYWxFcnJvclByb3RvdHlwZSA9IE9yaWdpbmFsRXJyb3IucHJvdG90eXBlO1xuIGlmICghSVNfUFVSRSAmJiBoYXNPd24oT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgJ2NhdXNlJykpXG4gIGRlbGV0ZSBPcmlnaW5hbEVycm9yUHJvdG90eXBlLmNhdXNlO1xuIGlmICghRk9SQ0VEKVxuICByZXR1cm4gT3JpZ2luYWxFcnJvcjtcbiB2YXIgQmFzZUVycm9yID0gZ2V0QnVpbHRJbignRXJyb3InKTtcbiB2YXIgV3JhcHBlZEVycm9yID0gd3JhcHBlcihmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgbWVzc2FnZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KElTX0FHR1JFR0FURV9FUlJPUiA/IGIgOiBhLCB1bmRlZmluZWQpO1xuICB2YXIgcmVzdWx0ID0gSVNfQUdHUkVHQVRFX0VSUk9SID8gbmV3IE9yaWdpbmFsRXJyb3IoYSkgOiBuZXcgT3JpZ2luYWxFcnJvcigpO1xuICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKVxuICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHJlc3VsdCwgJ21lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgaW5zdGFsbEVycm9yU3RhY2socmVzdWx0LCBXcmFwcGVkRXJyb3IsIHJlc3VsdC5zdGFjaywgMik7XG4gIGlmICh0aGlzICYmIGlzUHJvdG90eXBlT2YoT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgdGhpcykpXG4gICBpbmhlcml0SWZSZXF1aXJlZChyZXN1bHQsIHRoaXMsIFdyYXBwZWRFcnJvcik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gT1BUSU9OU19QT1NJVElPTilcbiAgIGluc3RhbGxFcnJvckNhdXNlKHJlc3VsdCwgYXJndW1lbnRzW09QVElPTlNfUE9TSVRJT05dKTtcbiAgcmV0dXJuIHJlc3VsdDtcbiB9KTtcbiBXcmFwcGVkRXJyb3IucHJvdG90eXBlID0gT3JpZ2luYWxFcnJvclByb3RvdHlwZTtcbiBpZiAoRVJST1JfTkFNRSAhPT0gJ0Vycm9yJykge1xuICBpZiAoc2V0UHJvdG90eXBlT2YpXG4gICBzZXRQcm90b3R5cGVPZihXcmFwcGVkRXJyb3IsIEJhc2VFcnJvcik7XG4gIGVsc2VcbiAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoV3JhcHBlZEVycm9yLCBCYXNlRXJyb3IsIHsgbmFtZTogdHJ1ZSB9KTtcbiB9IGVsc2UgaWYgKERFU0NSSVBUT1JTICYmIFNUQUNLX1RSQUNFX0xJTUlUIGluIE9yaWdpbmFsRXJyb3IpIHtcbiAgcHJveHlBY2Nlc3NvcihXcmFwcGVkRXJyb3IsIE9yaWdpbmFsRXJyb3IsIFNUQUNLX1RSQUNFX0xJTUlUKTtcbiAgcHJveHlBY2Nlc3NvcihXcmFwcGVkRXJyb3IsIE9yaWdpbmFsRXJyb3IsICdwcmVwYXJlU3RhY2tUcmFjZScpO1xuIH1cbiBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKFdyYXBwZWRFcnJvciwgT3JpZ2luYWxFcnJvcik7XG4gaWYgKCFJU19QVVJFKVxuICB0cnkge1xuICAgaWYgKE9yaWdpbmFsRXJyb3JQcm90b3R5cGUubmFtZSAhPT0gRVJST1JfTkFNRSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPcmlnaW5hbEVycm9yUHJvdG90eXBlLCAnbmFtZScsIEVSUk9SX05BTUUpO1xuICAgfVxuICAgT3JpZ2luYWxFcnJvclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdyYXBwZWRFcnJvcjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgfVxuIHJldHVybiBXcmFwcGVkRXJyb3I7XG59O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDIyNjpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjAwNyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7XG52YXIgc2V0QXJyYXlMZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2NjEpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNDI4Nyk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xudmFyIElOQ09SUkVDVF9UT19MRU5HVEggPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gcmV0dXJuIFtdLnB1c2guY2FsbCh7IGxlbmd0aDogMHgxMDAwMDAwMDAgfSwgMSkgIT09IDQyOTQ5NjcyOTc7XG59KTtcbnZhciBwcm9wZXJFcnJvck9uTm9uV3JpdGFibGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gdHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkucHVzaCgpO1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiB9XG59O1xudmFyIEZPUkNFRCA9IElOQ09SUkVDVF9UT19MRU5HVEggfHwgIXByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCgpO1xuJCh7XG4gdGFyZ2V0OiAnQXJyYXknLFxuIHByb3RvOiB0cnVlLFxuIGFyaXR5OiAxLFxuIGZvcmNlZDogRk9SQ0VEXG59LCB7XG4gcHVzaDogZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKGxlbiArIGFyZ0NvdW50KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7XG4gICBPW2xlbl0gPSBhcmd1bWVudHNbaV07XG4gICBsZW4rKztcbiAgfVxuICBzZXRBcnJheUxlbmd0aChPLCBsZW4pO1xuICByZXR1cm4gbGVuO1xuIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzM1Mjpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTgpO1xudmFyIGFwcGx5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Mjk0KTtcbnZhciB3cmFwRXJyb3JDb25zdHJ1Y3RvcldpdGhDYXVzZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzM0Mik7XG52YXIgV0VCX0FTU0VNQkxZID0gJ1dlYkFzc2VtYmx5JztcbnZhciBXZWJBc3NlbWJseSA9IGdsb2JhbFtXRUJfQVNTRU1CTFldO1xudmFyIEZPUkNFRCA9IG5ldyBFcnJvcignZScsIHsgY2F1c2U6IDcgfSkuY2F1c2UgIT09IDc7XG52YXIgZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIgPSBmdW5jdGlvbiAoRVJST1JfTkFNRSwgd3JhcHBlcikge1xuIHZhciBPID0ge307XG4gT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gJCh7XG4gIGdsb2JhbDogdHJ1ZSxcbiAgY29uc3RydWN0b3I6IHRydWUsXG4gIGFyaXR5OiAxLFxuICBmb3JjZWQ6IEZPUkNFRFxuIH0sIE8pO1xufTtcbnZhciBleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyID0gZnVuY3Rpb24gKEVSUk9SX05BTUUsIHdyYXBwZXIpIHtcbiBpZiAoV2ViQXNzZW1ibHkgJiYgV2ViQXNzZW1ibHlbRVJST1JfTkFNRV0pIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKFdFQl9BU1NFTUJMWSArICcuJyArIEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gICQoe1xuICAgdGFyZ2V0OiBXRUJfQVNTRU1CTFksXG4gICBzdGF0OiB0cnVlLFxuICAgY29uc3RydWN0b3I6IHRydWUsXG4gICBhcml0eTogMSxcbiAgIGZvcmNlZDogRk9SQ0VEXG4gIH0sIE8pO1xuIH1cbn07XG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuIHJldHVybiBmdW5jdGlvbiBFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpO1xuIH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdFdmFsRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuIHJldHVybiBmdW5jdGlvbiBFdmFsRXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTtcbiB9O1xufSk7XG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignUmFuZ2VFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gcmV0dXJuIGZ1bmN0aW9uIFJhbmdlRXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTtcbiB9O1xufSk7XG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignUmVmZXJlbmNlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuIHJldHVybiBmdW5jdGlvbiBSZWZlcmVuY2VFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpO1xuIH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdTeW50YXhFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gcmV0dXJuIGZ1bmN0aW9uIFN5bnRheEVycm9yKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ1R5cGVFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gcmV0dXJuIGZ1bmN0aW9uIFR5cGVFcnJvcihtZXNzYWdlKSB7XG4gIHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpO1xuIH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdVUklFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gcmV0dXJuIGZ1bmN0aW9uIFVSSUVycm9yKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gfTtcbn0pO1xuZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcignQ29tcGlsZUVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiByZXR1cm4gZnVuY3Rpb24gQ29tcGlsZUVycm9yKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gfTtcbn0pO1xuZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcignTGlua0Vycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiByZXR1cm4gZnVuY3Rpb24gTGlua0Vycm9yKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gfTtcbn0pO1xuZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcignUnVudGltZUVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiByZXR1cm4gZnVuY3Rpb24gUnVudGltZUVycm9yKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gfTtcbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTgwMzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1ODYxKTtcbnZhciAkZmluZExhc3RJbmRleCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDQwMjYpLmZpbmRMYXN0SW5kZXgpO1xudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZExhc3RJbmRleCcsIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlKSB7XG4gcmV0dXJuICRmaW5kTGFzdEluZGV4KGFUeXBlZEFycmF5KHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODgzNzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1ODYxKTtcbnZhciAkZmluZExhc3QgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg0MDI2KS5maW5kTGFzdCk7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmaW5kTGFzdCcsIGZ1bmN0aW9uIGZpbmRMYXN0KHByZWRpY2F0ZSkge1xuIHJldHVybiAkZmluZExhc3QoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MzQ3OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5OCk7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyNik7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTg2MSk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7XG52YXIgdG9PZmZzZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4OTIpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMjAwNyk7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgxNTQpO1xudmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyICRzZXQgPSBJbnQ4QXJyYXlQcm90b3R5cGUgJiYgSW50OEFycmF5UHJvdG90eXBlLnNldDtcbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciBXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiB2YXIgYXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMik7XG4gY2FsbCgkc2V0LCBhcnJheSwge1xuICBsZW5ndGg6IDEsXG4gIDA6IDNcbiB9LCAxKTtcbiByZXR1cm4gYXJyYXlbMV0gIT09IDM7XG59KTtcbnZhciBUT19PQkpFQ1RfQlVHID0gV09SS1NfV0lUSF9PQkpFQ1RTX0FORF9HRU5FUklDX09OX1RZUEVEX0FSUkFZUyAmJiBBcnJheUJ1ZmZlclZpZXdDb3JlLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuIHZhciBhcnJheSA9IG5ldyBJbnQ4QXJyYXkoMik7XG4gYXJyYXkuc2V0KDEpO1xuIGFycmF5LnNldCgnMicsIDEpO1xuIHJldHVybiBhcnJheVswXSAhPT0gMCB8fCBhcnJheVsxXSAhPT0gMjtcbn0pO1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc2V0JywgZnVuY3Rpb24gc2V0KGFycmF5TGlrZSkge1xuIGFUeXBlZEFycmF5KHRoaXMpO1xuIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMSk7XG4gdmFyIHNyYyA9IHRvSW5kZXhlZE9iamVjdChhcnJheUxpa2UpO1xuIGlmIChXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTKVxuICByZXR1cm4gY2FsbCgkc2V0LCB0aGlzLCBzcmMsIG9mZnNldCk7XG4gdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShzcmMpO1xuIHZhciBpbmRleCA9IDA7XG4gaWYgKGxlbiArIG9mZnNldCA+IGxlbmd0aClcbiAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCcpO1xuIHdoaWxlIChpbmRleCA8IGxlbilcbiAgdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107XG59LCAhV09SS1NfV0lUSF9PQkpFQ1RTX0FORF9HRU5FUklDX09OX1RZUEVEX0FSUkFZUyB8fCBUT19PQkpFQ1RfQlVHKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc5OTU6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgYXJyYXlUb1JldmVyc2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMzA0KTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1ODYxKTtcbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvUmV2ZXJzZWQnLCBmdW5jdGlvbiB0b1JldmVyc2VkKCkge1xuIHJldHVybiBhcnJheVRvUmV2ZXJzZWQoYVR5cGVkQXJyYXkodGhpcyksIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0aGlzKSk7XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDYyOlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4NjEpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDAzKTtcbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3ODIpO1xudmFyIGFycmF5RnJvbUNvbnN0cnVjdG9yQW5kTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzAwMyk7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgc29ydCA9IHVuY3VycnlUaGlzKEFycmF5QnVmZmVyVmlld0NvcmUuVHlwZWRBcnJheVByb3RvdHlwZS5zb3J0KTtcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvU29ydGVkJywgZnVuY3Rpb24gdG9Tb3J0ZWQoY29tcGFyZUZuKSB7XG4gaWYgKGNvbXBhcmVGbiAhPT0gdW5kZWZpbmVkKVxuICBhQ2FsbGFibGUoY29tcGFyZUZuKTtcbiB2YXIgTyA9IGFUeXBlZEFycmF5KHRoaXMpO1xuIHZhciBBID0gYXJyYXlGcm9tQ29uc3RydWN0b3JBbmRMaXN0KGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcihPKSwgTyk7XG4gcmV0dXJuIHNvcnQoQSwgY29tcGFyZUZuKTtcbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNDYwMjpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBhcnJheVdpdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4ODYpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4NjEpO1xudmFyIGlzQmlnSW50QXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU5ODYpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwMDMpO1xudmFyIHRvQmlnSW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTIpO1xudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIFBST1BFUl9PUkRFUiA9ICEhKGZ1bmN0aW9uICgpIHtcbiB0cnkge1xuICBuZXcgSW50OEFycmF5KDEpWyd3aXRoJ10oMiwge1xuICAgdmFsdWVPZjogZnVuY3Rpb24gKCkge1xuICAgIHRocm93IDg7XG4gICB9XG4gIH0pO1xuIH0gY2F0Y2ggKGVycm9yKSB7XG4gIHJldHVybiBlcnJvciA9PT0gODtcbiB9XG59KCkpO1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnd2l0aCcsIHtcbiAnd2l0aCc6IGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIHJlbGF0aXZlSW5kZXggPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgdmFyIGFjdHVhbFZhbHVlID0gaXNCaWdJbnRBcnJheShPKSA/IHRvQmlnSW50KHZhbHVlKSA6ICt2YWx1ZTtcbiAgcmV0dXJuIGFycmF5V2l0aChPLCBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IoTyksIHJlbGF0aXZlSW5kZXgsIGFjdHVhbFZhbHVlKTtcbiB9XG59Wyd3aXRoJ10sICFQUk9QRVJfT1JERVIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzQ0OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDApO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oOTY5MSk7XG52YXIgaXNEZXRhY2hlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTgyKTtcbnZhciBBcnJheUJ1ZmZlclByb3RvdHlwZSA9IEFycmF5QnVmZmVyLnByb3RvdHlwZTtcbmlmIChERVNDUklQVE9SUyAmJiAhKCdkZXRhY2hlZCcgaW4gQXJyYXlCdWZmZXJQcm90b3R5cGUpKSB7XG4gZGVmaW5lQnVpbHRJbkFjY2Vzc29yKEFycmF5QnVmZmVyUHJvdG90eXBlLCAnZGV0YWNoZWQnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBkZXRhY2hlZCgpIHtcbiAgIHJldHVybiBpc0RldGFjaGVkKHRoaXMpO1xuICB9XG4gfSk7XG59XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NTgzOlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5NzgpO1xudmFyICR0cmFuc2ZlciA9IF9fd2VicGFja19yZXF1aXJlX18oNDM1OCk7XG5pZiAoJHRyYW5zZmVyKVxuICQoe1xuICB0YXJnZXQ6ICdBcnJheUJ1ZmZlcicsXG4gIHByb3RvOiB0cnVlXG4gfSwge1xuICB0cmFuc2ZlclRvRml4ZWRMZW5ndGg6IGZ1bmN0aW9uIHRyYW5zZmVyVG9GaXhlZExlbmd0aCgpIHtcbiAgIHJldHVybiAkdHJhbnNmZXIodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG4gfSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA0MzA1OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5NzgpO1xudmFyICR0cmFuc2ZlciA9IF9fd2VicGFja19yZXF1aXJlX18oNDM1OCk7XG5pZiAoJHRyYW5zZmVyKVxuICQoe1xuICB0YXJnZXQ6ICdBcnJheUJ1ZmZlcicsXG4gIHByb3RvOiB0cnVlXG4gfSwge1xuICB0cmFuc2ZlcjogZnVuY3Rpb24gdHJhbnNmZXIoKSB7XG4gICByZXR1cm4gJHRyYW5zZmVyKHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQsIHRydWUpO1xuICB9XG4gfSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3MTIxOlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5NzgpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5OCk7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTgzNCk7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczMTYpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTc2KTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk2OTEpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OTQ3KTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oODE1NCk7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzYpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjI5Mik7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg1MjM4KS5JdGVyYXRvclByb3RvdHlwZSk7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MCk7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMjU1NCk7XG52YXIgQ09OU1RSVUNUT1IgPSAnY29uc3RydWN0b3InO1xudmFyIElURVJBVE9SID0gJ0l0ZXJhdG9yJztcbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTmF0aXZlSXRlcmF0b3IgPSBnbG9iYWxbSVRFUkFUT1JdO1xudmFyIEZPUkNFRCA9IElTX1BVUkUgfHwgIWlzQ2FsbGFibGUoTmF0aXZlSXRlcmF0b3IpIHx8IE5hdGl2ZUl0ZXJhdG9yLnByb3RvdHlwZSAhPT0gSXRlcmF0b3JQcm90b3R5cGUgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiBOYXRpdmVJdGVyYXRvcih7fSk7XG59KTtcbnZhciBJdGVyYXRvckNvbnN0cnVjdG9yID0gZnVuY3Rpb24gSXRlcmF0b3IoKSB7XG4gYW5JbnN0YW5jZSh0aGlzLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gaWYgKGdldFByb3RvdHlwZU9mKHRoaXMpID09PSBJdGVyYXRvclByb3RvdHlwZSlcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fic3RyYWN0IGNsYXNzIEl0ZXJhdG9yIG5vdCBkaXJlY3RseSBjb25zdHJ1Y3RhYmxlJyk7XG59O1xudmFyIGRlZmluZUl0ZXJhdG9yUHJvdG90eXBlQWNjZXNzb3IgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuIGlmIChERVNDUklQVE9SUykge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoSXRlcmF0b3JQcm90b3R5cGUsIGtleSwge1xuICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICAgfSxcbiAgIHNldDogZnVuY3Rpb24gKHJlcGxhY2VtZW50KSB7XG4gICAgYW5PYmplY3QodGhpcyk7XG4gICAgaWYgKHRoaXMgPT09IEl0ZXJhdG9yUHJvdG90eXBlKVxuICAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIllvdSBjYW4ndCByZWRlZmluZSB0aGlzIHByb3BlcnR5XCIpO1xuICAgIGlmIChoYXNPd24odGhpcywga2V5KSlcbiAgICAgdGhpc1trZXldID0gcmVwbGFjZW1lbnQ7XG4gICAgZWxzZVxuICAgICBjcmVhdGVQcm9wZXJ0eSh0aGlzLCBrZXksIHJlcGxhY2VtZW50KTtcbiAgIH1cbiAgfSk7XG4gfSBlbHNlXG4gIEl0ZXJhdG9yUHJvdG90eXBlW2tleV0gPSB2YWx1ZTtcbn07XG5pZiAoIWhhc093bihJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpXG4gZGVmaW5lSXRlcmF0b3JQcm90b3R5cGVBY2Nlc3NvcihUT19TVFJJTkdfVEFHLCBJVEVSQVRPUik7XG5pZiAoRk9SQ0VEIHx8ICFoYXNPd24oSXRlcmF0b3JQcm90b3R5cGUsIENPTlNUUlVDVE9SKSB8fCBJdGVyYXRvclByb3RvdHlwZVtDT05TVFJVQ1RPUl0gPT09IE9iamVjdCkge1xuIGRlZmluZUl0ZXJhdG9yUHJvdG90eXBlQWNjZXNzb3IoQ09OU1RSVUNUT1IsIEl0ZXJhdG9yQ29uc3RydWN0b3IpO1xufVxuSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBJdGVyYXRvclByb3RvdHlwZTtcbiQoe1xuIGdsb2JhbDogdHJ1ZSxcbiBjb25zdHJ1Y3RvcjogdHJ1ZSxcbiBmb3JjZWQ6IEZPUkNFRFxufSwgeyBJdGVyYXRvcjogSXRlcmF0b3JDb25zdHJ1Y3RvciB9KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDM4NTpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODM3KTtcbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3ODIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzE5KTtcbnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTIzNSk7XG4kKHtcbiB0YXJnZXQ6ICdJdGVyYXRvcicsXG4gcHJvdG86IHRydWUsXG4gcmVhbDogdHJ1ZVxufSwge1xuIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShwcmVkaWNhdGUpIHtcbiAgYW5PYmplY3QodGhpcyk7XG4gIGFDYWxsYWJsZShwcmVkaWNhdGUpO1xuICB2YXIgcmVjb3JkID0gZ2V0SXRlcmF0b3JEaXJlY3QodGhpcyk7XG4gIHZhciBjb3VudGVyID0gMDtcbiAgcmV0dXJuICFpdGVyYXRlKHJlY29yZCwgZnVuY3Rpb24gKHZhbHVlLCBzdG9wKSB7XG4gICBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwgY291bnRlcisrKSlcbiAgICByZXR1cm4gc3RvcCgpO1xuICB9LCB7XG4gICBJU19SRUNPUkQ6IHRydWUsXG4gICBJTlRFUlJVUFRFRDogdHJ1ZVxuICB9KS5zdG9wcGVkO1xuIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjk5Mzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDI2KTtcbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3ODIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzE5KTtcbnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTIzNSk7XG52YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oMzc1KTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzIzKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNTU0KTtcbnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoKSB7XG4gdmFyIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjtcbiB2YXIgcHJlZGljYXRlID0gdGhpcy5wcmVkaWNhdGU7XG4gdmFyIG5leHQgPSB0aGlzLm5leHQ7XG4gdmFyIHJlc3VsdCwgZG9uZSwgdmFsdWU7XG4gd2hpbGUgKHRydWUpIHtcbiAgcmVzdWx0ID0gYW5PYmplY3QoY2FsbChuZXh0LCBpdGVyYXRvcikpO1xuICBkb25lID0gdGhpcy5kb25lID0gISFyZXN1bHQuZG9uZTtcbiAgaWYgKGRvbmUpXG4gICByZXR1cm47XG4gIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICBpZiAoY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgcHJlZGljYXRlLCBbXG4gICAgdmFsdWUsXG4gICAgdGhpcy5jb3VudGVyKytcbiAgIF0sIHRydWUpKVxuICAgcmV0dXJuIHZhbHVlO1xuIH1cbn0pO1xuJCh7XG4gdGFyZ2V0OiAnSXRlcmF0b3InLFxuIHByb3RvOiB0cnVlLFxuIHJlYWw6IHRydWUsXG4gZm9yY2VkOiBJU19QVVJFXG59LCB7XG4gZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlKSB7XG4gIGFuT2JqZWN0KHRoaXMpO1xuICBhQ2FsbGFibGUocHJlZGljYXRlKTtcbiAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KGdldEl0ZXJhdG9yRGlyZWN0KHRoaXMpLCB7IHByZWRpY2F0ZTogcHJlZGljYXRlIH0pO1xuIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODQ5Nzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDI2KTtcbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3ODIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzE5KTtcbnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOTIzNSk7XG52YXIgZ2V0SXRlcmF0b3JGbGF0dGVuYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTA3KTtcbnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzUpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMTYpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1NTQpO1xudmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uICgpIHtcbiB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuIHZhciBtYXBwZXIgPSB0aGlzLm1hcHBlcjtcbiB2YXIgcmVzdWx0LCBpbm5lcjtcbiB3aGlsZSAodHJ1ZSkge1xuICBpZiAoaW5uZXIgPSB0aGlzLmlubmVyKVxuICAgdHJ5IHtcbiAgICByZXN1bHQgPSBhbk9iamVjdChjYWxsKGlubmVyLm5leHQsIGlubmVyLml0ZXJhdG9yKSk7XG4gICAgaWYgKCFyZXN1bHQuZG9uZSlcbiAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICB0aGlzLmlubmVyID0gbnVsbDtcbiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ3Rocm93JywgZXJyb3IpO1xuICAgfVxuICByZXN1bHQgPSBhbk9iamVjdChjYWxsKHRoaXMubmV4dCwgaXRlcmF0b3IpKTtcbiAgaWYgKHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmUpXG4gICByZXR1cm47XG4gIHRyeSB7XG4gICB0aGlzLmlubmVyID0gZ2V0SXRlcmF0b3JGbGF0dGVuYWJsZShtYXBwZXIocmVzdWx0LnZhbHVlLCB0aGlzLmNvdW50ZXIrKyksIGZhbHNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxuIH1cbn0pO1xuJCh7XG4gdGFyZ2V0OiAnSXRlcmF0b3InLFxuIHByb3RvOiB0cnVlLFxuIHJlYWw6IHRydWUsXG4gZm9yY2VkOiBJU19QVVJFXG59LCB7XG4gZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChtYXBwZXIpIHtcbiAgYW5PYmplY3QodGhpcyk7XG4gIGFDYWxsYWJsZShtYXBwZXIpO1xuICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoZ2V0SXRlcmF0b3JEaXJlY3QodGhpcyksIHtcbiAgIG1hcHBlcjogbWFwcGVyLFxuICAgaW5uZXI6IG51bGxcbiAgfSk7XG4gfVxufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3OTQ0OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5NzgpO1xudmFyIG1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oODE0Mik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMjU1NCk7XG4kKHtcbiB0YXJnZXQ6ICdJdGVyYXRvcicsXG4gcHJvdG86IHRydWUsXG4gcmVhbDogdHJ1ZSxcbiBmb3JjZWQ6IElTX1BVUkVcbn0sIHsgbWFwOiBtYXAgfSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4NTE4OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5NzgpO1xudmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4MzcpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTc4Mik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MTkpO1xudmFyIGdldEl0ZXJhdG9yRGlyZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MjM1KTtcbiQoe1xuIHRhcmdldDogJ0l0ZXJhdG9yJyxcbiBwcm90bzogdHJ1ZSxcbiByZWFsOiB0cnVlXG59LCB7XG4gc29tZTogZnVuY3Rpb24gc29tZShwcmVkaWNhdGUpIHtcbiAgYW5PYmplY3QodGhpcyk7XG4gIGFDYWxsYWJsZShwcmVkaWNhdGUpO1xuICB2YXIgcmVjb3JkID0gZ2V0SXRlcmF0b3JEaXJlY3QodGhpcyk7XG4gIHZhciBjb3VudGVyID0gMDtcbiAgcmV0dXJuIGl0ZXJhdGUocmVjb3JkLCBmdW5jdGlvbiAodmFsdWUsIHN0b3ApIHtcbiAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGNvdW50ZXIrKykpXG4gICAgcmV0dXJuIHN0b3AoKTtcbiAgfSwge1xuICAgSVNfUkVDT1JEOiB0cnVlLFxuICAgSU5URVJSVVBURUQ6IHRydWVcbiAgfSkuc3RvcHBlZDtcbiB9XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI4MDg6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNDk3OCk7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MCk7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk4KTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MTg3KTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjAyNik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzMxNik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2MzMpO1xudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5OTgpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oNTczMCk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1MSk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg5NDcpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTU0KTtcbnZhciBwYXJzZUpTT05TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MTMpO1xudmFyIE5BVElWRV9TWU1CT0wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2NjMpO1xudmFyIEpTT04gPSBnbG9iYWwuSlNPTjtcbnZhciBOdW1iZXIgPSBnbG9iYWwuTnVtYmVyO1xudmFyIFN5bnRheEVycm9yID0gZ2xvYmFsLlN5bnRheEVycm9yO1xudmFyIG5hdGl2ZVBhcnNlID0gSlNPTiAmJiBKU09OLnBhcnNlO1xudmFyIGVudW1lcmFibGVPd25Qcm9wZXJ0aWVzID0gZ2V0QnVpbHRJbignT2JqZWN0JywgJ2tleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBzbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoLy4vLmV4ZWMpO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcbnZhciBJU19ESUdJVCA9IC9eXFxkJC87XG52YXIgSVNfTk9OX1pFUk9fRElHSVQgPSAvXlsxLTldJC87XG52YXIgSVNfTlVNQkVSX1NUQVJUID0gL14oPzotfFxcZCkkLztcbnZhciBJU19XSElURVNQQUNFID0gL15bXFx0XFxuXFxyIF0kLztcbnZhciBQUklNSVRJVkUgPSAwO1xudmFyIE9CSkVDVCA9IDE7XG52YXIgJHBhcnNlID0gZnVuY3Rpb24gKHNvdXJjZSwgcmV2aXZlcikge1xuIHNvdXJjZSA9IHRvU3RyaW5nKHNvdXJjZSk7XG4gdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dChzb3VyY2UsIDAsICcnKTtcbiB2YXIgcm9vdCA9IGNvbnRleHQucGFyc2UoKTtcbiB2YXIgdmFsdWUgPSByb290LnZhbHVlO1xuIHZhciBlbmRJbmRleCA9IGNvbnRleHQuc2tpcChJU19XSElURVNQQUNFLCByb290LmVuZCk7XG4gaWYgKGVuZEluZGV4IDwgc291cmNlLmxlbmd0aCkge1xuICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgZXh0cmEgY2hhcmFjdGVyOiBcIicgKyBhdChzb3VyY2UsIGVuZEluZGV4KSArICdcIiBhZnRlciB0aGUgcGFyc2VkIGRhdGEgYXQ6ICcgKyBlbmRJbmRleCk7XG4gfVxuIHJldHVybiBpc0NhbGxhYmxlKHJldml2ZXIpID8gaW50ZXJuYWxpemUoeyAnJzogdmFsdWUgfSwgJycsIHJldml2ZXIsIHJvb3QpIDogdmFsdWU7XG59O1xudmFyIGludGVybmFsaXplID0gZnVuY3Rpb24gKGhvbGRlciwgbmFtZSwgcmV2aXZlciwgbm9kZSkge1xuIHZhciB2YWwgPSBob2xkZXJbbmFtZV07XG4gdmFyIHVubW9kaWZpZWQgPSBub2RlICYmIHZhbCA9PT0gbm9kZS52YWx1ZTtcbiB2YXIgY29udGV4dCA9IHVubW9kaWZpZWQgJiYgdHlwZW9mIG5vZGUuc291cmNlID09ICdzdHJpbmcnID8geyBzb3VyY2U6IG5vZGUuc291cmNlIH0gOiB7fTtcbiB2YXIgZWxlbWVudFJlY29yZHNMZW4sIGtleXMsIGxlbiwgaSwgUDtcbiBpZiAoaXNPYmplY3QodmFsKSkge1xuICB2YXIgbm9kZUlzQXJyYXkgPSBpc0FycmF5KHZhbCk7XG4gIHZhciBub2RlcyA9IHVubW9kaWZpZWQgPyBub2RlLm5vZGVzIDogbm9kZUlzQXJyYXkgPyBbXSA6IHt9O1xuICBpZiAobm9kZUlzQXJyYXkpIHtcbiAgIGVsZW1lbnRSZWNvcmRzTGVuID0gbm9kZXMubGVuZ3RoO1xuICAgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UodmFsKTtcbiAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGludGVybmFsaXplUHJvcGVydHkodmFsLCBpLCBpbnRlcm5hbGl6ZSh2YWwsICcnICsgaSwgcmV2aXZlciwgaSA8IGVsZW1lbnRSZWNvcmRzTGVuID8gbm9kZXNbaV0gOiB1bmRlZmluZWQpKTtcbiAgIH1cbiAgfSBlbHNlIHtcbiAgIGtleXMgPSBlbnVtZXJhYmxlT3duUHJvcGVydGllcyh2YWwpO1xuICAgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2Uoa2V5cyk7XG4gICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBQID0ga2V5c1tpXTtcbiAgICBpbnRlcm5hbGl6ZVByb3BlcnR5KHZhbCwgUCwgaW50ZXJuYWxpemUodmFsLCBQLCByZXZpdmVyLCBoYXNPd24obm9kZXMsIFApID8gbm9kZXNbUF0gOiB1bmRlZmluZWQpKTtcbiAgIH1cbiAgfVxuIH1cbiByZXR1cm4gY2FsbChyZXZpdmVyLCBob2xkZXIsIG5hbWUsIHZhbCwgY29udGV4dCk7XG59O1xudmFyIGludGVybmFsaXplUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gaWYgKERFU0NSSVBUT1JTKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwga2V5KTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlKVxuICAgcmV0dXJuO1xuIH1cbiBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgZGVsZXRlIG9iamVjdFtrZXldO1xuIGVsc2VcbiAgY3JlYXRlUHJvcGVydHkob2JqZWN0LCBrZXksIHZhbHVlKTtcbn07XG52YXIgTm9kZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5kLCBzb3VyY2UsIG5vZGVzKSB7XG4gdGhpcy52YWx1ZSA9IHZhbHVlO1xuIHRoaXMuZW5kID0gZW5kO1xuIHRoaXMuc291cmNlID0gc291cmNlO1xuIHRoaXMubm9kZXMgPSBub2Rlcztcbn07XG52YXIgQ29udGV4dCA9IGZ1bmN0aW9uIChzb3VyY2UsIGluZGV4KSB7XG4gdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gdGhpcy5pbmRleCA9IGluZGV4O1xufTtcbkNvbnRleHQucHJvdG90eXBlID0ge1xuIGZvcms6IGZ1bmN0aW9uIChuZXh0SW5kZXgpIHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KHRoaXMuc291cmNlLCBuZXh0SW5kZXgpO1xuIH0sXG4gcGFyc2U6IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNvdXJjZSA9IHRoaXMuc291cmNlO1xuICB2YXIgaSA9IHRoaXMuc2tpcChJU19XSElURVNQQUNFLCB0aGlzLmluZGV4KTtcbiAgdmFyIGZvcmsgPSB0aGlzLmZvcmsoaSk7XG4gIHZhciBjaHIgPSBhdChzb3VyY2UsIGkpO1xuICBpZiAoZXhlYyhJU19OVU1CRVJfU1RBUlQsIGNocikpXG4gICByZXR1cm4gZm9yay5udW1iZXIoKTtcbiAgc3dpdGNoIChjaHIpIHtcbiAgY2FzZSAneyc6XG4gICByZXR1cm4gZm9yay5vYmplY3QoKTtcbiAgY2FzZSAnWyc6XG4gICByZXR1cm4gZm9yay5hcnJheSgpO1xuICBjYXNlICdcIic6XG4gICByZXR1cm4gZm9yay5zdHJpbmcoKTtcbiAgY2FzZSAndCc6XG4gICByZXR1cm4gZm9yay5rZXl3b3JkKHRydWUpO1xuICBjYXNlICdmJzpcbiAgIHJldHVybiBmb3JrLmtleXdvcmQoZmFsc2UpO1xuICBjYXNlICduJzpcbiAgIHJldHVybiBmb3JrLmtleXdvcmQobnVsbCk7XG4gIH1cbiAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdVbmV4cGVjdGVkIGNoYXJhY3RlcjogXCInICsgY2hyICsgJ1wiIGF0OiAnICsgaSk7XG4gfSxcbiBub2RlOiBmdW5jdGlvbiAodHlwZSwgdmFsdWUsIHN0YXJ0LCBlbmQsIG5vZGVzKSB7XG4gIHJldHVybiBuZXcgTm9kZSh2YWx1ZSwgZW5kLCB0eXBlID8gbnVsbCA6IHNsaWNlKHRoaXMuc291cmNlLCBzdGFydCwgZW5kKSwgbm9kZXMpO1xuIH0sXG4gb2JqZWN0OiBmdW5jdGlvbiAoKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcbiAgdmFyIGkgPSB0aGlzLmluZGV4ICsgMTtcbiAgdmFyIGV4cGVjdEtleXBhaXIgPSBmYWxzZTtcbiAgdmFyIG9iamVjdCA9IHt9O1xuICB2YXIgbm9kZXMgPSB7fTtcbiAgd2hpbGUgKGkgPCBzb3VyY2UubGVuZ3RoKSB7XG4gICBpID0gdGhpcy51bnRpbChbXG4gICAgJ1wiJyxcbiAgICAnfSdcbiAgIF0sIGkpO1xuICAgaWYgKGF0KHNvdXJjZSwgaSkgPT09ICd9JyAmJiAhZXhwZWN0S2V5cGFpcikge1xuICAgIGkrKztcbiAgICBicmVhaztcbiAgIH1cbiAgIHZhciByZXN1bHQgPSB0aGlzLmZvcmsoaSkuc3RyaW5nKCk7XG4gICB2YXIga2V5ID0gcmVzdWx0LnZhbHVlO1xuICAgaSA9IHJlc3VsdC5lbmQ7XG4gICBpID0gdGhpcy51bnRpbChbJzonXSwgaSkgKyAxO1xuICAgaSA9IHRoaXMuc2tpcChJU19XSElURVNQQUNFLCBpKTtcbiAgIHJlc3VsdCA9IHRoaXMuZm9yayhpKS5wYXJzZSgpO1xuICAgY3JlYXRlUHJvcGVydHkobm9kZXMsIGtleSwgcmVzdWx0KTtcbiAgIGNyZWF0ZVByb3BlcnR5KG9iamVjdCwga2V5LCByZXN1bHQudmFsdWUpO1xuICAgaSA9IHRoaXMudW50aWwoW1xuICAgICcsJyxcbiAgICAnfSdcbiAgIF0sIHJlc3VsdC5lbmQpO1xuICAgdmFyIGNociA9IGF0KHNvdXJjZSwgaSk7XG4gICBpZiAoY2hyID09PSAnLCcpIHtcbiAgICBleHBlY3RLZXlwYWlyID0gdHJ1ZTtcbiAgICBpKys7XG4gICB9IGVsc2UgaWYgKGNociA9PT0gJ30nKSB7XG4gICAgaSsrO1xuICAgIGJyZWFrO1xuICAgfVxuICB9XG4gIHJldHVybiB0aGlzLm5vZGUoT0JKRUNULCBvYmplY3QsIHRoaXMuaW5kZXgsIGksIG5vZGVzKTtcbiB9LFxuIGFycmF5OiBmdW5jdGlvbiAoKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcbiAgdmFyIGkgPSB0aGlzLmluZGV4ICsgMTtcbiAgdmFyIGV4cGVjdEVsZW1lbnQgPSBmYWxzZTtcbiAgdmFyIGFycmF5ID0gW107XG4gIHZhciBub2RlcyA9IFtdO1xuICB3aGlsZSAoaSA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgIGkgPSB0aGlzLnNraXAoSVNfV0hJVEVTUEFDRSwgaSk7XG4gICBpZiAoYXQoc291cmNlLCBpKSA9PT0gJ10nICYmICFleHBlY3RFbGVtZW50KSB7XG4gICAgaSsrO1xuICAgIGJyZWFrO1xuICAgfVxuICAgdmFyIHJlc3VsdCA9IHRoaXMuZm9yayhpKS5wYXJzZSgpO1xuICAgcHVzaChub2RlcywgcmVzdWx0KTtcbiAgIHB1c2goYXJyYXksIHJlc3VsdC52YWx1ZSk7XG4gICBpID0gdGhpcy51bnRpbChbXG4gICAgJywnLFxuICAgICddJ1xuICAgXSwgcmVzdWx0LmVuZCk7XG4gICBpZiAoYXQoc291cmNlLCBpKSA9PT0gJywnKSB7XG4gICAgZXhwZWN0RWxlbWVudCA9IHRydWU7XG4gICAgaSsrO1xuICAgfSBlbHNlIGlmIChhdChzb3VyY2UsIGkpID09PSAnXScpIHtcbiAgICBpKys7XG4gICAgYnJlYWs7XG4gICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMubm9kZShPQkpFQ1QsIGFycmF5LCB0aGlzLmluZGV4LCBpLCBub2Rlcyk7XG4gfSxcbiBzdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5pbmRleDtcbiAgdmFyIHBhcnNlZCA9IHBhcnNlSlNPTlN0cmluZyh0aGlzLnNvdXJjZSwgdGhpcy5pbmRleCArIDEpO1xuICByZXR1cm4gdGhpcy5ub2RlKFBSSU1JVElWRSwgcGFyc2VkLnZhbHVlLCBpbmRleCwgcGFyc2VkLmVuZCk7XG4gfSxcbiBudW1iZXI6IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNvdXJjZSA9IHRoaXMuc291cmNlO1xuICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuaW5kZXg7XG4gIHZhciBpID0gc3RhcnRJbmRleDtcbiAgaWYgKGF0KHNvdXJjZSwgaSkgPT09ICctJylcbiAgIGkrKztcbiAgaWYgKGF0KHNvdXJjZSwgaSkgPT09ICcwJylcbiAgIGkrKztcbiAgZWxzZSBpZiAoZXhlYyhJU19OT05fWkVST19ESUdJVCwgYXQoc291cmNlLCBpKSkpXG4gICBpID0gdGhpcy5za2lwKElTX0RJR0lULCArK2kpO1xuICBlbHNlXG4gICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBudW1iZXIgYXQ6ICcgKyBpKTtcbiAgaWYgKGF0KHNvdXJjZSwgaSkgPT09ICcuJylcbiAgIGkgPSB0aGlzLnNraXAoSVNfRElHSVQsICsraSk7XG4gIGlmIChhdChzb3VyY2UsIGkpID09PSAnZScgfHwgYXQoc291cmNlLCBpKSA9PT0gJ0UnKSB7XG4gICBpKys7XG4gICBpZiAoYXQoc291cmNlLCBpKSA9PT0gJysnIHx8IGF0KHNvdXJjZSwgaSkgPT09ICctJylcbiAgICBpKys7XG4gICB2YXIgZXhwb25lbnRTdGFydEluZGV4ID0gaTtcbiAgIGkgPSB0aGlzLnNraXAoSVNfRElHSVQsIGkpO1xuICAgaWYgKGV4cG9uZW50U3RhcnRJbmRleCA9PT0gaSlcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgbnVtYmVyJ3MgZXhwb25lbnQgdmFsdWUgYXQ6IFwiICsgaSk7XG4gIH1cbiAgcmV0dXJuIHRoaXMubm9kZShQUklNSVRJVkUsIE51bWJlcihzbGljZShzb3VyY2UsIHN0YXJ0SW5kZXgsIGkpKSwgc3RhcnRJbmRleCwgaSk7XG4gfSxcbiBrZXl3b3JkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIGtleXdvcmQgPSAnJyArIHZhbHVlO1xuICB2YXIgaW5kZXggPSB0aGlzLmluZGV4O1xuICB2YXIgZW5kSW5kZXggPSBpbmRleCArIGtleXdvcmQubGVuZ3RoO1xuICBpZiAoc2xpY2UodGhpcy5zb3VyY2UsIGluZGV4LCBlbmRJbmRleCkgIT09IGtleXdvcmQpXG4gICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSB2YWx1ZSBhdDogJyArIGluZGV4KTtcbiAgcmV0dXJuIHRoaXMubm9kZShQUklNSVRJVkUsIHZhbHVlLCBpbmRleCwgZW5kSW5kZXgpO1xuIH0sXG4gc2tpcDogZnVuY3Rpb24gKHJlZ2V4LCBpKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcbiAgZm9yICg7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspXG4gICBpZiAoIWV4ZWMocmVnZXgsIGF0KHNvdXJjZSwgaSkpKVxuICAgIGJyZWFrO1xuICByZXR1cm4gaTtcbiB9LFxuIHVudGlsOiBmdW5jdGlvbiAoYXJyYXksIGkpIHtcbiAgaSA9IHRoaXMuc2tpcChJU19XSElURVNQQUNFLCBpKTtcbiAgdmFyIGNociA9IGF0KHRoaXMuc291cmNlLCBpKTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKylcbiAgIGlmIChhcnJheVtqXSA9PT0gY2hyKVxuICAgIHJldHVybiBpO1xuICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyOiBcIicgKyBjaHIgKyAnXCIgYXQ6ICcgKyBpKTtcbiB9XG59O1xudmFyIE5PX1NPVVJDRV9TVVBQT1JUID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuIHZhciB1bnNhZmVJbnQgPSAnOTAwNzE5OTI1NDc0MDk5Myc7XG4gdmFyIHNvdXJjZTtcbiBuYXRpdmVQYXJzZSh1bnNhZmVJbnQsIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBjb250ZXh0KSB7XG4gIHNvdXJjZSA9IGNvbnRleHQuc291cmNlO1xuIH0pO1xuIHJldHVybiBzb3VyY2UgIT09IHVuc2FmZUludDtcbn0pO1xudmFyIFBST1BFUl9CQVNFX1BBUlNFID0gTkFUSVZFX1NZTUJPTCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuIHJldHVybiAxIC8gbmF0aXZlUGFyc2UoJy0wIFxcdCcpICE9PSAtSW5maW5pdHk7XG59KTtcbiQoe1xuIHRhcmdldDogJ0pTT04nLFxuIHN0YXQ6IHRydWUsXG4gZm9yY2VkOiBOT19TT1VSQ0VfU1VQUE9SVFxufSwge1xuIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSh0ZXh0LCByZXZpdmVyKSB7XG4gIHJldHVybiBQUk9QRVJfQkFTRV9QQVJTRSAmJiAhaXNDYWxsYWJsZShyZXZpdmVyKSA/IG5hdGl2ZVBhcnNlKHRleHQpIDogJHBhcnNlKHRleHQsIHJldml2ZXIpO1xuIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTU2MTpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBkaWZmZXJlbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NjU2KTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDcpO1xuJCh7XG4gdGFyZ2V0OiAnU2V0JyxcbiBwcm90bzogdHJ1ZSxcbiByZWFsOiB0cnVlLFxuIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2RpZmZlcmVuY2UnKVxufSwgeyBkaWZmZXJlbmNlOiBkaWZmZXJlbmNlIH0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODU4Nzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oODE1NCk7XG52YXIgaW50ZXJzZWN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDYxKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDcpO1xudmFyIElOQ09SUkVDVCA9ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpbnRlcnNlY3Rpb24nKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChbXG4gIDEsXG4gIDIsXG4gIDNcbiBdKS5pbnRlcnNlY3Rpb24obmV3IFNldChbXG4gIDMsXG4gIDJcbiBdKSkpICE9PSAnMywyJztcbn0pO1xuJCh7XG4gdGFyZ2V0OiAnU2V0JyxcbiBwcm90bzogdHJ1ZSxcbiByZWFsOiB0cnVlLFxuIGZvcmNlZDogSU5DT1JSRUNUXG59LCB7IGludGVyc2VjdGlvbjogaW50ZXJzZWN0aW9uIH0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMzI0Nzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBpc0Rpc2pvaW50RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oODU1MCk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTA3KTtcbiQoe1xuIHRhcmdldDogJ1NldCcsXG4gcHJvdG86IHRydWUsXG4gcmVhbDogdHJ1ZSxcbiBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc0Rpc2pvaW50RnJvbScpXG59LCB7IGlzRGlzam9pbnRGcm9tOiBpc0Rpc2pvaW50RnJvbSB9KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDMzMDI6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNDk3OCk7XG52YXIgaXNTdWJzZXRPZiA9IF9fd2VicGFja19yZXF1aXJlX18oOTkwKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDcpO1xuJCh7XG4gdGFyZ2V0OiAnU2V0JyxcbiBwcm90bzogdHJ1ZSxcbiByZWFsOiB0cnVlLFxuIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2lzU3Vic2V0T2YnKVxufSwgeyBpc1N1YnNldE9mOiBpc1N1YnNldE9mIH0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gOTQ5MDpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTc4KTtcbnZhciBpc1N1cGVyc2V0T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NCk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTA3KTtcbiQoe1xuIHRhcmdldDogJ1NldCcsXG4gcHJvdG86IHRydWUsXG4gcmVhbDogdHJ1ZSxcbiBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc1N1cGVyc2V0T2YnKVxufSwgeyBpc1N1cGVyc2V0T2Y6IGlzU3VwZXJzZXRPZiB9KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU0Mzg6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNDk3OCk7XG52YXIgc3ltbWV0cmljRGlmZmVyZW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzE5NCk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTA3KTtcbiQoe1xuIHRhcmdldDogJ1NldCcsXG4gcHJvdG86IHRydWUsXG4gcmVhbDogdHJ1ZSxcbiBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdzeW1tZXRyaWNEaWZmZXJlbmNlJylcbn0sIHsgc3ltbWV0cmljRGlmZmVyZW5jZTogc3ltbWV0cmljRGlmZmVyZW5jZSB9KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc5MTQ6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNDk3OCk7XG52YXIgdW5pb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3MDMpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwNyk7XG4kKHtcbiB0YXJnZXQ6ICdTZXQnLFxuIHByb3RvOiB0cnVlLFxuIHJlYWw6IHRydWUsXG4gZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgndW5pb24nKVxufSwgeyB1bmlvbjogdW5pb24gfSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5NzA5OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5NzgpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5OCk7XG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oNzE4Nyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTk4KTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDc3NDQpLmYpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTM2KTtcbnZhciBhbkluc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1ODM0KTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzUyMyk7XG52YXIgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNjQpO1xudmFyIERPTUV4Y2VwdGlvbkNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTA1MCk7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MCk7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oMjU1NCk7XG52YXIgRE9NX0VYQ0VQVElPTiA9ICdET01FeGNlcHRpb24nO1xudmFyIEVycm9yID0gZ2V0QnVpbHRJbignRXJyb3InKTtcbnZhciBOYXRpdmVET01FeGNlcHRpb24gPSBnZXRCdWlsdEluKERPTV9FWENFUFRJT04pO1xudmFyICRET01FeGNlcHRpb24gPSBmdW5jdGlvbiBET01FeGNlcHRpb24oKSB7XG4gYW5JbnN0YW5jZSh0aGlzLCBET01FeGNlcHRpb25Qcm90b3R5cGUpO1xuIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoYXJndW1lbnRzTGVuZ3RoIDwgMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXSk7XG4gdmFyIG5hbWUgPSBub3JtYWxpemVTdHJpbmdBcmd1bWVudChhcmd1bWVudHNMZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdLCAnRXJyb3InKTtcbiB2YXIgdGhhdCA9IG5ldyBOYXRpdmVET01FeGNlcHRpb24obWVzc2FnZSwgbmFtZSk7XG4gdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuIGVycm9yLm5hbWUgPSBET01fRVhDRVBUSU9OO1xuIGRlZmluZVByb3BlcnR5KHRoYXQsICdzdGFjaycsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBjbGVhckVycm9yU3RhY2soZXJyb3Iuc3RhY2ssIDEpKSk7XG4gaW5oZXJpdElmUmVxdWlyZWQodGhhdCwgdGhpcywgJERPTUV4Y2VwdGlvbik7XG4gcmV0dXJuIHRoYXQ7XG59O1xudmFyIERPTUV4Y2VwdGlvblByb3RvdHlwZSA9ICRET01FeGNlcHRpb24ucHJvdG90eXBlID0gTmF0aXZlRE9NRXhjZXB0aW9uLnByb3RvdHlwZTtcbnZhciBFUlJPUl9IQVNfU1RBQ0sgPSAnc3RhY2snIGluIG5ldyBFcnJvcihET01fRVhDRVBUSU9OKTtcbnZhciBET01fRVhDRVBUSU9OX0hBU19TVEFDSyA9ICdzdGFjaycgaW4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAyKTtcbnZhciBkZXNjcmlwdG9yID0gTmF0aXZlRE9NRXhjZXB0aW9uICYmIERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCBET01fRVhDRVBUSU9OKTtcbnZhciBCVUdHWV9ERVNDUklQVE9SID0gISFkZXNjcmlwdG9yICYmICEoZGVzY3JpcHRvci53cml0YWJsZSAmJiBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSk7XG52YXIgRk9SQ0VEX0NPTlNUUlVDVE9SID0gRVJST1JfSEFTX1NUQUNLICYmICFCVUdHWV9ERVNDUklQVE9SICYmICFET01fRVhDRVBUSU9OX0hBU19TVEFDSztcbiQoe1xuIGdsb2JhbDogdHJ1ZSxcbiBjb25zdHJ1Y3RvcjogdHJ1ZSxcbiBmb3JjZWQ6IElTX1BVUkUgfHwgRk9SQ0VEX0NPTlNUUlVDVE9SXG59LCB7IERPTUV4Y2VwdGlvbjogRk9SQ0VEX0NPTlNUUlVDVE9SID8gJERPTUV4Y2VwdGlvbiA6IE5hdGl2ZURPTUV4Y2VwdGlvbiB9KTtcbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uID0gZ2V0QnVpbHRJbihET01fRVhDRVBUSU9OKTtcbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbi5wcm90b3R5cGU7XG5pZiAoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikge1xuIGlmICghSVNfUFVSRSkge1xuICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgUG9seWZpbGxlZERPTUV4Y2VwdGlvbikpO1xuIH1cbiBmb3IgKHZhciBrZXkgaW4gRE9NRXhjZXB0aW9uQ29uc3RhbnRzKVxuICBpZiAoaGFzT3duKERPTUV4Y2VwdGlvbkNvbnN0YW50cywga2V5KSkge1xuICAgdmFyIGNvbnN0YW50ID0gRE9NRXhjZXB0aW9uQ29uc3RhbnRzW2tleV07XG4gICB2YXIgY29uc3RhbnROYW1lID0gY29uc3RhbnQucztcbiAgIGlmICghaGFzT3duKFBvbHlmaWxsZWRET01FeGNlcHRpb24sIGNvbnN0YW50TmFtZSkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLCBjb25zdGFudE5hbWUsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig2LCBjb25zdGFudC5jKSk7XG4gICB9XG4gIH1cbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIDM2NTU6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oNzA0MSk7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0MDMpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzMwKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oMjc0Myk7XG52YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtcztcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcbnZhciBhcHBlbmQgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuYXBwZW5kKTtcbnZhciAkZGVsZXRlID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlWydkZWxldGUnXSk7XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5mb3JFYWNoKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7XG5wYXJhbXNbJ2RlbGV0ZSddKCdhJywgMSk7XG5wYXJhbXNbJ2RlbGV0ZSddKCdiJywgdW5kZWZpbmVkKTtcbmlmIChwYXJhbXMgKyAnJyAhPT0gJ2E9MicpIHtcbiBkZWZpbmVCdWlsdEluKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ2RlbGV0ZScsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgJHZhbHVlID0gbGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTtcbiAgaWYgKGxlbmd0aCAmJiAkdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgIHJldHVybiAkZGVsZXRlKHRoaXMsIG5hbWUpO1xuICB2YXIgZW50cmllcyA9IFtdO1xuICBmb3JFYWNoKHRoaXMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICBwdXNoKGVudHJpZXMsIHtcbiAgICBrZXk6IGssXG4gICAgdmFsdWU6IHZcbiAgIH0pO1xuICB9KTtcbiAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgobGVuZ3RoLCAxKTtcbiAgdmFyIGtleSA9IHRvU3RyaW5nKG5hbWUpO1xuICB2YXIgdmFsdWUgPSB0b1N0cmluZygkdmFsdWUpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgZGluZGV4ID0gMDtcbiAgdmFyIGZvdW5kID0gZmFsc2U7XG4gIHZhciBlbnRyaWVzTGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGluZGV4IDwgZW50cmllc0xlbmd0aCkge1xuICAgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdO1xuICAgaWYgKGZvdW5kIHx8IGVudHJ5LmtleSA9PT0ga2V5KSB7XG4gICAgZm91bmQgPSB0cnVlO1xuICAgICRkZWxldGUodGhpcywgZW50cnkua2V5KTtcbiAgIH0gZWxzZVxuICAgIGRpbmRleCsrO1xuICB9XG4gIHdoaWxlIChkaW5kZXggPCBlbnRyaWVzTGVuZ3RoKSB7XG4gICBlbnRyeSA9IGVudHJpZXNbZGluZGV4KytdO1xuICAgaWYgKCEoZW50cnkua2V5ID09PSBrZXkgJiYgZW50cnkudmFsdWUgPT09IHZhbHVlKSlcbiAgICBhcHBlbmQodGhpcywgZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7XG4gIH1cbiB9LCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHVuc2FmZTogdHJ1ZVxuIH0pO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjU1NTpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDQxKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3MzApO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzQzKTtcbnZhciAkVVJMU2VhcmNoUGFyYW1zID0gVVJMU2VhcmNoUGFyYW1zO1xudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9ICRVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xudmFyIGdldEFsbCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5nZXRBbGwpO1xudmFyICRoYXMgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuaGFzKTtcbnZhciBwYXJhbXMgPSBuZXcgJFVSTFNlYXJjaFBhcmFtcygnYT0xJyk7XG5pZiAocGFyYW1zLmhhcygnYScsIDIpIHx8ICFwYXJhbXMuaGFzKCdhJywgdW5kZWZpbmVkKSkge1xuIGRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAnaGFzJywgZnVuY3Rpb24gaGFzKG5hbWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciAkdmFsdWUgPSBsZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICBpZiAobGVuZ3RoICYmICR2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgcmV0dXJuICRoYXModGhpcywgbmFtZSk7XG4gIHZhciB2YWx1ZXMgPSBnZXRBbGwodGhpcywgbmFtZSk7XG4gIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGxlbmd0aCwgMSk7XG4gIHZhciB2YWx1ZSA9IHRvU3RyaW5nKCR2YWx1ZSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgIGlmICh2YWx1ZXNbaW5kZXgrK10gPT09IHZhbHVlKVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbiB9LCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHVuc2FmZTogdHJ1ZVxuIH0pO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjIwMjpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQwKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODQwMyk7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NjkxKTtcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xudmFyIGZvckVhY2ggPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZm9yRWFjaCk7XG5pZiAoREVTQ1JJUFRPUlMgJiYgISgnc2l6ZScgaW4gVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlKSkge1xuIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICdzaXplJywge1xuICBnZXQ6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICB2YXIgY291bnQgPSAwO1xuICAgZm9yRWFjaCh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgY291bnQrKztcbiAgIH0pO1xuICAgcmV0dXJuIGNvdW50O1xuICB9LFxuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWVcbiB9KTtcbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIDc2NDA6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuLy8gRVhQT1JUU1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbiAgQW5ub3RhdGlvbkxheWVyOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uTGF5ZXIpLFxuICBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50OiAoKSA9PiAoLyogYmluZGluZyAqLyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KSxcbiAgSW5rQW5ub3RhdGlvbkVsZW1lbnQ6ICgpID0+ICgvKiBiaW5kaW5nICovIElua0Fubm90YXRpb25FbGVtZW50KSxcbiAgU3RhbXBBbm5vdGF0aW9uRWxlbWVudDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gU3RhbXBBbm5vdGF0aW9uRWxlbWVudClcbn0pO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzXG52YXIgZXNfYXJyYXlfcHVzaCA9IF9fd2VicGFja19yZXF1aXJlX18oNDIyNik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmRpZmZlcmVuY2UudjIuanNcbnZhciBlc25leHRfc2V0X2RpZmZlcmVuY2VfdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1NjEpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pbnRlcnNlY3Rpb24udjIuanNcbnZhciBlc25leHRfc2V0X2ludGVyc2VjdGlvbl92MiA9IF9fd2VicGFja19yZXF1aXJlX18oODU4Nyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmlzLWRpc2pvaW50LWZyb20udjIuanNcbnZhciBlc25leHRfc2V0X2lzX2Rpc2pvaW50X2Zyb21fdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNDcpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdWJzZXQtb2YudjIuanNcbnZhciBlc25leHRfc2V0X2lzX3N1YnNldF9vZl92MiA9IF9fd2VicGFja19yZXF1aXJlX18oMzMwMik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmlzLXN1cGVyc2V0LW9mLnYyLmpzXG52YXIgZXNuZXh0X3NldF9pc19zdXBlcnNldF9vZl92MiA9IF9fd2VicGFja19yZXF1aXJlX18oOTQ5MCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlLnYyLmpzXG52YXIgZXNuZXh0X3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV92MiA9IF9fd2VicGFja19yZXF1aXJlX18oNTQzOCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnVuaW9uLnYyLmpzXG52YXIgZXNuZXh0X3NldF91bmlvbl92MiA9IF9fd2VicGFja19yZXF1aXJlX18oNzkxNCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IubWFwLmpzXG52YXIgZXNuZXh0X2l0ZXJhdG9yX21hcCA9IF9fd2VicGFja19yZXF1aXJlX18oNzk0NCk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanNcbnZhciBlc25leHRfaXRlcmF0b3JfY29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxMjEpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZsYXQtbWFwLmpzXG52YXIgZXNuZXh0X2l0ZXJhdG9yX2ZsYXRfbWFwID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDk3KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvc2hhcmVkL3V0aWwuanNcbnZhciB1dGlsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzXG52YXIgZGlzcGxheV91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNDczKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvZGlzcGxheS9hbm5vdGF0aW9uX3N0b3JhZ2UuanNcbnZhciBhbm5vdGF0aW9uX3N0b3JhZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3ODApO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3NoYXJlZC9zY3JpcHRpbmdfdXRpbHMuanNcblxuZnVuY3Rpb24gbWFrZUNvbG9yQ29tcChuKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG4pKSAqIDI1NSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbn1cbmZ1bmN0aW9uIHNjYWxlQW5kQ2xhbXAoeCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCAyNTUgKiB4KSk7XG59XG5jbGFzcyBDb2xvckNvbnZlcnRlcnMge1xuICBzdGF0aWMgQ01ZS19HKF9yZWYpIHtcbiAgICBsZXQgW2MsIHksIG0sIGtdID0gX3JlZjtcbiAgICByZXR1cm4gW1wiR1wiLCAxIC0gTWF0aC5taW4oMSwgMC4zICogYyArIDAuNTkgKiBtICsgMC4xMSAqIHkgKyBrKV07XG4gIH1cbiAgc3RhdGljIEdfQ01ZSyhfcmVmMikge1xuICAgIGxldCBbZ10gPSBfcmVmMjtcbiAgICByZXR1cm4gW1wiQ01ZS1wiLCAwLCAwLCAwLCAxIC0gZ107XG4gIH1cbiAgc3RhdGljIEdfUkdCKF9yZWYzKSB7XG4gICAgbGV0IFtnXSA9IF9yZWYzO1xuICAgIHJldHVybiBbXCJSR0JcIiwgZywgZywgZ107XG4gIH1cbiAgc3RhdGljIEdfcmdiKF9yZWY0KSB7XG4gICAgbGV0IFtnXSA9IF9yZWY0O1xuICAgIGcgPSBzY2FsZUFuZENsYW1wKGcpO1xuICAgIHJldHVybiBbZywgZywgZ107XG4gIH1cbiAgc3RhdGljIEdfSFRNTChfcmVmNSkge1xuICAgIGxldCBbZ10gPSBfcmVmNTtcbiAgICBjb25zdCBHID0gbWFrZUNvbG9yQ29tcChnKTtcbiAgICByZXR1cm4gYCMke0d9JHtHfSR7R31gO1xuICB9XG4gIHN0YXRpYyBSR0JfRyhfcmVmNikge1xuICAgIGxldCBbciwgZywgYl0gPSBfcmVmNjtcbiAgICByZXR1cm4gW1wiR1wiLCAwLjMgKiByICsgMC41OSAqIGcgKyAwLjExICogYl07XG4gIH1cbiAgc3RhdGljIFJHQl9yZ2IoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IubWFwKHNjYWxlQW5kQ2xhbXApO1xuICB9XG4gIHN0YXRpYyBSR0JfSFRNTChjb2xvcikge1xuICAgIHJldHVybiBgIyR7Y29sb3IubWFwKG1ha2VDb2xvckNvbXApLmpvaW4oXCJcIil9YDtcbiAgfVxuICBzdGF0aWMgVF9IVE1MKCkge1xuICAgIHJldHVybiBcIiMwMDAwMDAwMFwiO1xuICB9XG4gIHN0YXRpYyBUX3JnYigpIHtcbiAgICByZXR1cm4gW251bGxdO1xuICB9XG4gIHN0YXRpYyBDTVlLX1JHQihfcmVmNykge1xuICAgIGxldCBbYywgeSwgbSwga10gPSBfcmVmNztcbiAgICByZXR1cm4gW1wiUkdCXCIsIDEgLSBNYXRoLm1pbigxLCBjICsgayksIDEgLSBNYXRoLm1pbigxLCBtICsgayksIDEgLSBNYXRoLm1pbigxLCB5ICsgayldO1xuICB9XG4gIHN0YXRpYyBDTVlLX3JnYihfcmVmOCkge1xuICAgIGxldCBbYywgeSwgbSwga10gPSBfcmVmODtcbiAgICByZXR1cm4gW3NjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIGMgKyBrKSksIHNjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIG0gKyBrKSksIHNjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIHkgKyBrKSldO1xuICB9XG4gIHN0YXRpYyBDTVlLX0hUTUwoY29tcG9uZW50cykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuQ01ZS19SR0IoY29tcG9uZW50cykuc2xpY2UoMSk7XG4gICAgcmV0dXJuIHRoaXMuUkdCX0hUTUwocmdiKTtcbiAgfVxuICBzdGF0aWMgUkdCX0NNWUsoX3JlZjkpIHtcbiAgICBsZXQgW3IsIGcsIGJdID0gX3JlZjk7XG4gICAgY29uc3QgYyA9IDEgLSByO1xuICAgIGNvbnN0IG0gPSAxIC0gZztcbiAgICBjb25zdCB5ID0gMSAtIGI7XG4gICAgY29uc3QgayA9IE1hdGgubWluKGMsIG0sIHkpO1xuICAgIHJldHVybiBbXCJDTVlLXCIsIGMsIG0sIHksIGtdO1xuICB9XG59XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvZGlzcGxheS94ZmFfbGF5ZXIuanNcbnZhciB4ZmFfbGF5ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyNjYpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvYW5ub3RhdGlvbl9sYXllci5qc1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBERUZBVUxUX1RBQl9JTkRFWCA9IDEwMDA7XG5jb25zdCBERUZBVUxUX0ZPTlRfU0laRSA9IDk7XG5jb25zdCBHZXRFbGVtZW50c0J5TmFtZVNldCA9IG5ldyBXZWFrU2V0KCk7XG5mdW5jdGlvbiBnZXRSZWN0RGltcyhyZWN0KSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3RbMl0gLSByZWN0WzBdLFxuICAgIGhlaWdodDogcmVjdFszXSAtIHJlY3RbMV1cbiAgfTtcbn1cbmNsYXNzIEFubm90YXRpb25FbGVtZW50RmFjdG9yeSB7XG4gIHN0YXRpYyBjcmVhdGUocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHN1YnR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuYW5ub3RhdGlvblR5cGU7XG4gICAgc3dpdGNoIChzdWJ0eXBlKSB7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuTElOSzpcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuVEVYVDpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUOlxuICAgICAgICBjb25zdCBmaWVsZFR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuZmllbGRUeXBlO1xuICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJUeFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgY2FzZSBcIkJ0blwiOlxuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGF0YS5yYWRpb0J1dHRvbikge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMuZGF0YS5jaGVja0JveCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiQ2hcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgY2FzZSBcIlNpZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25UeXBlLlBPUFVQOlxuICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuRlJFRVRFWFQ6XG4gICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5FOlxuICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVBUkU6XG4gICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOlxuICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25UeXBlLlBPTFlMSU5FOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuQ0FSRVQ6XG4gICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uVHlwZS5JTks6XG4gICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUdPTjpcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvblR5cGUuSElHSExJR0hUOlxuICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25UeXBlLlVOREVSTElORTpcbiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTpcbiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25UeXBlLlNUUklLRU9VVDpcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVEFNUDpcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOlxuICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjaGFzQm9yZGVyID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBsZXQge1xuICAgICAgaXNSZW5kZXJhYmxlID0gZmFsc2UsXG4gICAgICBpZ25vcmVCb3JkZXIgPSBmYWxzZSxcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzID0gZmFsc2VcbiAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB0aGlzLmlzUmVuZGVyYWJsZSA9IGlzUmVuZGVyYWJsZTtcbiAgICB0aGlzLmRhdGEgPSBwYXJhbWV0ZXJzLmRhdGE7XG4gICAgdGhpcy5sYXllciA9IHBhcmFtZXRlcnMubGF5ZXI7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IHBhcmFtZXRlcnMubGlua1NlcnZpY2U7XG4gICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBwYXJhbWV0ZXJzLmRvd25sb2FkTWFuYWdlcjtcbiAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IHBhcmFtZXRlcnMuaW1hZ2VSZXNvdXJjZXNQYXRoO1xuICAgIHRoaXMucmVuZGVyRm9ybXMgPSBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zO1xuICAgIHRoaXMuc3ZnRmFjdG9yeSA9IHBhcmFtZXRlcnMuc3ZnRmFjdG9yeTtcbiAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlID0gcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICB0aGlzLmVuYWJsZVNjcmlwdGluZyA9IHBhcmFtZXRlcnMuZW5hYmxlU2NyaXB0aW5nO1xuICAgIHRoaXMuaGFzSlNBY3Rpb25zID0gcGFyYW1ldGVycy5oYXNKU0FjdGlvbnM7XG4gICAgdGhpcy5fZmllbGRPYmplY3RzID0gcGFyYW1ldGVycy5maWVsZE9iamVjdHM7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbWV0ZXJzLnBhcmVudDtcbiAgICBpZiAoaXNSZW5kZXJhYmxlKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIpO1xuICAgIH1cbiAgICBpZiAoY3JlYXRlUXVhZHJpbGF0ZXJhbHMpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBfaGFzUG9wdXBEYXRhKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgdGl0bGVPYmosXG4gICAgICBjb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0XG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuICEhKHRpdGxlT2JqPy5zdHIgfHwgY29udGVudHNPYmo/LnN0ciB8fCByaWNoVGV4dD8uc3RyKTtcbiAgfVxuICBnZXQgaGFzUG9wdXBEYXRhKCkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWxlbWVudC5faGFzUG9wdXBEYXRhKHRoaXMuZGF0YSk7XG4gIH1cbiAgX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIpIHtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhLFxuICAgICAgcGFyZW50OiB7XG4gICAgICAgIHBhZ2UsXG4gICAgICAgIHZpZXdwb3J0XG4gICAgICB9XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIik7XG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtYW5ub3RhdGlvbi1pZFwiLCBkYXRhLmlkKTtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpKSB7XG4gICAgICBjb250YWluZXIudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICB9XG4gICAgY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IHRoaXMucGFyZW50LnpJbmRleCsrO1xuICAgIGlmICh0aGlzLmRhdGEucG9wdXBSZWYpIHtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIFwiZGlhbG9nXCIpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5ub1JvdGF0ZSkge1xuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJub3JvdGF0ZVwiKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodCxcbiAgICAgIHBhZ2VYLFxuICAgICAgcGFnZVlcbiAgICB9ID0gdmlld3BvcnQucmF3RGltcztcbiAgICBpZiAoIWRhdGEucmVjdCB8fCB0aGlzIGluc3RhbmNlb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByb3RhdGlvblxuICAgICAgfSA9IGRhdGE7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duQ2FudmFzICYmIHJvdGF0aW9uICE9PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0Um90YXRpb24ocm90YXRpb24sIGNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGNvbnN0IHJlY3QgPSB1dGlsLlV0aWwubm9ybWFsaXplUmVjdChbZGF0YS5yZWN0WzBdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbMV0gKyBwYWdlLnZpZXdbMV0sIGRhdGEucmVjdFsyXSwgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzNdICsgcGFnZS52aWV3WzFdXSk7XG4gICAgaWYgKCFpZ25vcmVCb3JkZXIgJiYgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCA+IDApIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJXaWR0aCA9IGAke2RhdGEuYm9yZGVyU3R5bGUud2lkdGh9cHhgO1xuICAgICAgY29uc3QgaG9yaXpvbnRhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUuaG9yaXpvbnRhbENvcm5lclJhZGl1cztcbiAgICAgIGNvbnN0IHZlcnRpY2FsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1cztcbiAgICAgIGlmIChob3Jpem9udGFsUmFkaXVzID4gMCB8fCB2ZXJ0aWNhbFJhZGl1cyA+IDApIHtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gYGNhbGMoJHtob3Jpem9udGFsUmFkaXVzfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSkgLyBjYWxjKCR7dmVydGljYWxSYWRpdXN9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSByYWRpdXM7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IGBjYWxjKCR7d2lkdGh9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoJHtoZWlnaHR9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSByYWRpdXM7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGRhdGEuYm9yZGVyU3R5bGUuc3R5bGUpIHtcbiAgICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ6XG4gICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclN0eWxlID0gXCJzb2xpZFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ6XG4gICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclN0eWxlID0gXCJkYXNoZWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDpcbiAgICAgICAgICAoMCx1dGlsLndhcm4pKFwiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGJldmVsZWRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOlxuICAgICAgICAgICgwLHV0aWwud2FybikoXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogaW5zZXRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORTpcbiAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGRhdGEuYm9yZGVyQ29sb3IgfHwgbnVsbDtcbiAgICAgIGlmIChib3JkZXJDb2xvcikge1xuICAgICAgICB0aGlzLiNoYXNCb3JkZXIgPSB0cnVlO1xuICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyQ29sb3IgPSB1dGlsLlV0aWwubWFrZUhleENvbG9yKGJvcmRlckNvbG9yWzBdIHwgMCwgYm9yZGVyQ29sb3JbMV0gfCAwLCBib3JkZXJDb2xvclsyXSB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlcldpZHRoID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHsxMDAgKiAocmVjdFswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aH0lYDtcbiAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7MTAwICogKHJlY3RbMV0gLSBwYWdlWSkgLyBwYWdlSGVpZ2h0fSVgO1xuICAgIGNvbnN0IHtcbiAgICAgIHJvdGF0aW9uXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGRhdGEuaGFzT3duQ2FudmFzIHx8IHJvdGF0aW9uID09PSAwKSB7XG4gICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHsxMDAgKiB3aWR0aCAvIHBhZ2VXaWR0aH0lYDtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0fSVgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uLCBjb250YWluZXIpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG4gIHNldFJvdGF0aW9uKGFuZ2xlKSB7XG4gICAgbGV0IGNvbnRhaW5lciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdGhpcy5jb250YWluZXI7XG4gICAgaWYgKCF0aGlzLmRhdGEucmVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0XG4gICAgfSA9IHRoaXMucGFyZW50LnZpZXdwb3J0LnJhd0RpbXM7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXModGhpcy5kYXRhLnJlY3QpO1xuICAgIGxldCBlbGVtZW50V2lkdGgsIGVsZW1lbnRIZWlnaHQ7XG4gICAgaWYgKGFuZ2xlICUgMTgwID09PSAwKSB7XG4gICAgICBlbGVtZW50V2lkdGggPSAxMDAgKiB3aWR0aCAvIHBhZ2VXaWR0aDtcbiAgICAgIGVsZW1lbnRIZWlnaHQgPSAxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50V2lkdGggPSAxMDAgKiBoZWlnaHQgLyBwYWdlV2lkdGg7XG4gICAgICBlbGVtZW50SGVpZ2h0ID0gMTAwICogd2lkdGggLyBwYWdlSGVpZ2h0O1xuICAgIH1cbiAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHtlbGVtZW50V2lkdGh9JWA7XG4gICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2VsZW1lbnRIZWlnaHR9JWA7XG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCAoMzYwIC0gYW5nbGUpICUgMzYwKTtcbiAgfVxuICBnZXQgX2NvbW1vbkFjdGlvbnMoKSB7XG4gICAgY29uc3Qgc2V0Q29sb3IgPSAoanNOYW1lLCBzdHlsZU5hbWUsIGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjb2xvciA9IGV2ZW50LmRldGFpbFtqc05hbWVdO1xuICAgICAgY29uc3QgY29sb3JUeXBlID0gY29sb3JbMF07XG4gICAgICBjb25zdCBjb2xvckFycmF5ID0gY29sb3Iuc2xpY2UoMSk7XG4gICAgICBldmVudC50YXJnZXQuc3R5bGVbc3R5bGVOYW1lXSA9IENvbG9yQ29udmVydGVyc1tgJHtjb2xvclR5cGV9X0hUTUxgXShjb2xvckFycmF5KTtcbiAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgIFtzdHlsZU5hbWVdOiBDb2xvckNvbnZlcnRlcnNbYCR7Y29sb3JUeXBlfV9yZ2JgXShjb2xvckFycmF5KVxuICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKDAsdXRpbC5zaGFkb3cpKHRoaXMsIFwiX2NvbW1vbkFjdGlvbnNcIiwge1xuICAgICAgZGlzcGxheTogZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZGlzcGxheVxuICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICBjb25zdCBoaWRkZW4gPSBkaXNwbGF5ICUgMiA9PT0gMTtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGhpZGRlbiA/IFwiaGlkZGVuXCIgOiBcInZpc2libGVcIjtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICBub1ZpZXc6IGhpZGRlbixcbiAgICAgICAgICBub1ByaW50OiBkaXNwbGF5ID09PSAxIHx8IGRpc3BsYXkgPT09IDJcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcHJpbnQ6IGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICBub1ByaW50OiAhZXZlbnQuZGV0YWlsLnByaW50XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGhpZGRlbjogZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaGlkZGVuXG4gICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBoaWRkZW4gPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgbm9QcmludDogaGlkZGVuLFxuICAgICAgICAgIG5vVmlldzogaGlkZGVuXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZvY3VzOiBldmVudCA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZXZlbnQudGFyZ2V0LmZvY3VzKHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiBmYWxzZVxuICAgICAgICB9KSwgMCk7XG4gICAgICB9LFxuICAgICAgdXNlck5hbWU6IGV2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnRpdGxlID0gZXZlbnQuZGV0YWlsLnVzZXJOYW1lO1xuICAgICAgfSxcbiAgICAgIHJlYWRvbmx5OiBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnRhcmdldC5kaXNhYmxlZCA9IGV2ZW50LmRldGFpbC5yZWFkb25seTtcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLl9zZXRSZXF1aXJlZChldmVudC50YXJnZXQsIGV2ZW50LmRldGFpbC5yZXF1aXJlZCk7XG4gICAgICB9LFxuICAgICAgYmdDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImJnQ29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGZpbGxDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImZpbGxDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgZmdDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImZnQ29sb3JcIiwgXCJjb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgdGV4dENvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwidGV4dENvbG9yXCIsIFwiY29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGJvcmRlckNvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwiYm9yZGVyQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgc3Ryb2tlQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJzdHJva2VDb2xvclwiLCBcImJvcmRlckNvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICByb3RhdGlvbjogZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBhbmdsZSA9IGV2ZW50LmRldGFpbC5yb3RhdGlvbjtcbiAgICAgICAgdGhpcy5zZXRSb3RhdGlvbihhbmdsZSk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgcm90YXRpb246IGFuZ2xlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIF9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCkge1xuICAgIGNvbnN0IGNvbW1vbkFjdGlvbnMgPSB0aGlzLl9jb21tb25BY3Rpb25zO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhqc0V2ZW50LmRldGFpbCkpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNbbmFtZV0gfHwgY29tbW9uQWN0aW9uc1tuYW1lXTtcbiAgICAgIGFjdGlvbj8uKGpzRXZlbnQpO1xuICAgIH1cbiAgfVxuICBfc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVTY3JpcHRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmVkRGF0YSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UuZ2V0UmF3VmFsdWUodGhpcy5kYXRhLmlkKTtcbiAgICBpZiAoIXN0b3JlZERhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uQWN0aW9ucyA9IHRoaXMuX2NvbW1vbkFjdGlvbnM7XG4gICAgZm9yIChjb25zdCBbYWN0aW9uTmFtZSwgZGV0YWlsXSBvZiBPYmplY3QuZW50cmllcyhzdG9yZWREYXRhKSkge1xuICAgICAgY29uc3QgYWN0aW9uID0gY29tbW9uQWN0aW9uc1thY3Rpb25OYW1lXTtcbiAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZXZlbnRQcm94eSA9IHtcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIFthY3Rpb25OYW1lXTogZGV0YWlsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXQ6IGVsZW1lbnRcbiAgICAgICAgfTtcbiAgICAgICAgYWN0aW9uKGV2ZW50UHJveHkpO1xuICAgICAgICBkZWxldGUgc3RvcmVkRGF0YVthY3Rpb25OYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKCkge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcXVhZFBvaW50c1xuICAgIH0gPSB0aGlzLmRhdGE7XG4gICAgaWYgKCFxdWFkUG9pbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtyZWN0QmxYLCByZWN0QmxZLCByZWN0VHJYLCByZWN0VHJZXSA9IHRoaXMuZGF0YS5yZWN0O1xuICAgIGlmIChxdWFkUG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgWywge1xuICAgICAgICB4OiB0clgsXG4gICAgICAgIHk6IHRyWVxuICAgICAgfSwge1xuICAgICAgICB4OiBibFgsXG4gICAgICAgIHk6IGJsWVxuICAgICAgfV0gPSBxdWFkUG9pbnRzWzBdO1xuICAgICAgaWYgKHJlY3RUclggPT09IHRyWCAmJiByZWN0VHJZID09PSB0clkgJiYgcmVjdEJsWCA9PT0gYmxYICYmIHJlY3RCbFkgPT09IGJsWSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuY29udGFpbmVyO1xuICAgIGxldCBzdmdCdWZmZXI7XG4gICAgaWYgKHRoaXMuI2hhc0JvcmRlcikge1xuICAgICAgY29uc3Qge1xuICAgICAgICBib3JkZXJDb2xvcixcbiAgICAgICAgYm9yZGVyV2lkdGhcbiAgICAgIH0gPSBzdHlsZTtcbiAgICAgIHN0eWxlLmJvcmRlcldpZHRoID0gMDtcbiAgICAgIHN2Z0J1ZmZlciA9IFtcInVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsXCIsIGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcImAsIGAgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDEgMVwiPmAsIGA8ZyBmaWxsPVwidHJhbnNwYXJlbnRcIiBzdHJva2U9XCIke2JvcmRlckNvbG9yfVwiIHN0cm9rZS13aWR0aD1cIiR7Ym9yZGVyV2lkdGh9XCI+YF07XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGFzQm9yZGVyXCIpO1xuICAgIH1cbiAgICBjb25zdCB3aWR0aCA9IHJlY3RUclggLSByZWN0QmxYO1xuICAgIGNvbnN0IGhlaWdodCA9IHJlY3RUclkgLSByZWN0QmxZO1xuICAgIGNvbnN0IHtcbiAgICAgIHN2Z0ZhY3RvcnlcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBzdmcgPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIik7XG4gICAgc3ZnLmNsYXNzTGlzdC5hZGQoXCJxdWFkcmlsYXRlcmFsc0NvbnRhaW5lclwiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCAwKTtcbiAgICBjb25zdCBkZWZzID0gc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiZGVmc1wiKTtcbiAgICBzdmcuYXBwZW5kKGRlZnMpO1xuICAgIGNvbnN0IGNsaXBQYXRoID0gc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIik7XG4gICAgY29uc3QgaWQgPSBgY2xpcHBhdGhfJHt0aGlzLmRhdGEuaWR9YDtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBpZCk7XG4gICAgY2xpcFBhdGguc2V0QXR0cmlidXRlKFwiY2xpcFBhdGhVbml0c1wiLCBcIm9iamVjdEJvdW5kaW5nQm94XCIpO1xuICAgIGRlZnMuYXBwZW5kKGNsaXBQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFssIHtcbiAgICAgIHg6IHRyWCxcbiAgICAgIHk6IHRyWVxuICAgIH0sIHtcbiAgICAgIHg6IGJsWCxcbiAgICAgIHk6IGJsWVxuICAgIH1dIG9mIHF1YWRQb2ludHMpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIpO1xuICAgICAgY29uc3QgeCA9IChibFggLSByZWN0QmxYKSAvIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IChyZWN0VHJZIC0gdHJZKSAvIGhlaWdodDtcbiAgICAgIGNvbnN0IHJlY3RXaWR0aCA9ICh0clggLSBibFgpIC8gd2lkdGg7XG4gICAgICBjb25zdCByZWN0SGVpZ2h0ID0gKHRyWSAtIGJsWSkgLyBoZWlnaHQ7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgeCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgeSk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHJlY3RXaWR0aCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCByZWN0SGVpZ2h0KTtcbiAgICAgIGNsaXBQYXRoLmFwcGVuZChyZWN0KTtcbiAgICAgIHN2Z0J1ZmZlcj8ucHVzaChgPHJlY3QgdmVjdG9yLWVmZmVjdD1cIm5vbi1zY2FsaW5nLXN0cm9rZVwiIHg9XCIke3h9XCIgeT1cIiR7eX1cIiB3aWR0aD1cIiR7cmVjdFdpZHRofVwiIGhlaWdodD1cIiR7cmVjdEhlaWdodH1cIi8+YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNoYXNCb3JkZXIpIHtcbiAgICAgIHN2Z0J1ZmZlci5wdXNoKGA8L2c+PC9zdmc+JylgKTtcbiAgICAgIHN0eWxlLmJhY2tncm91bmRJbWFnZSA9IHN2Z0J1ZmZlci5qb2luKFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5jbGlwUGF0aCA9IGB1cmwoIyR7aWR9KWA7XG4gIH1cbiAgX2NyZWF0ZVBvcHVwKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGRhdGFcbiAgICB9ID0gdGhpcztcbiAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCBcImRpYWxvZ1wiKTtcbiAgICBjb25zdCBwb3B1cCA9IG5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29sb3I6IGRhdGEuY29sb3IsXG4gICAgICAgIHRpdGxlT2JqOiBkYXRhLnRpdGxlT2JqLFxuICAgICAgICBtb2RpZmljYXRpb25EYXRlOiBkYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICAgIGNvbnRlbnRzT2JqOiBkYXRhLmNvbnRlbnRzT2JqLFxuICAgICAgICByaWNoVGV4dDogZGF0YS5yaWNoVGV4dCxcbiAgICAgICAgcGFyZW50UmVjdDogZGF0YS5yZWN0LFxuICAgICAgICBib3JkZXJTdHlsZTogMCxcbiAgICAgICAgaWQ6IGBwb3B1cF8ke2RhdGEuaWR9YCxcbiAgICAgICAgcm90YXRpb246IGRhdGEucm90YXRpb25cbiAgICAgIH0sXG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZWxlbWVudHM6IFt0aGlzXVxuICAgIH0pO1xuICAgIHRoaXMucGFyZW50LmRpdi5hcHBlbmQocG9wdXAucmVuZGVyKCkpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICAoMCx1dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG4gIH1cbiAgX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUpIHtcbiAgICBsZXQgc2tpcElkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIGNvbnN0IGZpZWxkcyA9IFtdO1xuICAgIGlmICh0aGlzLl9maWVsZE9iamVjdHMpIHtcbiAgICAgIGNvbnN0IGZpZWxkT2JqID0gdGhpcy5fZmllbGRPYmplY3RzW25hbWVdO1xuICAgICAgaWYgKGZpZWxkT2JqKSB7XG4gICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgZXhwb3J0VmFsdWVzXG4gICAgICAgIH0gb2YgZmllbGRPYmopIHtcbiAgICAgICAgICBpZiAocGFnZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaWQgPT09IHNraXBJZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV4cG9ydFZhbHVlID0gdHlwZW9mIGV4cG9ydFZhbHVlcyA9PT0gXCJzdHJpbmdcIiA/IGV4cG9ydFZhbHVlcyA6IG51bGw7XG4gICAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWVsZW1lbnQtaWQ9XCIke2lkfVwiXWApO1xuICAgICAgICAgIGlmIChkb21FbGVtZW50ICYmICFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcbiAgICAgICAgICAgICgwLHV0aWwud2FybikoYF9nZXRFbGVtZW50c0J5TmFtZSAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6ICR7aWR9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBleHBvcnRWYWx1ZSxcbiAgICAgICAgICAgIGRvbUVsZW1lbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9XG4gICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKG5hbWUpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGV4cG9ydFZhbHVlXG4gICAgICB9ID0gZG9tRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIik7XG4gICAgICBpZiAoaWQgPT09IHNraXBJZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghR2V0RWxlbWVudHNCeU5hbWVTZXQuaGFzKGRvbUVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICBpZCxcbiAgICAgICAgZXhwb3J0VmFsdWUsXG4gICAgICAgIGRvbUVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5oaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wb3B1cD8ubWF5YmVTaG93KCk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMucG9wdXA/LmZvcmNlSGlkZSgpO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLmdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0cmlnZ2VycykpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2Vycykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2Vycy5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICB9XG4gIH1cbiAgZ2V0IF9pc0VkaXRhYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBfZWRpdE9uRG91YmxlQ2xpY2soKSB7XG4gICAgaWYgKCF0aGlzLl9pc0VkaXRhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFubm90YXRpb25FZGl0b3JUeXBlOiBtb2RlLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogZWRpdElkXG4gICAgICB9XG4gICAgfSA9IHRoaXM7XG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsICgpID0+IHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGVkaXRJZFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIExpbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogISFvcHRpb25zPy5pZ25vcmVCb3JkZXIsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuaXNUb29sdGlwT25seSA9IHBhcmFtZXRlcnMuZGF0YS5pc1Rvb2x0aXBPbmx5O1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhLFxuICAgICAgbGlua1NlcnZpY2VcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgbGluay5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgZGF0YS5pZCk7XG4gICAgbGV0IGlzQm91bmQgPSBmYWxzZTtcbiAgICBpZiAoZGF0YS51cmwpIHtcbiAgICAgIGxpbmtTZXJ2aWNlLmFkZExpbmtBdHRyaWJ1dGVzKGxpbmssIGRhdGEudXJsLCBkYXRhLm5ld1dpbmRvdyk7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuYWN0aW9uKSB7XG4gICAgICB0aGlzLl9iaW5kTmFtZWRBY3Rpb24obGluaywgZGF0YS5hY3Rpb24pO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkYXRhLmF0dGFjaG1lbnQpIHtcbiAgICAgIHRoaXMuI2JpbmRBdHRhY2htZW50KGxpbmssIGRhdGEuYXR0YWNobWVudCwgZGF0YS5hdHRhY2htZW50RGVzdCk7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuc2V0T0NHU3RhdGUpIHtcbiAgICAgIHRoaXMuI2JpbmRTZXRPQ0dTdGF0ZShsaW5rLCBkYXRhLnNldE9DR1N0YXRlKTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5kZXN0KSB7XG4gICAgICB0aGlzLl9iaW5kTGluayhsaW5rLCBkYXRhLmRlc3QpO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhLmFjdGlvbnMgJiYgKGRhdGEuYWN0aW9ucy5BY3Rpb24gfHwgZGF0YS5hY3Rpb25zW1wiTW91c2UgVXBcIl0gfHwgZGF0YS5hY3Rpb25zW1wiTW91c2UgRG93blwiXSkgJiYgdGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYmluZEpTQWN0aW9uKGxpbmssIGRhdGEpO1xuICAgICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnJlc2V0Rm9ybSkge1xuICAgICAgICB0aGlzLl9iaW5kUmVzZXRGb3JtQWN0aW9uKGxpbmssIGRhdGEucmVzZXRGb3JtKTtcbiAgICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUb29sdGlwT25seSAmJiAhaXNCb3VuZCkge1xuICAgICAgICB0aGlzLl9iaW5kTGluayhsaW5rLCBcIlwiKTtcbiAgICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJsaW5rQW5ub3RhdGlvblwiKTtcbiAgICBpZiAoaXNCb3VuZCkge1xuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGxpbmspO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgI3NldEludGVybmFsTGluaygpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWludGVybmFsLWxpbmtcIiwgXCJcIik7XG4gIH1cbiAgX2JpbmRMaW5rKGxpbmssIGRlc3RpbmF0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXREZXN0aW5hdGlvbkhhc2goZGVzdGluYXRpb24pO1xuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmdvVG9EZXN0aW5hdGlvbihkZXN0aW5hdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBpZiAoZGVzdGluYXRpb24gfHwgZGVzdGluYXRpb24gPT09IFwiXCIpIHtcbiAgICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICAgIH1cbiAgfVxuICBfYmluZE5hbWVkQWN0aW9uKGxpbmssIGFjdGlvbikge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2UuZXhlY3V0ZU5hbWVkQWN0aW9uKGFjdGlvbik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgfVxuICAjYmluZEF0dGFjaG1lbnQobGluaywgYXR0YWNobWVudCkge1xuICAgIGxldCBkZXN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyPy5vcGVuT3JEb3dubG9hZERhdGEoYXR0YWNobWVudC5jb250ZW50LCBhdHRhY2htZW50LmZpbGVuYW1lLCBkZXN0KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICB9XG4gICNiaW5kU2V0T0NHU3RhdGUobGluaywgYWN0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlU2V0T0NHU3RhdGUoYWN0aW9uKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICB9XG4gIF9iaW5kSlNBY3Rpb24obGluaywgZGF0YSkge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoW1tcIkFjdGlvblwiLCBcIm9uY2xpY2tcIl0sIFtcIk1vdXNlIFVwXCIsIFwib25tb3VzZXVwXCJdLCBbXCJNb3VzZSBEb3duXCIsIFwib25tb3VzZWRvd25cIl1dKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGF0YS5hY3Rpb25zKSkge1xuICAgICAgY29uc3QganNOYW1lID0gbWFwLmdldChuYW1lKTtcbiAgICAgIGlmICghanNOYW1lKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGlua1tqc05hbWVdID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghbGluay5vbmNsaWNrKSB7XG4gICAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gIH1cbiAgX2JpbmRSZXNldEZvcm1BY3Rpb24obGluaywgcmVzZXRGb3JtKSB7XG4gICAgY29uc3Qgb3RoZXJDbGlja0FjdGlvbiA9IGxpbmsub25jbGljaztcbiAgICBpZiAoIW90aGVyQ2xpY2tBY3Rpb24pIHtcbiAgICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgICBpZiAoIXRoaXMuX2ZpZWxkT2JqZWN0cykge1xuICAgICAgKDAsdXRpbC53YXJuKShgX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBcInJlc2V0Rm9ybVwiIGFjdGlvbiBub3Qgc3VwcG9ydGVkLCBgICsgXCJlbnN1cmUgdGhhdCB0aGUgYGZpZWxkT2JqZWN0c2AgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLlwiKTtcbiAgICAgIGlmICghb3RoZXJDbGlja0FjdGlvbikge1xuICAgICAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgb3RoZXJDbGlja0FjdGlvbj8uKCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZpZWxkczogcmVzZXRGb3JtRmllbGRzLFxuICAgICAgICByZWZzOiByZXNldEZvcm1SZWZzLFxuICAgICAgICBpbmNsdWRlXG4gICAgICB9ID0gcmVzZXRGb3JtO1xuICAgICAgY29uc3QgYWxsRmllbGRzID0gW107XG4gICAgICBpZiAocmVzZXRGb3JtRmllbGRzLmxlbmd0aCAhPT0gMCB8fCByZXNldEZvcm1SZWZzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCBmaWVsZElkcyA9IG5ldyBTZXQocmVzZXRGb3JtUmVmcyk7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGROYW1lIG9mIHJlc2V0Rm9ybUZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tmaWVsZE5hbWVdIHx8IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9IG9mIGZpZWxkcykge1xuICAgICAgICAgICAgZmllbGRJZHMuYWRkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmaWVsZHMgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZElkcy5oYXMoZmllbGQuaWQpID09PSBpbmNsdWRlKSB7XG4gICAgICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGRzIG9mIE9iamVjdC52YWx1ZXModGhpcy5fZmllbGRPYmplY3RzKSkge1xuICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKC4uLmZpZWxkcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgY29uc3QgYWxsSWRzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFsbEZpZWxkcykge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IGZpZWxkO1xuICAgICAgICBhbGxJZHMucHVzaChpZCk7XG4gICAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgY2FzZSBcInJhZGlvYnV0dG9uXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlID09PSBmaWVsZC5leHBvcnRWYWx1ZXM7XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImNvbWJvYm94XCI6XG4gICAgICAgICAgY2FzZSBcImxpc3Rib3hcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWVsZW1lbnQtaWQ9XCIke2lkfVwiXWApO1xuICAgICAgICBpZiAoIWRvbUVsZW1lbnQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICghR2V0RWxlbWVudHNCeU5hbWVTZXQuaGFzKGRvbUVsZW1lbnQpKSB7XG4gICAgICAgICAgKDAsdXRpbC53YXJuKShgX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBlbGVtZW50IG5vdCBhbGxvd2VkOiAke2lkfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJyZXNldGZvcm1cIikpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nKSB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQ6IFwiYXBwXCIsXG4gICAgICAgICAgICBpZHM6IGFsbElkcyxcbiAgICAgICAgICAgIG5hbWU6IFwiUmVzZXRGb3JtXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH1cbn1cbmNsYXNzIFRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dEFubm90YXRpb25cIik7XG4gICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgIGltYWdlLnNyYyA9IHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoICsgXCJhbm5vdGF0aW9uLVwiICsgdGhpcy5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSArIFwiLnN2Z1wiO1xuICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLXRleHQtYW5ub3RhdGlvbi10eXBlXCIpO1xuICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1hcmdzXCIsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHR5cGU6IHRoaXMuZGF0YS5uYW1lXG4gICAgfSkpO1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoaW1hZ2UpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dCkge1xuICAgICAgdGhpcy5jb250YWluZXIudGl0bGUgPSB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKGVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgaWYgKGVsZW1lbnQucHJldmlvdXNTaWJsaW5nPy5ub2RlTmFtZSA9PT0gXCJDQU5WQVNcIikge1xuICAgICAgICBlbGVtZW50LnByZXZpb3VzU2libGluZy5oaWRkZW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5oaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgX2dldEtleU1vZGlmaWVyKGV2ZW50KSB7XG4gICAgcmV0dXJuIHV0aWwuRmVhdHVyZVRlc3QucGxhdGZvcm0uaXNNYWMgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleTtcbiAgfVxuICBfc2V0RXZlbnRMaXN0ZW5lcihlbGVtZW50LCBlbGVtZW50RGF0YSwgYmFzZU5hbWUsIGV2ZW50TmFtZSwgdmFsdWVHZXR0ZXIpIHtcbiAgICBpZiAoYmFzZU5hbWUuaW5jbHVkZXMoXCJtb3VzZVwiKSkge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJhc2VOYW1lLCBldmVudCA9PiB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgICAgICAgIG5hbWU6IGV2ZW50TmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUdldHRlcihldmVudCksXG4gICAgICAgICAgICBzaGlmdDogZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICBtb2RpZmllcjogdGhpcy5fZ2V0S2V5TW9kaWZpZXIoZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYmFzZU5hbWUsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGJhc2VOYW1lID09PSBcImJsdXJcIikge1xuICAgICAgICAgIGlmICghZWxlbWVudERhdGEuZm9jdXNlZCB8fCAhZXZlbnQucmVsYXRlZFRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50RGF0YS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoYmFzZU5hbWUgPT09IFwiZm9jdXNcIikge1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWVHZXR0ZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZDogdGhpcy5kYXRhLmlkLFxuICAgICAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlR2V0dGVyKGV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBuYW1lcywgZ2V0dGVyKSB7XG4gICAgZm9yIChjb25zdCBbYmFzZU5hbWUsIGV2ZW50TmFtZV0gb2YgbmFtZXMpIHtcbiAgICAgIGlmIChldmVudE5hbWUgPT09IFwiQWN0aW9uXCIgfHwgdGhpcy5kYXRhLmFjdGlvbnM/LltldmVudE5hbWVdKSB7XG4gICAgICAgIGlmIChldmVudE5hbWUgPT09IFwiRm9jdXNcIiB8fCBldmVudE5hbWUgPT09IFwiQmx1clwiKSB7XG4gICAgICAgICAgZWxlbWVudERhdGEgfHw9IHtcbiAgICAgICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBiYXNlTmFtZSwgZXZlbnROYW1lLCBnZXR0ZXIpO1xuICAgICAgICBpZiAoZXZlbnROYW1lID09PSBcIkZvY3VzXCIgJiYgIXRoaXMuZGF0YS5hY3Rpb25zPy5CbHVyKSB7XG4gICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcihlbGVtZW50LCBlbGVtZW50RGF0YSwgXCJibHVyXCIsIFwiQmx1clwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiQmx1clwiICYmICF0aGlzLmRhdGEuYWN0aW9ucz8uRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBcImZvY3VzXCIsIFwiRm9jdXNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KSB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yIHx8IG51bGw7XG4gICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvciA9PT0gbnVsbCA/IFwidHJhbnNwYXJlbnRcIiA6IHV0aWwuVXRpbC5tYWtlSGV4Q29sb3IoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7XG4gIH1cbiAgX3NldFRleHRTdHlsZShlbGVtZW50KSB7XG4gICAgY29uc3QgVEVYVF9BTElHTk1FTlQgPSBbXCJsZWZ0XCIsIFwiY2VudGVyXCIsIFwicmlnaHRcIl07XG4gICAgY29uc3Qge1xuICAgICAgZm9udENvbG9yXG4gICAgfSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7XG4gICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplIHx8IERFRkFVTFRfRk9OVF9TSVpFO1xuICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudC5zdHlsZTtcbiAgICBsZXQgY29tcHV0ZWRGb250U2l6ZTtcbiAgICBjb25zdCBCT1JERVJfU0laRSA9IDI7XG4gICAgY29uc3Qgcm91bmRUb09uZURlY2ltYWwgPSB4ID0+IE1hdGgucm91bmQoMTAgKiB4KSAvIDEwO1xuICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyh0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdIC0gQk9SREVSX1NJWkUpO1xuICAgICAgY29uc3QgbnVtYmVyT2ZMaW5lcyA9IE1hdGgucm91bmQoaGVpZ2h0IC8gKHV0aWwuTElORV9GQUNUT1IgKiBmb250U2l6ZSkpIHx8IDE7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lcztcbiAgICAgIGNvbXB1dGVkRm9udFNpemUgPSBNYXRoLm1pbihmb250U2l6ZSwgcm91bmRUb09uZURlY2ltYWwobGluZUhlaWdodCAvIHV0aWwuTElORV9GQUNUT1IpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnModGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXSAtIEJPUkRFUl9TSVpFKTtcbiAgICAgIGNvbXB1dGVkRm9udFNpemUgPSBNYXRoLm1pbihmb250U2l6ZSwgcm91bmRUb09uZURlY2ltYWwoaGVpZ2h0IC8gdXRpbC5MSU5FX0ZBQ1RPUikpO1xuICAgIH1cbiAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7Y29tcHV0ZWRGb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICBzdHlsZS5jb2xvciA9IHV0aWwuVXRpbC5tYWtlSGV4Q29sb3IoZm9udENvbG9yWzBdLCBmb250Q29sb3JbMV0sIGZvbnRDb2xvclsyXSk7XG4gICAgaWYgKHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ICE9PSBudWxsKSB7XG4gICAgICBzdHlsZS50ZXh0QWxpZ24gPSBURVhUX0FMSUdOTUVOVFt0aGlzLmRhdGEudGV4dEFsaWdubWVudF07XG4gICAgfVxuICB9XG4gIF9zZXRSZXF1aXJlZChlbGVtZW50LCBpc1JlcXVpcmVkKSB7XG4gICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwicmVxdWlyZWRcIik7XG4gICAgfVxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1yZXF1aXJlZFwiLCBpc1JlcXVpcmVkKTtcbiAgfVxufVxuY2xhc3MgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gcGFyYW1ldGVycy5yZW5kZXJGb3JtcyB8fCBwYXJhbWV0ZXJzLmRhdGEuaGFzT3duQ2FudmFzIHx8ICFwYXJhbWV0ZXJzLmRhdGEuaGFzQXBwZWFyYW5jZSAmJiAhIXBhcmFtZXRlcnMuZGF0YS5maWVsZFZhbHVlO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZVxuICAgIH0pO1xuICB9XG4gIHNldFByb3BlcnR5T25TaWJsaW5ncyhiYXNlLCBrZXksIHZhbHVlLCBrZXlJblN0b3JhZ2UpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoYmFzZS5uYW1lLCBiYXNlLmlkKSkge1xuICAgICAgaWYgKGVsZW1lbnQuZG9tRWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmRvbUVsZW1lbnRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShlbGVtZW50LmlkLCB7XG4gICAgICAgIFtrZXlJblN0b3JhZ2VdOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dFdpZGdldEFubm90YXRpb25cIik7XG4gICAgbGV0IGVsZW1lbnQgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlbmRlckZvcm1zKSB7XG4gICAgICBjb25zdCBzdG9yZWREYXRhID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICAgIH0pO1xuICAgICAgbGV0IHRleHRDb250ZW50ID0gc3RvcmVkRGF0YS52YWx1ZSB8fCBcIlwiO1xuICAgICAgY29uc3QgbWF4TGVuID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW5cbiAgICAgIH0pLmNoYXJMaW1pdDtcbiAgICAgIGlmIChtYXhMZW4gJiYgdGV4dENvbnRlbnQubGVuZ3RoID4gbWF4TGVuKSB7XG4gICAgICAgIHRleHRDb250ZW50ID0gdGV4dENvbnRlbnQuc2xpY2UoMCwgbWF4TGVuKTtcbiAgICAgIH1cbiAgICAgIGxldCBmaWVsZEZvcm1hdHRlZFZhbHVlcyA9IHN0b3JlZERhdGEuZm9ybWF0dGVkVmFsdWUgfHwgdGhpcy5kYXRhLnRleHRDb250ZW50Py5qb2luKFwiXFxuXCIpIHx8IG51bGw7XG4gICAgICBpZiAoZmllbGRGb3JtYXR0ZWRWYWx1ZXMgJiYgdGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZXMgPSBmaWVsZEZvcm1hdHRlZFZhbHVlcy5yZXBsYWNlQWxsKC9cXHMrL2csIFwiXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudERhdGEgPSB7XG4gICAgICAgIHVzZXJWYWx1ZTogdGV4dENvbnRlbnQsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiBmaWVsZEZvcm1hdHRlZFZhbHVlcyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFZhbHVlOiBudWxsLFxuICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGZpZWxkRm9ybWF0dGVkVmFsdWVzID8/IHRleHRDb250ZW50O1xuICAgICAgICBpZiAodGhpcy5kYXRhLmRvTm90U2Nyb2xsKSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBlbGVtZW50LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBmaWVsZEZvcm1hdHRlZFZhbHVlcyA/PyB0ZXh0Q29udGVudCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZG9Ob3RTY3JvbGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IFwiaGlkZGVuXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7XG4gICAgICAgIGVsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChlbGVtZW50KTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoZWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgIGlmIChtYXhMZW4pIHtcbiAgICAgICAgZWxlbWVudC5tYXhMZW5ndGggPSBtYXhMZW47XG4gICAgICB9XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5T25TaWJsaW5ncyhlbGVtZW50LCBcInZhbHVlXCIsIGV2ZW50LnRhcmdldC52YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPz8gXCJcIjtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBsZXQgYmx1ckxpc3RlbmVyID0gZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZm9ybWF0dGVkVmFsdWVcbiAgICAgICAgfSA9IGVsZW1lbnREYXRhO1xuICAgICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgIT09IG51bGwgJiYgZm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudXNlclZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAxO1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhLmFjdGlvbnM/LkZvY3VzKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhqc0V2ZW50LnRhcmdldCk7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICAgIHZhbHVlKGV2ZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZSA/PyBcIlwiO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnREYXRhLnVzZXJWYWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLmZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgICAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LnRhcmdldCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWxSYW5nZShldmVudCkge1xuICAgICAgICAgICAgICBldmVudC50YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UoLi4uZXZlbnQuZGV0YWlsLnNlbFJhbmdlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFyTGltaXQ6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGNoYXJMaW1pdFxuICAgICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgICAgICAgaWYgKGNoYXJMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIiwgY2hhckxpbWl0KTtcbiAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlO1xuICAgICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA8PSBjaGFyTGltaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBjaGFyTGltaXQpO1xuICAgICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgd2lsbENvbW1pdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEtleTogMSxcbiAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiB0YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICBzZWxFbmQ6IHRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldmVudCA9PiB7XG4gICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMTtcbiAgICAgICAgICBsZXQgY29tbWl0S2V5ID0gLTE7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgY29tbWl0S2V5ID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiICYmICF0aGlzLmRhdGEubXVsdGlMaW5lKSB7XG4gICAgICAgICAgICBjb21taXRLZXkgPSAyO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tbWl0S2V5ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG4gICAgICAgICAgICAgIGNvbW1pdEtleSxcbiAgICAgICAgICAgICAgc2VsU3RhcnQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgc2VsRW5kOiBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfYmx1ckxpc3RlbmVyID0gYmx1ckxpc3RlbmVyO1xuICAgICAgICBibHVyTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLmZvY3VzZWQgfHwgIWV2ZW50LnJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuYWN0aW9ucz8uQmx1cikge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1pdEtleTogZWxlbWVudERhdGEuY29tbWl0S2V5LFxuICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgc2VsRW5kOiBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfYmx1ckxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuYWN0aW9ucz8uS2V5c3Ryb2tlKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICB9ID0gZXZlbnQ7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICB9ID0gdGFyZ2V0O1xuICAgICAgICAgICAgbGV0IHNlbFN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgIHNlbEVuZCA9IHNlbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVXb3JkQmFja3dhcmRcIjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1xcdypbXlxcd10qJC8pO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0IC09IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5zdWJzdHJpbmcoc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9eW15cXHddKlxcdyovKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxFbmQgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09PSBzZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0IC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEZvcndhcmRcIjpcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT09IHNlbGVjdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgICAgc2VsRW5kICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IGRhdGEgfHwgXCJcIixcbiAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWxTdGFydCxcbiAgICAgICAgICAgICAgICBzZWxFbmRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgZWxlbWVudERhdGEsIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChibHVyTGlzdGVuZXIpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBibHVyTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YS5jb21iKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdO1xuICAgICAgICBjb25zdCBjb21iV2lkdGggPSBmaWVsZFdpZHRoIC8gbWF4TGVuO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb21iXCIpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxldHRlclNwYWNpbmcgPSBgY2FsYygke2NvbWJXaWR0aH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikgLSAxY2gpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7XG4gICAgICBlbGVtZW50LnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcIm1pZGRsZVwiO1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJ0YWJsZS1jZWxsXCI7XG4gICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgICBlbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NldFRleHRTdHlsZShlbGVtZW50KTtcbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6ICEhcGFyYW1ldGVycy5kYXRhLmhhc093bkNhbnZhc1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3QgaWQgPSBkYXRhLmlkO1xuICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBkYXRhLmV4cG9ydFZhbHVlID09PSBkYXRhLmZpZWxkVmFsdWVcbiAgICB9KS52YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlICE9PSBcIk9mZlwiO1xuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwiY2hlY2tCb3hcIik7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoZWxlbWVudCk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5O1xuICAgIHRoaXMuX3NldFJlcXVpcmVkKGVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG4gICAgZWxlbWVudC50eXBlID0gXCJjaGVja2JveFwiO1xuICAgIGVsZW1lbnQubmFtZSA9IGRhdGEuZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgIH1cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImV4cG9ydFZhbHVlXCIsIGRhdGEuZXhwb3J0VmFsdWUpO1xuICAgIGVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjaGVja2VkXG4gICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgZm9yIChjb25zdCBjaGVja2JveCBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShuYW1lLCBpZCkpIHtcbiAgICAgICAgY29uc3QgY3VyQ2hlY2tlZCA9IGNoZWNrZWQgJiYgY2hlY2tib3guZXhwb3J0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG4gICAgICAgIGlmIChjaGVja2JveC5kb21FbGVtZW50KSB7XG4gICAgICAgICAgY2hlY2tib3guZG9tRWxlbWVudC5jaGVja2VkID0gY3VyQ2hlY2tlZDtcbiAgICAgICAgfVxuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGNoZWNrYm94LmlkLCB7XG4gICAgICAgICAgdmFsdWU6IGN1ckNoZWNrZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgIHZhbHVlOiBjaGVja2VkXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSB8fCBcIk9mZlwiO1xuICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBkZWZhdWx0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZShldmVudCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBldmVudC5kZXRhaWwudmFsdWUgIT09IFwiT2ZmXCI7XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIG51bGwsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcInJhZGlvQnV0dG9uXCIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3QgaWQgPSBkYXRhLmlkO1xuICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBkYXRhLmZpZWxkVmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWVcbiAgICB9KS52YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlICE9PSBkYXRhLmJ1dHRvblZhbHVlO1xuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChjb25zdCByYWRpbyBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShkYXRhLmZpZWxkTmFtZSwgaWQpKSB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8uaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICBlbGVtZW50LmRpc2FibGVkID0gZGF0YS5yZWFkT25seTtcbiAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgIGVsZW1lbnQudHlwZSA9IFwicmFkaW9cIjtcbiAgICBlbGVtZW50Lm5hbWUgPSBkYXRhLmZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcbiAgICB9XG4gICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNoZWNrZWRcbiAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUsIGlkKSkge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG4gICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZTogY2hlY2tlZFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRhdGEuZGVmYXVsdEZpZWxkVmFsdWU7XG4gICAgICBldmVudC50YXJnZXQuY2hlY2tlZCA9IGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0VmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBjb25zdCBwZGZCdXR0b25WYWx1ZSA9IGRhdGEuYnV0dG9uVmFsdWU7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZTogZXZlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHBkZkJ1dHRvblZhbHVlID09PSBldmVudC5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKGV2ZW50LnRhcmdldC5uYW1lKSkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJDaGVja2VkID0gY2hlY2tlZCAmJiByYWRpby5pZCA9PT0gaWQ7XG4gICAgICAgICAgICAgIGlmIChyYWRpby5kb21FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmFkaW8uZG9tRWxlbWVudC5jaGVja2VkID0gY3VyQ2hlY2tlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1ckNoZWNrZWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIG51bGwsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgTGlua0Fubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlnbm9yZUJvcmRlcjogcGFyYW1ldGVycy5kYXRhLmhhc0FwcGVhcmFuY2VcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gc3VwZXIucmVuZGVyKCk7XG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwicHVzaEJ1dHRvblwiKTtcbiAgICBpZiAodGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dCkge1xuICAgICAgY29udGFpbmVyLnRpdGxlID0gdGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dDtcbiAgICB9XG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBjb250YWluZXIubGFzdENoaWxkO1xuICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucyAmJiBsaW5rRWxlbWVudCkge1xuICAgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMobGlua0VsZW1lbnQpO1xuICAgICAgbGlua0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goe30sIGpzRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IHN0b3JlZERhdGEgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICB9KTtcbiAgICBjb25zdCBzZWxlY3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbiAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoc2VsZWN0RWxlbWVudCk7XG4gICAgc2VsZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuICAgIHNlbGVjdEVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgdGhpcy5fc2V0UmVxdWlyZWQoc2VsZWN0RWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICBzZWxlY3RFbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgIHNlbGVjdEVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICBsZXQgYWRkQW5FbXB0eUVudHJ5ID0gdGhpcy5kYXRhLmNvbWJvICYmIHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aCA+IDA7XG4gICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgIHNlbGVjdEVsZW1lbnQuc2l6ZSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDtcbiAgICAgIGlmICh0aGlzLmRhdGEubXVsdGlTZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0RWxlbWVudC5tdWx0aXBsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWU7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWxlY3RFbGVtZW50Lm9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gb3B0aW9uLnZhbHVlID09PSBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uLmV4cG9ydFZhbHVlO1xuICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUuaW5jbHVkZXMob3B0aW9uLmV4cG9ydFZhbHVlKSkge1xuICAgICAgICBvcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIHRydWUpO1xuICAgICAgICBhZGRBbkVtcHR5RW50cnkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgIH1cbiAgICBsZXQgcmVtb3ZlRW1wdHlFbnRyeSA9IG51bGw7XG4gICAgaWYgKGFkZEFuRW1wdHlFbnRyeSkge1xuICAgICAgY29uc3Qgbm9uZU9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgbm9uZU9wdGlvbkVsZW1lbnQudmFsdWUgPSBcIiBcIjtcbiAgICAgIG5vbmVPcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCB0cnVlKTtcbiAgICAgIG5vbmVPcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIHRydWUpO1xuICAgICAgc2VsZWN0RWxlbWVudC5wcmVwZW5kKG5vbmVPcHRpb25FbGVtZW50KTtcbiAgICAgIHJlbW92ZUVtcHR5RW50cnkgPSAoKSA9PiB7XG4gICAgICAgIG5vbmVPcHRpb25FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCByZW1vdmVFbXB0eUVudHJ5KTtcbiAgICAgICAgcmVtb3ZlRW1wdHlFbnRyeSA9IG51bGw7XG4gICAgICB9O1xuICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgcmVtb3ZlRW1wdHlFbnRyeSk7XG4gICAgfVxuICAgIGNvbnN0IGdldFZhbHVlID0gaXNFeHBvcnQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGlzRXhwb3J0ID8gXCJ2YWx1ZVwiIDogXCJ0ZXh0Q29udGVudFwiO1xuICAgICAgY29uc3Qge1xuICAgICAgICBvcHRpb25zLFxuICAgICAgICBtdWx0aXBsZVxuICAgICAgfSA9IHNlbGVjdEVsZW1lbnQ7XG4gICAgICBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnNlbGVjdGVkSW5kZXggPT09IC0xID8gbnVsbCA6IG9wdGlvbnNbb3B0aW9ucy5zZWxlY3RlZEluZGV4XVtuYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCkubWFwKG9wdGlvbiA9PiBvcHRpb25bbmFtZV0pO1xuICAgIH07XG4gICAgbGV0IHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgIGNvbnN0IGdldEl0ZW1zID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zO1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChvcHRpb25zLCBvcHRpb24gPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogb3B0aW9uLnRleHRDb250ZW50LFxuICAgICAgICAgIGV4cG9ydFZhbHVlOiBvcHRpb24udmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZShldmVudCkge1xuICAgICAgICAgICAgcmVtb3ZlRW1wdHlFbnRyeT8uKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0RWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlcy5oYXMob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVtb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZWN0RWxlbWVudC5vcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBldmVudC5kZXRhaWwucmVtb3ZlO1xuICAgICAgICAgICAgb3B0aW9uc1tpbmRleF0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXguY2FsbChvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpLFxuICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMoZXZlbnQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xlYXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluc2VydChldmVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICBleHBvcnRWYWx1ZVxuICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbC5pbnNlcnQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RDaGlsZCA9IHNlbGVjdEVsZW1lbnQuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gZGlzcGxheVZhbHVlO1xuICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGV4cG9ydFZhbHVlO1xuICAgICAgICAgICAgaWYgKHNlbGVjdENoaWxkKSB7XG4gICAgICAgICAgICAgIHNlbGVjdENoaWxkLmJlZm9yZShvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG4gICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpdGVtcyhldmVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpdGVtc1xuICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIGV4cG9ydFZhbHVlXG4gICAgICAgICAgICAgIH0gPSBpdGVtO1xuICAgICAgICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGRpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGV4cG9ydFZhbHVlO1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWxlY3RFbGVtZW50Lm9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG4gICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRpY2VzKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFNldChldmVudC5kZXRhaWwuaW5kaWNlcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBldmVudC50YXJnZXQub3B0aW9ucykge1xuICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBpbmRpY2VzLmhhcyhvcHRpb24uaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlZGl0YWJsZShldmVudCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gIWV2ZW50LmRldGFpbC5lZGl0YWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IGdldFZhbHVlKHRydWUpO1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgdmFsdWU6IGV4cG9ydFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIGNoYW5nZUV4OiBleHBvcnRWYWx1ZSxcbiAgICAgICAgICAgIHdpbGxDb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgY29tbWl0S2V5OiAxLFxuICAgICAgICAgICAga2V5RG93bjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhzZWxlY3RFbGVtZW50LCBudWxsLCBbW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXSwgW1wiaW5wdXRcIiwgXCJBY3Rpb25cIl0sIFtcImlucHV0XCIsIFwiVmFsaWRhdGVcIl1dLCBldmVudCA9PiBldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhLmNvbWJvKSB7XG4gICAgICB0aGlzLl9zZXRUZXh0U3R5bGUoc2VsZWN0RWxlbWVudCk7XG4gICAgfSBlbHNlIHt9XG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKHNlbGVjdEVsZW1lbnQpO1xuICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHNlbGVjdEVsZW1lbnQpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzZWxlY3RFbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhLFxuICAgICAgZWxlbWVudHNcbiAgICB9ID0gcGFyYW1ldGVycztcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IEFubm90YXRpb25FbGVtZW50Ll9oYXNQb3B1cERhdGEoZGF0YSlcbiAgICB9KTtcbiAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cEFubm90YXRpb25cIik7XG4gICAgY29uc3QgcG9wdXAgPSBuZXcgUG9wdXBFbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIsXG4gICAgICBjb2xvcjogdGhpcy5kYXRhLmNvbG9yLFxuICAgICAgdGl0bGVPYmo6IHRoaXMuZGF0YS50aXRsZU9iaixcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgY29udGVudHNPYmo6IHRoaXMuZGF0YS5jb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0OiB0aGlzLmRhdGEucmljaFRleHQsXG4gICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCxcbiAgICAgIHBhcmVudFJlY3Q6IHRoaXMuZGF0YS5wYXJlbnRSZWN0IHx8IG51bGwsXG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZWxlbWVudHM6IHRoaXMuZWxlbWVudHMsXG4gICAgICBvcGVuOiB0aGlzLmRhdGEub3BlblxuICAgIH0pO1xuICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgZWxlbWVudC5wb3B1cCA9IHBvcHVwO1xuICAgICAgZWxlbWVudElkcy5wdXNoKGVsZW1lbnQuZGF0YS5pZCk7XG4gICAgICBlbGVtZW50LmFkZEhpZ2hsaWdodEFyZWEoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiLCBlbGVtZW50SWRzLm1hcChpZCA9PiBgJHt1dGlsLkFubm90YXRpb25QcmVmaXh9JHtpZH1gKS5qb2luKFwiLFwiKSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBQb3B1cEVsZW1lbnQge1xuICAjYm91bmRLZXlEb3duID0gdGhpcy4ja2V5RG93bi5iaW5kKHRoaXMpO1xuICAjYm91bmRIaWRlID0gdGhpcy4jaGlkZS5iaW5kKHRoaXMpO1xuICAjYm91bmRTaG93ID0gdGhpcy4jc2hvdy5iaW5kKHRoaXMpO1xuICAjYm91bmRUb2dnbGUgPSB0aGlzLiN0b2dnbGUuYmluZCh0aGlzKTtcbiAgI2NvbG9yID0gbnVsbDtcbiAgI2NvbnRhaW5lciA9IG51bGw7XG4gICNjb250ZW50c09iaiA9IG51bGw7XG4gICNkYXRlT2JqID0gbnVsbDtcbiAgI2VsZW1lbnRzID0gbnVsbDtcbiAgI3BhcmVudCA9IG51bGw7XG4gICNwYXJlbnRSZWN0ID0gbnVsbDtcbiAgI3Bpbm5lZCA9IGZhbHNlO1xuICAjcG9wdXAgPSBudWxsO1xuICAjcmVjdCA9IG51bGw7XG4gICNyaWNoVGV4dCA9IG51bGw7XG4gICN0aXRsZU9iaiA9IG51bGw7XG4gICN3YXNWaXNpYmxlID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKF9yZWYyKSB7XG4gICAgbGV0IHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGNvbG9yLFxuICAgICAgZWxlbWVudHMsXG4gICAgICB0aXRsZU9iaixcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICBjb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0LFxuICAgICAgcGFyZW50LFxuICAgICAgcmVjdCxcbiAgICAgIHBhcmVudFJlY3QsXG4gICAgICBvcGVuXG4gICAgfSA9IF9yZWYyO1xuICAgIHRoaXMuI2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiN0aXRsZU9iaiA9IHRpdGxlT2JqO1xuICAgIHRoaXMuI2NvbnRlbnRzT2JqID0gY29udGVudHNPYmo7XG4gICAgdGhpcy4jcmljaFRleHQgPSByaWNoVGV4dDtcbiAgICB0aGlzLiNwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy4jY29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLiNyZWN0ID0gcmVjdDtcbiAgICB0aGlzLiNwYXJlbnRSZWN0ID0gcGFyZW50UmVjdDtcbiAgICB0aGlzLiNlbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgIHRoaXMuI2RhdGVPYmogPSBkaXNwbGF5X3V0aWxzLlBERkRhdGVTdHJpbmcudG9EYXRlT2JqZWN0KG1vZGlmaWNhdGlvbkRhdGUpO1xuICAgIHRoaXMudHJpZ2dlciA9IGVsZW1lbnRzLmZsYXRNYXAoZSA9PiBlLmdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMudHJpZ2dlcikge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jYm91bmRUb2dnbGUpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCB0aGlzLiNib3VuZFNob3cpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLiNib3VuZEhpZGUpO1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwicG9wdXBUcmlnZ2VyQXJlYVwiKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICBlbGVtZW50LmNvbnRhaW5lcj8uYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlEb3duKTtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMuI3RvZ2dsZSgpO1xuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuI3BvcHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2U6IHtcbiAgICAgICAgdmlld1xuICAgICAgfSxcbiAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgICBwYWdlV2lkdGgsXG4gICAgICAgICAgcGFnZUhlaWdodCxcbiAgICAgICAgICBwYWdlWCxcbiAgICAgICAgICBwYWdlWVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSA9IHRoaXMuI3BhcmVudDtcbiAgICBjb25zdCBwb3B1cCA9IHRoaXMuI3BvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBwb3B1cC5jbGFzc05hbWUgPSBcInBvcHVwXCI7XG4gICAgaWYgKHRoaXMuI2NvbG9yKSB7XG4gICAgICBjb25zdCBiYXNlQ29sb3IgPSBwb3B1cC5zdHlsZS5vdXRsaW5lQ29sb3IgPSB1dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLnRoaXMuI2NvbG9yKTtcbiAgICAgIGlmIChDU1Muc3VwcG9ydHMoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwiY29sb3ItbWl4KGluIHNyZ2IsIHJlZCAzMCUsIHdoaXRlKVwiKSkge1xuICAgICAgICBwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBgY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSAzMCUsIHdoaXRlKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBCQUNLR1JPVU5EX0VOTElHSFQgPSAwLjc7XG4gICAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHV0aWwuVXRpbC5tYWtlSGV4Q29sb3IoLi4udGhpcy4jY29sb3IubWFwKGMgPT4gTWF0aC5mbG9vcihCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gYykgKyBjKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBoZWFkZXIuY2xhc3NOYW1lID0gXCJoZWFkZXJcIjtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcbiAgICBoZWFkZXIuYXBwZW5kKHRpdGxlKTtcbiAgICAoe1xuICAgICAgZGlyOiB0aXRsZS5kaXIsXG4gICAgICBzdHI6IHRpdGxlLnRleHRDb250ZW50XG4gICAgfSA9IHRoaXMuI3RpdGxlT2JqKTtcbiAgICBwb3B1cC5hcHBlbmQoaGVhZGVyKTtcbiAgICBpZiAodGhpcy4jZGF0ZU9iaikge1xuICAgICAgY29uc3QgbW9kaWZpY2F0aW9uRGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5jbGFzc0xpc3QuYWRkKFwicG9wdXBEYXRlXCIpO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1hbm5vdGF0aW9uLWRhdGUtc3RyaW5nXCIpO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4tYXJnc1wiLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGRhdGU6IHRoaXMuI2RhdGVPYmoudG9Mb2NhbGVEYXRlU3RyaW5nKCksXG4gICAgICAgIHRpbWU6IHRoaXMuI2RhdGVPYmoudG9Mb2NhbGVUaW1lU3RyaW5nKClcbiAgICAgIH0pKTtcbiAgICAgIGhlYWRlci5hcHBlbmQobW9kaWZpY2F0aW9uRGF0ZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnRzT2JqID0gdGhpcy4jY29udGVudHNPYmo7XG4gICAgY29uc3QgcmljaFRleHQgPSB0aGlzLiNyaWNoVGV4dDtcbiAgICBpZiAocmljaFRleHQ/LnN0ciAmJiAoIWNvbnRlbnRzT2JqPy5zdHIgfHwgY29udGVudHNPYmouc3RyID09PSByaWNoVGV4dC5zdHIpKSB7XG4gICAgICB4ZmFfbGF5ZXIuWGZhTGF5ZXIucmVuZGVyKHtcbiAgICAgICAgeGZhSHRtbDogcmljaFRleHQuaHRtbCxcbiAgICAgICAgaW50ZW50OiBcInJpY2hUZXh0XCIsXG4gICAgICAgIGRpdjogcG9wdXBcbiAgICAgIH0pO1xuICAgICAgcG9wdXAubGFzdENoaWxkLmNsYXNzTGlzdC5hZGQoXCJyaWNoVGV4dFwiLCBcInBvcHVwQ29udGVudFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGVudHMgPSB0aGlzLl9mb3JtYXRDb250ZW50cyhjb250ZW50c09iaik7XG4gICAgICBwb3B1cC5hcHBlbmQoY29udGVudHMpO1xuICAgIH1cbiAgICBsZXQgdXNlUGFyZW50UmVjdCA9ICEhdGhpcy4jcGFyZW50UmVjdDtcbiAgICBsZXQgcmVjdCA9IHVzZVBhcmVudFJlY3QgPyB0aGlzLiNwYXJlbnRSZWN0IDogdGhpcy4jcmVjdDtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy4jZWxlbWVudHMpIHtcbiAgICAgIGlmICghcmVjdCB8fCB1dGlsLlV0aWwuaW50ZXJzZWN0KGVsZW1lbnQuZGF0YS5yZWN0LCByZWN0KSAhPT0gbnVsbCkge1xuICAgICAgICByZWN0ID0gZWxlbWVudC5kYXRhLnJlY3Q7XG4gICAgICAgIHVzZVBhcmVudFJlY3QgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZFJlY3QgPSB1dGlsLlV0aWwubm9ybWFsaXplUmVjdChbcmVjdFswXSwgdmlld1szXSAtIHJlY3RbMV0gKyB2aWV3WzFdLCByZWN0WzJdLCB2aWV3WzNdIC0gcmVjdFszXSArIHZpZXdbMV1dKTtcbiAgICBjb25zdCBIT1JJWk9OVEFMX1NQQUNFX0FGVEVSX0FOTk9UQVRJT04gPSA1O1xuICAgIGNvbnN0IHBhcmVudFdpZHRoID0gdXNlUGFyZW50UmVjdCA/IHJlY3RbMl0gLSByZWN0WzBdICsgSE9SSVpPTlRBTF9TUEFDRV9BRlRFUl9BTk5PVEFUSU9OIDogMDtcbiAgICBjb25zdCBwb3B1cExlZnQgPSBub3JtYWxpemVkUmVjdFswXSArIHBhcmVudFdpZHRoO1xuICAgIGNvbnN0IHBvcHVwVG9wID0gbm9ybWFsaXplZFJlY3RbMV07XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy4jY29udGFpbmVyO1xuICAgIHN0eWxlLmxlZnQgPSBgJHsxMDAgKiAocG9wdXBMZWZ0IC0gcGFnZVgpIC8gcGFnZVdpZHRofSVgO1xuICAgIHN0eWxlLnRvcCA9IGAkezEwMCAqIChwb3B1cFRvcCAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHR9JWA7XG4gICAgdGhpcy4jY29udGFpbmVyLmFwcGVuZChwb3B1cCk7XG4gIH1cbiAgX2Zvcm1hdENvbnRlbnRzKF9yZWYzKSB7XG4gICAgbGV0IHtcbiAgICAgIHN0cixcbiAgICAgIGRpclxuICAgIH0gPSBfcmVmMztcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgcC5jbGFzc0xpc3QuYWRkKFwicG9wdXBDb250ZW50XCIpO1xuICAgIHAuZGlyID0gZGlyO1xuICAgIGNvbnN0IGxpbmVzID0gc3RyLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICBwLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSk7XG4gICAgICBpZiAoaSA8IGlpIC0gMSkge1xuICAgICAgICBwLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfVxuICAja2V5RG93bihldmVudCkge1xuICAgIGlmIChldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiB8fCBldmVudC5rZXkgPT09IFwiRXNjYXBlXCIgJiYgdGhpcy4jcGlubmVkKSB7XG4gICAgICB0aGlzLiN0b2dnbGUoKTtcbiAgICB9XG4gIH1cbiAgI3RvZ2dsZSgpIHtcbiAgICB0aGlzLiNwaW5uZWQgPSAhdGhpcy4jcGlubmVkO1xuICAgIGlmICh0aGlzLiNwaW5uZWQpIHtcbiAgICAgIHRoaXMuI3Nob3coKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jYm91bmRUb2dnbGUpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2hpZGUoKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jYm91bmRUb2dnbGUpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgfVxuICB9XG4gICNzaG93KCkge1xuICAgIGlmICghdGhpcy4jcG9wdXApIHtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXggPSBwYXJzZUludCh0aGlzLiNjb250YWluZXIuc3R5bGUuekluZGV4KSArIDEwMDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNwaW5uZWQpIHtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZm9jdXNlZFwiKTtcbiAgICB9XG4gIH1cbiAgI2hpZGUoKSB7XG4gICAgdGhpcy4jY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJmb2N1c2VkXCIpO1xuICAgIGlmICh0aGlzLiNwaW5uZWQgfHwgIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXggPSBwYXJzZUludCh0aGlzLiNjb250YWluZXIuc3R5bGUuekluZGV4KSAtIDEwMDA7XG4gIH1cbiAgZm9yY2VIaWRlKCkge1xuICAgIHRoaXMuI3dhc1Zpc2libGUgPSB0aGlzLmlzVmlzaWJsZTtcbiAgICBpZiAoIXRoaXMuI3dhc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gIH1cbiAgbWF5YmVTaG93KCkge1xuICAgIGlmICghdGhpcy4jd2FzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiN3YXNWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IGZhbHNlO1xuICB9XG4gIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPT09IGZhbHNlO1xuICB9XG59XG5jbGFzcyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHBhcmFtZXRlcnMuZGF0YS50ZXh0Q29udGVudDtcbiAgICB0aGlzLnRleHRQb3NpdGlvbiA9IHBhcmFtZXRlcnMuZGF0YS50ZXh0UG9zaXRpb247XG4gICAgdGhpcy5hbm5vdGF0aW9uRWRpdG9yVHlwZSA9IHV0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJmcmVlVGV4dEFubm90YXRpb25cIik7XG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKFwiYW5ub3RhdGlvblRleHRDb250ZW50XCIpO1xuICAgICAgY29udGVudC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLnRleHRDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGxpbmVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIGxpbmVTcGFuLnRleHRDb250ZW50ID0gbGluZTtcbiAgICAgICAgY29udGVudC5hcHBlbmQobGluZVNwYW4pO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5fZWRpdE9uRG91YmxlQ2xpY2soKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0IF9pc0VkaXRhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuaGFzT3duQ2FudmFzO1xuICB9XG59XG5jbGFzcyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNsaW5lID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGluZUFubm90YXRpb25cIik7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuI2xpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpsaW5lXCIpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieDFcIiwgZGF0YS5yZWN0WzJdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMF0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieTFcIiwgZGF0YS5yZWN0WzNdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieDJcIiwgZGF0YS5yZWN0WzJdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMl0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieTJcIiwgZGF0YS5yZWN0WzNdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbM10pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzdmcuYXBwZW5kKGxpbmUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xpbmU7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxufVxuY2xhc3MgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNzcXVhcmUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzcXVhcmVBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgIGNvbnN0IGJvcmRlcldpZHRoID0gZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcbiAgICBjb25zdCBzcXVhcmUgPSB0aGlzLiNzcXVhcmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ4XCIsIGJvcmRlcldpZHRoIC8gMik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInlcIiwgYm9yZGVyV2lkdGggLyAyKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgd2lkdGggLSBib3JkZXJXaWR0aCk7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQgLSBib3JkZXJXaWR0aCk7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJXaWR0aCB8fCAxKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzdmcuYXBwZW5kKHNxdWFyZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3F1YXJlO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjY2lyY2xlID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2lyY2xlQW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBjb25zdCBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7XG4gICAgY29uc3QgY2lyY2xlID0gdGhpcy4jY2lyY2xlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6ZWxsaXBzZVwiKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3hcIiwgd2lkdGggLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3lcIiwgaGVpZ2h0IC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInJ4XCIsIHdpZHRoIC8gMiAtIGJvcmRlcldpZHRoIC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInJ5XCIsIGhlaWdodCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyV2lkdGggfHwgMSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3ZnLmFwcGVuZChjaXJjbGUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NpcmNsZTtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG59XG5jbGFzcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjcG9seWxpbmUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlsaW5lQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBsZXQgcG9pbnRzID0gW107XG4gICAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGRhdGEudmVydGljZXMpIHtcbiAgICAgIGNvbnN0IHggPSBjb29yZGluYXRlLnggLSBkYXRhLnJlY3RbMF07XG4gICAgICBjb25zdCB5ID0gZGF0YS5yZWN0WzNdIC0gY29vcmRpbmF0ZS55O1xuICAgICAgcG9pbnRzLnB1c2goeCArIFwiLFwiICsgeSk7XG4gICAgfVxuICAgIHBvaW50cyA9IHBvaW50cy5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuI3BvbHlsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwicG9pbnRzXCIsIHBvaW50cyk7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHN2Zy5hcHBlbmQocG9seWxpbmUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvbHlsaW5lO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlnb25Bbm5vdGF0aW9uXCI7XG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlnb25cIjtcbiAgfVxufVxuY2xhc3MgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2FyZXRBbm5vdGF0aW9uXCIpO1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIElua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjcG9seWxpbmVzID0gW107XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwiaW5rQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVkaXRvclR5cGUgPSB1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSztcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCh0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBpbmtMaXN0IG9mIGRhdGEuaW5rTGlzdHMpIHtcbiAgICAgIGxldCBwb2ludHMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY29vcmRpbmF0ZSBvZiBpbmtMaXN0KSB7XG4gICAgICAgIGNvbnN0IHggPSBjb29yZGluYXRlLnggLSBkYXRhLnJlY3RbMF07XG4gICAgICAgIGNvbnN0IHkgPSBkYXRhLnJlY3RbM10gLSBjb29yZGluYXRlLnk7XG4gICAgICAgIHBvaW50cy5wdXNoKGAke3h9LCR7eX1gKTtcbiAgICAgIH1cbiAgICAgIHBvaW50cyA9IHBvaW50cy5qb2luKFwiIFwiKTtcbiAgICAgIGNvbnN0IHBvbHlsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7XG4gICAgICB0aGlzLiNwb2x5bGluZXMucHVzaChwb2x5bGluZSk7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcG9pbnRzKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICBpZiAoIWRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgIH1cbiAgICAgIHN2Zy5hcHBlbmQocG9seWxpbmUpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jcG9seWxpbmVzO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWUsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInVuZGVybGluZUFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzcXVpZ2dseUFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RyaWtlb3V0QW5ub3RhdGlvblwiKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInN0YW1wQW5ub3RhdGlvblwiKTtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjdHJpZ2dlciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGNvbnRlbnRcbiAgICB9ID0gdGhpcy5kYXRhLmZpbGU7XG4gICAgdGhpcy5maWxlbmFtZSA9ICgwLGRpc3BsYXlfdXRpbHMuZ2V0RmlsZW5hbWVGcm9tVXJsKShmaWxlbmFtZSwgdHJ1ZSk7XG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImZpbGVhdHRhY2htZW50YW5ub3RhdGlvblwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGNvbnRlbnRcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZpbGVBdHRhY2htZW50QW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXIsXG4gICAgICBkYXRhXG4gICAgfSA9IHRoaXM7XG4gICAgbGV0IHRyaWdnZXI7XG4gICAgaWYgKGRhdGEuaGFzQXBwZWFyYW5jZSB8fCBkYXRhLmZpbGxBbHBoYSA9PT0gMCkge1xuICAgICAgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgdHJpZ2dlci5zcmMgPSBgJHt0aGlzLmltYWdlUmVzb3VyY2VzUGF0aH1hbm5vdGF0aW9uLSR7L3BhcGVyY2xpcC9pLnRlc3QoZGF0YS5uYW1lKSA/IFwicGFwZXJjbGlwXCIgOiBcInB1c2hwaW5cIn0uc3ZnYDtcbiAgICAgIGlmIChkYXRhLmZpbGxBbHBoYSAmJiBkYXRhLmZpbGxBbHBoYSA8IDEpIHtcbiAgICAgICAgdHJpZ2dlci5zdHlsZSA9IGBmaWx0ZXI6IG9wYWNpdHkoJHtNYXRoLnJvdW5kKGRhdGEuZmlsbEFscGhhICogMTAwKX0lKTtgO1xuICAgICAgfVxuICAgIH1cbiAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCB0aGlzLiNkb3dubG9hZC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLiN0cmlnZ2VyID0gdHJpZ2dlcjtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldnQgPT4ge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IFwiRW50ZXJcIiAmJiAoaXNNYWMgPyBldnQubWV0YUtleSA6IGV2dC5jdHJsS2V5KSkge1xuICAgICAgICB0aGlzLiNkb3dubG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlci5jbGFzc0xpc3QuYWRkKFwicG9wdXBUcmlnZ2VyQXJlYVwiKTtcbiAgICB9XG4gICAgY29udGFpbmVyLmFwcGVuZCh0cmlnZ2VyKTtcbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RyaWdnZXI7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxuICAjZG93bmxvYWQoKSB7XG4gICAgdGhpcy5kb3dubG9hZE1hbmFnZXI/Lm9wZW5PckRvd25sb2FkRGF0YSh0aGlzLmNvbnRlbnQsIHRoaXMuZmlsZW5hbWUpO1xuICB9XG59XG5jbGFzcyBBbm5vdGF0aW9uTGF5ZXIge1xuICAjYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBudWxsO1xuICAjYW5ub3RhdGlvbkNhbnZhc01hcCA9IG51bGw7XG4gICNlZGl0YWJsZUFubm90YXRpb25zID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3RvcihfcmVmNCkge1xuICAgIGxldCB7XG4gICAgICBkaXYsXG4gICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcixcbiAgICAgIGFubm90YXRpb25DYW52YXNNYXAsXG4gICAgICBwYWdlLFxuICAgICAgdmlld3BvcnRcbiAgICB9ID0gX3JlZjQ7XG4gICAgdGhpcy5kaXYgPSBkaXY7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBhY2Nlc3NpYmlsaXR5TWFuYWdlcjtcbiAgICB0aGlzLiNhbm5vdGF0aW9uQ2FudmFzTWFwID0gYW5ub3RhdGlvbkNhbnZhc01hcDtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICB0aGlzLnpJbmRleCA9IDA7XG4gIH1cbiAgI2FwcGVuZEVsZW1lbnQoZWxlbWVudCwgaWQpIHtcbiAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQuZmlyc3RDaGlsZCB8fCBlbGVtZW50O1xuICAgIGNvbnRlbnRFbGVtZW50LmlkID0gYCR7dXRpbC5Bbm5vdGF0aW9uUHJlZml4fSR7aWR9YDtcbiAgICB0aGlzLmRpdi5hcHBlbmQoZWxlbWVudCk7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIGVsZW1lbnQsIGNvbnRlbnRFbGVtZW50LCBmYWxzZSk7XG4gIH1cbiAgYXN5bmMgcmVuZGVyKHBhcmFtcykge1xuICAgIGNvbnN0IHtcbiAgICAgIGFubm90YXRpb25zXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBsYXllciA9IHRoaXMuZGl2O1xuICAgICgwLGRpc3BsYXlfdXRpbHMuc2V0TGF5ZXJEaW1lbnNpb25zKShsYXllciwgdGhpcy52aWV3cG9ydCk7XG4gICAgY29uc3QgcG9wdXBUb0VsZW1lbnRzID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGVsZW1lbnRQYXJhbXMgPSB7XG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgbGF5ZXIsXG4gICAgICBsaW5rU2VydmljZTogcGFyYW1zLmxpbmtTZXJ2aWNlLFxuICAgICAgZG93bmxvYWRNYW5hZ2VyOiBwYXJhbXMuZG93bmxvYWRNYW5hZ2VyLFxuICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiBwYXJhbXMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8IFwiXCIsXG4gICAgICByZW5kZXJGb3JtczogcGFyYW1zLnJlbmRlckZvcm1zICE9PSBmYWxzZSxcbiAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyBkaXNwbGF5X3V0aWxzLkRPTVNWR0ZhY3RvcnkoKSxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwYXJhbXMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IGFubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpLFxuICAgICAgZW5hYmxlU2NyaXB0aW5nOiBwYXJhbXMuZW5hYmxlU2NyaXB0aW5nID09PSB0cnVlLFxuICAgICAgaGFzSlNBY3Rpb25zOiBwYXJhbXMuaGFzSlNBY3Rpb25zLFxuICAgICAgZmllbGRPYmplY3RzOiBwYXJhbXMuZmllbGRPYmplY3RzLFxuICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgZWxlbWVudHM6IG51bGxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgZGF0YSBvZiBhbm5vdGF0aW9ucykge1xuICAgICAgaWYgKGRhdGEubm9IVE1MKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNQb3B1cEFubm90YXRpb24gPSBkYXRhLmFubm90YXRpb25UeXBlID09PSB1dGlsLkFubm90YXRpb25UeXBlLlBPUFVQO1xuICAgICAgaWYgKCFpc1BvcHVwQW5ub3RhdGlvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0XG4gICAgICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHBvcHVwVG9FbGVtZW50cy5nZXQoZGF0YS5pZCk7XG4gICAgICAgIGlmICghZWxlbWVudHMpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50UGFyYW1zLmVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICB9XG4gICAgICBlbGVtZW50UGFyYW1zLmRhdGEgPSBkYXRhO1xuICAgICAgY29uc3QgZWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUoZWxlbWVudFBhcmFtcyk7XG4gICAgICBpZiAoIWVsZW1lbnQuaXNSZW5kZXJhYmxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1BvcHVwQW5ub3RhdGlvbiAmJiBkYXRhLnBvcHVwUmVmKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gcG9wdXBUb0VsZW1lbnRzLmdldChkYXRhLnBvcHVwUmVmKTtcbiAgICAgICAgaWYgKCFlbGVtZW50cykge1xuICAgICAgICAgIHBvcHVwVG9FbGVtZW50cy5zZXQoZGF0YS5wb3B1cFJlZiwgW2VsZW1lbnRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZWxlbWVudC5hbm5vdGF0aW9uRWRpdG9yVHlwZSA+IDApIHtcbiAgICAgICAgdGhpcy4jZWRpdGFibGVBbm5vdGF0aW9ucy5zZXQoZWxlbWVudC5kYXRhLmlkLCBlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gZWxlbWVudC5yZW5kZXIoKTtcbiAgICAgIGlmIChkYXRhLmhpZGRlbikge1xuICAgICAgICByZW5kZXJlZC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIH1cbiAgICAgIHRoaXMuI2FwcGVuZEVsZW1lbnQocmVuZGVyZWQsIGRhdGEuaWQpO1xuICAgIH1cbiAgICB0aGlzLiNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKCk7XG4gIH1cbiAgdXBkYXRlKF9yZWY1KSB7XG4gICAgbGV0IHtcbiAgICAgIHZpZXdwb3J0XG4gICAgfSA9IF9yZWY1O1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5kaXY7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICgwLGRpc3BsYXlfdXRpbHMuc2V0TGF5ZXJEaW1lbnNpb25zKShsYXllciwge1xuICAgICAgcm90YXRpb246IHZpZXdwb3J0LnJvdGF0aW9uXG4gICAgfSk7XG4gICAgdGhpcy4jc2V0QW5ub3RhdGlvbkNhbnZhc01hcCgpO1xuICAgIGxheWVyLmhpZGRlbiA9IGZhbHNlO1xuICB9XG4gICNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKCkge1xuICAgIGlmICghdGhpcy4jYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMuZGl2O1xuICAgIGZvciAoY29uc3QgW2lkLCBjYW52YXNdIG9mIHRoaXMuI2Fubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBsYXllci5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHtpZH1cIl1gKTtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmlyc3RDaGlsZFxuICAgICAgfSA9IGVsZW1lbnQ7XG4gICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmQoY2FudmFzKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gXCJDQU5WQVNcIikge1xuICAgICAgICBmaXJzdENoaWxkLnJlcGxhY2VXaXRoKGNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdENoaWxkLmJlZm9yZShjYW52YXMpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNhbm5vdGF0aW9uQ2FudmFzTWFwLmNsZWFyKCk7XG4gIH1cbiAgZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNlZGl0YWJsZUFubm90YXRpb25zLnZhbHVlcygpKTtcbiAgfVxuICBnZXRFZGl0YWJsZUFubm90YXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jZWRpdGFibGVBbm5vdGF0aW9ucy5nZXQoaWQpO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQ3ODA6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFubm90YXRpb25TdG9yYWdlOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uU3RvcmFnZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFByaW50QW5ub3RhdGlvblN0b3JhZ2U6ICgpID0+ICgvKiBiaW5kaW5nICovIFByaW50QW5ub3RhdGlvblN0b3JhZ2UpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBTZXJpYWxpemFibGVFbXB0eTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gU2VyaWFsaXphYmxlRW1wdHkpXG4vKiBoYXJtb255IGV4cG9ydCAqLyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjI2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2l0ZXJhdG9yX21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTQ0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fc3RhY2tfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTcwOSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9lZGl0b3JfZWRpdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkxMTUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfbXVybXVyaGFzaDNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjgyNSk7XG5cblxuXG5cblxuXG5jb25zdCBTZXJpYWxpemFibGVFbXB0eSA9IE9iamVjdC5mcmVlemUoe1xuICBtYXA6IG51bGwsXG4gIGhhc2g6IFwiXCIsXG4gIHRyYW5zZmVyOiB1bmRlZmluZWRcbn0pO1xuY2xhc3MgQW5ub3RhdGlvblN0b3JhZ2Uge1xuICAjbW9kaWZpZWQgPSBmYWxzZTtcbiAgI3N0b3JhZ2UgPSBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMub25TZXRNb2RpZmllZCA9IG51bGw7XG4gICAgdGhpcy5vblJlc2V0TW9kaWZpZWQgPSBudWxsO1xuICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID0gbnVsbDtcbiAgfVxuICBnZXRWYWx1ZShrZXksIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jc3RvcmFnZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGVmYXVsdFZhbHVlLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0UmF3VmFsdWUoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG4gIH1cbiAgcmVtb3ZlKGtleSkge1xuICAgIHRoaXMuI3N0b3JhZ2UuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuI3N0b3JhZ2Uuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5yZXNldE1vZGlmaWVkKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLiNzdG9yYWdlLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9lZGl0b3JfZWRpdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uQW5ub3RhdGlvbkVkaXRvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vbkFubm90YXRpb25FZGl0b3IobnVsbCk7XG4gICAgfVxuICB9XG4gIHNldFZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLiNzdG9yYWdlLmdldChrZXkpO1xuICAgIGxldCBtb2RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBbZW50cnksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGlmIChvYmpbZW50cnldICE9PSB2YWwpIHtcbiAgICAgICAgICBtb2RpZmllZCA9IHRydWU7XG4gICAgICAgICAgb2JqW2VudHJ5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtb2RpZmllZCA9IHRydWU7XG4gICAgICB0aGlzLiNzdG9yYWdlLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVkKSB7XG4gICAgICB0aGlzLiNzZXRNb2RpZmllZCgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfZWRpdG9yX2VkaXRvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLkFubm90YXRpb25FZGl0b3IgJiYgdHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKHZhbHVlLmNvbnN0cnVjdG9yLl90eXBlKTtcbiAgICB9XG4gIH1cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLmhhcyhrZXkpO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5zaXplID4gMCA/ICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLm9iamVjdEZyb21NYXApKHRoaXMuI3N0b3JhZ2UpIDogbnVsbDtcbiAgfVxuICBzZXRBbGwob2JqKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCB2YWwpO1xuICAgIH1cbiAgfVxuICBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5zaXplO1xuICB9XG4gICNzZXRNb2RpZmllZCgpIHtcbiAgICBpZiAoIXRoaXMuI21vZGlmaWVkKSB7XG4gICAgICB0aGlzLiNtb2RpZmllZCA9IHRydWU7XG4gICAgICBpZiAodHlwZW9mIHRoaXMub25TZXRNb2RpZmllZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMub25TZXRNb2RpZmllZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXNldE1vZGlmaWVkKCkge1xuICAgIGlmICh0aGlzLiNtb2RpZmllZCkge1xuICAgICAgdGhpcy4jbW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgcHJpbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcmludEFubm90YXRpb25TdG9yYWdlKHRoaXMpO1xuICB9XG4gIGdldCBzZXJpYWxpemFibGUoKSB7XG4gICAgaWYgKHRoaXMuI3N0b3JhZ2Uuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFNlcmlhbGl6YWJsZUVtcHR5O1xuICAgIH1cbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCksXG4gICAgICBoYXNoID0gbmV3IF9zaGFyZWRfbXVybXVyaGFzaDNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5NdXJtdXJIYXNoM182NCgpLFxuICAgICAgdHJhbnNmZXIgPSBbXTtcbiAgICBjb25zdCBjb250ZXh0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgaGFzQml0bWFwID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMuI3N0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB2YWwgaW5zdGFuY2VvZiBfZWRpdG9yX2VkaXRvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLkFubm90YXRpb25FZGl0b3IgPyB2YWwuc2VyaWFsaXplKGZhbHNlLCBjb250ZXh0KSA6IHZhbDtcbiAgICAgIGlmIChzZXJpYWxpemVkKSB7XG4gICAgICAgIG1hcC5zZXQoa2V5LCBzZXJpYWxpemVkKTtcbiAgICAgICAgaGFzaC51cGRhdGUoYCR7a2V5fToke0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpfWApO1xuICAgICAgICBoYXNCaXRtYXAgfHw9ICEhc2VyaWFsaXplZC5iaXRtYXA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNCaXRtYXApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh2YWx1ZS5iaXRtYXApIHtcbiAgICAgICAgICB0cmFuc2Zlci5wdXNoKHZhbHVlLmJpdG1hcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcC5zaXplID4gMCA/IHtcbiAgICAgIG1hcCxcbiAgICAgIGhhc2g6IGhhc2guaGV4ZGlnZXN0KCksXG4gICAgICB0cmFuc2ZlclxuICAgIH0gOiBTZXJpYWxpemFibGVFbXB0eTtcbiAgfVxufVxuY2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgI3NlcmlhbGl6YWJsZTtcbiAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7XG4gICAgICBtYXAsXG4gICAgICBoYXNoLFxuICAgICAgdHJhbnNmZXJcbiAgICB9ID0gcGFyZW50LnNlcmlhbGl6YWJsZTtcbiAgICBjb25zdCBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShtYXAsIHRyYW5zZmVyID8ge1xuICAgICAgdHJhbnNmZXJcbiAgICB9IDogbnVsbCk7XG4gICAgdGhpcy4jc2VyaWFsaXphYmxlID0ge1xuICAgICAgbWFwOiBjbG9uZSxcbiAgICAgIGhhc2gsXG4gICAgICB0cmFuc2ZlclxuICAgIH07XG4gIH1cbiAgZ2V0IHByaW50KCkge1xuICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBQcmludEFubm90YXRpb25TdG9yYWdlLnByaW50XCIpO1xuICB9XG4gIGdldCBzZXJpYWxpemFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlcmlhbGl6YWJsZTtcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA5NDA2OlxuLyoqKi8gKChfX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuX193ZWJwYWNrX3JlcXVpcmVfXy5hKF9fd2VicGFja19tb2R1bGVfXywgYXN5bmMgKF9fd2VicGFja19oYW5kbGVfYXN5bmNfZGVwZW5kZW5jaWVzX18sIF9fd2VicGFja19hc3luY19yZXN1bHRfXykgPT4geyB0cnkge1xuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUERGRGF0YVJhbmdlVHJhbnNwb3J0OiAoKSA9PiAoLyogYmluZGluZyAqLyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBQREZXb3JrZXI6ICgpID0+ICgvKiBiaW5kaW5nICovIFBERldvcmtlciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGJ1aWxkOiAoKSA9PiAoLyogYmluZGluZyAqLyBidWlsZCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldERvY3VtZW50OiAoKSA9PiAoLyogYmluZGluZyAqLyBnZXREb2N1bWVudCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIHZlcnNpb246ICgpID0+ICgvKiBiaW5kaW5nICovIHZlcnNpb24pXG4vKiBoYXJtb255IGV4cG9ydCAqLyB9KTtcbi8qIHVudXNlZCBoYXJtb255IGV4cG9ydHMgRGVmYXVsdENhbnZhc0ZhY3RvcnksIERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSwgRGVmYXVsdEZpbHRlckZhY3RvcnksIERlZmF1bHRTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSwgTG9vcGJhY2tQb3J0LCBQREZEb2N1bWVudExvYWRpbmdUYXNrLCBQREZEb2N1bWVudFByb3h5LCBQREZQYWdlUHJveHksIFBERldvcmtlclV0aWwsIFJlbmRlclRhc2sgKi9cbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2RlbGV0ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNjU1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2hhc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNTU1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjIwMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2Vycm9yX2NhdXNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzNTIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgzNyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5ODAzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfc2V0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNDcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19yZXZlcnNlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTk1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjAyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2FycmF5X2J1ZmZlcl9kZXRhY2hlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2FycmF5X2J1ZmZlcl90cmFuc2Zlcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDMwNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfdG9fZml4ZWRfbGVuZ3RoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTgzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDIyNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfZGlmZmVyZW5jZV92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTU2MSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfaW50ZXJzZWN0aW9uX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTg3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9pc19kaXNqb2ludF9mcm9tX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjQ3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9pc19zdWJzZXRfb2ZfdjJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE3X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2lzX3N1cGVyc2V0X29mX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDkwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTQzOCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfdW5pb25fdjJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MTQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfaXRlcmF0b3JfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTQ0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fc3RhY2tfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3MDkpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI2Nik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Fubm90YXRpb25fc3RvcmFnZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDc4MCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3Myk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2ZvbnRfbG9hZGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzQyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBkaXNwbGF5X25vZGVfdXRpbHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI3X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3MzgpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9jYW52YXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNTApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF93b3JrZXJfb3B0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM2OCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9tZXNzYWdlX2hhbmRsZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2OTQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tZXRhZGF0YV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ3Mik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzODkwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdHJhbnNwb3J0X3N0cmVhbV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDA5Mik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgZGlzcGxheV9mZXRjaF9zdHJlYW1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxNzEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGRpc3BsYXlfbmV0d29ya19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ3NCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgZGlzcGxheV9ub2RlX3N0cmVhbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ5OCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3hmYV90ZXh0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTIxKTtcbnZhciBfX3dlYnBhY2tfYXN5bmNfZGVwZW5kZW5jaWVzX18gPSBfX3dlYnBhY2tfaGFuZGxlX2FzeW5jX2RlcGVuZGVuY2llc19fKFtkaXNwbGF5X25vZGVfdXRpbHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI3X18sIGRpc3BsYXlfbm9kZV9zdHJlYW1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM2X19dKTtcbihbZGlzcGxheV9ub2RlX3V0aWxzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fLCBkaXNwbGF5X25vZGVfc3RyZWFtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNl9fXSA9IF9fd2VicGFja19hc3luY19kZXBlbmRlbmNpZXNfXy50aGVuID8gKGF3YWl0IF9fd2VicGFja19hc3luY19kZXBlbmRlbmNpZXNfXykoKSA6IF9fd2VicGFja19hc3luY19kZXBlbmRlbmNpZXNfXyk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFID0gNjU1MzY7XG5jb25zdCBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQgPSAxMDA7XG5jb25zdCBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBEZWZhdWx0Q2FudmFzRmFjdG9yeSA9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5pc05vZGVKUyA/IGRpc3BsYXlfbm9kZV91dGlsc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjdfXy5Ob2RlQ2FudmFzRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNV9fLkRPTUNhbnZhc0ZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uaXNOb2RlSlMgPyBkaXNwbGF5X25vZGVfdXRpbHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI3X18uTm9kZUNNYXBSZWFkZXJGYWN0b3J5IDogX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18uRE9NQ01hcFJlYWRlckZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0RmlsdGVyRmFjdG9yeSA9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5pc05vZGVKUyA/IGRpc3BsYXlfbm9kZV91dGlsc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjdfXy5Ob2RlRmlsdGVyRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNV9fLkRPTUZpbHRlckZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uaXNOb2RlSlMgPyBkaXNwbGF5X25vZGVfdXRpbHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI3X18uTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IDogX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18uRE9NU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG5mdW5jdGlvbiBnZXREb2N1bWVudChzcmMpIHtcbiAgaWYgKHR5cGVvZiBzcmMgPT09IFwic3RyaW5nXCIgfHwgc3JjIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgc3JjID0ge1xuICAgICAgdXJsOiBzcmNcbiAgICB9O1xuICB9IGVsc2UgaWYgKCgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5pc0FycmF5QnVmZmVyKShzcmMpKSB7XG4gICAgc3JjID0ge1xuICAgICAgZGF0YTogc3JjXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIHNyYyAhPT0gXCJvYmplY3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVyIGluIGdldERvY3VtZW50LCBuZWVkIHBhcmFtZXRlciBvYmplY3QuXCIpO1xuICB9XG4gIGlmICghc3JjLnVybCAmJiAhc3JjLmRhdGEgJiYgIXNyYy5yYW5nZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVyIG9iamVjdDogbmVlZCBlaXRoZXIgLmRhdGEsIC5yYW5nZSBvciAudXJsXCIpO1xuICB9XG4gIGNvbnN0IHRhc2sgPSBuZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaygpO1xuICBjb25zdCB7XG4gICAgZG9jSWRcbiAgfSA9IHRhc2s7XG4gIGNvbnN0IHVybCA9IHNyYy51cmwgPyBnZXRVcmxQcm9wKHNyYy51cmwpIDogbnVsbDtcbiAgY29uc3QgZGF0YSA9IHNyYy5kYXRhID8gZ2V0RGF0YVByb3Aoc3JjLmRhdGEpIDogbnVsbDtcbiAgY29uc3QgaHR0cEhlYWRlcnMgPSBzcmMuaHR0cEhlYWRlcnMgfHwgbnVsbDtcbiAgY29uc3Qgd2l0aENyZWRlbnRpYWxzID0gc3JjLndpdGhDcmVkZW50aWFscyA9PT0gdHJ1ZTtcbiAgY29uc3QgcGFzc3dvcmQgPSBzcmMucGFzc3dvcmQgPz8gbnVsbDtcbiAgY29uc3QgcmFuZ2VUcmFuc3BvcnQgPSBzcmMucmFuZ2UgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgPyBzcmMucmFuZ2UgOiBudWxsO1xuICBjb25zdCByYW5nZUNodW5rU2l6ZSA9IE51bWJlci5pc0ludGVnZXIoc3JjLnJhbmdlQ2h1bmtTaXplKSAmJiBzcmMucmFuZ2VDaHVua1NpemUgPiAwID8gc3JjLnJhbmdlQ2h1bmtTaXplIDogREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFO1xuICBsZXQgd29ya2VyID0gc3JjLndvcmtlciBpbnN0YW5jZW9mIFBERldvcmtlciA/IHNyYy53b3JrZXIgOiBudWxsO1xuICBjb25zdCB2ZXJib3NpdHkgPSBzcmMudmVyYm9zaXR5O1xuICBjb25zdCBkb2NCYXNlVXJsID0gdHlwZW9mIHNyYy5kb2NCYXNlVXJsID09PSBcInN0cmluZ1wiICYmICEoMCxfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjVfXy5pc0RhdGFTY2hlbWUpKHNyYy5kb2NCYXNlVXJsKSA/IHNyYy5kb2NCYXNlVXJsIDogbnVsbDtcbiAgY29uc3QgY01hcFVybCA9IHR5cGVvZiBzcmMuY01hcFVybCA9PT0gXCJzdHJpbmdcIiA/IHNyYy5jTWFwVXJsIDogbnVsbDtcbiAgY29uc3QgY01hcFBhY2tlZCA9IHNyYy5jTWFwUGFja2VkICE9PSBmYWxzZTtcbiAgY29uc3QgQ01hcFJlYWRlckZhY3RvcnkgPSBzcmMuQ01hcFJlYWRlckZhY3RvcnkgfHwgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuICBjb25zdCBzdGFuZGFyZEZvbnREYXRhVXJsID0gdHlwZW9mIHNyYy5zdGFuZGFyZEZvbnREYXRhVXJsID09PSBcInN0cmluZ1wiID8gc3JjLnN0YW5kYXJkRm9udERhdGFVcmwgOiBudWxsO1xuICBjb25zdCBTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IHNyYy5TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB8fCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gIGNvbnN0IGlnbm9yZUVycm9ycyA9IHNyYy5zdG9wQXRFcnJvcnMgIT09IHRydWU7XG4gIGNvbnN0IG1heEltYWdlU2l6ZSA9IE51bWJlci5pc0ludGVnZXIoc3JjLm1heEltYWdlU2l6ZSkgJiYgc3JjLm1heEltYWdlU2l6ZSA+IC0xID8gc3JjLm1heEltYWdlU2l6ZSA6IC0xO1xuICBjb25zdCBpc0V2YWxTdXBwb3J0ZWQgPSBzcmMuaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTtcbiAgY29uc3QgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSB0eXBlb2Ygc3JjLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID09PSBcImJvb2xlYW5cIiA/IHNyYy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA6ICFfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uaXNOb2RlSlM7XG4gIGNvbnN0IGNhbnZhc01heEFyZWFJbkJ5dGVzID0gTnVtYmVyLmlzSW50ZWdlcihzcmMuY2FudmFzTWF4QXJlYUluQnl0ZXMpID8gc3JjLmNhbnZhc01heEFyZWFJbkJ5dGVzIDogLTE7XG4gIGNvbnN0IGRpc2FibGVGb250RmFjZSA9IHR5cGVvZiBzcmMuZGlzYWJsZUZvbnRGYWNlID09PSBcImJvb2xlYW5cIiA/IHNyYy5kaXNhYmxlRm9udEZhY2UgOiBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uaXNOb2RlSlM7XG4gIGNvbnN0IGZvbnRFeHRyYVByb3BlcnRpZXMgPSBzcmMuZm9udEV4dHJhUHJvcGVydGllcyA9PT0gdHJ1ZTtcbiAgY29uc3QgZW5hYmxlWGZhID0gc3JjLmVuYWJsZVhmYSA9PT0gdHJ1ZTtcbiAgY29uc3Qgb3duZXJEb2N1bWVudCA9IHNyYy5vd25lckRvY3VtZW50IHx8IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG4gIGNvbnN0IGRpc2FibGVSYW5nZSA9IHNyYy5kaXNhYmxlUmFuZ2UgPT09IHRydWU7XG4gIGNvbnN0IGRpc2FibGVTdHJlYW0gPSBzcmMuZGlzYWJsZVN0cmVhbSA9PT0gdHJ1ZTtcbiAgY29uc3QgZGlzYWJsZUF1dG9GZXRjaCA9IHNyYy5kaXNhYmxlQXV0b0ZldGNoID09PSB0cnVlO1xuICBjb25zdCBwZGZCdWcgPSBzcmMucGRmQnVnID09PSB0cnVlO1xuICBjb25zdCBsZW5ndGggPSByYW5nZVRyYW5zcG9ydCA/IHJhbmdlVHJhbnNwb3J0Lmxlbmd0aCA6IHNyYy5sZW5ndGggPz8gTmFOO1xuICBjb25zdCB1c2VTeXN0ZW1Gb250cyA9IHR5cGVvZiBzcmMudXNlU3lzdGVtRm9udHMgPT09IFwiYm9vbGVhblwiID8gc3JjLnVzZVN5c3RlbUZvbnRzIDogIV9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5pc05vZGVKUyAmJiAhZGlzYWJsZUZvbnRGYWNlO1xuICBjb25zdCB1c2VXb3JrZXJGZXRjaCA9IHR5cGVvZiBzcmMudXNlV29ya2VyRmV0Y2ggPT09IFwiYm9vbGVhblwiID8gc3JjLnVzZVdvcmtlckZldGNoIDogQ01hcFJlYWRlckZhY3RvcnkgPT09IF9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNV9fLkRPTUNNYXBSZWFkZXJGYWN0b3J5ICYmIFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID09PSBfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjVfXy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSAmJiBjTWFwVXJsICYmIHN0YW5kYXJkRm9udERhdGFVcmwgJiYgKDAsX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18uaXNWYWxpZEZldGNoVXJsKShjTWFwVXJsLCBkb2N1bWVudC5iYXNlVVJJKSAmJiAoMCxfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjVfXy5pc1ZhbGlkRmV0Y2hVcmwpKHN0YW5kYXJkRm9udERhdGFVcmwsIGRvY3VtZW50LmJhc2VVUkkpO1xuICBjb25zdCBjYW52YXNGYWN0b3J5ID0gc3JjLmNhbnZhc0ZhY3RvcnkgfHwgbmV3IERlZmF1bHRDYW52YXNGYWN0b3J5KHtcbiAgICBvd25lckRvY3VtZW50XG4gIH0pO1xuICBjb25zdCBmaWx0ZXJGYWN0b3J5ID0gc3JjLmZpbHRlckZhY3RvcnkgfHwgbmV3IERlZmF1bHRGaWx0ZXJGYWN0b3J5KHtcbiAgICBkb2NJZCxcbiAgICBvd25lckRvY3VtZW50XG4gIH0pO1xuICBjb25zdCBzdHlsZUVsZW1lbnQgPSBudWxsO1xuICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uc2V0VmVyYm9zaXR5TGV2ZWwpKHZlcmJvc2l0eSk7XG4gIGNvbnN0IHRyYW5zcG9ydEZhY3RvcnkgPSB7XG4gICAgY2FudmFzRmFjdG9yeSxcbiAgICBmaWx0ZXJGYWN0b3J5XG4gIH07XG4gIGlmICghdXNlV29ya2VyRmV0Y2gpIHtcbiAgICB0cmFuc3BvcnRGYWN0b3J5LmNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IENNYXBSZWFkZXJGYWN0b3J5KHtcbiAgICAgIGJhc2VVcmw6IGNNYXBVcmwsXG4gICAgICBpc0NvbXByZXNzZWQ6IGNNYXBQYWNrZWRcbiAgICB9KTtcbiAgICB0cmFuc3BvcnRGYWN0b3J5LnN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gbmV3IFN0YW5kYXJkRm9udERhdGFGYWN0b3J5KHtcbiAgICAgIGJhc2VVcmw6IHN0YW5kYXJkRm9udERhdGFVcmxcbiAgICB9KTtcbiAgfVxuICBpZiAoIXdvcmtlcikge1xuICAgIGNvbnN0IHdvcmtlclBhcmFtcyA9IHtcbiAgICAgIHZlcmJvc2l0eSxcbiAgICAgIHBvcnQ6IF93b3JrZXJfb3B0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnRcbiAgICB9O1xuICAgIHdvcmtlciA9IHdvcmtlclBhcmFtcy5wb3J0ID8gUERGV29ya2VyLmZyb21Qb3J0KHdvcmtlclBhcmFtcykgOiBuZXcgUERGV29ya2VyKHdvcmtlclBhcmFtcyk7XG4gICAgdGFzay5fd29ya2VyID0gd29ya2VyO1xuICB9XG4gIGNvbnN0IGZldGNoRG9jUGFyYW1zID0ge1xuICAgIGRvY0lkLFxuICAgIGFwaVZlcnNpb246ICc0LjAuMzc5JyxcbiAgICBkYXRhLFxuICAgIHBhc3N3b3JkLFxuICAgIGRpc2FibGVBdXRvRmV0Y2gsXG4gICAgcmFuZ2VDaHVua1NpemUsXG4gICAgbGVuZ3RoLFxuICAgIGRvY0Jhc2VVcmwsXG4gICAgZW5hYmxlWGZhLFxuICAgIGV2YWx1YXRvck9wdGlvbnM6IHtcbiAgICAgIG1heEltYWdlU2l6ZSxcbiAgICAgIGRpc2FibGVGb250RmFjZSxcbiAgICAgIGlnbm9yZUVycm9ycyxcbiAgICAgIGlzRXZhbFN1cHBvcnRlZCxcbiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkLFxuICAgICAgY2FudmFzTWF4QXJlYUluQnl0ZXMsXG4gICAgICBmb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgdXNlU3lzdGVtRm9udHMsXG4gICAgICBjTWFwVXJsOiB1c2VXb3JrZXJGZXRjaCA/IGNNYXBVcmwgOiBudWxsLFxuICAgICAgc3RhbmRhcmRGb250RGF0YVVybDogdXNlV29ya2VyRmV0Y2ggPyBzdGFuZGFyZEZvbnREYXRhVXJsIDogbnVsbFxuICAgIH1cbiAgfTtcbiAgY29uc3QgdHJhbnNwb3J0UGFyYW1zID0ge1xuICAgIGlnbm9yZUVycm9ycyxcbiAgICBpc0V2YWxTdXBwb3J0ZWQsXG4gICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgZW5hYmxlWGZhLFxuICAgIG93bmVyRG9jdW1lbnQsXG4gICAgZGlzYWJsZUF1dG9GZXRjaCxcbiAgICBwZGZCdWcsXG4gICAgc3R5bGVFbGVtZW50XG4gIH07XG4gIHdvcmtlci5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJJZFByb21pc2UgPSBfZmV0Y2hEb2N1bWVudCh3b3JrZXIsIGZldGNoRG9jUGFyYW1zKTtcbiAgICBjb25zdCBuZXR3b3JrU3RyZWFtUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBsZXQgbmV0d29ya1N0cmVhbTtcbiAgICAgIGlmIChyYW5nZVRyYW5zcG9ydCkge1xuICAgICAgICBuZXR3b3JrU3RyZWFtID0gbmV3IF90cmFuc3BvcnRfc3RyZWFtX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zM19fLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0oe1xuICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgICBpbml0aWFsRGF0YTogcmFuZ2VUcmFuc3BvcnQuaW5pdGlhbERhdGEsXG4gICAgICAgICAgcHJvZ3Jlc3NpdmVEb25lOiByYW5nZVRyYW5zcG9ydC5wcm9ncmVzc2l2ZURvbmUsXG4gICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IHJhbmdlVHJhbnNwb3J0LmNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lLFxuICAgICAgICAgIGRpc2FibGVSYW5nZSxcbiAgICAgICAgICBkaXNhYmxlU3RyZWFtXG4gICAgICAgIH0sIHJhbmdlVHJhbnNwb3J0KTtcbiAgICAgIH0gZWxzZSBpZiAoIWRhdGEpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlUERGTmV0d29ya1N0cmVhbSA9IHBhcmFtcyA9PiB7XG4gICAgICAgICAgaWYgKF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5pc05vZGVKUykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBkaXNwbGF5X25vZGVfc3RyZWFtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNl9fLlBERk5vZGVTdHJlYW0ocGFyYW1zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICgwLF9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNV9fLmlzVmFsaWRGZXRjaFVybCkocGFyYW1zLnVybCkgPyBuZXcgZGlzcGxheV9mZXRjaF9zdHJlYW1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18uUERGRmV0Y2hTdHJlYW0ocGFyYW1zKSA6IG5ldyBkaXNwbGF5X25ldHdvcmtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM1X18uUERGTmV0d29ya1N0cmVhbShwYXJhbXMpO1xuICAgICAgICB9O1xuICAgICAgICBuZXR3b3JrU3RyZWFtID0gY3JlYXRlUERGTmV0d29ya1N0cmVhbSh7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgICBodHRwSGVhZGVycyxcbiAgICAgICAgICB3aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgcmFuZ2VDaHVua1NpemUsXG4gICAgICAgICAgZGlzYWJsZVJhbmdlLFxuICAgICAgICAgIGRpc2FibGVTdHJlYW1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKG5ldHdvcmtTdHJlYW0pO1xuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChbd29ya2VySWRQcm9taXNlLCBuZXR3b3JrU3RyZWFtUHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIGxldCBbd29ya2VySWQsIG5ldHdvcmtTdHJlYW1dID0gX3JlZjtcbiAgICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkaW5nIGFib3J0ZWRcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBfc2hhcmVkX21lc3NhZ2VfaGFuZGxlcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzBfXy5NZXNzYWdlSGFuZGxlcihkb2NJZCwgd29ya2VySWQsIHdvcmtlci5wb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBXb3JrZXJUcmFuc3BvcnQobWVzc2FnZUhhbmRsZXIsIHRhc2ssIG5ldHdvcmtTdHJlYW0sIHRyYW5zcG9ydFBhcmFtcywgdHJhbnNwb3J0RmFjdG9yeSk7XG4gICAgICB0YXNrLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwiUmVhZHlcIiwgbnVsbCk7XG4gICAgfSk7XG4gIH0pLmNhdGNoKHRhc2suX2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgcmV0dXJuIHRhc2s7XG59XG5hc3luYyBmdW5jdGlvbiBfZmV0Y2hEb2N1bWVudCh3b3JrZXIsIHNvdXJjZSkge1xuICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICB9XG4gIGNvbnN0IHdvcmtlcklkID0gYXdhaXQgd29ya2VyLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERvY1JlcXVlc3RcIiwgc291cmNlLCBzb3VyY2UuZGF0YSA/IFtzb3VyY2UuZGF0YS5idWZmZXJdIDogbnVsbCk7XG4gIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHdvcmtlcklkO1xufVxuZnVuY3Rpb24gZ2V0VXJsUHJvcCh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHJldHVybiB2YWwuaHJlZjtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHZhbCwgd2luZG93LmxvY2F0aW9uKS5ocmVmO1xuICB9IGNhdGNoIHtcbiAgICBpZiAoX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLmlzTm9kZUpTICYmIHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIHVybCBkYXRhOiBcIiArIFwiZWl0aGVyIHN0cmluZyBvciBVUkwtb2JqZWN0IGlzIGV4cGVjdGVkIGluIHRoZSB1cmwgcHJvcGVydHkuXCIpO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVByb3AodmFsKSB7XG4gIGlmIChfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uaXNOb2RlSlMgJiYgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBiaW5hcnkgZGF0YSBhcyBgVWludDhBcnJheWAsIHJhdGhlciB0aGFuIGBCdWZmZXJgLlwiKTtcbiAgfVxuICBpZiAodmFsIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB2YWwuYnl0ZUxlbmd0aCA9PT0gdmFsLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uc3RyaW5nVG9CeXRlcykodmFsKTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiAhaXNOYU4odmFsPy5sZW5ndGgpIHx8ICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5pc0FycmF5QnVmZmVyKSh2YWwpKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBQREYgYmluYXJ5IGRhdGE6IGVpdGhlciBUeXBlZEFycmF5LCBcIiArIFwic3RyaW5nLCBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgZGF0YSBwcm9wZXJ0eS5cIik7XG59XG5jbGFzcyBQREZEb2N1bWVudExvYWRpbmdUYXNrIHtcbiAgc3RhdGljICNkb2NJZCA9IDA7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fdHJhbnNwb3J0ID0gbnVsbDtcbiAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgIHRoaXMuZG9jSWQgPSBgZCR7UERGRG9jdW1lbnRMb2FkaW5nVGFzay4jZG9jSWQrK31gO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5vblBhc3N3b3JkID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl93b3JrZXI/LnBvcnQpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLl9wZW5kaW5nRGVzdHJveSA9IHRydWU7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLl90cmFuc3BvcnQ/LmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKHRoaXMuX3dvcmtlcj8ucG9ydCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fd29ya2VyLl9wZW5kaW5nRGVzdHJveTtcbiAgICAgIH1cbiAgICAgIHRocm93IGV4O1xuICAgIH1cbiAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcbiAgY29uc3RydWN0b3IobGVuZ3RoLCBpbml0aWFsRGF0YSkge1xuICAgIGxldCBwcm9ncmVzc2l2ZURvbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgIGxldCBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB0aGlzLmluaXRpYWxEYXRhID0gaW5pdGlhbERhdGE7XG4gICAgdGhpcy5wcm9ncmVzc2l2ZURvbmUgPSBwcm9ncmVzc2l2ZURvbmU7XG4gICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lO1xuICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107XG4gICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gIH1cbiAgYWRkUmFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG4gIGFkZFByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBhZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBhZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBvbkRhdGFSYW5nZShiZWdpbiwgY2h1bmspIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3JhbmdlTGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihiZWdpbiwgY2h1bmspO1xuICAgIH1cbiAgfVxuICBvbkRhdGFQcm9ncmVzcyhsb2FkZWQsIHRvdGFsKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKGxvYWRlZCwgdG90YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uRGF0YVByb2dyZXNzaXZlUmVhZChjaHVuaykge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXIoY2h1bmspO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uRGF0YVByb2dyZXNzaXZlRG9uZSgpIHtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgdHJhbnNwb3J0UmVhZHkoKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuICByZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18udW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlXCIpO1xuICB9XG4gIGFib3J0KCkge31cbn1cbmNsYXNzIFBERkRvY3VtZW50UHJveHkge1xuICBjb25zdHJ1Y3RvcihwZGZJbmZvLCB0cmFuc3BvcnQpIHtcbiAgICB0aGlzLl9wZGZJbmZvID0gcGRmSW5mbztcbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gIH1cbiAgZ2V0IGFubm90YXRpb25TdG9yYWdlKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuYW5ub3RhdGlvblN0b3JhZ2U7XG4gIH1cbiAgZ2V0IGZpbHRlckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5O1xuICB9XG4gIGdldCBudW1QYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5udW1QYWdlcztcbiAgfVxuICBnZXQgZmluZ2VycHJpbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLmZpbmdlcnByaW50cztcbiAgfVxuICBnZXQgaXNQdXJlWGZhKCkge1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uc2hhZG93KSh0aGlzLCBcImlzUHVyZVhmYVwiLCAhIXRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSk7XG4gIH1cbiAgZ2V0IGFsbFhmYUh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYTtcbiAgfVxuICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2UocGFnZU51bWJlcik7XG4gIH1cbiAgZ2V0UGFnZUluZGV4KHJlZikge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUluZGV4KHJlZik7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERlc3RpbmF0aW9uKGlkKTtcbiAgfVxuICBnZXRQYWdlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxhYmVscygpO1xuICB9XG4gIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGF5b3V0KCk7XG4gIH1cbiAgZ2V0UGFnZU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTW9kZSgpO1xuICB9XG4gIGdldFZpZXdlclByZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKTtcbiAgfVxuICBnZXRPcGVuQWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3BlbkFjdGlvbigpO1xuICB9XG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QXR0YWNobWVudHMoKTtcbiAgfVxuICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREb2NKU0FjdGlvbnMoKTtcbiAgfVxuICBnZXRPdXRsaW5lKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpO1xuICB9XG4gIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICB9XG4gIGdldFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcbiAgfVxuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG4gIH1cbiAgZ2V0TWFya0luZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpO1xuICB9XG4gIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG4gIH1cbiAgc2F2ZURvY3VtZW50KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KCk7XG4gIH1cbiAgZ2V0RG93bmxvYWRJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNsZWFudXAoKSB7XG4gICAgbGV0IGtlZXBMb2FkZWRGb250cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAoa2VlcExvYWRlZEZvbnRzIHx8IHRoaXMuaXNQdXJlWGZhKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdUYXNrLmRlc3Ryb3koKTtcbiAgfVxuICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdQYXJhbXM7XG4gIH1cbiAgZ2V0IGxvYWRpbmdUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1Rhc2s7XG4gIH1cbiAgZ2V0RmllbGRPYmplY3RzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RmllbGRPYmplY3RzKCk7XG4gIH1cbiAgaGFzSlNBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuaGFzSlNBY3Rpb25zKCk7XG4gIH1cbiAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldENhbGN1bGF0aW9uT3JkZXJJZHMoKTtcbiAgfVxufVxuY2xhc3MgUERGUGFnZVByb3h5IHtcbiAgI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IG51bGw7XG4gICNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihwYWdlSW5kZXgsIHBhZ2VJbmZvLCB0cmFuc3BvcnQpIHtcbiAgICBsZXQgcGRmQnVnID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5fcGFnZUluZm8gPSBwYWdlSW5mbztcbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgdGhpcy5fc3RhdHMgPSBwZGZCdWcgPyBuZXcgX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18uU3RhdFRpbWVyKCkgOiBudWxsO1xuICAgIHRoaXMuX3BkZkJ1ZyA9IHBkZkJ1ZztcbiAgICB0aGlzLmNvbW1vbk9ianMgPSB0cmFuc3BvcnQuY29tbW9uT2JqcztcbiAgICB0aGlzLm9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgIHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gZmFsc2U7XG4gICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gIH1cbiAgZ2V0IHBhZ2VOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmRleCArIDE7XG4gIH1cbiAgZ2V0IHJvdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlO1xuICB9XG4gIGdldCByZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjtcbiAgfVxuICBnZXQgdXNlclVuaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0O1xuICB9XG4gIGdldCB2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3O1xuICB9XG4gIGdldFZpZXdwb3J0KCkge1xuICAgIGxldCB7XG4gICAgICBzY2FsZSxcbiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGUsXG4gICAgICBvZmZzZXRYID0gMCxcbiAgICAgIG9mZnNldFkgPSAwLFxuICAgICAgZG9udEZsaXAgPSBmYWxzZVxuICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHJldHVybiBuZXcgX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18uUGFnZVZpZXdwb3J0KHtcbiAgICAgIHZpZXdCb3g6IHRoaXMudmlldyxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGRvbnRGbGlwXG4gICAgfSk7XG4gIH1cbiAgZ2V0QW5ub3RhdGlvbnMoKSB7XG4gICAgbGV0IHtcbiAgICAgIGludGVudCA9IFwiZGlzcGxheVwiXG4gICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgaW50ZW50QXJncyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KTtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEFubm90YXRpb25zKHRoaXMuX3BhZ2VJbmRleCwgaW50ZW50QXJncy5yZW5kZXJpbmdJbnRlbnQpO1xuICB9XG4gIGdldEpTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VKU0FjdGlvbnModGhpcy5fcGFnZUluZGV4KTtcbiAgfVxuICBnZXQgZmlsdGVyRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3Rvcnk7XG4gIH1cbiAgZ2V0IGlzUHVyZVhmYSgpIHtcbiAgICByZXR1cm4gKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLnNoYWRvdykodGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuICB9XG4gIGFzeW5jIGdldFhmYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhPy5jaGlsZHJlblt0aGlzLl9wYWdlSW5kZXhdIHx8IG51bGw7XG4gIH1cbiAgcmVuZGVyKF9yZWYyKSB7XG4gICAgbGV0IHtcbiAgICAgIGNhbnZhc0NvbnRleHQsXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIGludGVudCA9IFwiZGlzcGxheVwiLFxuICAgICAgYW5ub3RhdGlvbk1vZGUgPSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuICAgICAgdHJhbnNmb3JtID0gbnVsbCxcbiAgICAgIGJhY2tncm91bmQgPSBudWxsLFxuICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGwsXG4gICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwID0gbnVsbCxcbiAgICAgIHBhZ2VDb2xvcnMgPSBudWxsLFxuICAgICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGxcbiAgICB9ID0gX3JlZjI7XG4gICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJPdmVyYWxsXCIpO1xuICAgIGNvbnN0IGludGVudEFyZ3MgPSB0aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCwgYW5ub3RhdGlvbk1vZGUsIHByaW50QW5ub3RhdGlvblN0b3JhZ2UpO1xuICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gICAgdGhpcy4jYWJvcnREZWxheWVkQ2xlYW51cCgpO1xuICAgIGlmICghb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSkge1xuICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTtcbiAgICB9XG4gICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpbnRlbnRBcmdzLmNhY2hlS2V5KTtcbiAgICBpZiAoIWludGVudFN0YXRlKSB7XG4gICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGludGVudEFyZ3MuY2FjaGVLZXksIGludGVudFN0YXRlKTtcbiAgICB9XG4gICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBpbnRlbnRQcmludCA9ICEhKGludGVudEFyZ3MucmVuZGVyaW5nSW50ZW50ICYgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpO1xuICAgIGlmICghaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHtcbiAgICAgICAgZm5BcnJheTogW10sXG4gICAgICAgIGFyZ3NBcnJheTogW10sXG4gICAgICAgIGxhc3RDaHVuazogZmFsc2UsXG4gICAgICAgIHNlcGFyYXRlQW5ub3RzOiBudWxsXG4gICAgICB9O1xuICAgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGludGVudEFyZ3MpO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9IGVycm9yID0+IHtcbiAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLmRlbGV0ZShpbnRlcm5hbFJlbmRlclRhc2spO1xuICAgICAgaWYgKHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyIHx8IGludGVudFByaW50KSB7XG4gICAgICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3RyeUNsZWFudXAoIWludGVudFByaW50KTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgaW50ZW50U3RhdGUsXG4gICAgICAgICAgcmVhc29uOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoZXJyb3IpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhdHM/LnRpbWVFbmQoXCJSZW5kZXJpbmdcIik7XG4gICAgICB0aGlzLl9zdGF0cz8udGltZUVuZChcIk92ZXJhbGxcIik7XG4gICAgfTtcbiAgICBjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgPSBuZXcgSW50ZXJuYWxSZW5kZXJUYXNrKHtcbiAgICAgIGNhbGxiYWNrOiBjb21wbGV0ZSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBjYW52YXNDb250ZXh0LFxuICAgICAgICB2aWV3cG9ydCxcbiAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICBiYWNrZ3JvdW5kXG4gICAgICB9LFxuICAgICAgb2JqczogdGhpcy5vYmpzLFxuICAgICAgY29tbW9uT2JqczogdGhpcy5jb21tb25PYmpzLFxuICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcCxcbiAgICAgIG9wZXJhdG9yTGlzdDogaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LFxuICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICBjYW52YXNGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuY2FudmFzRmFjdG9yeSxcbiAgICAgIGZpbHRlckZhY3Rvcnk6IHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5LFxuICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiAhaW50ZW50UHJpbnQsXG4gICAgICBwZGZCdWc6IHRoaXMuX3BkZkJ1ZyxcbiAgICAgIHBhZ2VDb2xvcnNcbiAgICB9KTtcbiAgICAoaW50ZW50U3RhdGUucmVuZGVyVGFza3MgfHw9IG5ldyBTZXQoKSkuYWRkKGludGVybmFsUmVuZGVyVGFzayk7XG4gICAgY29uc3QgcmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzay50YXNrO1xuICAgIFByb21pc2UuYWxsKFtpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2VdKS50aGVuKF9yZWYzID0+IHtcbiAgICAgIGxldCBbdHJhbnNwYXJlbmN5LCBvcHRpb25hbENvbnRlbnRDb25maWddID0gX3JlZjM7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJSZW5kZXJpbmdcIik7XG4gICAgICBpbnRlcm5hbFJlbmRlclRhc2suaW5pdGlhbGl6ZUdyYXBoaWNzKHtcbiAgICAgICAgdHJhbnNwYXJlbmN5LFxuICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdcbiAgICAgIH0pO1xuICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICB9KS5jYXRjaChjb21wbGV0ZSk7XG4gICAgcmV0dXJuIHJlbmRlclRhc2s7XG4gIH1cbiAgZ2V0T3BlcmF0b3JMaXN0KCkge1xuICAgIGxldCB7XG4gICAgICBpbnRlbnQgPSBcImRpc3BsYXlcIixcbiAgICAgIGFubm90YXRpb25Nb2RlID0gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLkFubm90YXRpb25Nb2RlLkVOQUJMRSxcbiAgICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsXG4gICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgZnVuY3Rpb24gb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHtcbiAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlc29sdmUoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MuZGVsZXRlKG9wTGlzdFRhc2spO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbnRlbnRBcmdzID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQsIGFubm90YXRpb25Nb2RlLCBwcmludEFubm90YXRpb25TdG9yYWdlLCB0cnVlKTtcbiAgICBsZXQgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudEFyZ3MuY2FjaGVLZXkpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIGludGVudFN0YXRlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5zZXQoaW50ZW50QXJncy5jYWNoZUtleSwgaW50ZW50U3RhdGUpO1xuICAgIH1cbiAgICBsZXQgb3BMaXN0VGFzaztcbiAgICBpZiAoIWludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICBvcExpc3RUYXNrID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIG9wTGlzdFRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCA9IG9wZXJhdG9yTGlzdENoYW5nZWQ7XG4gICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIChpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyB8fD0gbmV3IFNldCgpKS5hZGQob3BMaXN0VGFzayk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICBsYXN0Q2h1bms6IGZhbHNlLFxuICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuICAgICAgfTtcbiAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdChpbnRlbnRBcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgc3RyZWFtVGV4dENvbnRlbnQoKSB7XG4gICAgbGV0IHtcbiAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50ID0gZmFsc2UsXG4gICAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiA9IGZhbHNlXG4gICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgVEVYVF9DT05URU5UX0NIVU5LX1NJWkUgPSAxMDA7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbShcIkdldFRleHRDb250ZW50XCIsIHtcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQ6IGluY2x1ZGVNYXJrZWRDb250ZW50ID09PSB0cnVlLFxuICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb246IGRpc2FibGVOb3JtYWxpemF0aW9uID09PSB0cnVlXG4gICAgfSwge1xuICAgICAgaGlnaFdhdGVyTWFyazogVEVYVF9DT05URU5UX0NIVU5LX1NJWkUsXG4gICAgICBzaXplKHRleHRDb250ZW50KSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0VGV4dENvbnRlbnQoKSB7XG4gICAgbGV0IHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0WGZhKCkudGhlbih4ZmEgPT4ge1xuICAgICAgICByZXR1cm4gX3hmYV90ZXh0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zN19fLlhmYVRleHQudGV4dENvbnRlbnQoeGZhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuc3RyZWFtVGV4dENvbnRlbnQocGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gcHVtcCgpIHtcbiAgICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGRvbmVcbiAgICAgICAgICB9ID0gX3JlZjQ7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRleHRDb250ZW50LnN0eWxlcywgdmFsdWUuc3R5bGVzKTtcbiAgICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKC4uLnZhbHVlLml0ZW1zKTtcbiAgICAgICAgICBwdW1wKCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IHRleHRDb250ZW50ID0ge1xuICAgICAgICBpdGVtczogW10sXG4gICAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgfTtcbiAgICAgIHB1bXAoKTtcbiAgICB9KTtcbiAgfVxuICBnZXRTdHJ1Y3RUcmVlKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0U3RydWN0VHJlZSh0aGlzLl9wYWdlSW5kZXgpO1xuICB9XG4gIF9kZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBjb25zdCB3YWl0T24gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGludGVudFN0YXRlIG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBuZXcgRXJyb3IoXCJQYWdlIHdhcyBkZXN0cm95ZWQuXCIpLFxuICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgICB3YWl0T24ucHVzaChpbnRlcm5hbFJlbmRlclRhc2suY29tcGxldGVkKTtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKTtcbiAgfVxuICBjbGVhbnVwKCkge1xuICAgIGxldCByZXNldFN0YXRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IHRydWU7XG4gICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuI3RyeUNsZWFudXAoZmFsc2UpO1xuICAgIGlmIChyZXNldFN0YXRzICYmIHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX3N0YXRzICYmPSBuZXcgX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18uU3RhdFRpbWVyKCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG4gICN0cnlDbGVhbnVwKCkge1xuICAgIGxldCBkZWxheWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB0aGlzLiNhYm9ydERlbGF5ZWRDbGVhbnVwKCk7XG4gICAgaWYgKCF0aGlzLiNwZW5kaW5nQ2xlYW51cCB8fCB0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGVsYXllZCkge1xuICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuI3RyeUNsZWFudXAoZmFsc2UpO1xuICAgICAgfSwgREVMQVlFRF9DTEVBTlVQX1RJTUVPVVQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHJlbmRlclRhc2tzLFxuICAgICAgb3BlcmF0b3JMaXN0XG4gICAgfSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChyZW5kZXJUYXNrcy5zaXplID4gMCB8fCAhb3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpO1xuICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgI2Fib3J0RGVsYXllZENsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCk7XG4gICAgICB0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBfc3RhcnRSZW5kZXJQYWdlKHRyYW5zcGFyZW5jeSwgY2FjaGVLZXkpIHtcbiAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc3RhdHM/LnRpbWVFbmQoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eT8ucmVzb2x2ZSh0cmFuc3BhcmVuY3kpO1xuICB9XG4gIF9yZW5kZXJQYWdlQ2h1bmsob3BlcmF0b3JMaXN0Q2h1bmssIGludGVudFN0YXRlKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3BlcmF0b3JMaXN0Q2h1bmsubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LmZuQXJyYXkucHVzaChvcGVyYXRvckxpc3RDaHVuay5mbkFycmF5W2ldKTtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkucHVzaChvcGVyYXRvckxpc3RDaHVuay5hcmdzQXJyYXlbaV0pO1xuICAgIH1cbiAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gb3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rO1xuICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5zZXBhcmF0ZUFubm90cyA9IG9wZXJhdG9yTGlzdENodW5rLnNlcGFyYXRlQW5ub3RzO1xuICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG4gICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAob3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rKSB7XG4gICAgICB0aGlzLiN0cnlDbGVhbnVwKHRydWUpO1xuICAgIH1cbiAgfVxuICBfcHVtcE9wZXJhdG9yTGlzdChfcmVmNSkge1xuICAgIGxldCB7XG4gICAgICByZW5kZXJpbmdJbnRlbnQsXG4gICAgICBjYWNoZUtleSxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlXG4gICAgfSA9IF9yZWY1O1xuICAgIGNvbnN0IHtcbiAgICAgIG1hcCxcbiAgICAgIHRyYW5zZmVyXG4gICAgfSA9IGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlO1xuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0T3BlcmF0b3JMaXN0XCIsIHtcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgaW50ZW50OiByZW5kZXJpbmdJbnRlbnQsXG4gICAgICBjYWNoZUtleSxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlOiBtYXBcbiAgICB9LCB0cmFuc2Zlcik7XG4gICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSByZWFkZXI7XG4gICAgY29uc3QgcHVtcCA9ICgpID0+IHtcbiAgICAgIHJlYWRlci5yZWFkKCkudGhlbihfcmVmNiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZG9uZVxuICAgICAgICB9ID0gX3JlZjY7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKHZhbHVlLCBpbnRlbnRTdGF0ZSk7XG4gICAgICAgIHB1bXAoKTtcbiAgICAgIH0sIHJlYXNvbiA9PiB7XG4gICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy4jdHJ5Q2xlYW51cCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuICAgICAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgcHVtcCgpO1xuICB9XG4gIF9hYm9ydE9wZXJhdG9yTGlzdChfcmVmNykge1xuICAgIGxldCB7XG4gICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgIHJlYXNvbixcbiAgICAgIGZvcmNlID0gZmFsc2VcbiAgICB9ID0gX3JlZjc7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICBpZiAoaW50ZW50U3RhdGUucmVuZGVyVGFza3Muc2l6ZSA+IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNV9fLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikge1xuICAgICAgICBsZXQgZGVsYXkgPSBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQ7XG4gICAgICAgIGlmIChyZWFzb24uZXh0cmFEZWxheSA+IDAgJiYgcmVhc29uLmV4dHJhRGVsYXkgPCAxMDAwKSB7XG4gICAgICAgICAgZGVsYXkgKz0gcmVhc29uLmV4dHJhRGVsYXk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcbiAgICAgICAgICAgIGludGVudFN0YXRlLFxuICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgZm9yY2U6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlci5jYW5jZWwobmV3IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5BYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2N1ckNhY2hlS2V5LCBjdXJJbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7XG4gICAgICBpZiAoY3VySW50ZW50U3RhdGUgPT09IGludGVudFN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUoY3VyQ2FjaGVLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cbiAgZ2V0IHN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0cztcbiAgfVxufVxuY2xhc3MgTG9vcGJhY2tQb3J0IHtcbiAgI2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgI2RlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHBvc3RNZXNzYWdlKG9iaiwgdHJhbnNmZXIpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGRhdGE6IHN0cnVjdHVyZWRDbG9uZShvYmosIHRyYW5zZmVyID8ge1xuICAgICAgICB0cmFuc2ZlclxuICAgICAgfSA6IG51bGwpXG4gICAgfTtcbiAgICB0aGlzLiNkZWZlcnJlZC50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy4jbGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLiNsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfVxuICByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy4jbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbiAgdGVybWluYXRlKCkge1xuICAgIHRoaXMuI2xpc3RlbmVycy5jbGVhcigpO1xuICB9XG59XG5jb25zdCBQREZXb3JrZXJVdGlsID0ge1xuICBpc1dvcmtlckRpc2FibGVkOiBmYWxzZSxcbiAgZmFrZVdvcmtlcklkOiAwXG59O1xue1xuICBpZiAoX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLmlzTm9kZUpTKSB7XG4gICAgUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkID0gdHJ1ZTtcbiAgICBfd29ya2VyX29wdGlvbnNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI5X18uR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgfHw9IFwiLi9wZGYud29ya2VyLm1qc1wiO1xuICB9XG4gIFBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luID0gZnVuY3Rpb24gKGJhc2VVcmwsIG90aGVyVXJsKSB7XG4gICAgbGV0IGJhc2U7XG4gICAgdHJ5IHtcbiAgICAgIGJhc2UgPSBuZXcgVVJMKGJhc2VVcmwpO1xuICAgICAgaWYgKCFiYXNlLm9yaWdpbiB8fCBiYXNlLm9yaWdpbiA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBvdGhlciA9IG5ldyBVUkwob3RoZXJVcmwsIGJhc2UpO1xuICAgIHJldHVybiBiYXNlLm9yaWdpbiA9PT0gb3RoZXIub3JpZ2luO1xuICB9O1xuICBQREZXb3JrZXJVdGlsLmNyZWF0ZUNETldyYXBwZXIgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGBhd2FpdCBpbXBvcnQoXCIke3VybH1cIik7YDtcbiAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbd3JhcHBlcl0sIHtcbiAgICAgIHR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCJcbiAgICB9KSk7XG4gIH07XG59XG5jbGFzcyBQREZXb3JrZXIge1xuICBzdGF0aWMgI3dvcmtlclBvcnRzO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQge1xuICAgICAgbmFtZSA9IG51bGwsXG4gICAgICBwb3J0ID0gbnVsbCxcbiAgICAgIHZlcmJvc2l0eSA9ICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5nZXRWZXJib3NpdHlMZXZlbCkoKVxuICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgaWYgKHBvcnQpIHtcbiAgICAgIGlmIChQREZXb3JrZXIuI3dvcmtlclBvcnRzPy5oYXMocG9ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSBtb3JlIHRoYW4gb25lIFBERldvcmtlciBwZXIgcG9ydC5cIik7XG4gICAgICB9XG4gICAgICAoUERGV29ya2VyLiN3b3JrZXJQb3J0cyB8fD0gbmV3IFdlYWtNYXAoKSkuc2V0KHBvcnQsIHRoaXMpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gIH1cbiAgZ2V0IHByb21pc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGdldCBwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICB9XG4gIGdldCBtZXNzYWdlSGFuZGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhhbmRsZXI7XG4gIH1cbiAgX2luaXRpYWxpemVGcm9tUG9ydChwb3J0KSB7XG4gICAgdGhpcy5fcG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBuZXcgX3NoYXJlZF9tZXNzYWdlX2hhbmRsZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMwX18uTWVzc2FnZUhhbmRsZXIoXCJtYWluXCIsIFwid29ya2VyXCIsIHBvcnQpO1xuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZnVuY3Rpb24gKCkge30pO1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuc2VuZChcImNvbmZpZ3VyZVwiLCB7XG4gICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG4gICAgfSk7XG4gIH1cbiAgX2luaXRpYWxpemUoKSB7XG4gICAgaWYgKCFQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgJiYgIVBERldvcmtlci4jbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICBsZXQge1xuICAgICAgICB3b3JrZXJTcmNcbiAgICAgIH0gPSBQREZXb3JrZXI7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIVBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCB3b3JrZXJTcmMpKSB7XG4gICAgICAgICAgd29ya2VyU3JjID0gUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwod29ya2VyU3JjLCB3aW5kb3cubG9jYXRpb24pLmhyZWYpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyU3JjLCB7XG4gICAgICAgICAgdHlwZTogXCJtb2R1bGVcIlxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgX3NoYXJlZF9tZXNzYWdlX2hhbmRsZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMwX18uTWVzc2FnZUhhbmRsZXIoXCJtYWluXCIsIFwid29ya2VyXCIsIHdvcmtlcik7XG4gICAgICAgIGNvbnN0IHRlcm1pbmF0ZUVhcmx5ID0gKCkgPT4ge1xuICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG4gICAgICAgICAgbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uV29ya2VyRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLl93ZWJXb3JrZXIpIHtcbiAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuICAgICAgICBtZXNzYWdlSGFuZGxlci5vbihcInRlc3RcIiwgZGF0YSA9PiB7XG4gICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyO1xuICAgICAgICAgICAgdGhpcy5fcG9ydCA9IHdvcmtlcjtcbiAgICAgICAgICAgIHRoaXMuX3dlYldvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwiY29uZmlndXJlXCIsIHtcbiAgICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZGF0YSA9PiB7XG4gICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VuZFRlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGVzdE9iaiA9IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcInRlc3RcIiwgdGVzdE9iaiwgW3Rlc3RPYmouYnVmZmVyXSk7XG4gICAgICAgIH07XG4gICAgICAgIHNlbmRUZXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uaW5mbykoXCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gIH1cbiAgX3NldHVwRmFrZVdvcmtlcigpIHtcbiAgICBpZiAoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCkge1xuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLndhcm4pKFwiU2V0dGluZyB1cCBmYWtlIHdvcmtlci5cIik7XG4gICAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBQREZXb3JrZXIuX3NldHVwRmFrZVdvcmtlckdsb2JhbC50aGVuKFdvcmtlck1lc3NhZ2VIYW5kbGVyID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcG9ydCA9IG5ldyBMb29wYmFja1BvcnQoKTtcbiAgICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xuICAgICAgY29uc3QgaWQgPSBgZmFrZSR7UERGV29ya2VyVXRpbC5mYWtlV29ya2VySWQrK31gO1xuICAgICAgY29uc3Qgd29ya2VySGFuZGxlciA9IG5ldyBfc2hhcmVkX21lc3NhZ2VfaGFuZGxlcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzBfXy5NZXNzYWdlSGFuZGxlcihpZCArIFwiX3dvcmtlclwiLCBpZCwgcG9ydCk7XG4gICAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh3b3JrZXJIYW5kbGVyLCBwb3J0KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IF9zaGFyZWRfbWVzc2FnZV9oYW5kbGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMF9fLk1lc3NhZ2VIYW5kbGVyKGlkLCBpZCArIFwiX3dvcmtlclwiLCBwb3J0KTtcbiAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcImNvbmZpZ3VyZVwiLCB7XG4gICAgICAgIHZlcmJvc2l0eTogdGhpcy52ZXJib3NpdHlcbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihgU2V0dGluZyB1cCBmYWtlIHdvcmtlciBmYWlsZWQ6IFwiJHtyZWFzb24ubWVzc2FnZX1cIi5gKSk7XG4gICAgfSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuX3dlYldvcmtlcikge1xuICAgICAgdGhpcy5fd2ViV29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICB9XG4gICAgUERGV29ya2VyLiN3b3JrZXJQb3J0cz8uZGVsZXRlKHRoaXMuX3BvcnQpO1xuICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZnJvbVBvcnQocGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXM/LnBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS5cIik7XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlZFBvcnQgPSB0aGlzLiN3b3JrZXJQb3J0cz8uZ2V0KHBhcmFtcy5wb3J0KTtcbiAgICBpZiAoY2FjaGVkUG9ydCkge1xuICAgICAgaWYgKGNhY2hlZFBvcnQuX3BlbmRpbmdEZXN0cm95KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIHRoZSB3b3JrZXIgaXMgYmVpbmcgZGVzdHJveWVkLlxcblwiICsgXCJQbGVhc2UgcmVtZW1iZXIgdG8gYXdhaXQgYFBERkRvY3VtZW50TG9hZGluZ1Rhc2suZGVzdHJveSgpYC1jYWxscy5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVkUG9ydDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQREZXb3JrZXIocGFyYW1zKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHdvcmtlclNyYygpIHtcbiAgICBpZiAoX3dvcmtlcl9vcHRpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yOV9fLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSB7XG4gICAgICByZXR1cm4gX3dvcmtlcl9vcHRpb25zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yOV9fLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gIH1cbiAgc3RhdGljIGdldCAjbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5wZGZqc1dvcmtlcj8uV29ya2VyTWVzc2FnZUhhbmRsZXIgfHwgbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IF9zZXR1cEZha2VXb3JrZXJHbG9iYWwoKSB7XG4gICAgY29uc3QgbG9hZGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyO1xuICAgICAgfVxuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gdGhpcy53b3JrZXJTcmMpO1xuICAgICAgcmV0dXJuIHdvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICB9O1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uc2hhZG93KSh0aGlzLCBcIl9zZXR1cEZha2VXb3JrZXJHbG9iYWxcIiwgbG9hZGVyKCkpO1xuICB9XG59XG5jbGFzcyBXb3JrZXJUcmFuc3BvcnQge1xuICAjbWV0aG9kUHJvbWlzZXMgPSBuZXcgTWFwKCk7XG4gICNwYWdlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICNwYWdlUHJvbWlzZXMgPSBuZXcgTWFwKCk7XG4gICNwYXNzd29yZENhcGFiaWxpdHkgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlSGFuZGxlciwgbG9hZGluZ1Rhc2ssIG5ldHdvcmtTdHJlYW0sIHBhcmFtcywgZmFjdG9yeSkge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjtcbiAgICB0aGlzLmxvYWRpbmdUYXNrID0gbG9hZGluZ1Rhc2s7XG4gICAgdGhpcy5jb21tb25PYmpzID0gbmV3IFBERk9iamVjdHMoKTtcbiAgICB0aGlzLmZvbnRMb2FkZXIgPSBuZXcgX2ZvbnRfbG9hZGVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNl9fLkZvbnRMb2FkZXIoe1xuICAgICAgb3duZXJEb2N1bWVudDogcGFyYW1zLm93bmVyRG9jdW1lbnQsXG4gICAgICBzdHlsZUVsZW1lbnQ6IHBhcmFtcy5zdHlsZUVsZW1lbnRcbiAgICB9KTtcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gZmFjdG9yeS5jYW52YXNGYWN0b3J5O1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGZhY3RvcnkuZmlsdGVyRmFjdG9yeTtcbiAgICB0aGlzLmNNYXBSZWFkZXJGYWN0b3J5ID0gZmFjdG9yeS5jTWFwUmVhZGVyRmFjdG9yeTtcbiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZmFjdG9yeS5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBudWxsO1xuICAgIHRoaXMuX25ldHdvcmtTdHJlYW0gPSBuZXR3b3JrU3RyZWFtO1xuICAgIHRoaXMuX2Z1bGxSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xhc3RQcm9ncmVzcyA9IG51bGw7XG4gICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5ID0gbmV3IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpO1xuICB9XG4gICNjYWNoZVNpbXBsZU1ldGhvZChuYW1lKSB7XG4gICAgbGV0IGRhdGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgY29uc3QgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI21ldGhvZFByb21pc2VzLmdldChuYW1lKTtcbiAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShuYW1lLCBkYXRhKTtcbiAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5zZXQobmFtZSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgZ2V0IGFubm90YXRpb25TdG9yYWdlKCkge1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uc2hhZG93KSh0aGlzLCBcImFubm90YXRpb25TdG9yYWdlXCIsIG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fLkFubm90YXRpb25TdG9yYWdlKCkpO1xuICB9XG4gIGdldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHtcbiAgICBsZXQgYW5ub3RhdGlvbk1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5Bbm5vdGF0aW9uTW9kZS5FTkFCTEU7XG4gICAgbGV0IHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgbGV0IGlzT3BMaXN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgICBsZXQgcmVuZGVyaW5nSW50ZW50ID0gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWTtcbiAgICBsZXQgYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGUgPSBfYW5ub3RhdGlvbl9zdG9yYWdlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fLlNlcmlhbGl6YWJsZUVtcHR5O1xuICAgIHN3aXRjaCAoaW50ZW50KSB7XG4gICAgICBjYXNlIFwiYW55XCI6XG4gICAgICAgIHJlbmRlcmluZ0ludGVudCA9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOWTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGlzcGxheVwiOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwcmludFwiOlxuICAgICAgICByZW5kZXJpbmdJbnRlbnQgPSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18ud2FybikoYGdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgaW50ZW50OiAke2ludGVudH1gKTtcbiAgICB9XG4gICAgc3dpdGNoIChhbm5vdGF0aW9uTW9kZSkge1xuICAgICAgY2FzZSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uQW5ub3RhdGlvbk1vZGUuRU5BQkxFOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLkFubm90YXRpb25Nb2RlLkVOQUJMRV9GT1JNUzpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0ZPUk1TO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLkFubm90YXRpb25Nb2RlLkVOQUJMRV9TVE9SQUdFOlxuICAgICAgICByZW5kZXJpbmdJbnRlbnQgKz0gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSByZW5kZXJpbmdJbnRlbnQgJiBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCAmJiBwcmludEFubm90YXRpb25TdG9yYWdlIGluc3RhbmNlb2YgX2Fubm90YXRpb25fc3RvcmFnZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjRfXy5QcmludEFubm90YXRpb25TdG9yYWdlID8gcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlID0gYW5ub3RhdGlvblN0b3JhZ2Uuc2VyaWFsaXphYmxlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy53YXJuKShgZ2V0UmVuZGVyaW5nSW50ZW50IC0gaW52YWxpZCBhbm5vdGF0aW9uTW9kZTogJHthbm5vdGF0aW9uTW9kZX1gKTtcbiAgICB9XG4gICAgaWYgKGlzT3BMaXN0KSB7XG4gICAgICByZW5kZXJpbmdJbnRlbnQgKz0gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyaW5nSW50ZW50LFxuICAgICAgY2FjaGVLZXk6IGAke3JlbmRlcmluZ0ludGVudH1fJHthbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZS5oYXNofWAsXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZVxuICAgIH07XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kZXN0cm95Q2FwYWJpbGl0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5Py5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWQgZHVyaW5nIG9uUGFzc3dvcmQgY2FsbGJhY2tcIikpO1xuICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLiNwYWdlQ2FjaGUudmFsdWVzKCkpIHtcbiAgICAgIHdhaXRPbi5wdXNoKHBhZ2UuX2Rlc3Ryb3koKSk7XG4gICAgfVxuICAgIHRoaXMuI3BhZ2VDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuI3BhZ2VQcm9taXNlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KFwiYW5ub3RhdGlvblN0b3JhZ2VcIikpIHtcbiAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgIH1cbiAgICBjb25zdCB0ZXJtaW5hdGVkID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJUZXJtaW5hdGVcIiwgbnVsbCk7XG4gICAgd2FpdE9uLnB1c2godGVybWluYXRlZCk7XG4gICAgUHJvbWlzZS5hbGwod2FpdE9uKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuY29tbW9uT2Jqcy5jbGVhcigpO1xuICAgICAgdGhpcy5mb250TG9hZGVyLmNsZWFyKCk7XG4gICAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5jbGVhcigpO1xuICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0/LmNhbmNlbEFsbFJlcXVlc3RzKG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpKTtcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0sIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVzc2FnZUhhbmRsZXIsXG4gICAgICBsb2FkaW5nVGFza1xuICAgIH0gPSB0aGlzO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0UmVhZGVyXCIsIChkYXRhLCBzaW5rKSA9PiB7XG4gICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuXCIpO1xuICAgICAgdGhpcy5fZnVsbFJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlcigpO1xuICAgICAgdGhpcy5fZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKF9yZWY4KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZG9uZVxuICAgICAgICAgIH0gPSBfcmVmODtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uYXNzZXJ0KSh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcbiAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTtcbiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4ge1xuICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIlJlYWRlckhlYWRlcnNSZWFkeVwiLCBkYXRhID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgY29uc3QgZnVsbFJlYWRlciA9IHRoaXMuX2Z1bGxSZWFkZXI7XG4gICAgICBmdWxsUmVhZGVyLmhlYWRlcnNSZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKCFmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICFmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFByb2dyZXNzKSB7XG4gICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4odGhpcy5fbGFzdFByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHtcbiAgICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgICAgICAgdG90YWw6IGV2dC50b3RhbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZDogZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCxcbiAgICAgICAgICBpc1JhbmdlU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQsXG4gICAgICAgICAgY29udGVudExlbmd0aDogZnVsbFJlYWRlci5jb250ZW50TGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfSwgaGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgIHJldHVybiBoZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0UmFuZ2VSZWFkZXJcIiwgKGRhdGEsIHNpbmspID0+IHtcbiAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmFuZ2VSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLlwiKTtcbiAgICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihkYXRhLmJlZ2luLCBkYXRhLmVuZCk7XG4gICAgICBpZiAoIXJhbmdlUmVhZGVyKSB7XG4gICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG4gICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChfcmVmOSkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGRvbmVcbiAgICAgICAgICB9ID0gX3JlZjk7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLmFzc2VydCkodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciwgXCJHZXRSYW5nZVJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcbiAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTtcbiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4ge1xuICAgICAgICByYW5nZVJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICAgICAgc2luay5yZWFkeS5jYXRjaChyZWFkeVJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXREb2NcIiwgX3JlZjEwID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHBkZkluZm9cbiAgICAgIH0gPSBfcmVmMTA7XG4gICAgICB0aGlzLl9udW1QYWdlcyA9IHBkZkluZm8ubnVtUGFnZXM7XG4gICAgICB0aGlzLl9odG1sRm9yWGZhID0gcGRmSW5mby5odG1sRm9yWGZhO1xuICAgICAgZGVsZXRlIHBkZkluZm8uaHRtbEZvclhmYTtcbiAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkocGRmSW5mbywgdGhpcykpO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRG9jRXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChleCkge1xuICAgICAgbGV0IHJlYXNvbjtcbiAgICAgIHN3aXRjaCAoZXgubmFtZSkge1xuICAgICAgICBjYXNlIFwiUGFzc3dvcmRFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlBhc3N3b3JkRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmNvZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uSW52YWxpZFBERkV4Y2VwdGlvbihleC5tZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1pc3NpbmdQREZFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLk1pc3NpbmdQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5zdGF0dXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5Vbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguZGV0YWlscyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLnVucmVhY2hhYmxlKShcIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuXCIpO1xuICAgICAgfVxuICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJQYXNzd29yZFJlcXVlc3RcIiwgZXhjZXB0aW9uID0+IHtcbiAgICAgIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIGlmIChsb2FkaW5nVGFzay5vblBhc3N3b3JkKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVBhc3N3b3JkID0gcGFzc3dvcmQgPT4ge1xuICAgICAgICAgIGlmIChwYXNzd29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KHBhc3N3b3JkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgICAgICBwYXNzd29yZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQodXBkYXRlUGFzc3dvcmQsIGV4Y2VwdGlvbi5jb2RlKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlBhc3N3b3JkRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlLCBleGNlcHRpb24uY29kZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRGF0YUxvYWRlZFwiLCBkYXRhID0+IHtcbiAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZGF0YS5sZW5ndGgsXG4gICAgICAgIHRvdGFsOiBkYXRhLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIlN0YXJ0UmVuZGVyUGFnZVwiLCBkYXRhID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlID0gdGhpcy4jcGFnZUNhY2hlLmdldChkYXRhLnBhZ2VJbmRleCk7XG4gICAgICBwYWdlLl9zdGFydFJlbmRlclBhZ2UoZGF0YS50cmFuc3BhcmVuY3ksIGRhdGEuY2FjaGVLZXkpO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiY29tbW9ub2JqXCIsIF9yZWYxMSA9PiB7XG4gICAgICBsZXQgW2lkLCB0eXBlLCBleHBvcnRlZERhdGFdID0gX3JlZjExO1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29tbW9uT2Jqcy5oYXMoaWQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5fcGFyYW1zO1xuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gZXhwb3J0ZWREYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBleHBvcnRlZEVycm9yID0gZXhwb3J0ZWREYXRhLmVycm9yO1xuICAgICAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLndhcm4pKGBFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiAke2V4cG9ydGVkRXJyb3J9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWRFcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5zcGVjdEZvbnQgPSBwYXJhbXMucGRmQnVnICYmIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvcj8uZW5hYmxlZCA/IChmb250LCB1cmwpID0+IGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQoZm9udCwgdXJsKSA6IG51bGw7XG4gICAgICAgICAgY29uc3QgZm9udCA9IG5ldyBfZm9udF9sb2FkZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI2X18uRm9udEZhY2VPYmplY3QoZXhwb3J0ZWREYXRhLCB7XG4gICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHBhcmFtcy5pc0V2YWxTdXBwb3J0ZWQsXG4gICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IHBhcmFtcy5kaXNhYmxlRm9udEZhY2UsXG4gICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHBhcmFtcy5pZ25vcmVFcnJvcnMsXG4gICAgICAgICAgICBpbnNwZWN0Rm9udFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZm9udExvYWRlci5iaW5kKGZvbnQpLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiRm9udEZhbGxiYWNrXCIsIHtcbiAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYXJhbXMuZm9udEV4dHJhUHJvcGVydGllcyAmJiBmb250LmRhdGEpIHtcbiAgICAgICAgICAgICAgZm9udC5kYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBmb250KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNvcHlMb2NhbEltYWdlXCI6XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaW1hZ2VSZWZcbiAgICAgICAgICB9ID0gZXhwb3J0ZWREYXRhO1xuICAgICAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5hc3NlcnQpKGltYWdlUmVmLCBcIlRoZSBpbWFnZVJlZiBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICAgIGZvciAoY29uc3QgcGFnZVByb3h5IG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbLCBkYXRhXSBvZiBwYWdlUHJveHkub2Jqcykge1xuICAgICAgICAgICAgICBpZiAoZGF0YS5yZWYgIT09IGltYWdlUmVmKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmRhdGFMZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgc3RydWN0dXJlZENsb25lKGRhdGEpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YUxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGb250UGF0aFwiOlxuICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgY2FzZSBcIlBhdHRlcm5cIjpcbiAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWREYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIGNvbW1vbiBvYmplY3QgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIm9ialwiLCBfcmVmMTIgPT4ge1xuICAgICAgbGV0IFtpZCwgcGFnZUluZGV4LCB0eXBlLCBpbWFnZURhdGFdID0gX3JlZjEyO1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VQcm94eSA9IHRoaXMuI3BhZ2VDYWNoZS5nZXQocGFnZUluZGV4KTtcbiAgICAgIGlmIChwYWdlUHJveHkub2Jqcy5oYXMoaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlUHJveHkuX2ludGVudFN0YXRlcy5zaXplID09PSAwKSB7XG4gICAgICAgIGltYWdlRGF0YT8uYml0bWFwPy5jbG9zZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTtcbiAgICAgICAgICBpZiAoaW1hZ2VEYXRhPy5kYXRhTGVuID4gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFKSB7XG4gICAgICAgICAgICBwYWdlUHJveHkuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIG9iamVjdCB0eXBlICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRvY1Byb2dyZXNzXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsXG4gICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkZldGNoQnVpbHRJbkNNYXBcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY01hcFJlYWRlckZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNNYXBSZWFkZXJGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY01hcFJlYWRlckZhY3RvcnkuZmV0Y2goZGF0YSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJGZXRjaFN0YW5kYXJkRm9udERhdGFcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YW5kYXJkRm9udERhdGFGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkuZmV0Y2goZGF0YSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREYXRhXCIsIG51bGwpO1xuICB9XG4gIHNhdmVEb2N1bWVudCgpIHtcbiAgICBpZiAodGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zaXplIDw9IDApIHtcbiAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy53YXJuKShcInNhdmVEb2N1bWVudCBjYWxsZWQgd2hpbGUgYGFubm90YXRpb25TdG9yYWdlYCBpcyBlbXB0eSwgXCIgKyBcInBsZWFzZSB1c2UgdGhlIGdldERhdGEtbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBtYXAsXG4gICAgICB0cmFuc2ZlclxuICAgIH0gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNlcmlhbGl6YWJsZTtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJTYXZlRG9jdW1lbnRcIiwge1xuICAgICAgaXNQdXJlWGZhOiAhIXRoaXMuX2h0bWxGb3JYZmEsXG4gICAgICBudW1QYWdlczogdGhpcy5fbnVtUGFnZXMsXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZTogbWFwLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXI/LmZpbGVuYW1lID8/IG51bGxcbiAgICB9LCB0cmFuc2ZlcikuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnJlc2V0TW9kaWZpZWQoKTtcbiAgICB9KTtcbiAgfVxuICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgfHwgcGFnZU51bWJlciA8PSAwIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLl9udW1QYWdlcykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgcGFnZSByZXF1ZXN0LlwiKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxLFxuICAgICAgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI3BhZ2VQcm9taXNlcy5nZXQocGFnZUluZGV4KTtcbiAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VcIiwge1xuICAgICAgcGFnZUluZGV4XG4gICAgfSkudGhlbihwYWdlSW5mbyA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IGRlc3Ryb3llZFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2UgPSBuZXcgUERGUGFnZVByb3h5KHBhZ2VJbmRleCwgcGFnZUluZm8sIHRoaXMsIHRoaXMuX3BhcmFtcy5wZGZCdWcpO1xuICAgICAgdGhpcy4jcGFnZUNhY2hlLnNldChwYWdlSW5kZXgsIHBhZ2UpO1xuICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy4jcGFnZVByb21pc2VzLnNldChwYWdlSW5kZXgsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGdldFBhZ2VJbmRleChyZWYpIHtcbiAgICBpZiAodHlwZW9mIHJlZiAhPT0gXCJvYmplY3RcIiB8fCByZWYgPT09IG51bGwgfHwgIU51bWJlci5pc0ludGVnZXIocmVmLm51bSkgfHwgcmVmLm51bSA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIocmVmLmdlbikgfHwgcmVmLmdlbiA8IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZ2VJbmRleCByZXF1ZXN0LlwiKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VJbmRleFwiLCB7XG4gICAgICBudW06IHJlZi5udW0sXG4gICAgICBnZW46IHJlZi5nZW5cbiAgICB9KTtcbiAgfVxuICBnZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgsIGludGVudCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEFubm90YXRpb25zXCIsIHtcbiAgICAgIHBhZ2VJbmRleCxcbiAgICAgIGludGVudFxuICAgIH0pO1xuICB9XG4gIGdldEZpZWxkT2JqZWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVTaW1wbGVNZXRob2QoXCJHZXRGaWVsZE9iamVjdHNcIik7XG4gIH1cbiAgaGFzSlNBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkhhc0pTQWN0aW9uc1wiKTtcbiAgfVxuICBnZXRDYWxjdWxhdGlvbk9yZGVySWRzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldENhbGN1bGF0aW9uT3JkZXJJZHNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uc1wiLCBudWxsKTtcbiAgfVxuICBnZXREZXN0aW5hdGlvbihpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGRlc3RpbmF0aW9uIHJlcXVlc3QuXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGVzdGluYXRpb25cIiwge1xuICAgICAgaWRcbiAgICB9KTtcbiAgfVxuICBnZXRQYWdlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VMYWJlbHNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0UGFnZUxheW91dCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGF5b3V0XCIsIG51bGwpO1xuICB9XG4gIGdldFBhZ2VNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VNb2RlXCIsIG51bGwpO1xuICB9XG4gIGdldFZpZXdlclByZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFZpZXdlclByZWZlcmVuY2VzXCIsIG51bGwpO1xuICB9XG4gIGdldE9wZW5BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3BlbkFjdGlvblwiLCBudWxsKTtcbiAgfVxuICBnZXRBdHRhY2htZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRBdHRhY2htZW50c1wiLCBudWxsKTtcbiAgfVxuICBnZXREb2NKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlU2ltcGxlTWV0aG9kKFwiR2V0RG9jSlNBY3Rpb25zXCIpO1xuICB9XG4gIGdldFBhZ2VKU0FjdGlvbnMocGFnZUluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUpTQWN0aW9uc1wiLCB7XG4gICAgICBwYWdlSW5kZXhcbiAgICB9KTtcbiAgfVxuICBnZXRTdHJ1Y3RUcmVlKHBhZ2VJbmRleCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFN0cnVjdFRyZWVcIiwge1xuICAgICAgcGFnZUluZGV4XG4gICAgfSk7XG4gIH1cbiAgZ2V0T3V0bGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPdXRsaW5lXCIsIG51bGwpO1xuICB9XG4gIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIHJldHVybiBuZXcgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMl9fLk9wdGlvbmFsQ29udGVudENvbmZpZyhyZXN1bHRzKTtcbiAgICB9KTtcbiAgfVxuICBnZXRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQZXJtaXNzaW9uc1wiLCBudWxsKTtcbiAgfVxuICBnZXRNZXRhZGF0YSgpIHtcbiAgICBjb25zdCBuYW1lID0gXCJHZXRNZXRhZGF0YVwiLFxuICAgICAgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI21ldGhvZFByb21pc2VzLmdldChuYW1lKTtcbiAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShuYW1lLCBudWxsKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5mbzogcmVzdWx0c1swXSxcbiAgICAgICAgbWV0YWRhdGE6IHJlc3VsdHNbMV0gPyBuZXcgX21ldGFkYXRhX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMV9fLk1ldGFkYXRhKHJlc3VsdHNbMV0pIDogbnVsbCxcbiAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXI/LmZpbGVuYW1lID8/IG51bGwsXG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2Z1bGxSZWFkZXI/LmNvbnRlbnRMZW5ndGggPz8gbnVsbFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5zZXQobmFtZSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgZ2V0TWFya0luZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0TWFya0luZm9cIiwgbnVsbCk7XG4gIH1cbiAgYXN5bmMgc3RhcnRDbGVhbnVwKCkge1xuICAgIGxldCBrZWVwTG9hZGVkRm9udHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkNsZWFudXBcIiwgbnVsbCk7XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgY2xlYW51cFN1Y2Nlc3NmdWwgPSBwYWdlLmNsZWFudXAoKTtcbiAgICAgIGlmICghY2xlYW51cFN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdGFydENsZWFudXA6IFBhZ2UgJHtwYWdlLnBhZ2VOdW1iZXJ9IGlzIGN1cnJlbnRseSByZW5kZXJpbmcuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29tbW9uT2Jqcy5jbGVhcigpO1xuICAgIGlmICgha2VlcExvYWRlZEZvbnRzKSB7XG4gICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuY2xlYXIoKTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkuZGVzdHJveSh0cnVlKTtcbiAgfVxuICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlQXV0b0ZldGNoLFxuICAgICAgZW5hYmxlWGZhXG4gICAgfSA9IHRoaXMuX3BhcmFtcztcbiAgICByZXR1cm4gKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLnNoYWRvdykodGhpcywgXCJsb2FkaW5nUGFyYW1zXCIsIHtcbiAgICAgIGRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICBlbmFibGVYZmFcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgUERGT2JqZWN0cyB7XG4gICNvYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgI2Vuc3VyZU9iaihvYmpJZCkge1xuICAgIHJldHVybiB0aGlzLiNvYmpzW29iaklkXSB8fD0ge1xuICAgICAgY2FwYWJpbGl0eTogbmV3IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpLFxuICAgICAgZGF0YTogbnVsbFxuICAgIH07XG4gIH1cbiAgZ2V0KG9iaklkKSB7XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb2JqID0gdGhpcy4jZW5zdXJlT2JqKG9iaklkKTtcbiAgICAgIG9iai5jYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiBjYWxsYmFjayhvYmouZGF0YSkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgIGlmICghb2JqPy5jYXBhYmlsaXR5LnNldHRsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdGluZyBvYmplY3QgdGhhdCBpc24ndCByZXNvbHZlZCB5ZXQgJHtvYmpJZH0uYCk7XG4gICAgfVxuICAgIHJldHVybiBvYmouZGF0YTtcbiAgfVxuICBoYXMob2JqSWQpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLiNvYmpzW29iaklkXTtcbiAgICByZXR1cm4gb2JqPy5jYXBhYmlsaXR5LnNldHRsZWQgPz8gZmFsc2U7XG4gIH1cbiAgcmVzb2x2ZShvYmpJZCkge1xuICAgIGxldCBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuI2Vuc3VyZU9iaihvYmpJZCk7XG4gICAgb2JqLmRhdGEgPSBkYXRhO1xuICAgIG9iai5jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IG9iaklkIGluIHRoaXMuI29ianMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YVxuICAgICAgfSA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgICAgZGF0YT8uYml0bWFwPy5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLiNvYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgZm9yIChjb25zdCBvYmpJZCBpbiB0aGlzLiNvYmpzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNhcGFiaWxpdHksXG4gICAgICAgIGRhdGFcbiAgICAgIH0gPSB0aGlzLiNvYmpzW29iaklkXTtcbiAgICAgIGlmICghY2FwYWJpbGl0eS5zZXR0bGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgeWllbGQgW29iaklkLCBkYXRhXTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFJlbmRlclRhc2sge1xuICAjaW50ZXJuYWxSZW5kZXJUYXNrID0gbnVsbDtcbiAgY29uc3RydWN0b3IoaW50ZXJuYWxSZW5kZXJUYXNrKSB7XG4gICAgdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrO1xuICAgIHRoaXMub25Db250aW51ZSA9IG51bGw7XG4gIH1cbiAgZ2V0IHByb21pc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKCkge1xuICAgIGxldCBleHRyYURlbGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuICAgIHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5jYW5jZWwobnVsbCwgZXh0cmFEZWxheSk7XG4gIH1cbiAgZ2V0IHNlcGFyYXRlQW5ub3RzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlcGFyYXRlQW5ub3RzXG4gICAgfSA9IHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3Q7XG4gICAgaWYgKCFzZXBhcmF0ZUFubm90cykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwXG4gICAgfSA9IHRoaXMuI2ludGVybmFsUmVuZGVyVGFzaztcbiAgICByZXR1cm4gc2VwYXJhdGVBbm5vdHMuZm9ybSB8fCBzZXBhcmF0ZUFubm90cy5jYW52YXMgJiYgYW5ub3RhdGlvbkNhbnZhc01hcD8uc2l6ZSA+IDA7XG4gIH1cbn1cbmNsYXNzIEludGVybmFsUmVuZGVyVGFzayB7XG4gIHN0YXRpYyAjY2FudmFzSW5Vc2UgPSBuZXcgV2Vha1NldCgpO1xuICBjb25zdHJ1Y3RvcihfcmVmMTMpIHtcbiAgICBsZXQge1xuICAgICAgY2FsbGJhY2ssXG4gICAgICBwYXJhbXMsXG4gICAgICBvYmpzLFxuICAgICAgY29tbW9uT2JqcyxcbiAgICAgIGFubm90YXRpb25DYW52YXNNYXAsXG4gICAgICBvcGVyYXRvckxpc3QsXG4gICAgICBwYWdlSW5kZXgsXG4gICAgICBjYW52YXNGYWN0b3J5LFxuICAgICAgZmlsdGVyRmFjdG9yeSxcbiAgICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZhbHNlLFxuICAgICAgcGRmQnVnID0gZmFsc2UsXG4gICAgICBwYWdlQ29sb3JzID0gbnVsbFxuICAgIH0gPSBfcmVmMTM7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMub2JqcyA9IG9ianM7XG4gICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqcztcbiAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhbm5vdGF0aW9uQ2FudmFzTWFwO1xuICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gbnVsbDtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IG9wZXJhdG9yTGlzdDtcbiAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmaWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuX3BkZkJ1ZyA9IHBkZkJ1ZztcbiAgICB0aGlzLnBhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09IHRydWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB0aGlzLmNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTtcbiAgICB0aGlzLl9jYW5jZWxCb3VuZCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQgPSB0aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY2FudmFzID0gcGFyYW1zLmNhbnZhc0NvbnRleHQuY2FudmFzO1xuICB9XG4gIGdldCBjb21wbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgfVxuICBpbml0aWFsaXplR3JhcGhpY3MoX3JlZjE0KSB7XG4gICAgbGV0IHtcbiAgICAgIHRyYW5zcGFyZW5jeSA9IGZhbHNlLFxuICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG4gICAgfSA9IF9yZWYxNDtcbiAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhbnZhcykge1xuICAgICAgaWYgKEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuaGFzKHRoaXMuX2NhbnZhcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFwiICsgXCJVc2UgZGlmZmVyZW50IGNhbnZhcyBvciBlbnN1cmUgcHJldmlvdXMgb3BlcmF0aW9ucyB3ZXJlIFwiICsgXCJjYW5jZWxsZWQgb3IgY29tcGxldGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuYWRkKHRoaXMuX2NhbnZhcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wZGZCdWcgJiYgZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlcj8uZW5hYmxlZCkge1xuICAgICAgdGhpcy5zdGVwcGVyID0gZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5jcmVhdGUodGhpcy5fcGFnZUluZGV4KTtcbiAgICAgIHRoaXMuc3RlcHBlci5pbml0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICAgIHRoaXMuc3RlcHBlci5uZXh0QnJlYWtQb2ludCA9IHRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjYW52YXNDb250ZXh0LFxuICAgICAgdmlld3BvcnQsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICBiYWNrZ3JvdW5kXG4gICAgfSA9IHRoaXMucGFyYW1zO1xuICAgIHRoaXMuZ2Z4ID0gbmV3IF9jYW52YXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI4X18uQ2FudmFzR3JhcGhpY3MoY2FudmFzQ29udGV4dCwgdGhpcy5jb21tb25PYmpzLCB0aGlzLm9ianMsIHRoaXMuY2FudmFzRmFjdG9yeSwgdGhpcy5maWx0ZXJGYWN0b3J5LCB7XG4gICAgICBvcHRpb25hbENvbnRlbnRDb25maWdcbiAgICB9LCB0aGlzLmFubm90YXRpb25DYW52YXNNYXAsIHRoaXMucGFnZUNvbG9ycyk7XG4gICAgdGhpcy5nZnguYmVnaW5EcmF3aW5nKHtcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgdHJhbnNwYXJlbmN5LFxuICAgICAgYmFja2dyb3VuZFxuICAgIH0pO1xuICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gMDtcbiAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSB0cnVlO1xuICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrPy4oKTtcbiAgfVxuICBjYW5jZWwoKSB7XG4gICAgbGV0IGVycm9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgIGxldCBleHRyYURlbGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmdmeD8uZW5kRHJhd2luZygpO1xuICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuZGVsZXRlKHRoaXMuX2NhbnZhcyk7XG4gICAgdGhpcy5jYWxsYmFjayhlcnJvciB8fCBuZXcgX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18uUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKGBSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICR7dGhpcy5fcGFnZUluZGV4ICsgMX1gLCBleHRyYURlbGF5KSk7XG4gIH1cbiAgb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHtcbiAgICBpZiAoIXRoaXMuZ3JhcGhpY3NSZWFkeSkge1xuICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgfHw9IHRoaXMuX2NvbnRpbnVlQm91bmQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RlcHBlcj8udXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NvbnRpbnVlKCk7XG4gIH1cbiAgX2NvbnRpbnVlKCkge1xuICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnRhc2sub25Db250aW51ZSkge1xuICAgICAgdGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zY2hlZHVsZU5leHQoKTtcbiAgICB9XG4gIH1cbiAgX3NjaGVkdWxlTmV4dCgpIHtcbiAgICBpZiAodGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbmV4dEJvdW5kKCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fbmV4dEJvdW5kKS5jYXRjaCh0aGlzLl9jYW5jZWxCb3VuZCk7XG4gICAgfVxuICB9XG4gIGFzeW5jIF9uZXh0KCkge1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IHRoaXMuZ2Z4LmV4ZWN1dGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QsIHRoaXMub3BlcmF0b3JMaXN0SWR4LCB0aGlzLl9jb250aW51ZUJvdW5kLCB0aGlzLnN0ZXBwZXIpO1xuICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdElkeCA9PT0gdGhpcy5vcGVyYXRvckxpc3QuYXJnc0FycmF5Lmxlbmd0aCkge1xuICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgIHRoaXMuZ2Z4LmVuZERyYXdpbmcoKTtcbiAgICAgICAgSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5kZWxldGUodGhpcy5fY2FudmFzKTtcbiAgICAgICAgdGhpcy5jYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgdmVyc2lvbiA9ICc0LjAuMzc5JztcbmNvbnN0IGJ1aWxkID0gJzllMTRkMDRmZCc7XG5cbl9fd2VicGFja19hc3luY19yZXN1bHRfXygpO1xufSBjYXRjaChlKSB7IF9fd2VicGFja19hc3luY19yZXN1bHRfXyhlKTsgfSB9KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDY4MjI6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEJhc2VDTWFwUmVhZGVyRmFjdG9yeTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gQmFzZUNNYXBSZWFkZXJGYWN0b3J5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQmFzZUNhbnZhc0ZhY3Rvcnk6ICgpID0+ICgvKiBiaW5kaW5nICovIEJhc2VDYW52YXNGYWN0b3J5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQmFzZUZpbHRlckZhY3Rvcnk6ICgpID0+ICgvKiBiaW5kaW5nICovIEJhc2VGaWx0ZXJGYWN0b3J5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQmFzZVNWR0ZhY3Rvcnk6ICgpID0+ICgvKiBiaW5kaW5nICovIEJhc2VTVkdGYWN0b3J5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5OiAoKSA9PiAoLyogYmluZGluZyAqLyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkpXG4vKiBoYXJtb255IGV4cG9ydCAqLyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfZXJyb3JfY2F1c2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzM1Mik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuXG5cbmNsYXNzIEJhc2VGaWx0ZXJGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VGaWx0ZXJGYWN0b3J5KSB7XG4gICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRmlsdGVyRmFjdG9yeS5cIik7XG4gICAgfVxuICB9XG4gIGFkZEZpbHRlcihtYXBzKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGFkZEhDTUZpbHRlcihmZ0NvbG9yLCBiZ0NvbG9yKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGFkZEhpZ2hsaWdodEhDTUZpbHRlcihmZ0NvbG9yLCBiZ0NvbG9yLCBuZXdGZ0NvbG9yLCBuZXdCZ0NvbG9yKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgbGV0IGtlZXBIQ00gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICB9XG59XG5jbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ2FudmFzRmFjdG9yeSkge1xuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18udW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNhbnZhc0ZhY3RvcnkuXCIpO1xuICAgIH1cbiAgfVxuICBjcmVhdGUod2lkdGgsIGhlaWdodCkge1xuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgIH1cbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhcyxcbiAgICAgIGNvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIilcbiAgICB9O1xuICB9XG4gIHJlc2V0KGNhbnZhc0FuZENvbnRleHQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW52YXMgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgfVxuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG4gIGRlc3Ryb3koY2FudmFzQW5kQ29udGV4dCkge1xuICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkXCIpO1xuICAgIH1cbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IDA7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcyA9IG51bGw7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jb250ZXh0ID0gbnVsbDtcbiAgfVxuICBfY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVDYW52YXNgIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgYmFzZVVybCA9IG51bGwsXG4gICAgICBpc0NvbXByZXNzZWQgPSB0cnVlXG4gICAgfSA9IF9yZWY7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDTWFwUmVhZGVyRmFjdG9yeSkge1xuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18udW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LlwiKTtcbiAgICB9XG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcbiAgICB0aGlzLmlzQ29tcHJlc3NlZCA9IGlzQ29tcHJlc3NlZDtcbiAgfVxuICBhc3luYyBmZXRjaChfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBuYW1lXG4gICAgfSA9IF9yZWYyO1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwIFwiYmFzZVVybFwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgXCJjTWFwVXJsXCIgYW5kIFwiY01hcFBhY2tlZFwiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTtcbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDTWFwIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VVcmwgKyBuYW1lICsgKHRoaXMuaXNDb21wcmVzc2VkID8gXCIuYmNtYXBcIiA6IFwiXCIpO1xuICAgIGNvbnN0IGNvbXByZXNzaW9uVHlwZSA9IHRoaXMuaXNDb21wcmVzc2VkID8gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkgOiBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkU7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgJHt0aGlzLmlzQ29tcHJlc3NlZCA/IFwiYmluYXJ5IFwiIDogXCJcIn1DTWFwIGF0OiAke3VybH1gKTtcbiAgICB9KTtcbiAgfVxuICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG4gICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18udW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuXCIpO1xuICB9XG59XG5jbGFzcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICBjb25zdHJ1Y3RvcihfcmVmMykge1xuICAgIGxldCB7XG4gICAgICBiYXNlVXJsID0gbnVsbFxuICAgIH0gPSBfcmVmMztcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5KSB7XG4gICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkuXCIpO1xuICAgIH1cbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICB9XG4gIGFzeW5jIGZldGNoKF9yZWY0KSB7XG4gICAgbGV0IHtcbiAgICAgIGZpbGVuYW1lXG4gICAgfSA9IF9yZWY0O1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdGFuZGFyZCBmb250IFwiYmFzZVVybFwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgXCJzdGFuZGFyZEZvbnREYXRhVXJsXCIgQVBJIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtcbiAgICB9XG4gICAgaWYgKCFmaWxlbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRm9udCBmaWxlbmFtZSBtdXN0IGJlIHNwZWNpZmllZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYmFzZVVybH0ke2ZpbGVuYW1lfWA7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwpLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZvbnQgZGF0YSBhdDogJHt1cmx9YCk7XG4gICAgfSk7XG4gIH1cbiAgX2ZldGNoRGF0YSh1cmwpIHtcbiAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIEJhc2VTVkdGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTVkdGYWN0b3J5KSB7XG4gICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU1ZHRmFjdG9yeS5cIik7XG4gICAgfVxuICB9XG4gIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgbGV0IHNraXBEaW1lbnNpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBTVkcgZGltZW5zaW9uc1wiKTtcbiAgICB9XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5fY3JlYXRlU1ZHKFwic3ZnOnN2Z1wiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgICBpZiAoIXNraXBEaW1lbnNpb25zKSB7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGh9cHhgKTtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0fXB4YCk7XG4gICAgfVxuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsIFwibm9uZVwiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICAgIHJldHVybiBzdmc7XG4gIH1cbiAgY3JlYXRlRWxlbWVudCh0eXBlKSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGVcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVTVkcodHlwZSk7XG4gIH1cbiAgX2NyZWF0ZVNWRyh0eXBlKSB7XG4gICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18udW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlU1ZHYCBjYWxsZWQuXCIpO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEyNTA6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuLy8gRVhQT1JUU1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbiAgQ2FudmFzR3JhcGhpY3M6ICgpID0+ICgvKiBiaW5kaW5nICovIENhbnZhc0dyYXBoaWNzKVxufSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzXG52YXIgZXNfZXJyb3JfY2F1c2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzNTIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzXG52YXIgZXNfdHlwZWRfYXJyYXlfZmluZF9sYXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODM3KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQtbGFzdC1pbmRleC5qc1xudmFyIGVzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oOTgwMyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanNcbnZhciBlc190eXBlZF9hcnJheV9zZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNDcpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tcmV2ZXJzZWQuanNcbnZhciBlc190eXBlZF9hcnJheV90b19yZXZlcnNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzk5NSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanNcbnZhciBlc190eXBlZF9hcnJheV90b19zb3J0ZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanNcbnZhciBlc190eXBlZF9hcnJheV93aXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjAyKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hcnJheS1idWZmZXIuZGV0YWNoZWQuanNcbnZhciBlc25leHRfYXJyYXlfYnVmZmVyX2RldGFjaGVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNDQpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFycmF5LWJ1ZmZlci50cmFuc2Zlci5qc1xudmFyIGVzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzMDUpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFycmF5LWJ1ZmZlci50cmFuc2Zlci10by1maXhlZC1sZW5ndGguanNcbnZhciBlc25leHRfYXJyYXlfYnVmZmVyX3RyYW5zZmVyX3RvX2ZpeGVkX2xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzU4Myk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanNcbnZhciBlc25leHRfaXRlcmF0b3JfY29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxMjEpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qc1xudmFyIGVzbmV4dF9pdGVyYXRvcl9maWx0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5OTMpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qc1xudmFyIGVzX2FycmF5X3B1c2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMjYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLm1hcC5qc1xudmFyIGVzbmV4dF9pdGVyYXRvcl9tYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5NDQpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9zaGFyZWQvdXRpbC5qc1xudmFyIHV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcbnZhciBkaXNwbGF5X3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzMpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvcGF0dGVybl9oZWxwZXIuanNcblxuXG5cbmNvbnN0IFBhdGhUeXBlID0ge1xuICBGSUxMOiBcIkZpbGxcIixcbiAgU1RST0tFOiBcIlN0cm9rZVwiLFxuICBTSEFESU5HOiBcIlNoYWRpbmdcIlxufTtcbmZ1bmN0aW9uIGFwcGx5Qm91bmRpbmdCb3goY3R4LCBiYm94KSB7XG4gIGlmICghYmJveCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcbiAgY29uc3QgcmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICByZWdpb24ucmVjdChiYm94WzBdLCBiYm94WzFdLCB3aWR0aCwgaGVpZ2h0KTtcbiAgY3R4LmNsaXAocmVnaW9uKTtcbn1cbmNsYXNzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU2hhZGluZ1BhdHRlcm4pIHtcbiAgICAgICgwLHV0aWwudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmdQYXR0ZXJuLlwiKTtcbiAgICB9XG4gIH1cbiAgZ2V0UGF0dGVybigpIHtcbiAgICAoMCx1dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgZ2V0UGF0dGVybmAgY2FsbGVkLlwiKTtcbiAgfVxufVxuY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gIGNvbnN0cnVjdG9yKElSKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl90eXBlID0gSVJbMV07XG4gICAgdGhpcy5fYmJveCA9IElSWzJdO1xuICAgIHRoaXMuX2NvbG9yU3RvcHMgPSBJUlszXTtcbiAgICB0aGlzLl9wMCA9IElSWzRdO1xuICAgIHRoaXMuX3AxID0gSVJbNV07XG4gICAgdGhpcy5fcjAgPSBJUls2XTtcbiAgICB0aGlzLl9yMSA9IElSWzddO1xuICAgIHRoaXMubWF0cml4ID0gbnVsbDtcbiAgfVxuICBfY3JlYXRlR3JhZGllbnQoY3R4KSB7XG4gICAgbGV0IGdyYWQ7XG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IFwiYXhpYWxcIikge1xuICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBcInJhZGlhbFwiKSB7XG4gICAgICBncmFkID0gY3R4LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHRoaXMuX3AwWzBdLCB0aGlzLl9wMFsxXSwgdGhpcy5fcjAsIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSwgdGhpcy5fcjEpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbG9yU3RvcCBvZiB0aGlzLl9jb2xvclN0b3BzKSB7XG4gICAgICBncmFkLmFkZENvbG9yU3RvcChjb2xvclN0b3BbMF0sIGNvbG9yU3RvcFsxXSk7XG4gICAgfVxuICAgIHJldHVybiBncmFkO1xuICB9XG4gIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcbiAgICBsZXQgcGF0dGVybjtcbiAgICBpZiAocGF0aFR5cGUgPT09IFBhdGhUeXBlLlNUUk9LRSB8fCBwYXRoVHlwZSA9PT0gUGF0aFR5cGUuRklMTCkge1xuICAgICAgY29uc3Qgb3duZXJCQm94ID0gb3duZXIuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlLCAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCkpIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKG93bmVyQkJveFsyXSAtIG93bmVyQkJveFswXSkgfHwgMTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbChvd25lckJCb3hbM10gLSBvd25lckJCb3hbMV0pIHx8IDE7XG4gICAgICBjb25zdCB0bXBDYW52YXMgPSBvd25lci5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIHRtcEN0eC5jYW52YXMud2lkdGgsIHRtcEN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIHRtcEN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHRtcEN0eC5yZWN0KDAsIDAsIHRtcEN0eC5jYW52YXMud2lkdGgsIHRtcEN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIHRtcEN0eC50cmFuc2xhdGUoLW93bmVyQkJveFswXSwgLW93bmVyQkJveFsxXSk7XG4gICAgICBpbnZlcnNlID0gdXRpbC5VdGlsLnRyYW5zZm9ybShpbnZlcnNlLCBbMSwgMCwgMCwgMSwgb3duZXJCQm94WzBdLCBvd25lckJCb3hbMV1dKTtcbiAgICAgIHRtcEN0eC50cmFuc2Zvcm0oLi4ub3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgdG1wQ3R4LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG4gICAgICB9XG4gICAgICBhcHBseUJvdW5kaW5nQm94KHRtcEN0eCwgdGhpcy5fYmJveCk7XG4gICAgICB0bXBDdHguZmlsbFN0eWxlID0gdGhpcy5fY3JlYXRlR3JhZGllbnQodG1wQ3R4KTtcbiAgICAgIHRtcEN0eC5maWxsKCk7XG4gICAgICBwYXR0ZXJuID0gY3R4LmNyZWF0ZVBhdHRlcm4odG1wQ2FudmFzLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gICAgICBjb25zdCBkb21NYXRyaXggPSBuZXcgRE9NTWF0cml4KGludmVyc2UpO1xuICAgICAgcGF0dGVybi5zZXRUcmFuc2Zvcm0oZG9tTWF0cml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIHRoaXMuX2Jib3gpO1xuICAgICAgcGF0dGVybiA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KGN0eCk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG59XG5mdW5jdGlvbiBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcDEsIHAyLCBwMywgYzEsIGMyLCBjMykge1xuICBjb25zdCBjb29yZHMgPSBjb250ZXh0LmNvb3JkcyxcbiAgICBjb2xvcnMgPSBjb250ZXh0LmNvbG9ycztcbiAgY29uc3QgYnl0ZXMgPSBkYXRhLmRhdGEsXG4gICAgcm93U2l6ZSA9IGRhdGEud2lkdGggKiA0O1xuICBsZXQgdG1wO1xuICBpZiAoY29vcmRzW3AxICsgMV0gPiBjb29yZHNbcDIgKyAxXSkge1xuICAgIHRtcCA9IHAxO1xuICAgIHAxID0gcDI7XG4gICAgcDIgPSB0bXA7XG4gICAgdG1wID0gYzE7XG4gICAgYzEgPSBjMjtcbiAgICBjMiA9IHRtcDtcbiAgfVxuICBpZiAoY29vcmRzW3AyICsgMV0gPiBjb29yZHNbcDMgKyAxXSkge1xuICAgIHRtcCA9IHAyO1xuICAgIHAyID0gcDM7XG4gICAgcDMgPSB0bXA7XG4gICAgdG1wID0gYzI7XG4gICAgYzIgPSBjMztcbiAgICBjMyA9IHRtcDtcbiAgfVxuICBpZiAoY29vcmRzW3AxICsgMV0gPiBjb29yZHNbcDIgKyAxXSkge1xuICAgIHRtcCA9IHAxO1xuICAgIHAxID0gcDI7XG4gICAgcDIgPSB0bXA7XG4gICAgdG1wID0gYzE7XG4gICAgYzEgPSBjMjtcbiAgICBjMiA9IHRtcDtcbiAgfVxuICBjb25zdCB4MSA9IChjb29yZHNbcDFdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuICBjb25zdCB5MSA9IChjb29yZHNbcDEgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcbiAgY29uc3QgeDIgPSAoY29vcmRzW3AyXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcbiAgY29uc3QgeTIgPSAoY29vcmRzW3AyICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG4gIGNvbnN0IHgzID0gKGNvb3Jkc1twM10gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG4gIGNvbnN0IHkzID0gKGNvb3Jkc1twMyArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuICBpZiAoeTEgPj0geTMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYzFyID0gY29sb3JzW2MxXSxcbiAgICBjMWcgPSBjb2xvcnNbYzEgKyAxXSxcbiAgICBjMWIgPSBjb2xvcnNbYzEgKyAyXTtcbiAgY29uc3QgYzJyID0gY29sb3JzW2MyXSxcbiAgICBjMmcgPSBjb2xvcnNbYzIgKyAxXSxcbiAgICBjMmIgPSBjb2xvcnNbYzIgKyAyXTtcbiAgY29uc3QgYzNyID0gY29sb3JzW2MzXSxcbiAgICBjM2cgPSBjb2xvcnNbYzMgKyAxXSxcbiAgICBjM2IgPSBjb2xvcnNbYzMgKyAyXTtcbiAgY29uc3QgbWluWSA9IE1hdGgucm91bmQoeTEpLFxuICAgIG1heFkgPSBNYXRoLnJvdW5kKHkzKTtcbiAgbGV0IHhhLCBjYXIsIGNhZywgY2FiO1xuICBsZXQgeGIsIGNiciwgY2JnLCBjYmI7XG4gIGZvciAobGV0IHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykge1xuICAgIGlmICh5IDwgeTIpIHtcbiAgICAgIGNvbnN0IGsgPSB5IDwgeTEgPyAwIDogKHkxIC0geSkgLyAoeTEgLSB5Mik7XG4gICAgICB4YSA9IHgxIC0gKHgxIC0geDIpICogaztcbiAgICAgIGNhciA9IGMxciAtIChjMXIgLSBjMnIpICogaztcbiAgICAgIGNhZyA9IGMxZyAtIChjMWcgLSBjMmcpICogaztcbiAgICAgIGNhYiA9IGMxYiAtIChjMWIgLSBjMmIpICogaztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGs7XG4gICAgICBpZiAoeSA+IHkzKSB7XG4gICAgICAgIGsgPSAxO1xuICAgICAgfSBlbHNlIGlmICh5MiA9PT0geTMpIHtcbiAgICAgICAgayA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrID0gKHkyIC0geSkgLyAoeTIgLSB5Myk7XG4gICAgICB9XG4gICAgICB4YSA9IHgyIC0gKHgyIC0geDMpICogaztcbiAgICAgIGNhciA9IGMyciAtIChjMnIgLSBjM3IpICogaztcbiAgICAgIGNhZyA9IGMyZyAtIChjMmcgLSBjM2cpICogaztcbiAgICAgIGNhYiA9IGMyYiAtIChjMmIgLSBjM2IpICogaztcbiAgICB9XG4gICAgbGV0IGs7XG4gICAgaWYgKHkgPCB5MSkge1xuICAgICAgayA9IDA7XG4gICAgfSBlbHNlIGlmICh5ID4geTMpIHtcbiAgICAgIGsgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Myk7XG4gICAgfVxuICAgIHhiID0geDEgLSAoeDEgLSB4MykgKiBrO1xuICAgIGNiciA9IGMxciAtIChjMXIgLSBjM3IpICogaztcbiAgICBjYmcgPSBjMWcgLSAoYzFnIC0gYzNnKSAqIGs7XG4gICAgY2JiID0gYzFiIC0gKGMxYiAtIGMzYikgKiBrO1xuICAgIGNvbnN0IHgxXyA9IE1hdGgucm91bmQoTWF0aC5taW4oeGEsIHhiKSk7XG4gICAgY29uc3QgeDJfID0gTWF0aC5yb3VuZChNYXRoLm1heCh4YSwgeGIpKTtcbiAgICBsZXQgaiA9IHJvd1NpemUgKiB5ICsgeDFfICogNDtcbiAgICBmb3IgKGxldCB4ID0geDFfOyB4IDw9IHgyXzsgeCsrKSB7XG4gICAgICBrID0gKHhhIC0geCkgLyAoeGEgLSB4Yik7XG4gICAgICBpZiAoayA8IDApIHtcbiAgICAgICAgayA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGsgPiAxKSB7XG4gICAgICAgIGsgPSAxO1xuICAgICAgfVxuICAgICAgYnl0ZXNbaisrXSA9IGNhciAtIChjYXIgLSBjYnIpICogayB8IDA7XG4gICAgICBieXRlc1tqKytdID0gY2FnIC0gKGNhZyAtIGNiZykgKiBrIHwgMDtcbiAgICAgIGJ5dGVzW2orK10gPSBjYWIgLSAoY2FiIC0gY2JiKSAqIGsgfCAwO1xuICAgICAgYnl0ZXNbaisrXSA9IDI1NTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRyYXdGaWd1cmUoZGF0YSwgZmlndXJlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHBzID0gZmlndXJlLmNvb3JkcztcbiAgY29uc3QgY3MgPSBmaWd1cmUuY29sb3JzO1xuICBsZXQgaSwgaWk7XG4gIHN3aXRjaCAoZmlndXJlLnR5cGUpIHtcbiAgICBjYXNlIFwibGF0dGljZVwiOlxuICAgICAgY29uc3QgdmVydGljZXNQZXJSb3cgPSBmaWd1cmUudmVydGljZXNQZXJSb3c7XG4gICAgICBjb25zdCByb3dzID0gTWF0aC5mbG9vcihwcy5sZW5ndGggLyB2ZXJ0aWNlc1BlclJvdykgLSAxO1xuICAgICAgY29uc3QgY29scyA9IHZlcnRpY2VzUGVyUm93IC0gMTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgICAgbGV0IHEgPSBpICogdmVydGljZXNQZXJSb3c7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrLCBxKyspIHtcbiAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbcV0sIHBzW3EgKyAxXSwgcHNbcSArIHZlcnRpY2VzUGVyUm93XSwgY3NbcV0sIGNzW3EgKyAxXSwgY3NbcSArIHZlcnRpY2VzUGVyUm93XSk7XG4gICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidHJpYW5nbGVzXCI6XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IHBzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHtcbiAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW2ldLCBwc1tpICsgMV0sIHBzW2kgKyAyXSwgY3NbaV0sIGNzW2kgKyAxXSwgY3NbaSArIDJdKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGZpZ3VyZVwiKTtcbiAgfVxufVxuY2xhc3MgTWVzaFNoYWRpbmdQYXR0ZXJuIGV4dGVuZHMgQmFzZVNoYWRpbmdQYXR0ZXJuIHtcbiAgY29uc3RydWN0b3IoSVIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2Nvb3JkcyA9IElSWzJdO1xuICAgIHRoaXMuX2NvbG9ycyA9IElSWzNdO1xuICAgIHRoaXMuX2ZpZ3VyZXMgPSBJUls0XTtcbiAgICB0aGlzLl9ib3VuZHMgPSBJUls1XTtcbiAgICB0aGlzLl9iYm94ID0gSVJbN107XG4gICAgdGhpcy5fYmFja2dyb3VuZCA9IElSWzhdO1xuICAgIHRoaXMubWF0cml4ID0gbnVsbDtcbiAgfVxuICBfY3JlYXRlTWVzaENhbnZhcyhjb21iaW5lZFNjYWxlLCBiYWNrZ3JvdW5kQ29sb3IsIGNhY2hlZENhbnZhc2VzKSB7XG4gICAgY29uc3QgRVhQRUNURURfU0NBTEUgPSAxLjE7XG4gICAgY29uc3QgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7XG4gICAgY29uc3QgQk9SREVSX1NJWkUgPSAyO1xuICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLmZsb29yKHRoaXMuX2JvdW5kc1swXSk7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IodGhpcy5fYm91bmRzWzFdKTtcbiAgICBjb25zdCBib3VuZHNXaWR0aCA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbMl0pIC0gb2Zmc2V0WDtcbiAgICBjb25zdCBib3VuZHNIZWlnaHQgPSBNYXRoLmNlaWwodGhpcy5fYm91bmRzWzNdKSAtIG9mZnNldFk7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzV2lkdGggKiBjb21iaW5lZFNjYWxlWzBdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGJvdW5kc0hlaWdodCAqIGNvbWJpbmVkU2NhbGVbMV0gKiBFWFBFQ1RFRF9TQ0FMRSkpLCBNQVhfUEFUVEVSTl9TSVpFKTtcbiAgICBjb25zdCBzY2FsZVggPSBib3VuZHNXaWR0aCAvIHdpZHRoO1xuICAgIGNvbnN0IHNjYWxlWSA9IGJvdW5kc0hlaWdodCAvIGhlaWdodDtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgY29vcmRzOiB0aGlzLl9jb29yZHMsXG4gICAgICBjb2xvcnM6IHRoaXMuX2NvbG9ycyxcbiAgICAgIG9mZnNldFg6IC1vZmZzZXRYLFxuICAgICAgb2Zmc2V0WTogLW9mZnNldFksXG4gICAgICBzY2FsZVg6IDEgLyBzY2FsZVgsXG4gICAgICBzY2FsZVk6IDEgLyBzY2FsZVlcbiAgICB9O1xuICAgIGNvbnN0IHBhZGRlZFdpZHRoID0gd2lkdGggKyBCT1JERVJfU0laRSAqIDI7XG4gICAgY29uc3QgcGFkZGVkSGVpZ2h0ID0gaGVpZ2h0ICsgQk9SREVSX1NJWkUgKiAyO1xuICAgIGNvbnN0IHRtcENhbnZhcyA9IGNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1lc2hcIiwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgZmFsc2UpO1xuICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgIGNvbnN0IGRhdGEgPSB0bXBDdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gZGF0YS5kYXRhO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgICAgICBieXRlc1tpXSA9IGJhY2tncm91bmRDb2xvclswXTtcbiAgICAgICAgYnl0ZXNbaSArIDFdID0gYmFja2dyb3VuZENvbG9yWzFdO1xuICAgICAgICBieXRlc1tpICsgMl0gPSBiYWNrZ3JvdW5kQ29sb3JbMl07XG4gICAgICAgIGJ5dGVzW2kgKyAzXSA9IDI1NTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWd1cmUgb2YgdGhpcy5fZmlndXJlcykge1xuICAgICAgZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmUsIGNvbnRleHQpO1xuICAgIH1cbiAgICB0bXBDdHgucHV0SW1hZ2VEYXRhKGRhdGEsIEJPUkRFUl9TSVpFLCBCT1JERVJfU0laRSk7XG4gICAgY29uc3QgY2FudmFzID0gdG1wQ2FudmFzLmNhbnZhcztcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzLFxuICAgICAgb2Zmc2V0WDogb2Zmc2V0WCAtIEJPUkRFUl9TSVpFICogc2NhbGVYLFxuICAgICAgb2Zmc2V0WTogb2Zmc2V0WSAtIEJPUkRFUl9TSVpFICogc2NhbGVZLFxuICAgICAgc2NhbGVYLFxuICAgICAgc2NhbGVZXG4gICAgfTtcbiAgfVxuICBnZXRQYXR0ZXJuKGN0eCwgb3duZXIsIGludmVyc2UsIHBhdGhUeXBlKSB7XG4gICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIHRoaXMuX2Jib3gpO1xuICAgIGxldCBzY2FsZTtcbiAgICBpZiAocGF0aFR5cGUgPT09IFBhdGhUeXBlLlNIQURJTkcpIHtcbiAgICAgIHNjYWxlID0gdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKCgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlID0gdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG93bmVyLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG4gICAgICAgIGNvbnN0IG1hdHJpeFNjYWxlID0gdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KTtcbiAgICAgICAgc2NhbGUgPSBbc2NhbGVbMF0gKiBtYXRyaXhTY2FsZVswXSwgc2NhbGVbMV0gKiBtYXRyaXhTY2FsZVsxXV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLl9jcmVhdGVNZXNoQ2FudmFzKHNjYWxlLCBwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU0hBRElORyA/IG51bGwgOiB0aGlzLl9iYWNrZ3JvdW5kLCBvd25lci5jYWNoZWRDYW52YXNlcyk7XG4gICAgaWYgKHBhdGhUeXBlICE9PSBQYXRoVHlwZS5TSEFESU5HKSB7XG4gICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLm93bmVyLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG4gICAgICAgIGN0eC50cmFuc2Zvcm0oLi4udGhpcy5tYXRyaXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTtcbiAgICBjdHguc2NhbGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVgsIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVZKTtcbiAgICByZXR1cm4gY3R4LmNyZWF0ZVBhdHRlcm4odGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5jYW52YXMsIFwibm8tcmVwZWF0XCIpO1xuICB9XG59XG5jbGFzcyBEdW1teVNoYWRpbmdQYXR0ZXJuIGV4dGVuZHMgQmFzZVNoYWRpbmdQYXR0ZXJuIHtcbiAgZ2V0UGF0dGVybigpIHtcbiAgICByZXR1cm4gXCJob3RwaW5rXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFNoYWRpbmdQYXR0ZXJuKElSKSB7XG4gIHN3aXRjaCAoSVJbMF0pIHtcbiAgICBjYXNlIFwiUmFkaWFsQXhpYWxcIjpcbiAgICAgIHJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybihJUik7XG4gICAgY2FzZSBcIk1lc2hcIjpcbiAgICAgIHJldHVybiBuZXcgTWVzaFNoYWRpbmdQYXR0ZXJuKElSKTtcbiAgICBjYXNlIFwiRHVtbXlcIjpcbiAgICAgIHJldHVybiBuZXcgRHVtbXlTaGFkaW5nUGF0dGVybigpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBJUiB0eXBlOiAke0lSWzBdfWApO1xufVxuY29uc3QgUGFpbnRUeXBlID0ge1xuICBDT0xPUkVEOiAxLFxuICBVTkNPTE9SRUQ6IDJcbn07XG5jbGFzcyBUaWxpbmdQYXR0ZXJuIHtcbiAgc3RhdGljIE1BWF9QQVRURVJOX1NJWkUgPSAzMDAwO1xuICBjb25zdHJ1Y3RvcihJUiwgY29sb3IsIGN0eCwgY2FudmFzR3JhcGhpY3NGYWN0b3J5LCBiYXNlVHJhbnNmb3JtKSB7XG4gICAgdGhpcy5vcGVyYXRvckxpc3QgPSBJUlsyXTtcbiAgICB0aGlzLm1hdHJpeCA9IElSWzNdIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICB0aGlzLmJib3ggPSBJUls0XTtcbiAgICB0aGlzLnhzdGVwID0gSVJbNV07XG4gICAgdGhpcy55c3RlcCA9IElSWzZdO1xuICAgIHRoaXMucGFpbnRUeXBlID0gSVJbN107XG4gICAgdGhpcy50aWxpbmdUeXBlID0gSVJbOF07XG4gICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIHRoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5O1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IGJhc2VUcmFuc2Zvcm07XG4gIH1cbiAgY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcikge1xuICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IHRoaXMub3BlcmF0b3JMaXN0O1xuICAgIGNvbnN0IGJib3ggPSB0aGlzLmJib3g7XG4gICAgY29uc3QgeHN0ZXAgPSB0aGlzLnhzdGVwO1xuICAgIGNvbnN0IHlzdGVwID0gdGhpcy55c3RlcDtcbiAgICBjb25zdCBwYWludFR5cGUgPSB0aGlzLnBhaW50VHlwZTtcbiAgICBjb25zdCB0aWxpbmdUeXBlID0gdGhpcy50aWxpbmdUeXBlO1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICBjb25zdCBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcbiAgICAoMCx1dGlsLmluZm8pKFwiVGlsaW5nVHlwZTogXCIgKyB0aWxpbmdUeXBlKTtcbiAgICBjb25zdCB4MCA9IGJib3hbMF0sXG4gICAgICB5MCA9IGJib3hbMV0sXG4gICAgICB4MSA9IGJib3hbMl0sXG4gICAgICB5MSA9IGJib3hbM107XG4gICAgY29uc3QgbWF0cml4U2NhbGUgPSB1dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5tYXRyaXgpO1xuICAgIGNvbnN0IGN1ck1hdHJpeFNjYWxlID0gdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgY29uc3QgY29tYmluZWRTY2FsZSA9IFttYXRyaXhTY2FsZVswXSAqIGN1ck1hdHJpeFNjYWxlWzBdLCBtYXRyaXhTY2FsZVsxXSAqIGN1ck1hdHJpeFNjYWxlWzFdXTtcbiAgICBjb25zdCBkaW14ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoeHN0ZXAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgY29tYmluZWRTY2FsZVswXSk7XG4gICAgY29uc3QgZGlteSA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKHlzdGVwLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0LCBjb21iaW5lZFNjYWxlWzFdKTtcbiAgICBjb25zdCB0bXBDYW52YXMgPSBvd25lci5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIGRpbXguc2l6ZSwgZGlteS5zaXplLCB0cnVlKTtcbiAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICBjb25zdCBncmFwaGljcyA9IGNhbnZhc0dyYXBoaWNzRmFjdG9yeS5jcmVhdGVDYW52YXNHcmFwaGljcyh0bXBDdHgpO1xuICAgIGdyYXBoaWNzLmdyb3VwTGV2ZWwgPSBvd25lci5ncm91cExldmVsO1xuICAgIHRoaXMuc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKTtcbiAgICBsZXQgYWRqdXN0ZWRYMCA9IHgwO1xuICAgIGxldCBhZGp1c3RlZFkwID0geTA7XG4gICAgbGV0IGFkanVzdGVkWDEgPSB4MTtcbiAgICBsZXQgYWRqdXN0ZWRZMSA9IHkxO1xuICAgIGlmICh4MCA8IDApIHtcbiAgICAgIGFkanVzdGVkWDAgPSAwO1xuICAgICAgYWRqdXN0ZWRYMSArPSBNYXRoLmFicyh4MCk7XG4gICAgfVxuICAgIGlmICh5MCA8IDApIHtcbiAgICAgIGFkanVzdGVkWTAgPSAwO1xuICAgICAgYWRqdXN0ZWRZMSArPSBNYXRoLmFicyh5MCk7XG4gICAgfVxuICAgIHRtcEN0eC50cmFuc2xhdGUoLShkaW14LnNjYWxlICogYWRqdXN0ZWRYMCksIC0oZGlteS5zY2FsZSAqIGFkanVzdGVkWTApKTtcbiAgICBncmFwaGljcy50cmFuc2Zvcm0oZGlteC5zY2FsZSwgMCwgMCwgZGlteS5zY2FsZSwgMCwgMCk7XG4gICAgdG1wQ3R4LnNhdmUoKTtcbiAgICB0aGlzLmNsaXBCYm94KGdyYXBoaWNzLCBhZGp1c3RlZFgwLCBhZGp1c3RlZFkwLCBhZGp1c3RlZFgxLCBhZGp1c3RlZFkxKTtcbiAgICBncmFwaGljcy5iYXNlVHJhbnNmb3JtID0gKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShncmFwaGljcy5jdHgpO1xuICAgIGdyYXBoaWNzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTtcbiAgICBncmFwaGljcy5lbmREcmF3aW5nKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhczogdG1wQ2FudmFzLmNhbnZhcyxcbiAgICAgIHNjYWxlWDogZGlteC5zY2FsZSxcbiAgICAgIHNjYWxlWTogZGlteS5zY2FsZSxcbiAgICAgIG9mZnNldFg6IGFkanVzdGVkWDAsXG4gICAgICBvZmZzZXRZOiBhZGp1c3RlZFkwXG4gICAgfTtcbiAgfVxuICBnZXRTaXplQW5kU2NhbGUoc3RlcCwgcmVhbE91dHB1dFNpemUsIHNjYWxlKSB7XG4gICAgc3RlcCA9IE1hdGguYWJzKHN0ZXApO1xuICAgIGNvbnN0IG1heFNpemUgPSBNYXRoLm1heChUaWxpbmdQYXR0ZXJuLk1BWF9QQVRURVJOX1NJWkUsIHJlYWxPdXRwdXRTaXplKTtcbiAgICBsZXQgc2l6ZSA9IE1hdGguY2VpbChzdGVwICogc2NhbGUpO1xuICAgIGlmIChzaXplID49IG1heFNpemUpIHtcbiAgICAgIHNpemUgPSBtYXhTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2FsZSA9IHNpemUgLyBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGUsXG4gICAgICBzaXplXG4gICAgfTtcbiAgfVxuICBjbGlwQmJveChncmFwaGljcywgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBjb25zdCBiYm94V2lkdGggPSB4MSAtIHgwO1xuICAgIGNvbnN0IGJib3hIZWlnaHQgPSB5MSAtIHkwO1xuICAgIGdyYXBoaWNzLmN0eC5yZWN0KHgwLCB5MCwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTtcbiAgICBncmFwaGljcy5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShncmFwaGljcy5jdHgpLCBbeDAsIHkwLCB4MSwgeTFdKTtcbiAgICBncmFwaGljcy5jbGlwKCk7XG4gICAgZ3JhcGhpY3MuZW5kUGF0aCgpO1xuICB9XG4gIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChncmFwaGljcywgcGFpbnRUeXBlLCBjb2xvcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBncmFwaGljcy5jdHgsXG4gICAgICBjdXJyZW50ID0gZ3JhcGhpY3MuY3VycmVudDtcbiAgICBzd2l0Y2ggKHBhaW50VHlwZSkge1xuICAgICAgY2FzZSBQYWludFR5cGUuQ09MT1JFRDpcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTtcbiAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjdHguZmlsbFN0eWxlO1xuICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3R4LnN0cm9rZVN0eWxlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGFpbnRUeXBlLlVOQ09MT1JFRDpcbiAgICAgICAgY29uc3QgY3NzQ29sb3IgPSB1dGlsLlV0aWwubWFrZUhleENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGNzc0NvbG9yO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3NzQ29sb3I7XG4gICAgICAgIGN1cnJlbnQuZmlsbENvbG9yID0gY3NzQ29sb3I7XG4gICAgICAgIGN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjc3NDb2xvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgdXRpbC5Gb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcGFpbnQgdHlwZTogJHtwYWludFR5cGV9YCk7XG4gICAgfVxuICB9XG4gIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcbiAgICBsZXQgbWF0cml4ID0gaW52ZXJzZTtcbiAgICBpZiAocGF0aFR5cGUgIT09IFBhdGhUeXBlLlNIQURJTkcpIHtcbiAgICAgIG1hdHJpeCA9IHV0aWwuVXRpbC50cmFuc2Zvcm0obWF0cml4LCBvd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICBtYXRyaXggPSB1dGlsLlV0aWwudHJhbnNmb3JtKG1hdHJpeCwgdGhpcy5tYXRyaXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzID0gdGhpcy5jcmVhdGVQYXR0ZXJuQ2FudmFzKG93bmVyKTtcbiAgICBsZXQgZG9tTWF0cml4ID0gbmV3IERPTU1hdHJpeChtYXRyaXgpO1xuICAgIGRvbU1hdHJpeCA9IGRvbU1hdHJpeC50cmFuc2xhdGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFkpO1xuICAgIGRvbU1hdHJpeCA9IGRvbU1hdHJpeC5zY2FsZSgxIC8gdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVgsIDEgLyB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7XG4gICAgY29uc3QgcGF0dGVybiA9IGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuY2FudmFzLCBcInJlcGVhdFwiKTtcbiAgICBwYXR0ZXJuLnNldFRyYW5zZm9ybShkb21NYXRyaXgpO1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zaGFyZWQvaW1hZ2VfdXRpbHMuanNcblxuXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gY29udmVydFRvUkdCQShwYXJhbXMpIHtcbiAgc3dpdGNoIChwYXJhbXMua2luZCkge1xuICAgIGNhc2UgSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHBhcmFtcyk7XG4gICAgY2FzZSBJbWFnZUtpbmQuUkdCXzI0QlBQOlxuICAgICAgcmV0dXJuIGNvbnZlcnRSR0JUb1JHQkEocGFyYW1zKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzcmMsXG4gICAgc3JjUG9zID0gMCxcbiAgICBkZXN0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBub25CbGFja0NvbG9yID0gMHhmZmZmZmZmZixcbiAgICBpbnZlcnNlRGVjb2RlID0gZmFsc2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGJsYWNrID0gdXRpbC5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmO1xuICBjb25zdCBbemVyb01hcHBpbmcsIG9uZU1hcHBpbmddID0gaW52ZXJzZURlY29kZSA/IFtub25CbGFja0NvbG9yLCBibGFja10gOiBbYmxhY2ssIG5vbkJsYWNrQ29sb3JdO1xuICBjb25zdCB3aWR0aEluU291cmNlID0gd2lkdGggPj4gMztcbiAgY29uc3Qgd2lkdGhSZW1haW5kZXIgPSB3aWR0aCAmIDc7XG4gIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5sZW5ndGg7XG4gIGRlc3QgPSBuZXcgVWludDMyQXJyYXkoZGVzdC5idWZmZXIpO1xuICBsZXQgZGVzdFBvcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBmb3IgKGNvbnN0IG1heCA9IHNyY1BvcyArIHdpZHRoSW5Tb3VyY2U7IHNyY1BvcyA8IG1heDsgc3JjUG9zKyspIHtcbiAgICAgIGNvbnN0IGVsZW0gPSBzcmNQb3MgPCBzcmNMZW5ndGggPyBzcmNbc3JjUG9zXSA6IDI1NTtcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMSA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICB9XG4gICAgaWYgKHdpZHRoUmVtYWluZGVyID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3MrK10gOiAyNTU7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aFJlbWFpbmRlcjsgaisrKSB7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMSA8PCA3IC0gaiA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzcmNQb3MsXG4gICAgZGVzdFBvc1xuICB9O1xufVxuZnVuY3Rpb24gY29udmVydFJHQlRvUkdCQShfcmVmMikge1xuICBsZXQge1xuICAgIHNyYyxcbiAgICBzcmNQb3MgPSAwLFxuICAgIGRlc3QsXG4gICAgZGVzdFBvcyA9IDAsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSBfcmVmMjtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBsZW4zMiA9IHNyYy5sZW5ndGggPj4gMjtcbiAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc3JjLmJ1ZmZlciwgc3JjUG9zLCBsZW4zMik7XG4gIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkge1xuICAgICAgY29uc3QgczEgPSBzcmMzMltpXTtcbiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdO1xuICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07XG4gICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmMDAwMDAwO1xuICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA+Pj4gMjQgfCBzMiA8PCA4IHwgMHhmZjAwMDAwMDtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPj4+IDE2IHwgczMgPDwgMTYgfCAweGZmMDAwMDAwO1xuICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA+Pj4gOCB8IDB4ZmYwMDAwMDA7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmMubGVuZ3RoOyBqIDwgamo7IGogKz0gMykge1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIHwgc3JjW2ogKyAxXSA8PCA4IHwgc3JjW2ogKyAyXSA8PCAxNiB8IDB4ZmYwMDAwMDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkge1xuICAgICAgY29uc3QgczEgPSBzcmMzMltpXTtcbiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdO1xuICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07XG4gICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmO1xuICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA8PCAyNCB8IHMyID4+PiA4IHwgMHhmZjtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPDwgMTYgfCBzMyA+Pj4gMTYgfCAweGZmO1xuICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA8PCA4IHwgMHhmZjtcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyYy5sZW5ndGg7IGogPCBqajsgaiArPSAzKSB7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbal0gPDwgMjQgfCBzcmNbaiArIDFdIDw8IDE2IHwgc3JjW2ogKyAyXSA8PCA4IHwgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzcmNQb3MsXG4gICAgZGVzdFBvc1xuICB9O1xufVxuZnVuY3Rpb24gZ3JheVRvUkdCQShzcmMsIGRlc3QpIHtcbiAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxIHwgMHhmZjAwMDAwMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxMDAgfCAweDAwMDAwMGZmO1xuICAgIH1cbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9jYW52YXMuanNcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IE1JTl9GT05UX1NJWkUgPSAxNjtcbmNvbnN0IE1BWF9GT05UX1NJWkUgPSAxMDA7XG5jb25zdCBNQVhfR1JPVVBfU0laRSA9IDQwOTY7XG5jb25zdCBFWEVDVVRJT05fVElNRSA9IDE1O1xuY29uc3QgRVhFQ1VUSU9OX1NURVBTID0gMTA7XG5jb25zdCBNQVhfU0laRV9UT19DT01QSUxFID0gMTAwMDtcbmNvbnN0IEZVTExfQ0hVTktfSEVJR0hUID0gMTY7XG5mdW5jdGlvbiBtaXJyb3JDb250ZXh0T3BlcmF0aW9ucyhjdHgsIGRlc3RDdHgpIHtcbiAgaWYgKGN0eC5fcmVtb3ZlTWlycm9yaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBhbHJlYWR5IGZvcndhcmRpbmcgb3BlcmF0aW9ucy5cIik7XG4gIH1cbiAgY3R4Ll9fb3JpZ2luYWxTYXZlID0gY3R4LnNhdmU7XG4gIGN0eC5fX29yaWdpbmFsUmVzdG9yZSA9IGN0eC5yZXN0b3JlO1xuICBjdHguX19vcmlnaW5hbFJvdGF0ZSA9IGN0eC5yb3RhdGU7XG4gIGN0eC5fX29yaWdpbmFsU2NhbGUgPSBjdHguc2NhbGU7XG4gIGN0eC5fX29yaWdpbmFsVHJhbnNsYXRlID0gY3R4LnRyYW5zbGF0ZTtcbiAgY3R4Ll9fb3JpZ2luYWxUcmFuc2Zvcm0gPSBjdHgudHJhbnNmb3JtO1xuICBjdHguX19vcmlnaW5hbFNldFRyYW5zZm9ybSA9IGN0eC5zZXRUcmFuc2Zvcm07XG4gIGN0eC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0gPSBjdHgucmVzZXRUcmFuc2Zvcm07XG4gIGN0eC5fX29yaWdpbmFsQ2xpcCA9IGN0eC5jbGlwO1xuICBjdHguX19vcmlnaW5hbE1vdmVUbyA9IGN0eC5tb3ZlVG87XG4gIGN0eC5fX29yaWdpbmFsTGluZVRvID0gY3R4LmxpbmVUbztcbiAgY3R4Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvID0gY3R4LmJlemllckN1cnZlVG87XG4gIGN0eC5fX29yaWdpbmFsUmVjdCA9IGN0eC5yZWN0O1xuICBjdHguX19vcmlnaW5hbENsb3NlUGF0aCA9IGN0eC5jbG9zZVBhdGg7XG4gIGN0eC5fX29yaWdpbmFsQmVnaW5QYXRoID0gY3R4LmJlZ2luUGF0aDtcbiAgY3R4Ll9yZW1vdmVNaXJyb3JpbmcgPSAoKSA9PiB7XG4gICAgY3R4LnNhdmUgPSBjdHguX19vcmlnaW5hbFNhdmU7XG4gICAgY3R4LnJlc3RvcmUgPSBjdHguX19vcmlnaW5hbFJlc3RvcmU7XG4gICAgY3R4LnJvdGF0ZSA9IGN0eC5fX29yaWdpbmFsUm90YXRlO1xuICAgIGN0eC5zY2FsZSA9IGN0eC5fX29yaWdpbmFsU2NhbGU7XG4gICAgY3R4LnRyYW5zbGF0ZSA9IGN0eC5fX29yaWdpbmFsVHJhbnNsYXRlO1xuICAgIGN0eC50cmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFRyYW5zZm9ybTtcbiAgICBjdHguc2V0VHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm07XG4gICAgY3R4LnJlc2V0VHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybTtcbiAgICBjdHguY2xpcCA9IGN0eC5fX29yaWdpbmFsQ2xpcDtcbiAgICBjdHgubW92ZVRvID0gY3R4Ll9fb3JpZ2luYWxNb3ZlVG87XG4gICAgY3R4LmxpbmVUbyA9IGN0eC5fX29yaWdpbmFsTGluZVRvO1xuICAgIGN0eC5iZXppZXJDdXJ2ZVRvID0gY3R4Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvO1xuICAgIGN0eC5yZWN0ID0gY3R4Ll9fb3JpZ2luYWxSZWN0O1xuICAgIGN0eC5jbG9zZVBhdGggPSBjdHguX19vcmlnaW5hbENsb3NlUGF0aDtcbiAgICBjdHguYmVnaW5QYXRoID0gY3R4Ll9fb3JpZ2luYWxCZWdpblBhdGg7XG4gICAgZGVsZXRlIGN0eC5fcmVtb3ZlTWlycm9yaW5nO1xuICB9O1xuICBjdHguc2F2ZSA9IGZ1bmN0aW9uIGN0eFNhdmUoKSB7XG4gICAgZGVzdEN0eC5zYXZlKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsU2F2ZSgpO1xuICB9O1xuICBjdHgucmVzdG9yZSA9IGZ1bmN0aW9uIGN0eFJlc3RvcmUoKSB7XG4gICAgZGVzdEN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsUmVzdG9yZSgpO1xuICB9O1xuICBjdHgudHJhbnNsYXRlID0gZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHgsIHkpIHtcbiAgICBkZXN0Q3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2xhdGUoeCwgeSk7XG4gIH07XG4gIGN0eC5zY2FsZSA9IGZ1bmN0aW9uIGN0eFNjYWxlKHgsIHkpIHtcbiAgICBkZXN0Q3R4LnNjYWxlKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbFNjYWxlKHgsIHkpO1xuICB9O1xuICBjdHgudHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICBkZXN0Q3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gIH07XG4gIGN0eC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgIGRlc3RDdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIHRoaXMuX19vcmlnaW5hbFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgfTtcbiAgY3R4LnJlc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4UmVzZXRUcmFuc2Zvcm0oKSB7XG4gICAgZGVzdEN0eC5yZXNldFRyYW5zZm9ybSgpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtKCk7XG4gIH07XG4gIGN0eC5yb3RhdGUgPSBmdW5jdGlvbiBjdHhSb3RhdGUoYW5nbGUpIHtcbiAgICBkZXN0Q3R4LnJvdGF0ZShhbmdsZSk7XG4gICAgdGhpcy5fX29yaWdpbmFsUm90YXRlKGFuZ2xlKTtcbiAgfTtcbiAgY3R4LmNsaXAgPSBmdW5jdGlvbiBjdHhSb3RhdGUocnVsZSkge1xuICAgIGRlc3RDdHguY2xpcChydWxlKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxDbGlwKHJ1bGUpO1xuICB9O1xuICBjdHgubW92ZVRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBkZXN0Q3R4Lm1vdmVUbyh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNb3ZlVG8oeCwgeSk7XG4gIH07XG4gIGN0eC5saW5lVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGRlc3RDdHgubGluZVRvKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbExpbmVUbyh4LCB5KTtcbiAgfTtcbiAgY3R4LmJlemllckN1cnZlVG8gPSBmdW5jdGlvbiAoY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSkge1xuICAgIGRlc3RDdHguYmV6aWVyQ3VydmVUbyhjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvKGNwMXgsIGNwMXksIGNwMngsIGNwMnksIHgsIHkpO1xuICB9O1xuICBjdHgucmVjdCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgZGVzdEN0eC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH07XG4gIGN0eC5jbG9zZVBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgZGVzdEN0eC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxDbG9zZVBhdGgoKTtcbiAgfTtcbiAgY3R4LmJlZ2luUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICBkZXN0Q3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuX19vcmlnaW5hbEJlZ2luUGF0aCgpO1xuICB9O1xufVxuY2xhc3MgQ2FjaGVkQ2FudmFzZXMge1xuICBjb25zdHJ1Y3RvcihjYW52YXNGYWN0b3J5KSB7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBnZXRDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBsZXQgY2FudmFzRW50cnk7XG4gICAgaWYgKHRoaXMuY2FjaGVbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYWNoZVtpZF07XG4gICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoY2FudmFzRW50cnksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmNhY2hlW2lkXSA9IGNhbnZhc0VudHJ5O1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzRW50cnk7XG4gIH1cbiAgZGVsZXRlKGlkKSB7XG4gICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgY29uc3QgY2FudmFzRW50cnkgPSB0aGlzLmNhY2hlW2lkXTtcbiAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0VudHJ5KTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpIHtcbiAgY29uc3QgW2EsIGIsIGMsIGQsIHR4LCB0eV0gPSAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCk7XG4gIGlmIChiID09PSAwICYmIGMgPT09IDApIHtcbiAgICBjb25zdCB0bFggPSBkZXN0WCAqIGEgKyB0eDtcbiAgICBjb25zdCByVGxYID0gTWF0aC5yb3VuZCh0bFgpO1xuICAgIGNvbnN0IHRsWSA9IGRlc3RZICogZCArIHR5O1xuICAgIGNvbnN0IHJUbFkgPSBNYXRoLnJvdW5kKHRsWSk7XG4gICAgY29uc3QgYnJYID0gKGRlc3RYICsgZGVzdFcpICogYSArIHR4O1xuICAgIGNvbnN0IHJXaWR0aCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJYKSAtIHJUbFgpIHx8IDE7XG4gICAgY29uc3QgYnJZID0gKGRlc3RZICsgZGVzdEgpICogZCArIHR5O1xuICAgIGNvbnN0IHJIZWlnaHQgPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWSkgLSByVGxZKSB8fCAxO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oTWF0aC5zaWduKGEpLCAwLCAwLCBNYXRoLnNpZ24oZCksIHJUbFgsIHJUbFkpO1xuICAgIGN0eC5kcmF3SW1hZ2Uoc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCAwLCAwLCByV2lkdGgsIHJIZWlnaHQpO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgdHgsIHR5KTtcbiAgICByZXR1cm4gW3JXaWR0aCwgckhlaWdodF07XG4gIH1cbiAgaWYgKGEgPT09IDAgJiYgZCA9PT0gMCkge1xuICAgIGNvbnN0IHRsWCA9IGRlc3RZICogYyArIHR4O1xuICAgIGNvbnN0IHJUbFggPSBNYXRoLnJvdW5kKHRsWCk7XG4gICAgY29uc3QgdGxZID0gZGVzdFggKiBiICsgdHk7XG4gICAgY29uc3QgclRsWSA9IE1hdGgucm91bmQodGxZKTtcbiAgICBjb25zdCBiclggPSAoZGVzdFkgKyBkZXN0SCkgKiBjICsgdHg7XG4gICAgY29uc3QgcldpZHRoID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclgpIC0gclRsWCkgfHwgMTtcbiAgICBjb25zdCBiclkgPSAoZGVzdFggKyBkZXN0VykgKiBiICsgdHk7XG4gICAgY29uc3QgckhlaWdodCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJZKSAtIHJUbFkpIHx8IDE7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgwLCBNYXRoLnNpZ24oYiksIE1hdGguc2lnbihjKSwgMCwgclRsWCwgclRsWSk7XG4gICAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIDAsIDAsIHJIZWlnaHQsIHJXaWR0aCk7XG4gICAgY3R4LnNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCB0eCwgdHkpO1xuICAgIHJldHVybiBbckhlaWdodCwgcldpZHRoXTtcbiAgfVxuICBjdHguZHJhd0ltYWdlKHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpO1xuICBjb25zdCBzY2FsZVggPSBNYXRoLmh5cG90KGEsIGIpO1xuICBjb25zdCBzY2FsZVkgPSBNYXRoLmh5cG90KGMsIGQpO1xuICByZXR1cm4gW3NjYWxlWCAqIGRlc3RXLCBzY2FsZVkgKiBkZXN0SF07XG59XG5mdW5jdGlvbiBjb21waWxlVHlwZTNHbHlwaChpbWdEYXRhKSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IGltZ0RhdGE7XG4gIGlmICh3aWR0aCA+IE1BWF9TSVpFX1RPX0NPTVBJTEUgfHwgaGVpZ2h0ID4gTUFYX1NJWkVfVE9fQ09NUElMRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFBPSU5UX1RPX1BST0NFU1NfTElNSVQgPSAxMDAwO1xuICBjb25zdCBQT0lOVF9UWVBFUyA9IG5ldyBVaW50OEFycmF5KFswLCAyLCA0LCAwLCAxLCAwLCA1LCA0LCA4LCAxMCwgMCwgOCwgMCwgMiwgMSwgMF0pO1xuICBjb25zdCB3aWR0aDEgPSB3aWR0aCArIDE7XG4gIGxldCBwb2ludHMgPSBuZXcgVWludDhBcnJheSh3aWR0aDEgKiAoaGVpZ2h0ICsgMSkpO1xuICBsZXQgaSwgaiwgajA7XG4gIGNvbnN0IGxpbmVTaXplID0gd2lkdGggKyA3ICYgfjc7XG4gIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkobGluZVNpemUgKiBoZWlnaHQpLFxuICAgIHBvcyA9IDA7XG4gIGZvciAoY29uc3QgZWxlbSBvZiBpbWdEYXRhLmRhdGEpIHtcbiAgICBsZXQgbWFzayA9IDEyODtcbiAgICB3aGlsZSAobWFzayA+IDApIHtcbiAgICAgIGRhdGFbcG9zKytdID0gZWxlbSAmIG1hc2sgPyAwIDogMjU1O1xuICAgICAgbWFzayA+Pj0gMTtcbiAgICB9XG4gIH1cbiAgbGV0IGNvdW50ID0gMDtcbiAgcG9zID0gMDtcbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1swXSA9IDE7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqXSA9IGRhdGFbcG9zXSA/IDIgOiAxO1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgcG9zKys7XG4gIH1cbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqXSA9IDI7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGkgPSAxOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBwb3MgPSBpICogbGluZVNpemU7XG4gICAgajAgPSBpICogd2lkdGgxO1xuICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7XG4gICAgICBwb2ludHNbajBdID0gZGF0YVtwb3NdID8gMSA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBsZXQgc3VtID0gKGRhdGFbcG9zXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplXSA/IDggOiAwKTtcbiAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgc3VtID0gKHN1bSA+PiAyKSArIChkYXRhW3BvcyArIDFdID8gNCA6IDApICsgKGRhdGFbcG9zIC0gbGluZVNpemUgKyAxXSA/IDggOiAwKTtcbiAgICAgIGlmIChQT0lOVF9UWVBFU1tzdW1dKSB7XG4gICAgICAgIHBvaW50c1tqMCArIGpdID0gUE9JTlRfVFlQRVNbc3VtXTtcbiAgICAgICAgKytjb3VudDtcbiAgICAgIH1cbiAgICAgIHBvcysrO1xuICAgIH1cbiAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuICAgICAgcG9pbnRzW2owICsgal0gPSBkYXRhW3Bvc10gPyAyIDogNDtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuICAgIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBwb3MgPSBsaW5lU2l6ZSAqIChoZWlnaHQgLSAxKTtcbiAgajAgPSBpICogd2lkdGgxO1xuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owXSA9IDg7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gNCA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBwb3MrKztcbiAgfVxuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owICsgal0gPSA0O1xuICAgICsrY291bnQ7XG4gIH1cbiAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN0ZXBzID0gbmV3IEludDMyQXJyYXkoWzAsIHdpZHRoMSwgLTEsIDAsIC13aWR0aDEsIDAsIDAsIDAsIDFdKTtcbiAgY29uc3QgcGF0aCA9IG5ldyBQYXRoMkQoKTtcbiAgZm9yIChpID0gMDsgY291bnQgJiYgaSA8PSBoZWlnaHQ7IGkrKykge1xuICAgIGxldCBwID0gaSAqIHdpZHRoMTtcbiAgICBjb25zdCBlbmQgPSBwICsgd2lkdGg7XG4gICAgd2hpbGUgKHAgPCBlbmQgJiYgIXBvaW50c1twXSkge1xuICAgICAgcCsrO1xuICAgIH1cbiAgICBpZiAocCA9PT0gZW5kKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGF0aC5tb3ZlVG8ocCAlIHdpZHRoMSwgaSk7XG4gICAgY29uc3QgcDAgPSBwO1xuICAgIGxldCB0eXBlID0gcG9pbnRzW3BdO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1t0eXBlXTtcbiAgICAgIGRvIHtcbiAgICAgICAgcCArPSBzdGVwO1xuICAgICAgfSB3aGlsZSAoIXBvaW50c1twXSk7XG4gICAgICBjb25zdCBwcCA9IHBvaW50c1twXTtcbiAgICAgIGlmIChwcCAhPT0gNSAmJiBwcCAhPT0gMTApIHtcbiAgICAgICAgdHlwZSA9IHBwO1xuICAgICAgICBwb2ludHNbcF0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IHBwICYgMHgzMyAqIHR5cGUgPj4gNDtcbiAgICAgICAgcG9pbnRzW3BdICY9IHR5cGUgPj4gMiB8IHR5cGUgPDwgMjtcbiAgICAgIH1cbiAgICAgIHBhdGgubGluZVRvKHAgJSB3aWR0aDEsIHAgLyB3aWR0aDEgfCAwKTtcbiAgICAgIGlmICghcG9pbnRzW3BdKSB7XG4gICAgICAgIC0tY291bnQ7XG4gICAgICB9XG4gICAgfSB3aGlsZSAocDAgIT09IHApO1xuICAgIC0taTtcbiAgfVxuICBkYXRhID0gbnVsbDtcbiAgcG9pbnRzID0gbnVsbDtcbiAgY29uc3QgZHJhd091dGxpbmUgPSBmdW5jdGlvbiAoYykge1xuICAgIGMuc2F2ZSgpO1xuICAgIGMuc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG4gICAgYy50cmFuc2xhdGUoMCwgLWhlaWdodCk7XG4gICAgYy5maWxsKHBhdGgpO1xuICAgIGMuYmVnaW5QYXRoKCk7XG4gICAgYy5yZXN0b3JlKCk7XG4gIH07XG4gIHJldHVybiBkcmF3T3V0bGluZTtcbn1cbmNsYXNzIENhbnZhc0V4dHJhU3RhdGUge1xuICBjb25zdHJ1Y3Rvcih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy5hbHBoYUlzU2hhcGUgPSBmYWxzZTtcbiAgICB0aGlzLmZvbnRTaXplID0gMDtcbiAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgIHRoaXMudGV4dE1hdHJpeCA9IHV0aWwuSURFTlRJVFlfTUFUUklYO1xuICAgIHRoaXMudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICB0aGlzLmZvbnRNYXRyaXggPSB1dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgIHRoaXMubGVhZGluZyA9IDA7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIHRoaXMubGluZVggPSAwO1xuICAgIHRoaXMubGluZVkgPSAwO1xuICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwO1xuICAgIHRoaXMud29yZFNwYWNpbmcgPSAwO1xuICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7XG4gICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IHV0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcbiAgICB0aGlzLnRleHRSaXNlID0gMDtcbiAgICB0aGlzLmZpbGxDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBcIiMwMDAwMDBcIjtcbiAgICB0aGlzLnBhdHRlcm5GaWxsID0gZmFsc2U7XG4gICAgdGhpcy5maWxsQWxwaGEgPSAxO1xuICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuICAgIHRoaXMubGluZVdpZHRoID0gMTtcbiAgICB0aGlzLmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICB0aGlzLnRyYW5zZmVyTWFwcyA9IFwibm9uZVwiO1xuICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwgMCwgd2lkdGgsIGhlaWdodF0pO1xuICB9XG4gIGNsb25lKCkge1xuICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICBjbG9uZS5jbGlwQm94ID0gdGhpcy5jbGlwQm94LnNsaWNlKCk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG4gIHNldEN1cnJlbnRQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG4gIHVwZGF0ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4LCB5KSB7XG4gICAgW3gsIHldID0gdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt4LCB5XSwgdHJhbnNmb3JtKTtcbiAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIHgpO1xuICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgeSk7XG4gICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCB4KTtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIHkpO1xuICB9XG4gIHVwZGF0ZVJlY3RNaW5NYXgodHJhbnNmb3JtLCByZWN0KSB7XG4gICAgY29uc3QgcDEgPSB1dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0ocmVjdCwgdHJhbnNmb3JtKTtcbiAgICBjb25zdCBwMiA9IHV0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShyZWN0LnNsaWNlKDIpLCB0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHAzID0gdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzBdLCByZWN0WzNdXSwgdHJhbnNmb3JtKTtcbiAgICBjb25zdCBwNCA9IHV0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFsyXSwgcmVjdFsxXV0sIHRyYW5zZm9ybSk7XG4gICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSk7XG4gICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCBwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSk7XG4gICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSk7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSk7XG4gIH1cbiAgdXBkYXRlU2NhbGluZ1BhdGhNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpIHtcbiAgICB1dGlsLlV0aWwuc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpO1xuICAgIHRoaXMubWluWCA9IE1hdGgubWluKHRoaXMubWluWCwgbWluTWF4WzBdKTtcbiAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIG1pbk1heFsxXSk7XG4gICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCBtaW5NYXhbMl0pO1xuICAgIHRoaXMubWF4WSA9IE1hdGgubWF4KHRoaXMubWF4WSwgbWluTWF4WzNdKTtcbiAgfVxuICB1cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIG1pbk1heCkge1xuICAgIGNvbnN0IGJveCA9IHV0aWwuVXRpbC5iZXppZXJCb3VuZGluZ0JveCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpO1xuICAgIGlmIChtaW5NYXgpIHtcbiAgICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgYm94WzBdLCBib3hbMl0pO1xuICAgICAgbWluTWF4WzFdID0gTWF0aC5tYXgobWluTWF4WzFdLCBib3hbMF0sIGJveFsyXSk7XG4gICAgICBtaW5NYXhbMl0gPSBNYXRoLm1pbihtaW5NYXhbMl0sIGJveFsxXSwgYm94WzNdKTtcbiAgICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgYm94WzFdLCBib3hbM10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVJlY3RNaW5NYXgodHJhbnNmb3JtLCBib3gpO1xuICB9XG4gIGdldFBhdGhCb3VuZGluZ0JveCgpIHtcbiAgICBsZXQgcGF0aFR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFBhdGhUeXBlLkZJTEw7XG4gICAgbGV0IHRyYW5zZm9ybSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICBjb25zdCBib3ggPSBbdGhpcy5taW5YLCB0aGlzLm1pblksIHRoaXMubWF4WCwgdGhpcy5tYXhZXTtcbiAgICBpZiAocGF0aFR5cGUgPT09IFBhdGhUeXBlLlNUUk9LRSkge1xuICAgICAgaWYgKCF0cmFuc2Zvcm0pIHtcbiAgICAgICAgKDAsdXRpbC51bnJlYWNoYWJsZSkoXCJTdHJva2UgYm91bmRpbmcgYm94IG11c3QgaW5jbHVkZSB0cmFuc2Zvcm0uXCIpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NhbGUgPSB1dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodHJhbnNmb3JtKTtcbiAgICAgIGNvbnN0IHhTdHJva2VQYWQgPSBzY2FsZVswXSAqIHRoaXMubGluZVdpZHRoIC8gMjtcbiAgICAgIGNvbnN0IHlTdHJva2VQYWQgPSBzY2FsZVsxXSAqIHRoaXMubGluZVdpZHRoIC8gMjtcbiAgICAgIGJveFswXSAtPSB4U3Ryb2tlUGFkO1xuICAgICAgYm94WzFdIC09IHlTdHJva2VQYWQ7XG4gICAgICBib3hbMl0gKz0geFN0cm9rZVBhZDtcbiAgICAgIGJveFszXSArPSB5U3Ryb2tlUGFkO1xuICAgIH1cbiAgICByZXR1cm4gYm94O1xuICB9XG4gIHVwZGF0ZUNsaXBGcm9tUGF0aCgpIHtcbiAgICBjb25zdCBpbnRlcnNlY3QgPSB1dGlsLlV0aWwuaW50ZXJzZWN0KHRoaXMuY2xpcEJveCwgdGhpcy5nZXRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KGludGVyc2VjdCB8fCBbMCwgMCwgMCwgMF0pO1xuICB9XG4gIGlzRW1wdHlDbGlwKCkge1xuICAgIHJldHVybiB0aGlzLm1pblggPT09IEluZmluaXR5O1xuICB9XG4gIHN0YXJ0TmV3UGF0aEFuZENsaXBCb3goYm94KSB7XG4gICAgdGhpcy5jbGlwQm94ID0gYm94O1xuICAgIHRoaXMubWluWCA9IEluZmluaXR5O1xuICAgIHRoaXMubWluWSA9IEluZmluaXR5O1xuICAgIHRoaXMubWF4WCA9IDA7XG4gICAgdGhpcy5tYXhZID0gMDtcbiAgfVxuICBnZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkge1xuICAgIGxldCBwYXRoVHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogUGF0aFR5cGUuRklMTDtcbiAgICBsZXQgdHJhbnNmb3JtID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIHJldHVybiB1dGlsLlV0aWwuaW50ZXJzZWN0KHRoaXMuY2xpcEJveCwgdGhpcy5nZXRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUsIHRyYW5zZm9ybSkpO1xuICB9XG59XG5mdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEoY3R4LCBpbWdEYXRhKSB7XG4gIGlmICh0eXBlb2YgSW1hZ2VEYXRhICE9PSBcInVuZGVmaW5lZFwiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZ0RhdGEsIDAsIDApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCxcbiAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gIGNvbnN0IHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUO1xuICBjb25zdCBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgY29uc3QgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7XG4gIGNvbnN0IGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgbGV0IHNyY1BvcyA9IDAsXG4gICAgZGVzdFBvcztcbiAgY29uc3Qgc3JjID0gaW1nRGF0YS5kYXRhO1xuICBjb25zdCBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7XG4gIGxldCBpLCBqLCB0aGlzQ2h1bmtIZWlnaHQsIGVsZW1zSW5UaGlzQ2h1bms7XG4gIGlmIChpbWdEYXRhLmtpbmQgPT09IHV0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7XG4gICAgY29uc3Qgc3JjTGVuZ3RoID0gc3JjLmJ5dGVMZW5ndGg7XG4gICAgY29uc3QgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyLCAwLCBkZXN0LmJ5dGVMZW5ndGggPj4gMik7XG4gICAgY29uc3QgZGVzdDMyRGF0YUxlbmd0aCA9IGRlc3QzMi5sZW5ndGg7XG4gICAgY29uc3QgZnVsbFNyY0RpZmYgPSB3aWR0aCArIDcgPj4gMztcbiAgICBjb25zdCB3aGl0ZSA9IDB4ZmZmZmZmZmY7XG4gICAgY29uc3QgYmxhY2sgPSB1dGlsLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmY7XG4gICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcbiAgICAgIHRoaXNDaHVua0hlaWdodCA9IGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG4gICAgICBkZXN0UG9zID0gMDtcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykge1xuICAgICAgICBjb25zdCBzcmNEaWZmID0gc3JjTGVuZ3RoIC0gc3JjUG9zO1xuICAgICAgICBsZXQgayA9IDA7XG4gICAgICAgIGNvbnN0IGtFbmQgPSBzcmNEaWZmID4gZnVsbFNyY0RpZmYgPyB3aWR0aCA6IHNyY0RpZmYgKiA4IC0gNztcbiAgICAgICAgY29uc3Qga0VuZFVucm9sbGVkID0ga0VuZCAmIH43O1xuICAgICAgICBsZXQgbWFzayA9IDA7XG4gICAgICAgIGxldCBzcmNCeXRlID0gMDtcbiAgICAgICAgZm9yICg7IGsgPCBrRW5kVW5yb2xsZWQ7IGsgKz0gOCkge1xuICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEyOCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNjQgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDMyID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxNiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgOCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMSA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGsgPCBrRW5kOyBrKyspIHtcbiAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgc3JjQnl0ZSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiBtYXNrID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZGVzdFBvcyA8IGRlc3QzMkRhdGFMZW5ndGgpIHtcbiAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSAwO1xuICAgICAgfVxuICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUCkge1xuICAgIGogPSAwO1xuICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIEZVTExfQ0hVTktfSEVJR0hUICogNDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZnVsbENodW5rczsgaSsrKSB7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7XG4gICAgICBzcmNQb3MgKz0gZWxlbXNJblRoaXNDaHVuaztcbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTtcbiAgICAgIGogKz0gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgfVxuICAgIGlmIChpIDwgdG90YWxDaHVua3MpIHtcbiAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHBhcnRpYWxDaHVua0hlaWdodCAqIDQ7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQKSB7XG4gICAgdGhpc0NodW5rSGVpZ2h0ID0gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0O1xuICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgICBpZiAoaSA+PSBmdWxsQ2h1bmtzKSB7XG4gICAgICAgIHRoaXNDaHVua0hlaWdodCA9IHBhcnRpYWxDaHVua0hlaWdodDtcbiAgICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0O1xuICAgICAgfVxuICAgICAgZGVzdFBvcyA9IDA7XG4gICAgICBmb3IgKGogPSBlbGVtc0luVGhpc0NodW5rOyBqLS07KSB7XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IDI1NTtcbiAgICAgIH1cbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJhZCBpbWFnZSBraW5kOiAke2ltZ0RhdGEua2luZH1gKTtcbiAgfVxufVxuZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VNYXNrKGN0eCwgaW1nRGF0YSkge1xuICBpZiAoaW1nRGF0YS5iaXRtYXApIHtcbiAgICBjdHguZHJhd0ltYWdlKGltZ0RhdGEuYml0bWFwLCAwLCAwKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQsXG4gICAgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICBjb25zdCBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgY29uc3QgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7XG4gIGNvbnN0IHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxO1xuICBjb25zdCBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gIGxldCBzcmNQb3MgPSAwO1xuICBjb25zdCBzcmMgPSBpbWdEYXRhLmRhdGE7XG4gIGNvbnN0IGRlc3QgPSBjaHVua0ltZ0RhdGEuZGF0YTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgY29uc3QgdGhpc0NodW5rSGVpZ2h0ID0gaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDtcbiAgICAoe1xuICAgICAgc3JjUG9zXG4gICAgfSA9IGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHtcbiAgICAgIHNyYyxcbiAgICAgIHNyY1BvcyxcbiAgICAgIGRlc3QsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodDogdGhpc0NodW5rSGVpZ2h0LFxuICAgICAgbm9uQmxhY2tDb2xvcjogMFxuICAgIH0pKTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgfVxufVxuZnVuY3Rpb24gY29weUN0eFN0YXRlKHNvdXJjZUN0eCwgZGVzdEN0eCkge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gW1wic3Ryb2tlU3R5bGVcIiwgXCJmaWxsU3R5bGVcIiwgXCJmaWxsUnVsZVwiLCBcImdsb2JhbEFscGhhXCIsIFwibGluZVdpZHRoXCIsIFwibGluZUNhcFwiLCBcImxpbmVKb2luXCIsIFwibWl0ZXJMaW1pdFwiLCBcImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblwiLCBcImZvbnRcIiwgXCJmaWx0ZXJcIl07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgIGlmIChzb3VyY2VDdHhbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RDdHhbcHJvcGVydHldID0gc291cmNlQ3R4W3Byb3BlcnR5XTtcbiAgICB9XG4gIH1cbiAgaWYgKHNvdXJjZUN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVzdEN0eC5zZXRMaW5lRGFzaChzb3VyY2VDdHguZ2V0TGluZURhc2goKSk7XG4gICAgZGVzdEN0eC5saW5lRGFzaE9mZnNldCA9IHNvdXJjZUN0eC5saW5lRGFzaE9mZnNldDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzZXRDdHhUb0RlZmF1bHQoY3R4KSB7XG4gIGN0eC5zdHJva2VTdHlsZSA9IGN0eC5maWxsU3R5bGUgPSBcIiMwMDAwMDBcIjtcbiAgY3R4LmZpbGxSdWxlID0gXCJub256ZXJvXCI7XG4gIGN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gIGN0eC5saW5lV2lkdGggPSAxO1xuICBjdHgubGluZUNhcCA9IFwiYnV0dFwiO1xuICBjdHgubGluZUpvaW4gPSBcIm1pdGVyXCI7XG4gIGN0eC5taXRlckxpbWl0ID0gMTA7XG4gIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG4gIGN0eC5mb250ID0gXCIxMHB4IHNhbnMtc2VyaWZcIjtcbiAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY3R4LnNldExpbmVEYXNoKFtdKTtcbiAgICBjdHgubGluZURhc2hPZmZzZXQgPSAwO1xuICB9XG4gIGlmICghdXRpbC5pc05vZGVKUykge1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbHRlclxuICAgIH0gPSBjdHg7XG4gICAgaWYgKGZpbHRlciAhPT0gXCJub25lXCIgJiYgZmlsdGVyICE9PSBcIlwiKSB7XG4gICAgICBjdHguZmlsdGVyID0gXCJub25lXCI7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcChieXRlcywgcjAsIGcwLCBiMCkge1xuICBjb25zdCBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICBjb25zdCBhbHBoYSA9IGJ5dGVzW2ldO1xuICAgIGlmIChhbHBoYSA9PT0gMCkge1xuICAgICAgYnl0ZXNbaSAtIDNdID0gcjA7XG4gICAgICBieXRlc1tpIC0gMl0gPSBnMDtcbiAgICAgIGJ5dGVzW2kgLSAxXSA9IGIwO1xuICAgIH0gZWxzZSBpZiAoYWxwaGEgPCAyNTUpIHtcbiAgICAgIGNvbnN0IGFscGhhXyA9IDI1NSAtIGFscGhhO1xuICAgICAgYnl0ZXNbaSAtIDNdID0gYnl0ZXNbaSAtIDNdICogYWxwaGEgKyByMCAqIGFscGhhXyA+PiA4O1xuICAgICAgYnl0ZXNbaSAtIDJdID0gYnl0ZXNbaSAtIDJdICogYWxwaGEgKyBnMCAqIGFscGhhXyA+PiA4O1xuICAgICAgYnl0ZXNbaSAtIDFdID0gYnl0ZXNbaSAtIDFdICogYWxwaGEgKyBiMCAqIGFscGhhXyA+PiA4O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29tcG9zZVNNYXNrQWxwaGEobWFza0RhdGEsIGxheWVyRGF0YSwgdHJhbnNmZXJNYXApIHtcbiAgY29uc3QgbGVuZ3RoID0gbWFza0RhdGEubGVuZ3RoO1xuICBjb25zdCBzY2FsZSA9IDEgLyAyNTU7XG4gIGZvciAobGV0IGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICBjb25zdCBhbHBoYSA9IHRyYW5zZmVyTWFwID8gdHJhbnNmZXJNYXBbbWFza0RhdGFbaV1dIDogbWFza0RhdGFbaV07XG4gICAgbGF5ZXJEYXRhW2ldID0gbGF5ZXJEYXRhW2ldICogYWxwaGEgKiBzY2FsZSB8IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbXBvc2VTTWFza0x1bWlub3NpdHkobWFza0RhdGEsIGxheWVyRGF0YSwgdHJhbnNmZXJNYXApIHtcbiAgY29uc3QgbGVuZ3RoID0gbWFza0RhdGEubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgY29uc3QgeSA9IG1hc2tEYXRhW2kgLSAzXSAqIDc3ICsgbWFza0RhdGFbaSAtIDJdICogMTUyICsgbWFza0RhdGFbaSAtIDFdICogMjg7XG4gICAgbGF5ZXJEYXRhW2ldID0gdHJhbnNmZXJNYXAgPyBsYXllckRhdGFbaV0gKiB0cmFuc2Zlck1hcFt5ID4+IDhdID4+IDggOiBsYXllckRhdGFbaV0gKiB5ID4+IDE2O1xuICB9XG59XG5mdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKG1hc2tDdHgsIGxheWVyQ3R4LCB3aWR0aCwgaGVpZ2h0LCBzdWJ0eXBlLCBiYWNrZHJvcCwgdHJhbnNmZXJNYXAsIGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCBtYXNrT2Zmc2V0WCwgbWFza09mZnNldFkpIHtcbiAgY29uc3QgaGFzQmFja2Ryb3AgPSAhIWJhY2tkcm9wO1xuICBjb25zdCByMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMF0gOiAwO1xuICBjb25zdCBnMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMV0gOiAwO1xuICBjb25zdCBiMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMl0gOiAwO1xuICBjb25zdCBjb21wb3NlRm4gPSBzdWJ0eXBlID09PSBcIkx1bWlub3NpdHlcIiA/IGNvbXBvc2VTTWFza0x1bWlub3NpdHkgOiBjb21wb3NlU01hc2tBbHBoYTtcbiAgY29uc3QgUElYRUxTX1RPX1BST0NFU1MgPSAxMDQ4NTc2O1xuICBjb25zdCBjaHVua1NpemUgPSBNYXRoLm1pbihoZWlnaHQsIE1hdGguY2VpbChQSVhFTFNfVE9fUFJPQ0VTUyAvIHdpZHRoKSk7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICs9IGNodW5rU2l6ZSkge1xuICAgIGNvbnN0IGNodW5rSGVpZ2h0ID0gTWF0aC5taW4oY2h1bmtTaXplLCBoZWlnaHQgLSByb3cpO1xuICAgIGNvbnN0IG1hc2tEYXRhID0gbWFza0N0eC5nZXRJbWFnZURhdGEobGF5ZXJPZmZzZXRYIC0gbWFza09mZnNldFgsIHJvdyArIChsYXllck9mZnNldFkgLSBtYXNrT2Zmc2V0WSksIHdpZHRoLCBjaHVua0hlaWdodCk7XG4gICAgY29uc3QgbGF5ZXJEYXRhID0gbGF5ZXJDdHguZ2V0SW1hZ2VEYXRhKGxheWVyT2Zmc2V0WCwgcm93ICsgbGF5ZXJPZmZzZXRZLCB3aWR0aCwgY2h1bmtIZWlnaHQpO1xuICAgIGlmIChoYXNCYWNrZHJvcCkge1xuICAgICAgY29tcG9zZVNNYXNrQmFja2Ryb3AobWFza0RhdGEuZGF0YSwgcjAsIGcwLCBiMCk7XG4gICAgfVxuICAgIGNvbXBvc2VGbihtYXNrRGF0YS5kYXRhLCBsYXllckRhdGEuZGF0YSwgdHJhbnNmZXJNYXApO1xuICAgIGxheWVyQ3R4LnB1dEltYWdlRGF0YShsYXllckRhdGEsIGxheWVyT2Zmc2V0WCwgcm93ICsgbGF5ZXJPZmZzZXRZKTtcbiAgfVxufVxuZnVuY3Rpb24gY29tcG9zZVNNYXNrKGN0eCwgc21hc2ssIGxheWVyQ3R4LCBsYXllckJveCkge1xuICBjb25zdCBsYXllck9mZnNldFggPSBsYXllckJveFswXTtcbiAgY29uc3QgbGF5ZXJPZmZzZXRZID0gbGF5ZXJCb3hbMV07XG4gIGNvbnN0IGxheWVyV2lkdGggPSBsYXllckJveFsyXSAtIGxheWVyT2Zmc2V0WDtcbiAgY29uc3QgbGF5ZXJIZWlnaHQgPSBsYXllckJveFszXSAtIGxheWVyT2Zmc2V0WTtcbiAgaWYgKGxheWVyV2lkdGggPT09IDAgfHwgbGF5ZXJIZWlnaHQgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZ2VuZXJpY0NvbXBvc2VTTWFzayhzbWFzay5jb250ZXh0LCBsYXllckN0eCwgbGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHQsIHNtYXNrLnN1YnR5cGUsIHNtYXNrLmJhY2tkcm9wLCBzbWFzay50cmFuc2Zlck1hcCwgbGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIHNtYXNrLm9mZnNldFgsIHNtYXNrLm9mZnNldFkpO1xuICBjdHguc2F2ZSgpO1xuICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICBjdHguZHJhd0ltYWdlKGxheWVyQ3R4LmNhbnZhcywgMCwgMCk7XG4gIGN0eC5yZXN0b3JlKCk7XG59XG5mdW5jdGlvbiBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQodHJhbnNmb3JtLCBpbnRlcnBvbGF0ZSkge1xuICBjb25zdCBzY2FsZSA9IHV0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pO1xuICBzY2FsZVswXSA9IE1hdGguZnJvdW5kKHNjYWxlWzBdKTtcbiAgc2NhbGVbMV0gPSBNYXRoLmZyb3VuZChzY2FsZVsxXSk7XG4gIGNvbnN0IGFjdHVhbFNjYWxlID0gTWF0aC5mcm91bmQoKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAqIGRpc3BsYXlfdXRpbHMuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcbiAgaWYgKGludGVycG9sYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gaW50ZXJwb2xhdGU7XG4gIH0gZWxzZSBpZiAoc2NhbGVbMF0gPD0gYWN0dWFsU2NhbGUgfHwgc2NhbGVbMV0gPD0gYWN0dWFsU2NhbGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBMSU5FX0NBUF9TVFlMRVMgPSBbXCJidXR0XCIsIFwicm91bmRcIiwgXCJzcXVhcmVcIl07XG5jb25zdCBMSU5FX0pPSU5fU1RZTEVTID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdO1xuY29uc3QgTk9STUFMX0NMSVAgPSB7fTtcbmNvbnN0IEVPX0NMSVAgPSB7fTtcbmNsYXNzIENhbnZhc0dyYXBoaWNzIHtcbiAgY29uc3RydWN0b3IoY2FudmFzQ3R4LCBjb21tb25PYmpzLCBvYmpzLCBjYW52YXNGYWN0b3J5LCBmaWx0ZXJGYWN0b3J5LCBfcmVmLCBhbm5vdGF0aW9uQ2FudmFzTWFwLCBwYWdlQ29sb3JzKSB7XG4gICAgbGV0IHtcbiAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZyxcbiAgICAgIG1hcmtlZENvbnRlbnRTdGFjayA9IG51bGxcbiAgICB9ID0gX3JlZjtcbiAgICB0aGlzLmN0eCA9IGNhbnZhc0N0eDtcbiAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSh0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdO1xuICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuICAgIHRoaXMucmVzID0gbnVsbDtcbiAgICB0aGlzLnhvYmpzID0gbnVsbDtcbiAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuICAgIHRoaXMub2JqcyA9IG9ianM7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmaWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuZ3JvdXBTdGFjayA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBudWxsO1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrID0gW107XG4gICAgdGhpcy5ncm91cExldmVsID0gMDtcbiAgICB0aGlzLnNtYXNrU3RhY2sgPSBbXTtcbiAgICB0aGlzLnNtYXNrQ291bnRlciA9IDA7XG4gICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjayA9IG1hcmtlZENvbnRlbnRTdGFjayB8fCBbXTtcbiAgICB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZyA9IG9wdGlvbmFsQ29udGVudENvbmZpZztcbiAgICB0aGlzLmNhY2hlZENhbnZhc2VzID0gbmV3IENhY2hlZENhbnZhc2VzKHRoaXMuY2FudmFzRmFjdG9yeSk7XG4gICAgdGhpcy5jYWNoZWRQYXR0ZXJucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhbm5vdGF0aW9uQ2FudmFzTWFwO1xuICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IDE7XG4gICAgdGhpcy5vdXRwdXRTY2FsZVggPSAxO1xuICAgIHRoaXMub3V0cHV0U2NhbGVZID0gMTtcbiAgICB0aGlzLnBhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBbLTEsIDBdO1xuICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAgPSBuZXcgTWFwKCk7XG4gIH1cbiAgZ2V0T2JqZWN0KGRhdGEpIHtcbiAgICBsZXQgZmFsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZGF0YS5zdGFydHNXaXRoKFwiZ19cIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KGRhdGEpIDogdGhpcy5vYmpzLmdldChkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG4gIGJlZ2luRHJhd2luZyhfcmVmMikge1xuICAgIGxldCB7XG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIHRyYW5zcGFyZW5jeSA9IGZhbHNlLFxuICAgICAgYmFja2dyb3VuZCA9IG51bGxcbiAgICB9ID0gX3JlZjI7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmN0eC5jYW52YXMud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jdHguY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBzYXZlZEZpbGxTdHlsZSA9IHRoaXMuY3R4LmZpbGxTdHlsZTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kIHx8IFwiI2ZmZmZmZlwiO1xuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IHNhdmVkRmlsbFN0eWxlO1xuICAgIGlmICh0cmFuc3BhcmVuY3kpIHtcbiAgICAgIGNvbnN0IHRyYW5zcGFyZW50Q2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJ0cmFuc3BhcmVudFwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7XG4gICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdHJhbnNwYXJlbnRDYW52YXMuY2FudmFzO1xuICAgICAgdGhpcy5jdHggPSB0cmFuc3BhcmVudENhbnZhcy5jb250ZXh0O1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtKC4uLigwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jb21wb3NpdGVDdHgpKTtcbiAgICB9XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcbiAgICAgIHRoaXMub3V0cHV0U2NhbGVYID0gdHJhbnNmb3JtWzBdO1xuICAgICAgdGhpcy5vdXRwdXRTY2FsZVkgPSB0cmFuc2Zvcm1bMF07XG4gICAgfVxuICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi52aWV3cG9ydC50cmFuc2Zvcm0pO1xuICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IHZpZXdwb3J0LnNjYWxlO1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9ICgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpO1xuICB9XG4gIGV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0LCBleGVjdXRpb25TdGFydElkeCwgY29udGludWVDYWxsYmFjaywgc3RlcHBlcikge1xuICAgIGNvbnN0IGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7XG4gICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5O1xuICAgIGxldCBpID0gZXhlY3V0aW9uU3RhcnRJZHggfHwgMDtcbiAgICBjb25zdCBhcmdzQXJyYXlMZW4gPSBhcmdzQXJyYXkubGVuZ3RoO1xuICAgIGlmIChhcmdzQXJyYXlMZW4gPT09IGkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICBjb25zdCBjaHVua09wZXJhdGlvbnMgPSBhcmdzQXJyYXlMZW4gLSBpID4gRVhFQ1VUSU9OX1NURVBTICYmIHR5cGVvZiBjb250aW51ZUNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCI7XG4gICAgY29uc3QgZW5kVGltZSA9IGNodW5rT3BlcmF0aW9ucyA/IERhdGUubm93KCkgKyBFWEVDVVRJT05fVElNRSA6IDA7XG4gICAgbGV0IHN0ZXBzID0gMDtcbiAgICBjb25zdCBjb21tb25PYmpzID0gdGhpcy5jb21tb25PYmpzO1xuICAgIGNvbnN0IG9ianMgPSB0aGlzLm9ianM7XG4gICAgbGV0IGZuSWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChzdGVwcGVyICE9PSB1bmRlZmluZWQgJiYgaSA9PT0gc3RlcHBlci5uZXh0QnJlYWtQb2ludCkge1xuICAgICAgICBzdGVwcGVyLmJyZWFrSXQoaSwgY29udGludWVDYWxsYmFjayk7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgICAgZm5JZCA9IGZuQXJyYXlbaV07XG4gICAgICBpZiAoZm5JZCAhPT0gdXRpbC5PUFMuZGVwZW5kZW5jeSkge1xuICAgICAgICB0aGlzW2ZuSWRdLmFwcGx5KHRoaXMsIGFyZ3NBcnJheVtpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcE9iaklkIG9mIGFyZ3NBcnJheVtpXSkge1xuICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gZGVwT2JqSWQuc3RhcnRzV2l0aChcImdfXCIpID8gY29tbW9uT2JqcyA6IG9ianM7XG4gICAgICAgICAgaWYgKCFvYmpzUG9vbC5oYXMoZGVwT2JqSWQpKSB7XG4gICAgICAgICAgICBvYmpzUG9vbC5nZXQoZGVwT2JqSWQsIGNvbnRpbnVlQ2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgICBpZiAoaSA9PT0gYXJnc0FycmF5TGVuKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgICAgaWYgKGNodW5rT3BlcmF0aW9ucyAmJiArK3N0ZXBzID4gRVhFQ1VUSU9OX1NURVBTKSB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpID4gZW5kVGltZSkge1xuICAgICAgICAgIGNvbnRpbnVlQ2FsbGJhY2soKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwcyA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNyZXN0b3JlSW5pdGlhbFN0YXRlKCkge1xuICAgIHdoaWxlICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoIHx8IHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH1cbiAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgaWYgKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpIHtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5jb21wb3NpdGVDdHg7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywgMCwgMCk7XG4gICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgZW5kRHJhd2luZygpIHtcbiAgICB0aGlzLiNyZXN0b3JlSW5pdGlhbFN0YXRlKCk7XG4gICAgdGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpO1xuICAgIHRoaXMuY2FjaGVkUGF0dGVybnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGNhY2hlIG9mIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAudmFsdWVzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgY2FudmFzIG9mIGNhY2hlLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5jbGVhcigpO1xuICAgIHRoaXMuI2RyYXdGaWx0ZXIoKTtcbiAgfVxuICAjZHJhd0ZpbHRlcigpIHtcbiAgICBpZiAodGhpcy5wYWdlQ29sb3JzKSB7XG4gICAgICBjb25zdCBoY21GaWx0ZXJJZCA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy5wYWdlQ29sb3JzLmZvcmVncm91bmQsIHRoaXMucGFnZUNvbG9ycy5iYWNrZ3JvdW5kKTtcbiAgICAgIGlmIChoY21GaWx0ZXJJZCAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWRGaWx0ZXIgPSB0aGlzLmN0eC5maWx0ZXI7XG4gICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IGhjbUZpbHRlcklkO1xuICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jdHguY2FudmFzLCAwLCAwKTtcbiAgICAgICAgdGhpcy5jdHguZmlsdGVyID0gc2F2ZWRGaWx0ZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9zY2FsZUltYWdlKGltZywgaW52ZXJzZVRyYW5zZm9ybSkge1xuICAgIGNvbnN0IHdpZHRoID0gaW1nLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgbGV0IHdpZHRoU2NhbGUgPSBNYXRoLm1heChNYXRoLmh5cG90KGludmVyc2VUcmFuc2Zvcm1bMF0sIGludmVyc2VUcmFuc2Zvcm1bMV0pLCAxKTtcbiAgICBsZXQgaGVpZ2h0U2NhbGUgPSBNYXRoLm1heChNYXRoLmh5cG90KGludmVyc2VUcmFuc2Zvcm1bMl0sIGludmVyc2VUcmFuc2Zvcm1bM10pLCAxKTtcbiAgICBsZXQgcGFpbnRXaWR0aCA9IHdpZHRoLFxuICAgICAgcGFpbnRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgbGV0IHRtcENhbnZhc0lkID0gXCJwcmVzY2FsZTFcIjtcbiAgICBsZXQgdG1wQ2FudmFzLCB0bXBDdHg7XG4gICAgd2hpbGUgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxIHx8IGhlaWdodFNjYWxlID4gMiAmJiBwYWludEhlaWdodCA+IDEpIHtcbiAgICAgIGxldCBuZXdXaWR0aCA9IHBhaW50V2lkdGgsXG4gICAgICAgIG5ld0hlaWdodCA9IHBhaW50SGVpZ2h0O1xuICAgICAgaWYgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxKSB7XG4gICAgICAgIG5ld1dpZHRoID0gcGFpbnRXaWR0aCA+PSAxNjM4NCA/IE1hdGguZmxvb3IocGFpbnRXaWR0aCAvIDIpIC0gMSB8fCAxIDogTWF0aC5jZWlsKHBhaW50V2lkdGggLyAyKTtcbiAgICAgICAgd2lkdGhTY2FsZSAvPSBwYWludFdpZHRoIC8gbmV3V2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkge1xuICAgICAgICBuZXdIZWlnaHQgPSBwYWludEhlaWdodCA+PSAxNjM4NCA/IE1hdGguZmxvb3IocGFpbnRIZWlnaHQgLyAyKSAtIDEgfHwgMSA6IE1hdGguY2VpbChwYWludEhlaWdodCkgLyAyO1xuICAgICAgICBoZWlnaHRTY2FsZSAvPSBwYWludEhlaWdodCAvIG5ld0hlaWdodDtcbiAgICAgIH1cbiAgICAgIHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKHRtcENhbnZhc0lkLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIHRtcEN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBwYWludFdpZHRoLCBwYWludEhlaWdodCwgMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICBpbWcgPSB0bXBDYW52YXMuY2FudmFzO1xuICAgICAgcGFpbnRXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgcGFpbnRIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICB0bXBDYW52YXNJZCA9IHRtcENhbnZhc0lkID09PSBcInByZXNjYWxlMVwiID8gXCJwcmVzY2FsZTJcIiA6IFwicHJlc2NhbGUxXCI7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpbWcsXG4gICAgICBwYWludFdpZHRoLFxuICAgICAgcGFpbnRIZWlnaHRcbiAgICB9O1xuICB9XG4gIF9jcmVhdGVNYXNrQ2FudmFzKGltZykge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGltZztcbiAgICBjb25zdCBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgIGNvbnN0IGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG4gICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9ICgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KTtcbiAgICBsZXQgY2FjaGUsIGNhY2hlS2V5LCBzY2FsZWQsIG1hc2tDYW52YXM7XG4gICAgaWYgKChpbWcuYml0bWFwIHx8IGltZy5kYXRhKSAmJiBpbWcuY291bnQgPiAxKSB7XG4gICAgICBjb25zdCBtYWluS2V5ID0gaW1nLmJpdG1hcCB8fCBpbWcuZGF0YS5idWZmZXI7XG4gICAgICBjYWNoZUtleSA9IEpTT04uc3RyaW5naWZ5KGlzUGF0dGVybkZpbGwgPyBjdXJyZW50VHJhbnNmb3JtIDogW2N1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoMCwgNCksIGZpbGxDb2xvcl0pO1xuICAgICAgY2FjaGUgPSB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmdldChtYWluS2V5KTtcbiAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuc2V0KG1haW5LZXksIGNhY2hlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhY2hlZEltYWdlID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYWNoZWRJbWFnZSAmJiAhaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5yb3VuZChNYXRoLm1pbihjdXJyZW50VHJhbnNmb3JtWzBdLCBjdXJyZW50VHJhbnNmb3JtWzJdKSArIGN1cnJlbnRUcmFuc2Zvcm1bNF0pO1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5yb3VuZChNYXRoLm1pbihjdXJyZW50VHJhbnNmb3JtWzFdLCBjdXJyZW50VHJhbnNmb3JtWzNdKSArIGN1cnJlbnRUcmFuc2Zvcm1bNV0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNhbnZhczogY2FjaGVkSW1hZ2UsXG4gICAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzY2FsZWQgPSBjYWNoZWRJbWFnZTtcbiAgICB9XG4gICAgaWYgKCFzY2FsZWQpIHtcbiAgICAgIG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tDYW52YXNcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0NhbnZhcy5jb250ZXh0LCBpbWcpO1xuICAgIH1cbiAgICBsZXQgbWFza1RvQ2FudmFzID0gdXRpbC5VdGlsLnRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtLCBbMSAvIHdpZHRoLCAwLCAwLCAtMSAvIGhlaWdodCwgMCwgMF0pO1xuICAgIG1hc2tUb0NhbnZhcyA9IHV0aWwuVXRpbC50cmFuc2Zvcm0obWFza1RvQ2FudmFzLCBbMSwgMCwgMCwgMSwgMCwgLWhlaWdodF0pO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IHV0aWwuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgd2lkdGgsIGhlaWdodF0sIG1hc2tUb0NhbnZhcyk7XG4gICAgY29uc3QgZHJhd25XaWR0aCA9IE1hdGgucm91bmQobWF4WCAtIG1pblgpIHx8IDE7XG4gICAgY29uc3QgZHJhd25IZWlnaHQgPSBNYXRoLnJvdW5kKG1heFkgLSBtaW5ZKSB8fCAxO1xuICAgIGNvbnN0IGZpbGxDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImZpbGxDYW52YXNcIiwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuICAgIGNvbnN0IGZpbGxDdHggPSBmaWxsQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3Qgb2Zmc2V0WCA9IG1pblg7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IG1pblk7XG4gICAgZmlsbEN0eC50cmFuc2xhdGUoLW9mZnNldFgsIC1vZmZzZXRZKTtcbiAgICBmaWxsQ3R4LnRyYW5zZm9ybSguLi5tYXNrVG9DYW52YXMpO1xuICAgIGlmICghc2NhbGVkKSB7XG4gICAgICBzY2FsZWQgPSB0aGlzLl9zY2FsZUltYWdlKG1hc2tDYW52YXMuY2FudmFzLCAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShmaWxsQ3R4KSk7XG4gICAgICBzY2FsZWQgPSBzY2FsZWQuaW1nO1xuICAgICAgaWYgKGNhY2hlICYmIGlzUGF0dGVybkZpbGwpIHtcbiAgICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBzY2FsZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBmaWxsQ3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGdldEltYWdlU21vb3RoaW5nRW5hYmxlZCgoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGZpbGxDdHgpLCBpbWcuaW50ZXJwb2xhdGUpO1xuICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhmaWxsQ3R4LCBzY2FsZWQsIDAsIDAsIHNjYWxlZC53aWR0aCwgc2NhbGVkLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgZmlsbEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgIGNvbnN0IGludmVyc2UgPSB1dGlsLlV0aWwudHJhbnNmb3JtKCgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGZpbGxDdHgpLCBbMSwgMCwgMCwgMSwgLW9mZnNldFgsIC1vZmZzZXRZXSk7XG4gICAgZmlsbEN0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBpbnZlcnNlLCBQYXRoVHlwZS5GSUxMKSA6IGZpbGxDb2xvcjtcbiAgICBmaWxsQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChjYWNoZSAmJiAhaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgdGhpcy5jYWNoZWRDYW52YXNlcy5kZWxldGUoXCJmaWxsQ2FudmFzXCIpO1xuICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBmaWxsQ2FudmFzLmNhbnZhcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjYW52YXM6IGZpbGxDYW52YXMuY2FudmFzLFxuICAgICAgb2Zmc2V0WDogTWF0aC5yb3VuZChvZmZzZXRYKSxcbiAgICAgIG9mZnNldFk6IE1hdGgucm91bmQob2Zmc2V0WSlcbiAgICB9O1xuICB9XG4gIHNldExpbmVXaWR0aCh3aWR0aCkge1xuICAgIGlmICh3aWR0aCAhPT0gdGhpcy5jdXJyZW50LmxpbmVXaWR0aCkge1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jdHgubGluZVdpZHRoID0gd2lkdGg7XG4gIH1cbiAgc2V0TGluZUNhcChzdHlsZSkge1xuICAgIHRoaXMuY3R4LmxpbmVDYXAgPSBMSU5FX0NBUF9TVFlMRVNbc3R5bGVdO1xuICB9XG4gIHNldExpbmVKb2luKHN0eWxlKSB7XG4gICAgdGhpcy5jdHgubGluZUpvaW4gPSBMSU5FX0pPSU5fU1RZTEVTW3N0eWxlXTtcbiAgfVxuICBzZXRNaXRlckxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jdHgubWl0ZXJMaW1pdCA9IGxpbWl0O1xuICB9XG4gIHNldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBpZiAoY3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoQXJyYXkpO1xuICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gZGFzaFBoYXNlO1xuICAgIH1cbiAgfVxuICBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7fVxuICBzZXRGbGF0bmVzcyhmbGF0bmVzcykge31cbiAgc2V0R1N0YXRlKHN0YXRlcykge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0YXRlcykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcIkxXXCI6XG4gICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTENcIjpcbiAgICAgICAgICB0aGlzLnNldExpbmVDYXAodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICB0aGlzLnNldExpbmVKb2luKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1MXCI6XG4gICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkRcIjpcbiAgICAgICAgICB0aGlzLnNldERhc2godmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlJJXCI6XG4gICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRkxcIjpcbiAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICB0aGlzLnNldEZvbnQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNBXCI6XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhID0gdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQk1cIjpcbiAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlNNYXNrXCI6XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gdmFsdWUgPyB0aGlzLnRlbXBTTWFzayA6IG51bGw7XG4gICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJUUlwiOlxuICAgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkRmlsdGVyKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IGluU01hc2tNb2RlKCkge1xuICAgIHJldHVybiAhIXRoaXMuc3VzcGVuZGVkQ3R4O1xuICB9XG4gIGNoZWNrU01hc2tTdGF0ZSgpIHtcbiAgICBjb25zdCBpblNNYXNrTW9kZSA9IHRoaXMuaW5TTWFza01vZGU7XG4gICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiAhaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuYmVnaW5TTWFza01vZGUoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG4gICAgfVxuICB9XG4gIGJlZ2luU01hc2tNb2RlKCkge1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpblNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBpbiBzbWFzayBtb2RlXCIpO1xuICAgIH1cbiAgICBjb25zdCBkcmF3bldpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoO1xuICAgIGNvbnN0IGRyYXduSGVpZ2h0ID0gdGhpcy5jdHguY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBjYWNoZUlkID0gXCJzbWFza0dyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICBjb25zdCBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5jdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY3R4LnNldFRyYW5zZm9ybSguLi4oMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuc3VzcGVuZGVkQ3R4KSk7XG4gICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCBjdHgpO1xuICAgIG1pcnJvckNvbnRleHRPcGVyYXRpb25zKGN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgfVxuICBlbmRTTWFza01vZGUoKSB7XG4gICAgaWYgKCF0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmRTTWFza01vZGUgY2FsbGVkIHdoaWxlIG5vdCBpbiBzbWFzayBtb2RlXCIpO1xuICAgIH1cbiAgICB0aGlzLmN0eC5fcmVtb3ZlTWlycm9yaW5nKCk7XG4gICAgY29weUN0eFN0YXRlKHRoaXMuY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG4gICAgdGhpcy5jdHggPSB0aGlzLnN1c3BlbmRlZEN0eDtcbiAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IG51bGw7XG4gIH1cbiAgY29tcG9zZShkaXJ0eUJveCkge1xuICAgIGlmICghdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZGlydHlCb3gpIHtcbiAgICAgIGRpcnR5Qm94ID0gWzAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcnR5Qm94WzBdID0gTWF0aC5mbG9vcihkaXJ0eUJveFswXSk7XG4gICAgICBkaXJ0eUJveFsxXSA9IE1hdGguZmxvb3IoZGlydHlCb3hbMV0pO1xuICAgICAgZGlydHlCb3hbMl0gPSBNYXRoLmNlaWwoZGlydHlCb3hbMl0pO1xuICAgICAgZGlydHlCb3hbM10gPSBNYXRoLmNlaWwoZGlydHlCb3hbM10pO1xuICAgIH1cbiAgICBjb25zdCBzbWFzayA9IHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaztcbiAgICBjb25zdCBzdXNwZW5kZWRDdHggPSB0aGlzLnN1c3BlbmRlZEN0eDtcbiAgICBjb21wb3NlU01hc2soc3VzcGVuZGVkQ3R4LCBzbWFzaywgdGhpcy5jdHgsIGRpcnR5Qm94KTtcbiAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgfVxuICBzYXZlKCkge1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4LnNhdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIH1cbiAgICBjb25zdCBvbGQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2gob2xkKTtcbiAgICB0aGlzLmN1cnJlbnQgPSBvbGQuY2xvbmUoKTtcbiAgfVxuICByZXN0b3JlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoID09PSAwICYmIHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7XG4gICAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgICB0aGlzLnN1c3BlbmRlZEN0eC5yZXN0b3JlKCk7XG4gICAgICAgIGNvcHlDdHhTdGF0ZSh0aGlzLnN1c3BlbmRlZEN0eCwgdGhpcy5jdHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGVja1NNYXNrU3RhdGUoKTtcbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gICAgfVxuICB9XG4gIHRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgdGhpcy5jdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgfVxuICBjb25zdHJ1Y3RQYXRoKG9wcywgYXJncywgbWluTWF4KSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBsZXQgeCA9IGN1cnJlbnQueCxcbiAgICAgIHkgPSBjdXJyZW50Lnk7XG4gICAgbGV0IHN0YXJ0WCwgc3RhcnRZO1xuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCk7XG4gICAgY29uc3QgaXNTY2FsaW5nTWF0cml4ID0gY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwIHx8IGN1cnJlbnRUcmFuc2Zvcm1bMV0gPT09IDAgJiYgY3VycmVudFRyYW5zZm9ybVsyXSA9PT0gMDtcbiAgICBjb25zdCBtaW5NYXhGb3JCZXppZXIgPSBpc1NjYWxpbmdNYXRyaXggPyBtaW5NYXguc2xpY2UoMCkgOiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSBvcHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgc3dpdGNoIChvcHNbaV0gfCAwKSB7XG4gICAgICAgIGNhc2UgdXRpbC5PUFMucmVjdGFuZ2xlOlxuICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgeSA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhcmdzW2orK107XG4gICAgICAgICAgY29uc3QgeHcgPSB4ICsgd2lkdGg7XG4gICAgICAgICAgY29uc3QgeWggPSB5ICsgaGVpZ2h0O1xuICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeWgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeWgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzU2NhbGluZ01hdHJpeCkge1xuICAgICAgICAgICAgY3VycmVudC51cGRhdGVSZWN0TWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIFt4LCB5LCB4dywgeWhdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHV0aWwuT1BTLm1vdmVUbzpcbiAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgICBpZiAoIWlzU2NhbGluZ01hdHJpeCkge1xuICAgICAgICAgICAgY3VycmVudC51cGRhdGVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB1dGlsLk9QUy5saW5lVG86XG4gICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCB4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdXRpbC5PUFMuY3VydmVUbzpcbiAgICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICAgIHN0YXJ0WSA9IHk7XG4gICAgICAgICAgeCA9IGFyZ3NbaiArIDRdO1xuICAgICAgICAgIHkgPSBhcmdzW2ogKyA1XTtcbiAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCB4LCB5KTtcbiAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgeCwgeSwgbWluTWF4Rm9yQmV6aWVyKTtcbiAgICAgICAgICBqICs9IDY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdXRpbC5PUFMuY3VydmVUbzI6XG4gICAgICAgICAgc3RhcnRYID0geDtcbiAgICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHgsIHksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10pO1xuICAgICAgICAgIGN1cnJlbnQudXBkYXRlQ3VydmVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHN0YXJ0WCwgc3RhcnRZLCB4LCB5LCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCBtaW5NYXhGb3JCZXppZXIpO1xuICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcbiAgICAgICAgICB5ID0gYXJnc1tqICsgM107XG4gICAgICAgICAgaiArPSA0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHV0aWwuT1BTLmN1cnZlVG8zOlxuICAgICAgICAgIHN0YXJ0WCA9IHg7XG4gICAgICAgICAgc3RhcnRZID0geTtcbiAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG4gICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCB4LCB5LCB4LCB5KTtcbiAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIHgsIHksIHgsIHksIG1pbk1heEZvckJlemllcik7XG4gICAgICAgICAgaiArPSA0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHV0aWwuT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgIGN1cnJlbnQudXBkYXRlU2NhbGluZ1BhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgbWluTWF4Rm9yQmV6aWVyKTtcbiAgICB9XG4gICAgY3VycmVudC5zZXRDdXJyZW50UG9pbnQoeCwgeSk7XG4gIH1cbiAgY2xvc2VQYXRoKCkge1xuICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICB9XG4gIHN0cm9rZSgpIHtcbiAgICBsZXQgY29uc3VtZVBhdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG4gICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhO1xuICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIHN0cm9rZUNvbG9yID09PSBcIm9iamVjdFwiICYmIHN0cm9rZUNvbG9yPy5nZXRQYXR0ZXJuKSB7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShjdHgpLCBQYXRoVHlwZS5TVFJPS0UpO1xuICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UoZmFsc2UpO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNjYWxlQW5kU3Ryb2tlKHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uc3VtZVBhdGgpIHtcbiAgICAgIHRoaXMuY29uc3VtZVBhdGgodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgfVxuICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5maWxsQWxwaGE7XG4gIH1cbiAgY2xvc2VTdHJva2UoKSB7XG4gICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLnN0cm9rZSgpO1xuICB9XG4gIGZpbGwoKSB7XG4gICAgbGV0IGNvbnN1bWVQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgY29uc3QgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBsZXQgbmVlZFJlc3RvcmUgPSBmYWxzZTtcbiAgICBpZiAoaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsICgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGN0eCksIFBhdGhUeXBlLkZJTEwpO1xuICAgICAgbmVlZFJlc3RvcmUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpbnRlcnNlY3QgPSB0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIGludGVyc2VjdCAhPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0VPRmlsbCkge1xuICAgICAgICBjdHguZmlsbChcImV2ZW5vZGRcIik7XG4gICAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5lZWRSZXN0b3JlKSB7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgICBpZiAoY29uc3VtZVBhdGgpIHtcbiAgICAgIHRoaXMuY29uc3VtZVBhdGgoaW50ZXJzZWN0KTtcbiAgICB9XG4gIH1cbiAgZW9GaWxsKCkge1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7XG4gICAgdGhpcy5maWxsKCk7XG4gIH1cbiAgZmlsbFN0cm9rZSgpIHtcbiAgICB0aGlzLmZpbGwoZmFsc2UpO1xuICAgIHRoaXMuc3Ryb2tlKGZhbHNlKTtcbiAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gIH1cbiAgZW9GaWxsU3Ryb2tlKCkge1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7XG4gICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gIH1cbiAgY2xvc2VGaWxsU3Ryb2tlKCkge1xuICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gIH1cbiAgY2xvc2VFT0ZpbGxTdHJva2UoKSB7XG4gICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICB9XG4gIGVuZFBhdGgoKSB7XG4gICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICB9XG4gIGNsaXAoKSB7XG4gICAgdGhpcy5wZW5kaW5nQ2xpcCA9IE5PUk1BTF9DTElQO1xuICB9XG4gIGVvQ2xpcCgpIHtcbiAgICB0aGlzLnBlbmRpbmdDbGlwID0gRU9fQ0xJUDtcbiAgfVxuICBiZWdpblRleHQoKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSB1dGlsLklERU5USVRZX01BVFJJWDtcbiAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG4gICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgPSAwO1xuICB9XG4gIGVuZFRleHQoKSB7XG4gICAgY29uc3QgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnBhdGgudHJhbnNmb3JtKTtcbiAgICAgIGN0eC50cmFuc2xhdGUocGF0aC54LCBwYXRoLnkpO1xuICAgICAgcGF0aC5hZGRUb1BhdGgoY3R4LCBwYXRoLmZvbnRTaXplKTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICBjdHguY2xpcCgpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuICB9XG4gIHNldENoYXJTcGFjaW5nKHNwYWNpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQuY2hhclNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG4gIHNldFdvcmRTcGFjaW5nKHNwYWNpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG4gIHNldEhTY2FsZShzY2FsZSkge1xuICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gc2NhbGUgLyAxMDA7XG4gIH1cbiAgc2V0TGVhZGluZyhsZWFkaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZztcbiAgfVxuICBzZXRGb250KGZvbnRSZWZOYW1lLCBzaXplKSB7XG4gICAgY29uc3QgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZm9udFJlZk5hbWUpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgaWYgKCFmb250T2JqKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGZpbmQgZm9udCBmb3IgJHtmb250UmVmTmFtZX1gKTtcbiAgICB9XG4gICAgY3VycmVudC5mb250TWF0cml4ID0gZm9udE9iai5mb250TWF0cml4IHx8IHV0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgaWYgKGN1cnJlbnQuZm9udE1hdHJpeFswXSA9PT0gMCB8fCBjdXJyZW50LmZvbnRNYXRyaXhbM10gPT09IDApIHtcbiAgICAgICgwLHV0aWwud2FybikoXCJJbnZhbGlkIGZvbnQgbWF0cml4IGZvciBmb250IFwiICsgZm9udFJlZk5hbWUpO1xuICAgIH1cbiAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgIHNpemUgPSAtc2l6ZTtcbiAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQuZm9udCA9IGZvbnRPYmo7XG4gICAgdGhpcy5jdXJyZW50LmZvbnRTaXplID0gc2l6ZTtcbiAgICBpZiAoZm9udE9iai5pc1R5cGUzRm9udCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZm9udE9iai5sb2FkZWROYW1lIHx8IFwic2Fucy1zZXJpZlwiO1xuICAgIGNvbnN0IHR5cGVmYWNlID0gZm9udE9iai5zeXN0ZW1Gb250SW5mbz8uY3NzIHx8IGBcIiR7bmFtZX1cIiwgJHtmb250T2JqLmZhbGxiYWNrTmFtZX1gO1xuICAgIGxldCBib2xkID0gXCJub3JtYWxcIjtcbiAgICBpZiAoZm9udE9iai5ibGFjaykge1xuICAgICAgYm9sZCA9IFwiOTAwXCI7XG4gICAgfSBlbHNlIGlmIChmb250T2JqLmJvbGQpIHtcbiAgICAgIGJvbGQgPSBcImJvbGRcIjtcbiAgICB9XG4gICAgY29uc3QgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcbiAgICBsZXQgYnJvd3NlckZvbnRTaXplID0gc2l6ZTtcbiAgICBpZiAoc2l6ZSA8IE1JTl9GT05UX1NJWkUpIHtcbiAgICAgIGJyb3dzZXJGb250U2l6ZSA9IE1JTl9GT05UX1NJWkU7XG4gICAgfSBlbHNlIGlmIChzaXplID4gTUFYX0ZPTlRfU0laRSkge1xuICAgICAgYnJvd3NlckZvbnRTaXplID0gTUFYX0ZPTlRfU0laRTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBzaXplIC8gYnJvd3NlckZvbnRTaXplO1xuICAgIHRoaXMuY3R4LmZvbnQgPSBgJHtpdGFsaWN9ICR7Ym9sZH0gJHticm93c2VyRm9udFNpemV9cHggJHt0eXBlZmFjZX1gO1xuICB9XG4gIHNldFRleHRSZW5kZXJpbmdNb2RlKG1vZGUpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPSBtb2RlO1xuICB9XG4gIHNldFRleHRSaXNlKHJpc2UpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dFJpc2UgPSByaXNlO1xuICB9XG4gIG1vdmVUZXh0KHgsIHkpIHtcbiAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCArPSB4O1xuICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZICs9IHk7XG4gIH1cbiAgc2V0TGVhZGluZ01vdmVUZXh0KHgsIHkpIHtcbiAgICB0aGlzLnNldExlYWRpbmcoLXkpO1xuICAgIHRoaXMubW92ZVRleHQoeCwgeSk7XG4gIH1cbiAgc2V0VGV4dE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguaHlwb3QoYSwgYik7XG4gICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggPSAwO1xuICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDtcbiAgfVxuICBuZXh0TGluZSgpIHtcbiAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTtcbiAgfVxuICBwYWludENoYXIoY2hhcmFjdGVyLCB4LCB5LCBwYXR0ZXJuVHJhbnNmb3JtKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuICAgIGNvbnN0IHRleHRSZW5kZXJpbmdNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZTtcbiAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemUgLyBjdXJyZW50LmZvbnRTaXplU2NhbGU7XG4gICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSB0ZXh0UmVuZGVyaW5nTW9kZSAmIHV0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICBjb25zdCBpc0FkZFRvUGF0aFNldCA9ICEhKHRleHRSZW5kZXJpbmdNb2RlICYgdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTtcbiAgICBjb25zdCBwYXR0ZXJuRmlsbCA9IGN1cnJlbnQucGF0dGVybkZpbGwgJiYgIWZvbnQubWlzc2luZ0ZpbGU7XG4gICAgbGV0IGFkZFRvUGF0aDtcbiAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgaXNBZGRUb1BhdGhTZXQgfHwgcGF0dGVybkZpbGwpIHtcbiAgICAgIGFkZFRvUGF0aCA9IGZvbnQuZ2V0UGF0aEdlbmVyYXRvcih0aGlzLmNvbW1vbk9ianMsIGNoYXJhY3Rlcik7XG4gICAgfVxuICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBwYXR0ZXJuRmlsbCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBhZGRUb1BhdGgoY3R4LCBmb250U2l6ZSk7XG4gICAgICBpZiAocGF0dGVyblRyYW5zZm9ybSkge1xuICAgICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSB1dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IHV0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IHV0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSB1dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IHV0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IHV0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSB1dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG4gICAgICAgIGN0eC5zdHJva2VUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0FkZFRvUGF0aFNldCkge1xuICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHMgfHw9IFtdO1xuICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgIHRyYW5zZm9ybTogKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgYWRkVG9QYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzRm9udFN1YnBpeGVsQUFFbmFibGVkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRleHQ6IGN0eFxuICAgIH0gPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlzRm9udFN1YnBpeGVsQUFFbmFibGVkXCIsIDEwLCAxMCk7XG4gICAgY3R4LnNjYWxlKDEuNSwgMSk7XG4gICAgY3R4LmZpbGxUZXh0KFwiSVwiLCAwLCAxMCk7XG4gICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMTAsIDEwKS5kYXRhO1xuICAgIGxldCBlbmFibGVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpZiAoZGF0YVtpXSA+IDAgJiYgZGF0YVtpXSA8IDI1NSkge1xuICAgICAgICBlbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoMCx1dGlsLnNoYWRvdykodGhpcywgXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCBlbmFibGVkKTtcbiAgfVxuICBzaG93VGV4dChnbHlwaHMpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQoZ2x5cGhzKTtcbiAgICB9XG4gICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplO1xuICAgIGlmIChmb250U2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZm9udFNpemVTY2FsZSA9IGN1cnJlbnQuZm9udFNpemVTY2FsZTtcbiAgICBjb25zdCBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7XG4gICAgY29uc3Qgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nO1xuICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG4gICAgY29uc3QgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247XG4gICAgY29uc3QgZ2x5cGhzTGVuZ3RoID0gZ2x5cGhzLmxlbmd0aDtcbiAgICBjb25zdCB2ZXJ0aWNhbCA9IGZvbnQudmVydGljYWw7XG4gICAgY29uc3Qgc3BhY2luZ0RpciA9IHZlcnRpY2FsID8gMSA6IC0xO1xuICAgIGNvbnN0IGRlZmF1bHRWTWV0cmljcyA9IGZvbnQuZGVmYXVsdFZNZXRyaWNzO1xuICAgIGNvbnN0IHdpZHRoQWR2YW5jZVNjYWxlID0gZm9udFNpemUgKiBjdXJyZW50LmZvbnRNYXRyaXhbMF07XG4gICAgY29uc3Qgc2ltcGxlRmlsbFRleHQgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSB1dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIWZvbnQuZGlzYWJsZUZvbnRGYWNlICYmICFjdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zZm9ybSguLi5jdXJyZW50LnRleHRNYXRyaXgpO1xuICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkgKyBjdXJyZW50LnRleHRSaXNlKTtcbiAgICBpZiAoZm9udERpcmVjdGlvbiA+IDApIHtcbiAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAtMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAxKTtcbiAgICB9XG4gICAgbGV0IHBhdHRlcm5UcmFuc2Zvcm07XG4gICAgaWYgKGN1cnJlbnQucGF0dGVybkZpbGwpIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjb25zdCBwYXR0ZXJuID0gY3VycmVudC5maWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsICgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGN0eCksIFBhdGhUeXBlLkZJTEwpO1xuICAgICAgcGF0dGVyblRyYW5zZm9ybSA9ICgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgICB9XG4gICAgbGV0IGxpbmVXaWR0aCA9IGN1cnJlbnQubGluZVdpZHRoO1xuICAgIGNvbnN0IHNjYWxlID0gY3VycmVudC50ZXh0TWF0cml4U2NhbGU7XG4gICAgaWYgKHNjYWxlID09PSAwIHx8IGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSB1dGlsLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBsaW5lV2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGluZVdpZHRoIC89IHNjYWxlO1xuICAgIH1cbiAgICBpZiAoZm9udFNpemVTY2FsZSAhPT0gMS4wKSB7XG4gICAgICBjdHguc2NhbGUoZm9udFNpemVTY2FsZSwgZm9udFNpemVTY2FsZSk7XG4gICAgICBsaW5lV2lkdGggLz0gZm9udFNpemVTY2FsZTtcbiAgICB9XG4gICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICBpZiAoZm9udC5pc0ludmFsaWRQREZqc0ZvbnQpIHtcbiAgICAgIGNvbnN0IGNoYXJzID0gW107XG4gICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcbiAgICAgICAgY2hhcnMucHVzaChnbHlwaC51bmljb2RlKTtcbiAgICAgICAgd2lkdGggKz0gZ2x5cGgud2lkdGg7XG4gICAgICB9XG4gICAgICBjdHguZmlsbFRleHQoY2hhcnMuam9pbihcIlwiKSwgMCwgMCk7XG4gICAgICBjdXJyZW50LnggKz0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAqIHRleHRIU2NhbGU7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy5jb21wb3NlKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgeCA9IDAsXG4gICAgICBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICBpZiAodHlwZW9mIGdseXBoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHggKz0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCByZXN0b3JlTmVlZGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjtcbiAgICAgIGNvbnN0IGFjY2VudCA9IGdseXBoLmFjY2VudDtcbiAgICAgIGxldCBzY2FsZWRYLCBzY2FsZWRZO1xuICAgICAgbGV0IHdpZHRoID0gZ2x5cGgud2lkdGg7XG4gICAgICBpZiAodmVydGljYWwpIHtcbiAgICAgICAgY29uc3Qgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzO1xuICAgICAgICBjb25zdCB2eCA9IC0oZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNSkgKiB3aWR0aEFkdmFuY2VTY2FsZTtcbiAgICAgICAgY29uc3QgdnkgPSB2bWV0cmljWzJdICogd2lkdGhBZHZhbmNlU2NhbGU7XG4gICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7XG4gICAgICAgIHNjYWxlZFggPSB2eCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIHNjYWxlZFkgPSAoeCArIHZ5KSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FsZWRYID0geCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIHNjYWxlZFkgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGZvbnQucmVtZWFzdXJlICYmIHdpZHRoID4gMCkge1xuICAgICAgICBjb25zdCBtZWFzdXJlZFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGNoYXJhY3Rlcikud2lkdGggKiAxMDAwIC8gZm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuICAgICAgICBpZiAod2lkdGggPCBtZWFzdXJlZFdpZHRoICYmIHRoaXMuaXNGb250U3VicGl4ZWxBQUVuYWJsZWQpIHtcbiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJTY2FsZVggPSB3aWR0aCAvIG1lYXN1cmVkV2lkdGg7XG4gICAgICAgICAgcmVzdG9yZU5lZWRlZCA9IHRydWU7XG4gICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICBjdHguc2NhbGUoY2hhcmFjdGVyU2NhbGVYLCAxKTtcbiAgICAgICAgICBzY2FsZWRYIC89IGNoYXJhY3RlclNjYWxlWDtcbiAgICAgICAgfSBlbHNlIGlmICh3aWR0aCAhPT0gbWVhc3VyZWRXaWR0aCkge1xuICAgICAgICAgIHNjYWxlZFggKz0gKHdpZHRoIC0gbWVhc3VyZWRXaWR0aCkgLyAyMDAwICogZm9udFNpemUgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZ2x5cGguaXNJbkZvbnQgfHwgZm9udC5taXNzaW5nRmlsZSkpIHtcbiAgICAgICAgaWYgKHNpbXBsZUZpbGxUZXh0ICYmICFhY2NlbnQpIHtcbiAgICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCBzY2FsZWRYLCBzY2FsZWRZKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhaW50Q2hhcihjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICAgIGlmIChhY2NlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZEFjY2VudFggPSBzY2FsZWRYICsgZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnggLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVkQWNjZW50WSA9IHNjYWxlZFkgLSBmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgICB0aGlzLnBhaW50Q2hhcihhY2NlbnQuZm9udENoYXIsIHNjYWxlZEFjY2VudFgsIHNjYWxlZEFjY2VudFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY2hhcldpZHRoID0gdmVydGljYWwgPyB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb24gOiB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG4gICAgICB4ICs9IGNoYXJXaWR0aDtcbiAgICAgIGlmIChyZXN0b3JlTmVlZGVkKSB7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgY3VycmVudC55IC09IHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnQueCArPSB4ICogdGV4dEhTY2FsZTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHNob3dUeXBlM1RleHQoZ2x5cGhzKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTtcbiAgICBjb25zdCBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uO1xuICAgIGNvbnN0IHNwYWNpbmdEaXIgPSBmb250LnZlcnRpY2FsID8gMSA6IC0xO1xuICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcbiAgICBjb25zdCB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7XG4gICAgY29uc3QgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247XG4gICAgY29uc3QgZm9udE1hdHJpeCA9IGN1cnJlbnQuZm9udE1hdHJpeCB8fCB1dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgIGNvbnN0IGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7XG4gICAgY29uc3QgaXNUZXh0SW52aXNpYmxlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEU7XG4gICAgbGV0IGksIGdseXBoLCB3aWR0aCwgc3BhY2luZ0xlbmd0aDtcbiAgICBpZiAoaXNUZXh0SW52aXNpYmxlIHx8IGZvbnRTaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC50cmFuc2Zvcm0oLi4uY3VycmVudC50ZXh0TWF0cml4KTtcbiAgICBjdHgudHJhbnNsYXRlKGN1cnJlbnQueCwgY3VycmVudC55KTtcbiAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgZm9udERpcmVjdGlvbik7XG4gICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7XG4gICAgICBnbHlwaCA9IGdseXBoc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgZ2x5cGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgc3BhY2luZ0xlbmd0aCA9IHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplIC8gMTAwMDtcbiAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHNwYWNpbmdMZW5ndGgsIDApO1xuICAgICAgICBjdXJyZW50LnggKz0gc3BhY2luZ0xlbmd0aCAqIHRleHRIU2NhbGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nO1xuICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gZm9udC5jaGFyUHJvY09wZXJhdG9yTGlzdFtnbHlwaC5vcGVyYXRvckxpc3RJZF07XG4gICAgICBpZiAoIW9wZXJhdG9yTGlzdCkge1xuICAgICAgICAoMCx1dGlsLndhcm4pKGBUeXBlMyBjaGFyYWN0ZXIgXCIke2dseXBoLm9wZXJhdG9yTGlzdElkfVwiIGlzIG5vdCBhdmFpbGFibGUuYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBnbHlwaDtcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIGN0eC5zY2FsZShmb250U2l6ZSwgZm9udFNpemUpO1xuICAgICAgICBjdHgudHJhbnNmb3JtKC4uLmZvbnRNYXRyaXgpO1xuICAgICAgICB0aGlzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTtcbiAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHV0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbZ2x5cGgud2lkdGgsIDBdLCBmb250TWF0cml4KTtcbiAgICAgIHdpZHRoID0gdHJhbnNmb3JtZWRbMF0gKiBmb250U2l6ZSArIHNwYWNpbmc7XG4gICAgICBjdHgudHJhbnNsYXRlKHdpZHRoLCAwKTtcbiAgICAgIGN1cnJlbnQueCArPSB3aWR0aCAqIHRleHRIU2NhbGU7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsO1xuICB9XG4gIHNldENoYXJXaWR0aCh4V2lkdGgsIHlXaWR0aCkge31cbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzKHhXaWR0aCwgeVdpZHRoLCBsbHgsIGxseSwgdXJ4LCB1cnkpIHtcbiAgICB0aGlzLmN0eC5yZWN0KGxseCwgbGx5LCB1cnggLSBsbHgsIHVyeSAtIGxseSk7XG4gICAgdGhpcy5jdHguY2xpcCgpO1xuICAgIHRoaXMuZW5kUGF0aCgpO1xuICB9XG4gIGdldENvbG9yTl9QYXR0ZXJuKElSKSB7XG4gICAgbGV0IHBhdHRlcm47XG4gICAgaWYgKElSWzBdID09PSBcIlRpbGluZ1BhdHRlcm5cIikge1xuICAgICAgY29uc3QgY29sb3IgPSBJUlsxXTtcbiAgICAgIGNvbnN0IGJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICBjb25zdCBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB7XG4gICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiBjdHggPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgQ2FudmFzR3JhcGhpY3MoY3R4LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgICAgICAgICBtYXJrZWRDb250ZW50U3RhY2s6IHRoaXMubWFya2VkQ29udGVudFN0YWNrXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwYXR0ZXJuID0gbmV3IFRpbGluZ1BhdHRlcm4oSVIsIGNvbG9yLCB0aGlzLmN0eCwgY2FudmFzR3JhcGhpY3NGYWN0b3J5LCBiYXNlVHJhbnNmb3JtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0dGVybiA9IHRoaXMuX2dldFBhdHRlcm4oSVJbMV0sIElSWzJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cbiAgc2V0U3Ryb2tlQ29sb3JOKCkge1xuICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgfVxuICBzZXRGaWxsQ29sb3JOKCkge1xuICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gdHJ1ZTtcbiAgfVxuICBzZXRTdHJva2VSR0JDb2xvcihyLCBnLCBiKSB7XG4gICAgY29uc3QgY29sb3IgPSB1dGlsLlV0aWwubWFrZUhleENvbG9yKHIsIGcsIGIpO1xuICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG4gICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY29sb3I7XG4gIH1cbiAgc2V0RmlsbFJHQkNvbG9yKHIsIGcsIGIpIHtcbiAgICBjb25zdCBjb2xvciA9IHV0aWwuVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3I7XG4gICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IGZhbHNlO1xuICB9XG4gIF9nZXRQYXR0ZXJuKG9iaklkKSB7XG4gICAgbGV0IG1hdHJpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICBsZXQgcGF0dGVybjtcbiAgICBpZiAodGhpcy5jYWNoZWRQYXR0ZXJucy5oYXMob2JqSWQpKSB7XG4gICAgICBwYXR0ZXJuID0gdGhpcy5jYWNoZWRQYXR0ZXJucy5nZXQob2JqSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXR0ZXJuID0gZ2V0U2hhZGluZ1BhdHRlcm4odGhpcy5nZXRPYmplY3Qob2JqSWQpKTtcbiAgICAgIHRoaXMuY2FjaGVkUGF0dGVybnMuc2V0KG9iaklkLCBwYXR0ZXJuKTtcbiAgICB9XG4gICAgaWYgKG1hdHJpeCkge1xuICAgICAgcGF0dGVybi5tYXRyaXggPSBtYXRyaXg7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG4gIHNoYWRpbmdGaWxsKG9iaklkKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLl9nZXRQYXR0ZXJuKG9iaklkKTtcbiAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybi5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoY3R4KSwgUGF0aFR5cGUuU0hBRElORyk7XG4gICAgY29uc3QgaW52ID0gKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoY3R4KTtcbiAgICBpZiAoaW52KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSBjdHguY2FudmFzO1xuICAgICAgY29uc3QgW3gwLCB5MCwgeDEsIHkxXSA9IHV0aWwuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgd2lkdGgsIGhlaWdodF0sIGludik7XG4gICAgICB0aGlzLmN0eC5maWxsUmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwgLTFlMTAsIDJlMTAsIDJlMTApO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvc2UodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbiAgYmVnaW5JbmxpbmVJbWFnZSgpIHtcbiAgICAoMCx1dGlsLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlXCIpO1xuICB9XG4gIGJlZ2luSW1hZ2VEYXRhKCkge1xuICAgICgwLHV0aWwudW5yZWFjaGFibGUpKFwiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW1hZ2VEYXRhXCIpO1xuICB9XG4gIHBhaW50Rm9ybVhPYmplY3RCZWdpbihtYXRyaXgsIGJib3gpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1hdHJpeCkgJiYgbWF0cml4Lmxlbmd0aCA9PT0gNikge1xuICAgICAgdGhpcy50cmFuc2Zvcm0oLi4ubWF0cml4KTtcbiAgICB9XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgaWYgKGJib3gpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07XG4gICAgICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcbiAgICAgIHRoaXMuY3R4LnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heCgoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KSwgYmJveCk7XG4gICAgICB0aGlzLmNsaXAoKTtcbiAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgIH1cbiAgfVxuICBwYWludEZvcm1YT2JqZWN0RW5kKCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wb3AoKTtcbiAgfVxuICBiZWdpbkdyb3VwKGdyb3VwKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEN0eCA9IHRoaXMuY3R4O1xuICAgIGlmICghZ3JvdXAuaXNvbGF0ZWQpIHtcbiAgICAgICgwLHV0aWwuaW5mbykoXCJUT0RPOiBTdXBwb3J0IG5vbi1pc29sYXRlZCBncm91cHMuXCIpO1xuICAgIH1cbiAgICBpZiAoZ3JvdXAua25vY2tvdXQpIHtcbiAgICAgICgwLHV0aWwud2FybikoXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN1cnJlbnRDdHgpO1xuICAgIGlmIChncm91cC5tYXRyaXgpIHtcbiAgICAgIGN1cnJlbnRDdHgudHJhbnNmb3JtKC4uLmdyb3VwLm1hdHJpeCk7XG4gICAgfVxuICAgIGlmICghZ3JvdXAuYmJveCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcbiAgICB9XG4gICAgbGV0IGJvdW5kcyA9IHV0aWwuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChncm91cC5iYm94LCAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN1cnJlbnRDdHgpKTtcbiAgICBjb25zdCBjYW52YXNCb3VuZHMgPSBbMCwgMCwgY3VycmVudEN0eC5jYW52YXMud2lkdGgsIGN1cnJlbnRDdHguY2FudmFzLmhlaWdodF07XG4gICAgYm91bmRzID0gdXRpbC5VdGlsLmludGVyc2VjdChib3VuZHMsIGNhbnZhc0JvdW5kcykgfHwgWzAsIDAsIDAsIDBdO1xuICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLmZsb29yKGJvdW5kc1swXSk7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoYm91bmRzWzFdKTtcbiAgICBsZXQgZHJhd25XaWR0aCA9IE1hdGgubWF4KE1hdGguY2VpbChib3VuZHNbMl0pIC0gb2Zmc2V0WCwgMSk7XG4gICAgbGV0IGRyYXduSGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1szXSkgLSBvZmZzZXRZLCAxKTtcbiAgICBsZXQgc2NhbGVYID0gMSxcbiAgICAgIHNjYWxlWSA9IDE7XG4gICAgaWYgKGRyYXduV2lkdGggPiBNQVhfR1JPVVBfU0laRSkge1xuICAgICAgc2NhbGVYID0gZHJhd25XaWR0aCAvIE1BWF9HUk9VUF9TSVpFO1xuICAgICAgZHJhd25XaWR0aCA9IE1BWF9HUk9VUF9TSVpFO1xuICAgIH1cbiAgICBpZiAoZHJhd25IZWlnaHQgPiBNQVhfR1JPVVBfU0laRSkge1xuICAgICAgc2NhbGVZID0gZHJhd25IZWlnaHQgLyBNQVhfR1JPVVBfU0laRTtcbiAgICAgIGRyYXduSGVpZ2h0ID0gTUFYX0dST1VQX1NJWkU7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodF0pO1xuICAgIGxldCBjYWNoZUlkID0gXCJncm91cEF0XCIgKyB0aGlzLmdyb3VwTGV2ZWw7XG4gICAgaWYgKGdyb3VwLnNtYXNrKSB7XG4gICAgICBjYWNoZUlkICs9IFwiX3NtYXNrX1wiICsgdGhpcy5zbWFza0NvdW50ZXIrKyAlIDI7XG4gICAgfVxuICAgIGNvbnN0IHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCk7XG4gICAgY29uc3QgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG4gICAgZ3JvdXBDdHguc2NhbGUoMSAvIHNjYWxlWCwgMSAvIHNjYWxlWSk7XG4gICAgZ3JvdXBDdHgudHJhbnNsYXRlKC1vZmZzZXRYLCAtb2Zmc2V0WSk7XG4gICAgZ3JvdXBDdHgudHJhbnNmb3JtKC4uLmN1cnJlbnRUcmFuc2Zvcm0pO1xuICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgdGhpcy5zbWFza1N0YWNrLnB1c2goe1xuICAgICAgICBjYW52YXM6IHNjcmF0Y2hDYW52YXMuY2FudmFzLFxuICAgICAgICBjb250ZXh0OiBncm91cEN0eCxcbiAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WSxcbiAgICAgICAgc2NhbGVYLFxuICAgICAgICBzY2FsZVksXG4gICAgICAgIHN1YnR5cGU6IGdyb3VwLnNtYXNrLnN1YnR5cGUsXG4gICAgICAgIGJhY2tkcm9wOiBncm91cC5zbWFzay5iYWNrZHJvcCxcbiAgICAgICAgdHJhbnNmZXJNYXA6IGdyb3VwLnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsXG4gICAgICAgIHN0YXJ0VHJhbnNmb3JtSW52ZXJzZTogbnVsbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3VycmVudEN0eC50cmFuc2xhdGUob2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgICBjdXJyZW50Q3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgIGN1cnJlbnRDdHguc2F2ZSgpO1xuICAgIH1cbiAgICBjb3B5Q3R4U3RhdGUoY3VycmVudEN0eCwgZ3JvdXBDdHgpO1xuICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7XG4gICAgdGhpcy5zZXRHU3RhdGUoW1tcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sIFtcImNhXCIsIDFdLCBbXCJDQVwiLCAxXV0pO1xuICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpO1xuICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuICB9XG4gIGVuZEdyb3VwKGdyb3VwKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ3JvdXBMZXZlbC0tO1xuICAgIGNvbnN0IGdyb3VwQ3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIHRoaXMuY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgY29uc3QgY3VycmVudE10eCA9ICgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpO1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4uY3VycmVudE10eCk7XG4gICAgICBjb25zdCBkaXJ0eUJveCA9IHV0aWwuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZ3JvdXBDdHguY2FudmFzLndpZHRoLCBncm91cEN0eC5jYW52YXMuaGVpZ2h0XSwgY3VycmVudE10eCk7XG4gICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoZ3JvdXBDdHguY2FudmFzLCAwLCAwKTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuY29tcG9zZShkaXJ0eUJveCk7XG4gICAgfVxuICB9XG4gIGJlZ2luQW5ub3RhdGlvbihpZCwgcmVjdCwgdHJhbnNmb3JtLCBtYXRyaXgsIGhhc093bkNhbnZhcykge1xuICAgIHRoaXMuI3Jlc3RvcmVJbml0aWFsU3RhdGUoKTtcbiAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICh0aGlzLmJhc2VUcmFuc2Zvcm0pIHtcbiAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSguLi50aGlzLmJhc2VUcmFuc2Zvcm0pO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWN0KSAmJiByZWN0Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgY29uc3Qgd2lkdGggPSByZWN0WzJdIC0gcmVjdFswXTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHJlY3RbM10gLSByZWN0WzFdO1xuICAgICAgaWYgKGhhc093bkNhbnZhcyAmJiB0aGlzLmFubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgICAgdHJhbnNmb3JtID0gdHJhbnNmb3JtLnNsaWNlKCk7XG4gICAgICAgIHRyYW5zZm9ybVs0XSAtPSByZWN0WzBdO1xuICAgICAgICB0cmFuc2Zvcm1bNV0gLT0gcmVjdFsxXTtcbiAgICAgICAgcmVjdCA9IHJlY3Quc2xpY2UoKTtcbiAgICAgICAgcmVjdFswXSA9IHJlY3RbMV0gPSAwO1xuICAgICAgICByZWN0WzJdID0gd2lkdGg7XG4gICAgICAgIHJlY3RbM10gPSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IFtzY2FsZVgsIHNjYWxlWV0gPSB1dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCkpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdmlld3BvcnRTY2FsZVxuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBNYXRoLmNlaWwod2lkdGggKiB0aGlzLm91dHB1dFNjYWxlWCAqIHZpZXdwb3J0U2NhbGUpO1xuICAgICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0ICogdGhpcy5vdXRwdXRTY2FsZVkgKiB2aWV3cG9ydFNjYWxlKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcC5zZXQoaWQsIGNhbnZhcyk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eCA9IHRoaXMuY3R4O1xuICAgICAgICB0aGlzLmN0eCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgLXNjYWxlWSwgMCwgaGVpZ2h0ICogc2NhbGVZKTtcbiAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgICB0aGlzLmN0eC5yZWN0KHJlY3RbMF0sIHJlY3RbMV0sIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSh0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG4gICAgdGhpcy50cmFuc2Zvcm0oLi4ubWF0cml4KTtcbiAgfVxuICBlbmRBbm5vdGF0aW9uKCkge1xuICAgIGlmICh0aGlzLmFubm90YXRpb25DYW52YXMpIHtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuI2RyYXdGaWx0ZXIoKTtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O1xuICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eDtcbiAgICAgIGRlbGV0ZSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgfVxuICB9XG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdChpbWcpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSBpbWcuY291bnQ7XG4gICAgaW1nID0gdGhpcy5nZXRPYmplY3QoaW1nLmRhdGEsIGltZyk7XG4gICAgaW1nLmNvdW50ID0gY291bnQ7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZ2x5cGggPSB0aGlzLnByb2Nlc3NpbmdUeXBlMztcbiAgICBpZiAoZ2x5cGgpIHtcbiAgICAgIGlmIChnbHlwaC5jb21waWxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGdseXBoLmNvbXBpbGVkID0gY29tcGlsZVR5cGUzR2x5cGgoaW1nKTtcbiAgICAgIH1cbiAgICAgIGlmIChnbHlwaC5jb21waWxlZCkge1xuICAgICAgICBnbHlwaC5jb21waWxlZChjdHgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1hc2sgPSB0aGlzLl9jcmVhdGVNYXNrQ2FudmFzKGltZyk7XG4gICAgY29uc3QgbWFza0NhbnZhcyA9IG1hc2suY2FudmFzO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguZHJhd0ltYWdlKG1hc2tDYW52YXMsIG1hc2sub2Zmc2V0WCwgbWFzay5vZmZzZXRZKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdChpbWcsIHNjYWxlWCkge1xuICAgIGxldCBza2V3WCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcbiAgICBsZXQgc2tld1kgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gICAgbGV0IHNjYWxlWSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ID8gYXJndW1lbnRzWzRdIDogdW5kZWZpbmVkO1xuICAgIGxldCBwb3NpdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW1nID0gdGhpcy5nZXRPYmplY3QoaW1nLmRhdGEsIGltZyk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpO1xuICAgIGN0eC50cmFuc2Zvcm0oc2NhbGVYLCBza2V3WCwgc2tld1ksIHNjYWxlWSwgMCwgMCk7XG4gICAgY29uc3QgbWFzayA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXMoaW1nKTtcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIG1hc2sub2Zmc2V0WCAtIGN1cnJlbnRUcmFuc2Zvcm1bNF0sIG1hc2sub2Zmc2V0WSAtIGN1cnJlbnRUcmFuc2Zvcm1bNV0pO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBjb25zdCB0cmFucyA9IHV0aWwuVXRpbC50cmFuc2Zvcm0oY3VycmVudFRyYW5zZm9ybSwgW3NjYWxlWCwgc2tld1gsIHNrZXdZLCBzY2FsZVksIHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXV0pO1xuICAgICAgY29uc3QgW3gsIHldID0gdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFswLCAwXSwgdHJhbnMpO1xuICAgICAgY3R4LmRyYXdJbWFnZShtYXNrLmNhbnZhcywgeCwgeSk7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAoaW1hZ2VzKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgY29uc3QgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB0cmFuc2Zvcm1cbiAgICAgIH0gPSBpbWFnZTtcbiAgICAgIGNvbnN0IG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tDYW52YXNcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0O1xuICAgICAgbWFza0N0eC5zYXZlKCk7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmdldE9iamVjdChkYXRhLCBpbWFnZSk7XG4gICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0N0eCwgaW1nKTtcbiAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtaW5cIjtcbiAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMsICgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGN0eCksIFBhdGhUeXBlLkZJTEwpIDogZmlsbENvbG9yO1xuICAgICAgbWFza0N0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcbiAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRJbWFnZVhPYmplY3Qob2JqSWQpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KG9iaklkKTtcbiAgICBpZiAoIWltZ0RhdGEpIHtcbiAgICAgICgwLHV0aWwud2FybikoXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpO1xuICB9XG4gIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KG9iaklkLCBzY2FsZVgsIHNjYWxlWSwgcG9zaXRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLmdldE9iamVjdChvYmpJZCk7XG4gICAgaWYgKCFpbWdEYXRhKSB7XG4gICAgICAoMCx1dGlsLndhcm4pKFwiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgIGNvbnN0IG1hcCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBtYXAucHVzaCh7XG4gICAgICAgIHRyYW5zZm9ybTogW3NjYWxlWCwgMCwgMCwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgaDogaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCk7XG4gIH1cbiAgYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyhjdHgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyAhPT0gXCJub25lXCIpIHtcbiAgICAgIGN0eC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuICAgICAgY3R4LmRyYXdJbWFnZShjdHguY2FudmFzLCAwLCAwKTtcbiAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIGN0eC5jYW52YXM7XG4gIH1cbiAgYXBwbHlUcmFuc2Zlck1hcHNUb0JpdG1hcChpbWdEYXRhKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPT09IFwibm9uZVwiKSB7XG4gICAgICByZXR1cm4gaW1nRGF0YS5iaXRtYXA7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGJpdG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGltZ0RhdGE7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICB0bXBDdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcztcbiAgICB0bXBDdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7XG4gICAgdG1wQ3R4LmZpbHRlciA9IFwibm9uZVwiO1xuICAgIHJldHVybiB0bXBDYW52YXMuY2FudmFzO1xuICB9XG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICghdXRpbC5pc05vZGVKUykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaWx0ZXJcbiAgICAgIH0gPSBjdHg7XG4gICAgICBpZiAoZmlsdGVyICE9PSBcIm5vbmVcIiAmJiBmaWx0ZXIgIT09IFwiXCIpIHtcbiAgICAgICAgY3R4LmZpbHRlciA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHguc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG4gICAgbGV0IGltZ1RvUGFpbnQ7XG4gICAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG4gICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKGltZ0RhdGEpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgaW1nRGF0YSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8ICFpbWdEYXRhLmRhdGEpIHtcbiAgICAgIGltZ1RvUGFpbnQgPSBpbWdEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhKTtcbiAgICAgIGltZ1RvUGFpbnQgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXModG1wQ3R4KTtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGVkID0gdGhpcy5fc2NhbGVJbWFnZShpbWdUb1BhaW50LCAoMCxkaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShjdHgpKTtcbiAgICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKCgwLGRpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KSwgaW1nRGF0YS5pbnRlcnBvbGF0ZSk7XG4gICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGN0eCwgc2NhbGVkLmltZywgMCwgMCwgc2NhbGVkLnBhaW50V2lkdGgsIHNjYWxlZC5wYWludEhlaWdodCwgMCwgLWhlaWdodCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChpbWdEYXRhLCBtYXApIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgbGV0IGltZ1RvUGFpbnQ7XG4gICAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG4gICAgICBpbWdUb1BhaW50ID0gaW1nRGF0YS5iaXRtYXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHcgPSBpbWdEYXRhLndpZHRoO1xuICAgICAgY29uc3QgaCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3LCBoKTtcbiAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSk7XG4gICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQ2FudmFzKHRtcEN0eCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWFwKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LnRyYW5zZm9ybSguLi5lbnRyeS50cmFuc2Zvcm0pO1xuICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcbiAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIGltZ1RvUGFpbnQsIGVudHJ5LngsIGVudHJ5LnksIGVudHJ5LncsIGVudHJ5LmgsIDAsIC0xLCAxLCAxKTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgbWFya1BvaW50KHRhZykge31cbiAgbWFya1BvaW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7fVxuICBiZWdpbk1hcmtlZENvbnRlbnQodGFnKSB7XG4gICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICB2aXNpYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHRhZyA9PT0gXCJPQ1wiKSB7XG4gICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcuaXNWaXNpYmxlKHByb3BlcnRpZXMpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdGhpcy5pc0NvbnRlbnRWaXNpYmxlKCk7XG4gIH1cbiAgZW5kTWFya2VkQ29udGVudCgpIHtcbiAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTtcbiAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdGhpcy5pc0NvbnRlbnRWaXNpYmxlKCk7XG4gIH1cbiAgYmVnaW5Db21wYXQoKSB7fVxuICBlbmRDb21wYXQoKSB7fVxuICBjb25zdW1lUGF0aChjbGlwQm94KSB7XG4gICAgY29uc3QgaXNFbXB0eSA9IHRoaXMuY3VycmVudC5pc0VtcHR5Q2xpcCgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICB0aGlzLmN1cnJlbnQudXBkYXRlQ2xpcEZyb21QYXRoKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgdGhpcy5jb21wb3NlKGNsaXBCb3gpO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgaWYgKCFpc0VtcHR5KSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwID09PSBFT19DTElQKSB7XG4gICAgICAgICAgY3R4LmNsaXAoXCJldmVub2RkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eC5jbGlwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0aGlzLmN1cnJlbnQuY2xpcEJveCk7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICB9XG4gIGdldFNpbmdsZVBpeGVsV2lkdGgoKSB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoKSB7XG4gICAgICBjb25zdCBtID0gKDAsZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICBpZiAobVsxXSA9PT0gMCAmJiBtWzJdID09PSAwKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSAxIC8gTWF0aC5taW4oTWF0aC5hYnMobVswXSksIE1hdGguYWJzKG1bM10pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFic0RldCA9IE1hdGguYWJzKG1bMF0gKiBtWzNdIC0gbVsyXSAqIG1bMV0pO1xuICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguaHlwb3QobVswXSwgbVsyXSk7XG4gICAgICAgIGNvbnN0IG5vcm1ZID0gTWF0aC5oeXBvdChtWzFdLCBtWzNdKTtcbiAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IE1hdGgubWF4KG5vcm1YLCBub3JtWSkgLyBhYnNEZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoO1xuICB9XG4gIGdldFNjYWxlRm9yU3Ryb2tpbmcoKSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPT09IC0xKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxpbmVXaWR0aFxuICAgICAgfSA9IHRoaXMuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYSxcbiAgICAgICAgYixcbiAgICAgICAgYyxcbiAgICAgICAgZFxuICAgICAgfSA9IHRoaXMuY3R4LmdldFRyYW5zZm9ybSgpO1xuICAgICAgbGV0IHNjYWxlWCwgc2NhbGVZO1xuICAgICAgaWYgKGIgPT09IDAgJiYgYyA9PT0gMCkge1xuICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguYWJzKGEpO1xuICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguYWJzKGQpO1xuICAgICAgICBpZiAobm9ybVggPT09IG5vcm1ZKSB7XG4gICAgICAgICAgaWYgKGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2NhbGVYID0gc2NhbGVZID0gMSAvIG5vcm1YO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsZWRMaW5lV2lkdGggPSBub3JtWCAqIGxpbmVXaWR0aDtcbiAgICAgICAgICAgIHNjYWxlWCA9IHNjYWxlWSA9IHNjYWxlZExpbmVXaWR0aCA8IDEgPyAxIC8gc2NhbGVkTGluZVdpZHRoIDogMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGluZVdpZHRoID09PSAwKSB7XG4gICAgICAgICAgc2NhbGVYID0gMSAvIG5vcm1YO1xuICAgICAgICAgIHNjYWxlWSA9IDEgLyBub3JtWTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzY2FsZWRYTGluZVdpZHRoID0gbm9ybVggKiBsaW5lV2lkdGg7XG4gICAgICAgICAgY29uc3Qgc2NhbGVkWUxpbmVXaWR0aCA9IG5vcm1ZICogbGluZVdpZHRoO1xuICAgICAgICAgIHNjYWxlWCA9IHNjYWxlZFhMaW5lV2lkdGggPCAxID8gMSAvIHNjYWxlZFhMaW5lV2lkdGggOiAxO1xuICAgICAgICAgIHNjYWxlWSA9IHNjYWxlZFlMaW5lV2lkdGggPCAxID8gMSAvIHNjYWxlZFlMaW5lV2lkdGggOiAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhYnNEZXQgPSBNYXRoLmFicyhhICogZCAtIGIgKiBjKTtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmh5cG90KGEsIGIpO1xuICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguaHlwb3QoYywgZCk7XG4gICAgICAgIGlmIChsaW5lV2lkdGggPT09IDApIHtcbiAgICAgICAgICBzY2FsZVggPSBub3JtWSAvIGFic0RldDtcbiAgICAgICAgICBzY2FsZVkgPSBub3JtWCAvIGFic0RldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBiYXNlQXJlYSA9IGxpbmVXaWR0aCAqIGFic0RldDtcbiAgICAgICAgICBzY2FsZVggPSBub3JtWSA+IGJhc2VBcmVhID8gbm9ybVkgLyBiYXNlQXJlYSA6IDE7XG4gICAgICAgICAgc2NhbGVZID0gbm9ybVggPiBiYXNlQXJlYSA/IG5vcm1YIC8gYmFzZUFyZWEgOiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gc2NhbGVYO1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1sxXSA9IHNjYWxlWTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmc7XG4gIH1cbiAgcmVzY2FsZUFuZFN0cm9rZShzYXZlUmVzdG9yZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGN0eFxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIGxpbmVXaWR0aFxuICAgIH0gPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgW3NjYWxlWCwgc2NhbGVZXSA9IHRoaXMuZ2V0U2NhbGVGb3JTdHJva2luZygpO1xuICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGggfHwgMTtcbiAgICBpZiAoc2NhbGVYID09PSAxICYmIHNjYWxlWSA9PT0gMSkge1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXNoZXMgPSBjdHguZ2V0TGluZURhc2goKTtcbiAgICBpZiAoc2F2ZVJlc3RvcmUpIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgfVxuICAgIGN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgaWYgKGRhc2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWF4KHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoZXMubWFwKHggPT4geCAvIHNjYWxlKSk7XG4gICAgICBjdHgubGluZURhc2hPZmZzZXQgLz0gc2NhbGU7XG4gICAgfVxuICAgIGN0eC5zdHJva2UoKTtcbiAgICBpZiAoc2F2ZVJlc3RvcmUpIHtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG4gIGlzQ29udGVudFZpc2libGUoKSB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXRoaXMubWFya2VkQ29udGVudFN0YWNrW2ldLnZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuZm9yIChjb25zdCBvcCBpbiB1dGlsLk9QUykge1xuICBpZiAoQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW29wXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW3V0aWwuT1BTW29wXV0gPSBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQ3Mzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgRE9NQ01hcFJlYWRlckZhY3Rvcnk6ICgpID0+ICgvKiBiaW5kaW5nICovIERPTUNNYXBSZWFkZXJGYWN0b3J5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgRE9NQ2FudmFzRmFjdG9yeTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gRE9NQ2FudmFzRmFjdG9yeSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIERPTUZpbHRlckZhY3Rvcnk6ICgpID0+ICgvKiBiaW5kaW5nICovIERPTUZpbHRlckZhY3RvcnkpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBET01TVkdGYWN0b3J5OiAoKSA9PiAoLyogYmluZGluZyAqLyBET01TVkdGYWN0b3J5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgRE9NU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk6ICgpID0+ICgvKiBiaW5kaW5nICovIERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUERGRGF0ZVN0cmluZzogKCkgPT4gKC8qIGJpbmRpbmcgKi8gUERGRGF0ZVN0cmluZyksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFBhZ2VWaWV3cG9ydDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gUGFnZVZpZXdwb3J0KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUGl4ZWxzUGVySW5jaDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gUGl4ZWxzUGVySW5jaCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgU3RhdFRpbWVyOiAoKSA9PiAoLyogYmluZGluZyAqLyBTdGF0VGltZXIpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBmZXRjaERhdGE6ICgpID0+ICgvKiBiaW5kaW5nICovIGZldGNoRGF0YSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldENvbG9yVmFsdWVzOiAoKSA9PiAoLyogYmluZGluZyAqLyBnZXRDb2xvclZhbHVlcyksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldEN1cnJlbnRUcmFuc2Zvcm06ICgpID0+ICgvKiBiaW5kaW5nICovIGdldEN1cnJlbnRUcmFuc2Zvcm0pLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBnZXRGaWxlbmFtZUZyb21Vcmw6ICgpID0+ICgvKiBiaW5kaW5nICovIGdldEZpbGVuYW1lRnJvbVVybCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldFBkZkZpbGVuYW1lRnJvbVVybDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gZ2V0UGRmRmlsZW5hbWVGcm9tVXJsKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgZ2V0UkdCOiAoKSA9PiAoLyogYmluZGluZyAqLyBnZXRSR0IpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBnZXRYZmFQYWdlVmlld3BvcnQ6ICgpID0+ICgvKiBiaW5kaW5nICovIGdldFhmYVBhZ2VWaWV3cG9ydCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGlzRGF0YVNjaGVtZTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gaXNEYXRhU2NoZW1lKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgaXNQZGZGaWxlOiAoKSA9PiAoLyogYmluZGluZyAqLyBpc1BkZkZpbGUpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBpc1ZhbGlkRmV0Y2hVcmw6ICgpID0+ICgvKiBiaW5kaW5nICovIGlzVmFsaWRGZXRjaFVybCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIG5vQ29udGV4dE1lbnU6ICgpID0+ICgvKiBiaW5kaW5nICovIG5vQ29udGV4dE1lbnUpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBzZXRMYXllckRpbWVuc2lvbnM6ICgpID0+ICgvKiBiaW5kaW5nICovIHNldExheWVyRGltZW5zaW9ucylcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogdW51c2VkIGhhcm1vbnkgZXhwb3J0IGRlcHJlY2F0ZWQgKi9cbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2l0ZXJhdG9yX21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTQ0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfZXJyb3JfY2F1c2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzM1Mik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODM3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmluZF9sYXN0X2luZGV4X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4MDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zZXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODM0Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3JldmVyc2VkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5OTUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19zb3J0ZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV93aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2MDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX2RldGFjaGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0NCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDMwNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfdG9fZml4ZWRfbGVuZ3RoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTgzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDIyNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19kZWxldGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2NTUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfaGFzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNTU1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyMDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYXNlX2ZhY3RvcnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE1X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4MjIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI2Nik7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gdHlwZW9mIGkgPyBpIDogU3RyaW5nKGkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgaSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5cblxuY29uc3QgU1ZHX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY2xhc3MgUGl4ZWxzUGVySW5jaCB7XG4gIHN0YXRpYyBDU1MgPSA5Ni4wO1xuICBzdGF0aWMgUERGID0gNzIuMDtcbiAgc3RhdGljICNfID0gX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiUERGX1RPX0NTU19VTklUU1wiLCB0aGlzLkNTUyAvIHRoaXMuUERGKTtcbn1cbmNsYXNzIERPTUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNV9fLkJhc2VGaWx0ZXJGYWN0b3J5IHtcbiAgI19jYWNoZTtcbiAgI19kZWZzO1xuICAjZG9jSWQ7XG4gICNkb2N1bWVudDtcbiAgI2hjbUZpbHRlcjtcbiAgI2hjbUtleTtcbiAgI2hjbVVybDtcbiAgI2hjbUhpZ2hsaWdodEZpbHRlcjtcbiAgI2hjbUhpZ2hsaWdodEtleTtcbiAgI2hjbUhpZ2hsaWdodFVybDtcbiAgI2lkID0gMDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgbGV0IHtcbiAgICAgIGRvY0lkLFxuICAgICAgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnRcbiAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2RvY0lkID0gZG9jSWQ7XG4gICAgdGhpcy4jZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICB9XG4gIGdldCAjY2FjaGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jYWNoZSB8fD0gbmV3IE1hcCgpO1xuICB9XG4gIGdldCAjZGVmcygpIHtcbiAgICBpZiAoIXRoaXMuI19kZWZzKSB7XG4gICAgICBjb25zdCBkaXYgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdHlsZVxuICAgICAgfSA9IGRpdjtcbiAgICAgIHN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgc3R5bGUuY29udGFpbiA9IFwic3RyaWN0XCI7XG4gICAgICBzdHlsZS53aWR0aCA9IHN0eWxlLmhlaWdodCA9IDA7XG4gICAgICBzdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgIHN0eWxlLnRvcCA9IHN0eWxlLmxlZnQgPSAwO1xuICAgICAgc3R5bGUuekluZGV4ID0gLTE7XG4gICAgICBjb25zdCBzdmcgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCAwKTtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgMCk7XG4gICAgICB0aGlzLiNfZGVmcyA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZGVmc1wiKTtcbiAgICAgIGRpdi5hcHBlbmQoc3ZnKTtcbiAgICAgIHN2Zy5hcHBlbmQodGhpcy4jX2RlZnMpO1xuICAgICAgdGhpcy4jZG9jdW1lbnQuYm9keS5hcHBlbmQoZGl2KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI19kZWZzO1xuICB9XG4gIGFkZEZpbHRlcihtYXBzKSB7XG4gICAgaWYgKCFtYXBzKSB7XG4gICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChtYXBzKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgbGV0IHRhYmxlUiwgdGFibGVHLCB0YWJsZUIsIGtleTtcbiAgICBpZiAobWFwcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG1hcFIgPSBtYXBzWzBdO1xuICAgICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9IG1hcFJbaV0gLyAyNTU7XG4gICAgICB9XG4gICAgICBrZXkgPSB0YWJsZVIgPSB0YWJsZUcgPSB0YWJsZUIgPSBidWZmZXIuam9pbihcIixcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFttYXBSLCBtYXBHLCBtYXBCXSA9IG1hcHM7XG4gICAgICBjb25zdCBidWZmZXJSID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBjb25zdCBidWZmZXJHID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBjb25zdCBidWZmZXJCID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlclJbaV0gPSBtYXBSW2ldIC8gMjU1O1xuICAgICAgICBidWZmZXJHW2ldID0gbWFwR1tpXSAvIDI1NTtcbiAgICAgICAgYnVmZmVyQltpXSA9IG1hcEJbaV0gLyAyNTU7XG4gICAgICB9XG4gICAgICB0YWJsZVIgPSBidWZmZXJSLmpvaW4oXCIsXCIpO1xuICAgICAgdGFibGVHID0gYnVmZmVyRy5qb2luKFwiLFwiKTtcbiAgICAgIHRhYmxlQiA9IGJ1ZmZlckIuam9pbihcIixcIik7XG4gICAgICBrZXkgPSBgJHt0YWJsZVJ9JHt0YWJsZUd9JHt0YWJsZUJ9YDtcbiAgICB9XG4gICAgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChtYXBzLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1fdHJhbnNmZXJfbWFwXyR7dGhpcy4jaWQrK31gO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgdGhpcy4jY2FjaGUuc2V0KG1hcHMsIHVybCk7XG4gICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgdXJsKTtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbih0YWJsZVIsIHRhYmxlRywgdGFibGVCLCBmaWx0ZXIpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgYWRkSENNRmlsdGVyKGZnQ29sb3IsIGJnQ29sb3IpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtmZ0NvbG9yfS0ke2JnQ29sb3J9YDtcbiAgICBpZiAodGhpcy4jaGNtS2V5ID09PSBrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLiNoY21Vcmw7XG4gICAgfVxuICAgIHRoaXMuI2hjbUtleSA9IGtleTtcbiAgICB0aGlzLiNoY21VcmwgPSBcIm5vbmVcIjtcbiAgICB0aGlzLiNoY21GaWx0ZXI/LnJlbW92ZSgpO1xuICAgIGlmICghZmdDb2xvciB8fCAhYmdDb2xvcikge1xuICAgICAgcmV0dXJuIHRoaXMuI2hjbVVybDtcbiAgICB9XG4gICAgY29uc3QgZmdSR0IgPSB0aGlzLiNnZXRSR0IoZmdDb2xvcik7XG4gICAgZmdDb2xvciA9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy5VdGlsLm1ha2VIZXhDb2xvciguLi5mZ1JHQik7XG4gICAgY29uc3QgYmdSR0IgPSB0aGlzLiNnZXRSR0IoYmdDb2xvcik7XG4gICAgYmdDb2xvciA9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy5VdGlsLm1ha2VIZXhDb2xvciguLi5iZ1JHQik7XG4gICAgdGhpcy4jZGVmcy5zdHlsZS5jb2xvciA9IFwiXCI7XG4gICAgaWYgKGZnQ29sb3IgPT09IFwiIzAwMDAwMFwiICYmIGJnQ29sb3IgPT09IFwiI2ZmZmZmZlwiIHx8IGZnQ29sb3IgPT09IGJnQ29sb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLiNoY21Vcmw7XG4gICAgfVxuICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheSgyNTYpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gaSAvIDI1NTtcbiAgICAgIG1hcFtpXSA9IHggPD0gMC4wMzkyOCA/IHggLyAxMi45MiA6ICgoeCArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQ7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gbWFwLmpvaW4oXCIsXCIpO1xuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1faGNtX2ZpbHRlcmA7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy4jaGNtSGlnaGxpZ2h0RmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcENvbnZlcnNpb24odGFibGUsIHRhYmxlLCB0YWJsZSwgZmlsdGVyKTtcbiAgICB0aGlzLiNhZGRHcmF5Q29udmVyc2lvbihmaWx0ZXIpO1xuICAgIGNvbnN0IGdldFN0ZXBzID0gKGMsIG4pID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZmdSR0JbY10gLyAyNTU7XG4gICAgICBjb25zdCBlbmQgPSBiZ1JHQltjXSAvIDI1NTtcbiAgICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShuICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gc3RhcnQgKyBpIC8gbiAqIChlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyLmpvaW4oXCIsXCIpO1xuICAgIH07XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKGdldFN0ZXBzKDAsIDUpLCBnZXRTdGVwcygxLCA1KSwgZ2V0U3RlcHMoMiwgNSksIGZpbHRlcik7XG4gICAgdGhpcy4jaGNtVXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICByZXR1cm4gdGhpcy4jaGNtVXJsO1xuICB9XG4gIGFkZEhpZ2hsaWdodEhDTUZpbHRlcihmZ0NvbG9yLCBiZ0NvbG9yLCBuZXdGZ0NvbG9yLCBuZXdCZ0NvbG9yKSB7XG4gICAgY29uc3Qga2V5ID0gYCR7ZmdDb2xvcn0tJHtiZ0NvbG9yfS0ke25ld0ZnQ29sb3J9LSR7bmV3QmdDb2xvcn1gO1xuICAgIGlmICh0aGlzLiNoY21IaWdobGlnaHRLZXkgPT09IGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2hjbUhpZ2hsaWdodFVybDtcbiAgICB9XG4gICAgdGhpcy4jaGNtSGlnaGxpZ2h0S2V5ID0ga2V5O1xuICAgIHRoaXMuI2hjbUhpZ2hsaWdodFVybCA9IFwibm9uZVwiO1xuICAgIHRoaXMuI2hjbUhpZ2hsaWdodEZpbHRlcj8ucmVtb3ZlKCk7XG4gICAgaWYgKCFmZ0NvbG9yIHx8ICFiZ0NvbG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy4jaGNtSGlnaGxpZ2h0VXJsO1xuICAgIH1cbiAgICBjb25zdCBbZmdSR0IsIGJnUkdCXSA9IFtmZ0NvbG9yLCBiZ0NvbG9yXS5tYXAodGhpcy4jZ2V0UkdCLmJpbmQodGhpcykpO1xuICAgIGxldCBmZ0dyYXkgPSBNYXRoLnJvdW5kKDAuMjEyNiAqIGZnUkdCWzBdICsgMC43MTUyICogZmdSR0JbMV0gKyAwLjA3MjIgKiBmZ1JHQlsyXSk7XG4gICAgbGV0IGJnR3JheSA9IE1hdGgucm91bmQoMC4yMTI2ICogYmdSR0JbMF0gKyAwLjcxNTIgKiBiZ1JHQlsxXSArIDAuMDcyMiAqIGJnUkdCWzJdKTtcbiAgICBsZXQgW25ld0ZnUkdCLCBuZXdCZ1JHQl0gPSBbbmV3RmdDb2xvciwgbmV3QmdDb2xvcl0ubWFwKHRoaXMuI2dldFJHQi5iaW5kKHRoaXMpKTtcbiAgICBpZiAoYmdHcmF5IDwgZmdHcmF5KSB7XG4gICAgICBbZmdHcmF5LCBiZ0dyYXksIG5ld0ZnUkdCLCBuZXdCZ1JHQl0gPSBbYmdHcmF5LCBmZ0dyYXksIG5ld0JnUkdCLCBuZXdGZ1JHQl07XG4gICAgfVxuICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgIGNvbnN0IGdldFN0ZXBzID0gKGZnLCBiZywgbikgPT4ge1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBjb25zdCBzdGVwID0gKGJnR3JheSAtIGZnR3JheSkgLyBuO1xuICAgICAgY29uc3QgbmV3U3RhcnQgPSBmZyAvIDI1NTtcbiAgICAgIGNvbnN0IG5ld1N0ZXAgPSAoYmcgLSBmZykgLyAoMjU1ICogbik7XG4gICAgICBsZXQgcHJldiA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IE1hdGgucm91bmQoZmdHcmF5ICsgaSAqIHN0ZXApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5ld1N0YXJ0ICsgaSAqIG5ld1N0ZXA7XG4gICAgICAgIGZvciAobGV0IGogPSBwcmV2OyBqIDw9IGs7IGorKykge1xuICAgICAgICAgIGFycltqXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHByZXYgPSBrICsgMTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBwcmV2OyBpIDwgMjU2OyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gYXJyW3ByZXYgLSAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIuam9pbihcIixcIik7XG4gICAgfTtcbiAgICBjb25zdCBpZCA9IGBnXyR7dGhpcy4jZG9jSWR9X2hjbV9oaWdobGlnaHRfZmlsdGVyYDtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNoY21IaWdobGlnaHRGaWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcik7XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKGdldFN0ZXBzKG5ld0ZnUkdCWzBdLCBuZXdCZ1JHQlswXSwgNSksIGdldFN0ZXBzKG5ld0ZnUkdCWzFdLCBuZXdCZ1JHQlsxXSwgNSksIGdldFN0ZXBzKG5ld0ZnUkdCWzJdLCBuZXdCZ1JHQlsyXSwgNSksIGZpbHRlcik7XG4gICAgdGhpcy4jaGNtSGlnaGxpZ2h0VXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICByZXR1cm4gdGhpcy4jaGNtSGlnaGxpZ2h0VXJsO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgbGV0IGtlZXBIQ00gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIGlmIChrZWVwSENNICYmICh0aGlzLiNoY21VcmwgfHwgdGhpcy4jaGNtSGlnaGxpZ2h0VXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jX2RlZnMpIHtcbiAgICAgIHRoaXMuI19kZWZzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuI19kZWZzID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuI19jYWNoZSkge1xuICAgICAgdGhpcy4jX2NhY2hlLmNsZWFyKCk7XG4gICAgICB0aGlzLiNfY2FjaGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNpZCA9IDA7XG4gIH1cbiAgI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29sb3JNYXRyaXggPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29sb3JNYXRyaXhcIik7XG4gICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwibWF0cml4XCIpO1xuICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMCAwIDAgMSAwXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb2xvck1hdHJpeCk7XG4gIH1cbiAgI2NyZWF0ZUZpbHRlcihpZCkge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmlsdGVyXCIpO1xuICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnNcIiwgXCJzUkdCXCIpO1xuICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBpZCk7XG4gICAgdGhpcy4jZGVmcy5hcHBlbmQoZmlsdGVyKTtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG4gICNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgZnVuYywgdGFibGUpIHtcbiAgICBjb25zdCBmZUZ1bmMgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBmdW5jKTtcbiAgICBmZUZ1bmMuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImRpc2NyZXRlXCIpO1xuICAgIGZlRnVuYy5zZXRBdHRyaWJ1dGUoXCJ0YWJsZVZhbHVlc1wiLCB0YWJsZSk7XG4gICAgZmVDb21wb25lbnRUcmFuc2Zlci5hcHBlbmQoZmVGdW5jKTtcbiAgfVxuICAjYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKHJUYWJsZSwgZ1RhYmxlLCBiVGFibGUsIGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIik7XG4gICAgZmlsdGVyLmFwcGVuZChmZUNvbXBvbmVudFRyYW5zZmVyKTtcbiAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNSXCIsIHJUYWJsZSk7XG4gICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jR1wiLCBnVGFibGUpO1xuICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0JcIiwgYlRhYmxlKTtcbiAgfVxuICAjZ2V0UkdCKGNvbG9yKSB7XG4gICAgdGhpcy4jZGVmcy5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgIHJldHVybiBnZXRSR0IoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiNkZWZzKS5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sb3JcIikpO1xuICB9XG59XG5jbGFzcyBET01DYW52YXNGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXy5CYXNlQ2FudmFzRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCB7XG4gICAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICB9XG4gIF9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICByZXR1cm4gY2FudmFzO1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBmZXRjaERhdGEodXJsKSB7XG4gIGxldCB0eXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBcInRleHRcIjtcbiAgaWYgKGlzVmFsaWRGZXRjaFVybCh1cmwsIGRvY3VtZW50LmJhc2VVUkkpKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgdXJsLCB0cnVlKTtcbiAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHR5cGU7XG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwIHx8IHJlcXVlc3Quc3RhdHVzID09PSAwKSB7XG4gICAgICAgIGxldCBkYXRhO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICBkYXRhID0gcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBkYXRhID0gcmVxdWVzdC5yZXNwb25zZVRleHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IEVycm9yKHJlcXVlc3Quc3RhdHVzVGV4dCkpO1xuICAgIH07XG4gICAgcmVxdWVzdC5zZW5kKG51bGwpO1xuICB9KTtcbn1cbmNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXy5CYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG4gICAgcmV0dXJuIGZldGNoRGF0YSh1cmwsIHRoaXMuaXNDb21wcmVzc2VkID8gXCJhcnJheWJ1ZmZlclwiIDogXCJ0ZXh0XCIpLnRoZW4oZGF0YSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjTWFwRGF0YTogZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbmV3IFVpbnQ4QXJyYXkoZGF0YSkgOiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE2X18uc3RyaW5nVG9CeXRlcykoZGF0YSksXG4gICAgICAgIGNvbXByZXNzaW9uVHlwZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNV9fLkJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsKSB7XG4gICAgcmV0dXJuIGZldGNoRGF0YSh1cmwsIFwiYXJyYXlidWZmZXJcIikudGhlbihkYXRhID0+IHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgRE9NU1ZHRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE1X18uQmFzZVNWR0ZhY3Rvcnkge1xuICBfY3JlYXRlU1ZHKHR5cGUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgdHlwZSk7XG4gIH1cbn1cbmNsYXNzIFBhZ2VWaWV3cG9ydCB7XG4gIGNvbnN0cnVjdG9yKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgdmlld0JveCxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYID0gMCxcbiAgICAgIG9mZnNldFkgPSAwLFxuICAgICAgZG9udEZsaXAgPSBmYWxzZVxuICAgIH0gPSBfcmVmO1xuICAgIHRoaXMudmlld0JveCA9IHZpZXdCb3g7XG4gICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgIHRoaXMucm90YXRpb24gPSByb3RhdGlvbjtcbiAgICB0aGlzLm9mZnNldFggPSBvZmZzZXRYO1xuICAgIHRoaXMub2Zmc2V0WSA9IG9mZnNldFk7XG4gICAgY29uc3QgY2VudGVyWCA9ICh2aWV3Qm94WzJdICsgdmlld0JveFswXSkgLyAyO1xuICAgIGNvbnN0IGNlbnRlclkgPSAodmlld0JveFszXSArIHZpZXdCb3hbMV0pIC8gMjtcbiAgICBsZXQgcm90YXRlQSwgcm90YXRlQiwgcm90YXRlQywgcm90YXRlRDtcbiAgICByb3RhdGlvbiAlPSAzNjA7XG4gICAgaWYgKHJvdGF0aW9uIDwgMCkge1xuICAgICAgcm90YXRpb24gKz0gMzYwO1xuICAgIH1cbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcm90YXRlQSA9IC0xO1xuICAgICAgICByb3RhdGVCID0gMDtcbiAgICAgICAgcm90YXRlQyA9IDA7XG4gICAgICAgIHJvdGF0ZUQgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJvdGF0ZUEgPSAwO1xuICAgICAgICByb3RhdGVCID0gMTtcbiAgICAgICAgcm90YXRlQyA9IDE7XG4gICAgICAgIHJvdGF0ZUQgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByb3RhdGVBID0gMDtcbiAgICAgICAgcm90YXRlQiA9IC0xO1xuICAgICAgICByb3RhdGVDID0gLTE7XG4gICAgICAgIHJvdGF0ZUQgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcm90YXRlQSA9IDE7XG4gICAgICAgIHJvdGF0ZUIgPSAwO1xuICAgICAgICByb3RhdGVDID0gMDtcbiAgICAgICAgcm90YXRlRCA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhZ2VWaWV3cG9ydDogSW52YWxpZCByb3RhdGlvbiwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDkwIGRlZ3JlZXMuXCIpO1xuICAgIH1cbiAgICBpZiAoZG9udEZsaXApIHtcbiAgICAgIHJvdGF0ZUMgPSAtcm90YXRlQztcbiAgICAgIHJvdGF0ZUQgPSAtcm90YXRlRDtcbiAgICB9XG4gICAgbGV0IG9mZnNldENhbnZhc1gsIG9mZnNldENhbnZhc1k7XG4gICAgbGV0IHdpZHRoLCBoZWlnaHQ7XG4gICAgaWYgKHJvdGF0ZUEgPT09IDApIHtcbiAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFg7XG4gICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRZO1xuICAgICAgd2lkdGggPSAodmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSAodmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJYIC0gdmlld0JveFswXSkgKiBzY2FsZSArIG9mZnNldFg7XG4gICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWSAtIHZpZXdCb3hbMV0pICogc2NhbGUgKyBvZmZzZXRZO1xuICAgICAgd2lkdGggPSAodmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSAodmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgfVxuICAgIHRoaXMudHJhbnNmb3JtID0gW3JvdGF0ZUEgKiBzY2FsZSwgcm90YXRlQiAqIHNjYWxlLCByb3RhdGVDICogc2NhbGUsIHJvdGF0ZUQgKiBzY2FsZSwgb2Zmc2V0Q2FudmFzWCAtIHJvdGF0ZUEgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVDICogc2NhbGUgKiBjZW50ZXJZLCBvZmZzZXRDYW52YXNZIC0gcm90YXRlQiAqIHNjYWxlICogY2VudGVyWCAtIHJvdGF0ZUQgKiBzY2FsZSAqIGNlbnRlclldO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuICBnZXQgcmF3RGltcygpIHtcbiAgICBjb25zdCB7XG4gICAgICB2aWV3Qm94XG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy5zaGFkb3cpKHRoaXMsIFwicmF3RGltc1wiLCB7XG4gICAgICBwYWdlV2lkdGg6IHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdLFxuICAgICAgcGFnZUhlaWdodDogdmlld0JveFszXSAtIHZpZXdCb3hbMV0sXG4gICAgICBwYWdlWDogdmlld0JveFswXSxcbiAgICAgIHBhZ2VZOiB2aWV3Qm94WzFdXG4gICAgfSk7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgbGV0IHtcbiAgICAgIHNjYWxlID0gdGhpcy5zY2FsZSxcbiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbixcbiAgICAgIG9mZnNldFggPSB0aGlzLm9mZnNldFgsXG4gICAgICBvZmZzZXRZID0gdGhpcy5vZmZzZXRZLFxuICAgICAgZG9udEZsaXAgPSBmYWxzZVxuICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHJldHVybiBuZXcgUGFnZVZpZXdwb3J0KHtcbiAgICAgIHZpZXdCb3g6IHRoaXMudmlld0JveC5zbGljZSgpLFxuICAgICAgc2NhbGUsXG4gICAgICByb3RhdGlvbixcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZLFxuICAgICAgZG9udEZsaXBcbiAgICB9KTtcbiAgfVxuICBjb252ZXJ0VG9WaWV3cG9ydFBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNl9fLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG4gIH1cbiAgY29udmVydFRvVmlld3BvcnRSZWN0YW5nbGUocmVjdCkge1xuICAgIGNvbnN0IHRvcExlZnQgPSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE2X18uVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFsxXV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICBjb25zdCBib3R0b21SaWdodCA9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy5VdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzJdLCByZWN0WzNdXSwgdGhpcy50cmFuc2Zvcm0pO1xuICAgIHJldHVybiBbdG9wTGVmdFswXSwgdG9wTGVmdFsxXSwgYm90dG9tUmlnaHRbMF0sIGJvdHRvbVJpZ2h0WzFdXTtcbiAgfVxuICBjb252ZXJ0VG9QZGZQb2ludCh4LCB5KSB7XG4gICAgcmV0dXJuIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy5VdGlsLmFwcGx5SW52ZXJzZVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgfVxufVxuY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNl9fLkJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBsZXQgZXh0cmFEZWxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgICBzdXBlcihtc2csIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuZXh0cmFEZWxheSA9IGV4dHJhRGVsYXk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRGF0YVNjaGVtZSh1cmwpIHtcbiAgY29uc3QgaWkgPSB1cmwubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgaWkgJiYgdXJsW2ldLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhOlwiO1xufVxuZnVuY3Rpb24gaXNQZGZGaWxlKGZpbGVuYW1lKSB7XG4gIHJldHVybiB0eXBlb2YgZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgL1xcLnBkZiQvaS50ZXN0KGZpbGVuYW1lKTtcbn1cbmZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh1cmwpIHtcbiAgbGV0IG9ubHlTdHJpcFBhdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICBpZiAoIW9ubHlTdHJpcFBhdGgpIHtcbiAgICBbdXJsXSA9IHVybC5zcGxpdCgvWyM/XS8sIDEpO1xuICB9XG4gIHJldHVybiB1cmwuc3Vic3RyaW5nKHVybC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbn1cbmZ1bmN0aW9uIGdldFBkZkZpbGVuYW1lRnJvbVVybCh1cmwpIHtcbiAgbGV0IGRlZmF1bHRGaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogXCJkb2N1bWVudC5wZGZcIjtcbiAgaWYgKHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG4gIGlmIChpc0RhdGFTY2hlbWUodXJsKSkge1xuICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy53YXJuKSgnZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgXCJkYXRhOlwiLVVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG4gIGNvbnN0IHJlVVJJID0gL14oPzooPzpbXjpdKzopP1xcL1xcL1teL10rKT8oW14/I10qKShcXD9bXiNdKik/KCMuKik/JC87XG4gIGNvbnN0IHJlRmlsZW5hbWUgPSAvW14vPyM9XStcXC5wZGZcXGIoPyEuKlxcLnBkZlxcYikvaTtcbiAgY29uc3Qgc3BsaXRVUkkgPSByZVVSSS5leGVjKHVybCk7XG4gIGxldCBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVsxXSkgfHwgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzJdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbM10pO1xuICBpZiAoc3VnZ2VzdGVkRmlsZW5hbWUpIHtcbiAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHN1Z2dlc3RlZEZpbGVuYW1lWzBdO1xuICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKGRlY29kZVVSSUNvbXBvbmVudChzdWdnZXN0ZWRGaWxlbmFtZSkpWzBdO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VnZ2VzdGVkRmlsZW5hbWUgfHwgZGVmYXVsdEZpbGVuYW1lO1xufVxuY2xhc3MgU3RhdFRpbWVyIHtcbiAgc3RhcnRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRpbWVzID0gW107XG4gIHRpbWUobmFtZSkge1xuICAgIGlmIChuYW1lIGluIHRoaXMuc3RhcnRlZCkge1xuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNl9fLndhcm4pKGBUaW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydGVkW25hbWVdID0gRGF0ZS5ub3coKTtcbiAgfVxuICB0aW1lRW5kKG5hbWUpIHtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuc3RhcnRlZCkpIHtcbiAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy53YXJuKShgVGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy50aW1lcy5wdXNoKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydDogdGhpcy5zdGFydGVkW25hbWVdLFxuICAgICAgZW5kOiBEYXRlLm5vdygpXG4gICAgfSk7XG4gICAgZGVsZXRlIHRoaXMuc3RhcnRlZFtuYW1lXTtcbiAgfVxuICB0b1N0cmluZygpIHtcbiAgICBjb25zdCBvdXRCdWYgPSBbXTtcbiAgICBsZXQgbG9uZ2VzdCA9IDA7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICBuYW1lXG4gICAgfSBvZiB0aGlzLnRpbWVzKSB7XG4gICAgICBsb25nZXN0ID0gTWF0aC5tYXgobmFtZS5sZW5ndGgsIGxvbmdlc3QpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgIH0gb2YgdGhpcy50aW1lcykge1xuICAgICAgb3V0QnVmLnB1c2goYCR7bmFtZS5wYWRFbmQobG9uZ2VzdCl9ICR7ZW5kIC0gc3RhcnR9bXNcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zi5qb2luKFwiXCIpO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodXJsLCBiYXNlVXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvdG9jb2xcbiAgICB9ID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gcHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCBwcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBub0NvbnRleHRNZW51KGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufVxuZnVuY3Rpb24gZGVwcmVjYXRlZChkZXRhaWxzKSB7XG4gIGNvbnNvbGUubG9nKFwiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6IFwiICsgZGV0YWlscyk7XG59XG5sZXQgcGRmRGF0ZVN0cmluZ1JlZ2V4O1xuY2xhc3MgUERGRGF0ZVN0cmluZyB7XG4gIHN0YXRpYyB0b0RhdGVPYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBkZkRhdGVTdHJpbmdSZWdleCB8fD0gbmV3IFJlZ0V4cChcIl5EOlwiICsgXCIoXFxcXGR7NH0pXCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihbWnwrfC1dKT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiJz9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiJz9cIik7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHBkZkRhdGVTdHJpbmdSZWdleC5leGVjKGlucHV0KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApO1xuICAgIGxldCBtb250aCA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDEwKTtcbiAgICBtb250aCA9IG1vbnRoID49IDEgJiYgbW9udGggPD0gMTIgPyBtb250aCAtIDEgOiAwO1xuICAgIGxldCBkYXkgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxMCk7XG4gICAgZGF5ID0gZGF5ID49IDEgJiYgZGF5IDw9IDMxID8gZGF5IDogMTtcbiAgICBsZXQgaG91ciA9IHBhcnNlSW50KG1hdGNoZXNbNF0sIDEwKTtcbiAgICBob3VyID0gaG91ciA+PSAwICYmIGhvdXIgPD0gMjMgPyBob3VyIDogMDtcbiAgICBsZXQgbWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xuICAgIG1pbnV0ZSA9IG1pbnV0ZSA+PSAwICYmIG1pbnV0ZSA8PSA1OSA/IG1pbnV0ZSA6IDA7XG4gICAgbGV0IHNlY29uZCA9IHBhcnNlSW50KG1hdGNoZXNbNl0sIDEwKTtcbiAgICBzZWNvbmQgPSBzZWNvbmQgPj0gMCAmJiBzZWNvbmQgPD0gNTkgPyBzZWNvbmQgOiAwO1xuICAgIGNvbnN0IHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9IG1hdGNoZXNbN10gfHwgXCJaXCI7XG4gICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7XG4gICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7XG4gICAgbGV0IG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwO1xuICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7XG4gICAgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCItXCIpIHtcbiAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG4gICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09IFwiK1wiKSB7XG4gICAgICBob3VyIC09IG9mZnNldEhvdXI7XG4gICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0WGZhUGFnZVZpZXdwb3J0KHhmYVBhZ2UsIF9yZWYyKSB7XG4gIGxldCB7XG4gICAgc2NhbGUgPSAxLFxuICAgIHJvdGF0aW9uID0gMFxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IHhmYVBhZ2UuYXR0cmlidXRlcy5zdHlsZTtcbiAgY29uc3Qgdmlld0JveCA9IFswLCAwLCBwYXJzZUludCh3aWR0aCksIHBhcnNlSW50KGhlaWdodCldO1xuICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgdmlld0JveCxcbiAgICBzY2FsZSxcbiAgICByb3RhdGlvblxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFJHQihjb2xvcikge1xuICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICBjb25zdCBjb2xvclJHQiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDEpLCAxNik7XG4gICAgcmV0dXJuIFsoY29sb3JSR0IgJiAweGZmMDAwMCkgPj4gMTYsIChjb2xvclJHQiAmIDB4MDBmZjAwKSA+PiA4LCBjb2xvclJHQiAmIDB4MDAwMGZmXTtcbiAgfVxuICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICByZXR1cm4gY29sb3Iuc2xpY2UoNCwgLTEpLnNwbGl0KFwiLFwiKS5tYXAoeCA9PiBwYXJzZUludCh4KSk7XG4gIH1cbiAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgIHJldHVybiBjb2xvci5zbGljZSg1LCAtMSkuc3BsaXQoXCIsXCIpLm1hcCh4ID0+IHBhcnNlSW50KHgpKS5zbGljZSgwLCAzKTtcbiAgfVxuICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE2X18ud2FybikoYE5vdCBhIHZhbGlkIGNvbG9yIGZvcm1hdDogXCIke2NvbG9yfVwiYCk7XG4gIHJldHVybiBbMCwgMCwgMF07XG59XG5mdW5jdGlvbiBnZXRDb2xvclZhbHVlcyhjb2xvcnMpIHtcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZChzcGFuKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGNvbG9ycy5rZXlzKCkpIHtcbiAgICBzcGFuLnN0eWxlLmNvbG9yID0gbmFtZTtcbiAgICBjb25zdCBjb21wdXRlZENvbG9yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc3BhbikuY29sb3I7XG4gICAgY29sb3JzLnNldChuYW1lLCBnZXRSR0IoY29tcHV0ZWRDb2xvcikpO1xuICB9XG4gIHNwYW4ucmVtb3ZlKCk7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCkge1xuICBjb25zdCB7XG4gICAgYSxcbiAgICBiLFxuICAgIGMsXG4gICAgZCxcbiAgICBlLFxuICAgIGZcbiAgfSA9IGN0eC5nZXRUcmFuc2Zvcm0oKTtcbiAgcmV0dXJuIFthLCBiLCBjLCBkLCBlLCBmXTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCkge1xuICBjb25zdCB7XG4gICAgYSxcbiAgICBiLFxuICAgIGMsXG4gICAgZCxcbiAgICBlLFxuICAgIGZcbiAgfSA9IGN0eC5nZXRUcmFuc2Zvcm0oKS5pbnZlcnRTZWxmKCk7XG4gIHJldHVybiBbYSwgYiwgYywgZCwgZSwgZl07XG59XG5mdW5jdGlvbiBzZXRMYXllckRpbWVuc2lvbnMoZGl2LCB2aWV3cG9ydCkge1xuICBsZXQgbXVzdEZsaXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICBsZXQgbXVzdFJvdGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgaWYgKHZpZXdwb3J0IGluc3RhbmNlb2YgUGFnZVZpZXdwb3J0KSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodFxuICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGRpdjtcbiAgICBjb25zdCB1c2VSb3VuZCA9IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXy5GZWF0dXJlVGVzdC5pc0NTU1JvdW5kU3VwcG9ydGVkO1xuICAgIGNvbnN0IHcgPSBgdmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cGFnZVdpZHRofXB4YCxcbiAgICAgIGggPSBgdmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cGFnZUhlaWdodH1weGA7XG4gICAgY29uc3Qgd2lkdGhTdHIgPSB1c2VSb3VuZCA/IGByb3VuZCgke3d9LCAxcHgpYCA6IGBjYWxjKCR7d30pYCxcbiAgICAgIGhlaWdodFN0ciA9IHVzZVJvdW5kID8gYHJvdW5kKCR7aH0sIDFweClgIDogYGNhbGMoJHtofSlgO1xuICAgIGlmICghbXVzdEZsaXAgfHwgdmlld3BvcnQucm90YXRpb24gJSAxODAgPT09IDApIHtcbiAgICAgIHN0eWxlLndpZHRoID0gd2lkdGhTdHI7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHRTdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLndpZHRoID0gaGVpZ2h0U3RyO1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gd2lkdGhTdHI7XG4gICAgfVxuICB9XG4gIGlmIChtdXN0Um90YXRlKSB7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCB2aWV3cG9ydC5yb3RhdGlvbik7XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTQyMzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgRHJhd0xheWVyOiAoKSA9PiAoLyogYmluZGluZyAqLyBEcmF3TGF5ZXIpXG4vKiBoYXJtb255IGV4cG9ydCAqLyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjI2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcblxuXG5cbmNsYXNzIERyYXdMYXllciB7XG4gICNwYXJlbnQgPSBudWxsO1xuICAjaWQgPSAwO1xuICAjbWFwcGluZyA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3IoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBwYWdlSW5kZXhcbiAgICB9ID0gX3JlZjtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgfVxuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgaWYgKCF0aGlzLiNwYXJlbnQpIHtcbiAgICAgIHRoaXMuI3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI3BhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICBpZiAodGhpcy4jbWFwcGluZy5zaXplID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy4jbWFwcGluZy52YWx1ZXMoKSkge1xuICAgICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICAgICAgcGFyZW50LmFwcGVuZChyb290KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4jcGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IF9zdmdGYWN0b3J5KCkge1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5zaGFkb3cpKHRoaXMsIFwiX3N2Z0ZhY3RvcnlcIiwgbmV3IF9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uRE9NU1ZHRmFjdG9yeSgpKTtcbiAgfVxuICBzdGF0aWMgI3NldEJveChlbGVtZW50LCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IF9yZWYyO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGVsZW1lbnQ7XG4gICAgc3R5bGUudG9wID0gYCR7MTAwICogeX0lYDtcbiAgICBzdHlsZS5sZWZ0ID0gYCR7MTAwICogeH0lYDtcbiAgICBzdHlsZS53aWR0aCA9IGAkezEwMCAqIHdpZHRofSVgO1xuICAgIHN0eWxlLmhlaWdodCA9IGAkezEwMCAqIGhlaWdodH0lYDtcbiAgfVxuICAjY3JlYXRlU1ZHKGJveCkge1xuICAgIGNvbnN0IHN2ZyA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGUoMSwgMSwgdHJ1ZSk7XG4gICAgdGhpcy4jcGFyZW50LmFwcGVuZChzdmcpO1xuICAgIERyYXdMYXllci4jc2V0Qm94KHN2ZywgYm94KTtcbiAgICByZXR1cm4gc3ZnO1xuICB9XG4gIGhpZ2hsaWdodChfcmVmMywgY29sb3IsIG9wYWNpdHkpIHtcbiAgICBsZXQge1xuICAgICAgb3V0bGluZXMsXG4gICAgICBib3hcbiAgICB9ID0gX3JlZjM7XG4gICAgY29uc3QgaWQgPSB0aGlzLiNpZCsrO1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNjcmVhdGVTVkcoYm94KTtcbiAgICByb290LmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRcIik7XG4gICAgY29uc3QgZGVmcyA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiZGVmc1wiKTtcbiAgICByb290LmFwcGVuZChkZWZzKTtcbiAgICBjb25zdCBwYXRoID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIpO1xuICAgIGRlZnMuYXBwZW5kKHBhdGgpO1xuICAgIGNvbnN0IHBhdGhJZCA9IGBwYXRoX3Ake3RoaXMucGFnZUluZGV4fV8ke2lkfWA7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBwYXRoSWQpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBEcmF3TGF5ZXIuI2V4dHJhY3RQYXRoRnJvbUhpZ2hsaWdodE91dGxpbmVzKG91dGxpbmVzKSk7XG4gICAgY29uc3QgY2xpcFBhdGggPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIpO1xuICAgIGRlZnMuYXBwZW5kKGNsaXBQYXRoKTtcbiAgICBjb25zdCBjbGlwUGF0aElkID0gYGNsaXBfJHtwYXRoSWR9YDtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBjbGlwUGF0aElkKTtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJjbGlwUGF0aFVuaXRzXCIsIFwib2JqZWN0Qm91bmRpbmdCb3hcIik7XG4gICAgY29uc3QgY2xpcFBhdGhVc2UgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICBjbGlwUGF0aC5hcHBlbmQoY2xpcFBhdGhVc2UpO1xuICAgIGNsaXBQYXRoVXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICBjbGlwUGF0aFVzZS5jbGFzc0xpc3QuYWRkKFwiY2xpcFwiKTtcbiAgICBjb25zdCB1c2UgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICByb290LmFwcGVuZCh1c2UpO1xuICAgIHJvb3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBjb2xvcik7XG4gICAgcm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgb3BhY2l0eSk7XG4gICAgdXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICB0aGlzLiNtYXBwaW5nLnNldChpZCwgcm9vdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgY2xpcFBhdGhJZDogYHVybCgjJHtjbGlwUGF0aElkfSlgXG4gICAgfTtcbiAgfVxuICBoaWdobGlnaHRPdXRsaW5lKF9yZWY0KSB7XG4gICAgbGV0IHtcbiAgICAgIG91dGxpbmVzLFxuICAgICAgYm94XG4gICAgfSA9IF9yZWY0O1xuICAgIGNvbnN0IGlkID0gdGhpcy4jaWQrKztcbiAgICBjb25zdCByb290ID0gdGhpcy4jY3JlYXRlU1ZHKGJveCk7XG4gICAgcm9vdC5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0T3V0bGluZVwiKTtcbiAgICBjb25zdCBkZWZzID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIpO1xuICAgIHJvb3QuYXBwZW5kKGRlZnMpO1xuICAgIGNvbnN0IHBhdGggPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInBhdGhcIik7XG4gICAgZGVmcy5hcHBlbmQocGF0aCk7XG4gICAgY29uc3QgcGF0aElkID0gYHBhdGhfcCR7dGhpcy5wYWdlSW5kZXh9XyR7aWR9YDtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImlkXCIsIHBhdGhJZCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIERyYXdMYXllci4jZXh0cmFjdFBhdGhGcm9tSGlnaGxpZ2h0T3V0bGluZXMob3V0bGluZXMpKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcInZlY3Rvci1lZmZlY3RcIiwgXCJub24tc2NhbGluZy1zdHJva2VcIik7XG4gICAgY29uc3QgdXNlMSA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwidXNlXCIpO1xuICAgIHJvb3QuYXBwZW5kKHVzZTEpO1xuICAgIHVzZTEuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBgIyR7cGF0aElkfWApO1xuICAgIGNvbnN0IHVzZTIgPSB1c2UxLmNsb25lTm9kZSgpO1xuICAgIHJvb3QuYXBwZW5kKHVzZTIpO1xuICAgIHVzZTEuY2xhc3NMaXN0LmFkZChcIm1haW5PdXRsaW5lXCIpO1xuICAgIHVzZTIuY2xhc3NMaXN0LmFkZChcInNlY29uZGFyeU91dGxpbmVcIik7XG4gICAgdGhpcy4jbWFwcGluZy5zZXQoaWQsIHJvb3QpO1xuICAgIHJldHVybiBpZDtcbiAgfVxuICBzdGF0aWMgI2V4dHJhY3RQYXRoRnJvbUhpZ2hsaWdodE91dGxpbmVzKHBvbHlnb25zKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIHBvbHlnb25zKSB7XG4gICAgICBsZXQgW3ByZXZYLCBwcmV2WV0gPSBwb2x5Z29uO1xuICAgICAgYnVmZmVyLnB1c2goYE0ke3ByZXZYfSAke3ByZXZZfWApO1xuICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGNvbnN0IHggPSBwb2x5Z29uW2ldO1xuICAgICAgICBjb25zdCB5ID0gcG9seWdvbltpICsgMV07XG4gICAgICAgIGlmICh4ID09PSBwcmV2WCkge1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKGBWJHt5fWApO1xuICAgICAgICAgIHByZXZZID0geTtcbiAgICAgICAgfSBlbHNlIGlmICh5ID09PSBwcmV2WSkge1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKGBIJHt4fWApO1xuICAgICAgICAgIHByZXZYID0geDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVmZmVyLnB1c2goXCJaXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCIgXCIpO1xuICB9XG4gIHVwZGF0ZUJveChpZCwgYm94KSB7XG4gICAgRHJhd0xheWVyLiNzZXRCb3godGhpcy4jbWFwcGluZy5nZXQoaWQpLCBib3gpO1xuICB9XG4gIHJvdGF0ZShpZCwgYW5nbGUpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsIGFuZ2xlKTtcbiAgfVxuICBjaGFuZ2VDb2xvcihpZCwgY29sb3IpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBjb2xvcik7XG4gIH1cbiAgY2hhbmdlT3BhY2l0eShpZCwgb3BhY2l0eSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgb3BhY2l0eSk7XG4gIH1cbiAgYWRkQ2xhc3MoaWQsIGNsYXNzTmFtZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbiAgcmVtb3ZlQ2xhc3MoaWQsIGNsYXNzTmFtZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gIH1cbiAgcmVtb3ZlKGlkKSB7XG4gICAgaWYgKHRoaXMuI3BhcmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkucmVtb3ZlKCk7XG4gICAgdGhpcy4jbWFwcGluZy5kZWxldGUoaWQpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4jcGFyZW50ID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy4jbWFwcGluZy52YWx1ZXMoKSkge1xuICAgICAgcm9vdC5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy4jbWFwcGluZy5jbGVhcigpO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQ2Mjk6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuLy8gRVhQT1JUU1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbiAgQW5ub3RhdGlvbkVkaXRvckxheWVyOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIpXG59KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLm1hcC5qc1xudmFyIGVzbmV4dF9pdGVyYXRvcl9tYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5NDQpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5kaWZmZXJlbmNlLnYyLmpzXG52YXIgZXNuZXh0X3NldF9kaWZmZXJlbmNlX3YyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTYxKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaW50ZXJzZWN0aW9uLnYyLmpzXG52YXIgZXNuZXh0X3NldF9pbnRlcnNlY3Rpb25fdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1ODcpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1kaXNqb2ludC1mcm9tLnYyLmpzXG52YXIgZXNuZXh0X3NldF9pc19kaXNqb2ludF9mcm9tX3YyID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjQ3KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3Vic2V0LW9mLnYyLmpzXG52YXIgZXNuZXh0X3NldF9pc19zdWJzZXRfb2ZfdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMDIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdXBlcnNldC1vZi52Mi5qc1xudmFyIGVzbmV4dF9zZXRfaXNfc3VwZXJzZXRfb2ZfdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0OTApO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5zeW1tZXRyaWMtZGlmZmVyZW5jZS52Mi5qc1xudmFyIGVzbmV4dF9zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0MzgpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC51bmlvbi52Mi5qc1xudmFyIGVzbmV4dF9zZXRfdW5pb25fdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MTQpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qc1xudmFyIGVzX2FycmF5X3B1c2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMjYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9zaGFyZWQvdXRpbC5qc1xudmFyIHV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9lZGl0b3IuanMgKyAyIG1vZHVsZXNcbnZhciBlZGl0b3JfZWRpdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MTE1KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qc1xudmFyIGVzbmV4dF9pdGVyYXRvcl9jb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oNzEyMSk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3Iuc29tZS5qc1xudmFyIGVzbmV4dF9pdGVyYXRvcl9zb21lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTE4KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvdG9vbHMuanNcbnZhciB0b29scyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgxMik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvYW5ub3RhdGlvbl9sYXllci5qcyArIDEgbW9kdWxlc1xudmFyIGFubm90YXRpb25fbGF5ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NDApO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2ZyZWV0ZXh0LmpzXG5cblxuXG5cblxuXG5cbmNsYXNzIEZyZWVUZXh0RWRpdG9yIGV4dGVuZHMgZWRpdG9yX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2JvdW5kRWRpdG9yRGl2Qmx1ciA9IHRoaXMuZWRpdG9yRGl2Qmx1ci5iaW5kKHRoaXMpO1xuICAjYm91bmRFZGl0b3JEaXZGb2N1cyA9IHRoaXMuZWRpdG9yRGl2Rm9jdXMuYmluZCh0aGlzKTtcbiAgI2JvdW5kRWRpdG9yRGl2SW5wdXQgPSB0aGlzLmVkaXRvckRpdklucHV0LmJpbmQodGhpcyk7XG4gICNib3VuZEVkaXRvckRpdktleWRvd24gPSB0aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKTtcbiAgI2NvbG9yO1xuICAjY29udGVudCA9IFwiXCI7XG4gICNlZGl0b3JEaXZJZCA9IGAke3RoaXMuaWR9LWVkaXRvcmA7XG4gICNmb250U2l6ZTtcbiAgI2luaXRpYWxEYXRhID0gbnVsbDtcbiAgc3RhdGljIF9mcmVlVGV4dERlZmF1bHRDb250ZW50ID0gXCJcIjtcbiAgc3RhdGljIF9pbnRlcm5hbFBhZGRpbmcgPSAwO1xuICBzdGF0aWMgX2RlZmF1bHRDb2xvciA9IG51bGw7XG4gIHN0YXRpYyBfZGVmYXVsdEZvbnRTaXplID0gMTA7XG4gIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCBwcm90byA9IEZyZWVUZXh0RWRpdG9yLnByb3RvdHlwZTtcbiAgICBjb25zdCBhcnJvd0NoZWNrZXIgPSBzZWxmID0+IHNlbGYuaXNFbXB0eSgpO1xuICAgIGNvbnN0IHNtYWxsID0gdG9vbHMuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfU01BTEw7XG4gICAgY29uc3QgYmlnID0gdG9vbHMuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO1xuICAgIHJldHVybiAoMCx1dGlsLnNoYWRvdykodGhpcywgXCJfa2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyB0b29scy5LZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK3NcIiwgXCJtYWMrbWV0YStzXCIsIFwiY3RybCtwXCIsIFwibWFjK21ldGErcFwiXSwgcHJvdG8uY29tbWl0T3JSZW1vdmUsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICB9XSwgW1tcImN0cmwrRW50ZXJcIiwgXCJtYWMrbWV0YStFbnRlclwiLCBcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHByb3RvLmNvbW1pdE9yUmVtb3ZlXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWy1zbWFsbCwgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbLWJpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93UmlnaHRcIiwgXCJtYWMrc2hpZnQrQXJyb3dSaWdodFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbYmlnLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFswLCAtc21hbGxdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbMCwgLWJpZ10sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWzAsIHNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFswLCBiaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV1dKSk7XG4gIH1cbiAgc3RhdGljIF90eXBlID0gXCJmcmVldGV4dFwiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSB1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUO1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBuYW1lOiBcImZyZWVUZXh0RWRpdG9yXCJcbiAgICB9KTtcbiAgICB0aGlzLiNjb2xvciA9IHBhcmFtcy5jb2xvciB8fCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yIHx8IGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcjtcbiAgICB0aGlzLiNmb250U2l6ZSA9IHBhcmFtcy5mb250U2l6ZSB8fCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4pIHtcbiAgICBlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuaW5pdGlhbGl6ZShsMTBuLCB7XG4gICAgICBzdHJpbmdzOiBbXCJwZGZqcy1mcmVlLXRleHQtZGVmYXVsdC1jb250ZW50XCJdXG4gICAgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgdGhpcy5faW50ZXJuYWxQYWRkaW5nID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1mcmVldGV4dC1wYWRkaW5nXCIpKTtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUZvbnRTaXplKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1t1dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemVdLCBbdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdXTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSwgdGhpcy4jZm9udFNpemVdLCBbdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgdGhpcy4jY29sb3JdXTtcbiAgfVxuICAjdXBkYXRlRm9udFNpemUoZm9udFNpemUpIHtcbiAgICBjb25zdCBzZXRGb250c2l6ZSA9IHNpemUgPT4ge1xuICAgICAgdGhpcy5lZGl0b3JEaXYuc3R5bGUuZm9udFNpemUgPSBgY2FsYygke3NpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgICB0aGlzLnRyYW5zbGF0ZSgwLCAtKHNpemUgLSB0aGlzLiNmb250U2l6ZSkgKiB0aGlzLnBhcmVudFNjYWxlKTtcbiAgICAgIHRoaXMuI2ZvbnRTaXplID0gc2l6ZTtcbiAgICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkRm9udHNpemUgPSB0aGlzLiNmb250U2l6ZTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICBzZXRGb250c2l6ZShmb250U2l6ZSk7XG4gICAgICB9LFxuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICBzZXRGb250c2l6ZShzYXZlZEZvbnRzaXplKTtcbiAgICAgIH0sXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSxcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gICN1cGRhdGVDb2xvcihjb2xvcikge1xuICAgIGNvbnN0IHNhdmVkQ29sb3IgPSB0aGlzLiNjb2xvcjtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICB0aGlzLiNjb2xvciA9IHRoaXMuZWRpdG9yRGl2LnN0eWxlLmNvbG9yID0gY29sb3I7XG4gICAgICB9LFxuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICB0aGlzLiNjb2xvciA9IHRoaXMuZWRpdG9yRGl2LnN0eWxlLmNvbG9yID0gc2F2ZWRDb2xvcjtcbiAgICAgIH0sXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICBfdHJhbnNsYXRlRW1wdHkoeCwgeSkge1xuICAgIHRoaXMuX3VpTWFuYWdlci50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMoeCwgeSwgdHJ1ZSk7XG4gIH1cbiAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5wYXJlbnRTY2FsZTtcbiAgICByZXR1cm4gWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogc2NhbGUsIC0oRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyArIHRoaXMuI2ZvbnRTaXplKSAqIHNjYWxlXTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgfVxuICB9XG4gIGVuYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICh0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZShmYWxzZSk7XG4gICAgdGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcih1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QucmVtb3ZlKFwiZW5hYmxlZFwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2S2V5ZG93bik7XG4gICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Rm9jdXMpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Qmx1cik7XG4gICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2SW5wdXQpO1xuICB9XG4gIGRpc2FibGVFZGl0TW9kZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKHRydWUpO1xuICAgIHN1cGVyLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwiZW5hYmxlZFwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgdGhpcy4jZWRpdG9yRGl2SWQpO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEVkaXRvckRpdktleWRvd24pO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEVkaXRvckRpdkZvY3VzKTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEVkaXRvckRpdkJsdXIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLiNib3VuZEVkaXRvckRpdklucHV0KTtcbiAgICB0aGlzLmRpdi5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmVudC5kaXYuY2xhc3NMaXN0LmFkZChcImZyZWV0ZXh0RWRpdGluZ1wiKTtcbiAgfVxuICBmb2N1c2luKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZm9jdXNpbihldmVudCk7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lZGl0b3JEaXYpIHtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgdGhpcy4jY2hlYXRJbml0aWFsUmVjdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcbiAgICBpZiAodGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzQ2VudGVyZWQpIHtcbiAgICAgIHRoaXMuY2VudGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0gbnVsbDtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5lZGl0b3JEaXYgfHwgdGhpcy5lZGl0b3JEaXYuaW5uZXJUZXh0LnRyaW0oKSA9PT0gXCJcIjtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcbiAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZXRleHRFZGl0aW5nXCIpO1xuICAgIH1cbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICAjZXh0cmFjdFRleHQoKSB7XG4gICAgY29uc3QgZGl2cyA9IHRoaXMuZWRpdG9yRGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZGl2XCIpO1xuICAgIGlmIChkaXZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dDtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xuICAgICAgYnVmZmVyLnB1c2goZGl2LmlubmVyVGV4dC5yZXBsYWNlKC9cXHJcXG4/fFxcbi8sIFwiXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiXFxuXCIpO1xuICB9XG4gICNzZXRFZGl0b3JEaW1lbnNpb25zKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBsZXQgcmVjdDtcbiAgICBpZiAodGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJlY3QgPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjdXJyZW50TGF5ZXIsXG4gICAgICAgIGRpdlxuICAgICAgfSA9IHRoaXM7XG4gICAgICBjb25zdCBzYXZlZERpc3BsYXkgPSBkaXYuc3R5bGUuZGlzcGxheTtcbiAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcbiAgICAgIGN1cnJlbnRMYXllci5kaXYuYXBwZW5kKHRoaXMuZGl2KTtcbiAgICAgIHJlY3QgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICBkaXYuc3R5bGUuZGlzcGxheSA9IHNhdmVkRGlzcGxheTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm90YXRpb24gJSAxODAgPT09IHRoaXMucGFyZW50Um90YXRpb24gJSAxODApIHtcbiAgICAgIHRoaXMud2lkdGggPSByZWN0LndpZHRoIC8gcGFyZW50V2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHJlY3QuaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndpZHRoID0gcmVjdC5oZWlnaHQgLyBwYXJlbnRXaWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gcmVjdC53aWR0aCAvIHBhcmVudEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIGNvbW1pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuY29tbWl0KCk7XG4gICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICBjb25zdCBzYXZlZFRleHQgPSB0aGlzLiNjb250ZW50O1xuICAgIGNvbnN0IG5ld1RleHQgPSB0aGlzLiNjb250ZW50ID0gdGhpcy4jZXh0cmFjdFRleHQoKS50cmltRW5kKCk7XG4gICAgaWYgKHNhdmVkVGV4dCA9PT0gbmV3VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZXRUZXh0ID0gdGV4dCA9PiB7XG4gICAgICB0aGlzLiNjb250ZW50ID0gdGV4dDtcbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLiNzZXRDb250ZW50KCk7XG4gICAgICB0aGlzLl91aU1hbmFnZXIucmVidWlsZCh0aGlzKTtcbiAgICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgIHNldFRleHQobmV3VGV4dCk7XG4gICAgICB9LFxuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICBzZXRUZXh0KHNhdmVkVGV4dCk7XG4gICAgICB9LFxuICAgICAgbXVzdEV4ZWM6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy4jc2V0RWRpdG9yRGltZW5zaW9ucygpO1xuICB9XG4gIHNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzSW5FZGl0TW9kZSgpO1xuICB9XG4gIGVudGVySW5FZGl0TW9kZSgpIHtcbiAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcbiAgfVxuICBkYmxjbGljayhldmVudCkge1xuICAgIHRoaXMuZW50ZXJJbkVkaXRNb2RlKCk7XG4gIH1cbiAga2V5ZG93bihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuZGl2ICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICB0aGlzLmVudGVySW5FZGl0TW9kZSgpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbiAgZWRpdG9yRGl2S2V5ZG93bihldmVudCkge1xuICAgIEZyZWVUZXh0RWRpdG9yLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gIH1cbiAgZWRpdG9yRGl2Rm9jdXMoZXZlbnQpIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gIH1cbiAgZWRpdG9yRGl2Qmx1cihldmVudCkge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cbiAgZWRpdG9yRGl2SW5wdXQoZXZlbnQpIHtcbiAgICB0aGlzLnBhcmVudC5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImZyZWV0ZXh0RWRpdGluZ1wiLCB0aGlzLmlzRW1wdHkoKSk7XG4gIH1cbiAgZGlzYWJsZUVkaXRpbmcoKSB7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcImNvbW1lbnRcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1tdWx0aWxpbmVcIik7XG4gIH1cbiAgZW5hYmxlRWRpdGluZygpIHtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidGV4dGJveFwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiLCB0cnVlKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgfVxuICAgIGxldCBiYXNlWCwgYmFzZVk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGJhc2VYID0gdGhpcy54O1xuICAgICAgYmFzZVkgPSB0aGlzLnk7XG4gICAgfVxuICAgIHN1cGVyLnJlbmRlcigpO1xuICAgIHRoaXMuZWRpdG9yRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jbGFzc05hbWUgPSBcImludGVybmFsXCI7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy4jZWRpdG9yRGl2SWQpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWZyZWUtdGV4dFwiKTtcbiAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICBlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWZyZWUtdGV4dC1kZWZhdWx0LWNvbnRlbnRcIikudGhlbihtc2cgPT4gdGhpcy5lZGl0b3JEaXY/LnNldEF0dHJpYnV0ZShcImRlZmF1bHQtY29udGVudFwiLCBtc2cpKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuZWRpdG9yRGl2O1xuICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHt0aGlzLiNmb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICBzdHlsZS5jb2xvciA9IHRoaXMuI2NvbG9yO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLmVkaXRvckRpdik7XG4gICAgdGhpcy5vdmVybGF5RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LmFkZChcIm92ZXJsYXlcIiwgXCJlbmFibGVkXCIpO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLm92ZXJsYXlEaXYpO1xuICAgICgwLHRvb2xzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkYmxjbGlja1wiLCBcImtleWRvd25cIl0pO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICBpZiAodGhpcy5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwb3NpdGlvblxuICAgICAgICB9ID0gdGhpcy4jaW5pdGlhbERhdGE7XG4gICAgICAgIGxldCBbdHgsIHR5XSA9IHRoaXMuZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCk7XG4gICAgICAgIFt0eCwgdHldID0gdGhpcy5wYWdlVHJhbnNsYXRpb25Ub1NjcmVlbih0eCwgdHkpO1xuICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgIGNvbnN0IFtwYWdlWCwgcGFnZVldID0gdGhpcy5wYWdlVHJhbnNsYXRpb247XG4gICAgICAgIGxldCBwb3NYLCBwb3NZO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBwb3NYID0gYmFzZVggKyAocG9zaXRpb25bMF0gLSBwYWdlWCkgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgICBwb3NZID0gYmFzZVkgKyB0aGlzLmhlaWdodCAtIChwb3NpdGlvblsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYICsgKHBvc2l0aW9uWzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZIC0gKHBvc2l0aW9uWzFdIC0gcGFnZVkpIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIFt0eCwgdHldID0gW3R5LCAtdHhdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICBwb3NYID0gYmFzZVggLSB0aGlzLndpZHRoICsgKHBvc2l0aW9uWzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZIC0gKHBvc2l0aW9uWzFdIC0gcGFnZVkpIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIFt0eCwgdHldID0gWy10eCwgLXR5XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYICsgKHBvc2l0aW9uWzBdIC0gcGFnZVggLSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZICsgKHBvc2l0aW9uWzFdIC0gcGFnZVkgLSB0aGlzLndpZHRoICogcGFnZVdpZHRoKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBbdHgsIHR5XSA9IFstdHksIHR4XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0QXQocG9zWCAqIHBhcmVudFdpZHRoLCBwb3NZICogcGFyZW50SGVpZ2h0LCB0eCwgdHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRBdChiYXNlWCAqIHBhcmVudFdpZHRoLCBiYXNlWSAqIHBhcmVudEhlaWdodCwgdGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgICB9XG4gICAgICB0aGlzLiNzZXRDb250ZW50KCk7XG4gICAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICAjc2V0Q29udGVudCgpIHtcbiAgICB0aGlzLmVkaXRvckRpdi5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBpZiAoIXRoaXMuI2NvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuI2NvbnRlbnQuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXYuYXBwZW5kKGxpbmUgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICB0aGlzLmVkaXRvckRpdi5hcHBlbmQoZGl2KTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbnRlbnREaXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yRGl2O1xuICB9XG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcikge1xuICAgIGxldCBpbml0aWFsRGF0YSA9IG51bGw7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBhbm5vdGF0aW9uX2xheWVyLkZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGRlZmF1bHRBcHBlYXJhbmNlRGF0YToge1xuICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICBmb250Q29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgcm90YXRpb24sXG4gICAgICAgICAgaWRcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dENvbnRlbnQsXG4gICAgICAgIHRleHRQb3NpdGlvbixcbiAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgcGFnZToge1xuICAgICAgICAgICAgcGFnZU51bWJlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSA9IGRhdGE7XG4gICAgICBpZiAoIXRleHRDb250ZW50IHx8IHRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxEYXRhID0gZGF0YSA9IHtcbiAgICAgICAgYW5ub3RhdGlvblR5cGU6IHV0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgIGNvbG9yOiBBcnJheS5mcm9tKGZvbnRDb2xvciksXG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICB2YWx1ZTogdGV4dENvbnRlbnQuam9pbihcIlxcblwiKSxcbiAgICAgICAgcG9zaXRpb246IHRleHRQb3NpdGlvbixcbiAgICAgICAgcGFnZUluZGV4OiBwYWdlTnVtYmVyIC0gMSxcbiAgICAgICAgcmVjdCxcbiAgICAgICAgcm90YXRpb24sXG4gICAgICAgIGlkLFxuICAgICAgICBkZWxldGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gc3VwZXIuZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpO1xuICAgIGVkaXRvci4jZm9udFNpemUgPSBkYXRhLmZvbnRTaXplO1xuICAgIGVkaXRvci4jY29sb3IgPSB1dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLmRhdGEuY29sb3IpO1xuICAgIGVkaXRvci4jY29udGVudCA9IGRhdGEudmFsdWU7XG4gICAgZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPSBkYXRhLmlkIHx8IG51bGw7XG4gICAgZWRpdG9yLiNpbml0aWFsRGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIGxldCBpc0ZvckNvcHlpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICAgIGlkOiB0aGlzLmFubm90YXRpb25FbGVtZW50SWQsXG4gICAgICAgIGRlbGV0ZWQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmcgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRSZWN0KHBhZGRpbmcsIHBhZGRpbmcpO1xuICAgIGNvbnN0IGNvbG9yID0gZWRpdG9yX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmlzQXR0YWNoZWRUb0RPTSA/IGdldENvbXB1dGVkU3R5bGUodGhpcy5lZGl0b3JEaXYpLmNvbG9yIDogdGhpcy4jY29sb3IpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCxcbiAgICAgIGNvbG9yLFxuICAgICAgZm9udFNpemU6IHRoaXMuI2ZvbnRTaXplLFxuICAgICAgdmFsdWU6IHRoaXMuI2NvbnRlbnQsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICAgIGlmIChpc0ZvckNvcHlpbmcpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5hbm5vdGF0aW9uRWxlbWVudElkICYmICF0aGlzLiNoYXNFbGVtZW50Q2hhbmdlZChzZXJpYWxpemVkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNlcmlhbGl6ZWQuaWQgPSB0aGlzLmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gIH1cbiAgI2hhc0VsZW1lbnRDaGFuZ2VkKHNlcmlhbGl6ZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGZvbnRTaXplLFxuICAgICAgY29sb3IsXG4gICAgICByZWN0LFxuICAgICAgcGFnZUluZGV4XG4gICAgfSA9IHRoaXMuI2luaXRpYWxEYXRhO1xuICAgIHJldHVybiBzZXJpYWxpemVkLnZhbHVlICE9PSB2YWx1ZSB8fCBzZXJpYWxpemVkLmZvbnRTaXplICE9PSBmb250U2l6ZSB8fCBzZXJpYWxpemVkLnJlY3Quc29tZSgoeCwgaSkgPT4gTWF0aC5hYnMoeCAtIHJlY3RbaV0pID49IDEpIHx8IHNlcmlhbGl6ZWQuY29sb3Iuc29tZSgoYywgaSkgPT4gYyAhPT0gY29sb3JbaV0pIHx8IHNlcmlhbGl6ZWQucGFnZUluZGV4ICE9PSBwYWdlSW5kZXg7XG4gIH1cbiAgI2NoZWF0SW5pdGlhbFJlY3QoKSB7XG4gICAgbGV0IGRlbGF5ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIGlmICghdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcbiAgICBpZiAoIWRlbGF5ZWQgJiYgKHRoaXMud2lkdGggPT09IDAgfHwgdGhpcy5oZWlnaHQgPT09IDApKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuI2NoZWF0SW5pdGlhbFJlY3QodHJ1ZSksIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYWRkaW5nID0gRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyAqIHRoaXMucGFyZW50U2NhbGU7XG4gICAgdGhpcy4jaW5pdGlhbERhdGEucmVjdCA9IHRoaXMuZ2V0UmVjdChwYWRkaW5nLCBwYWRkaW5nKTtcbiAgfVxufVxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2NvbG9yX3BpY2tlci5qc1xudmFyIGNvbG9yX3BpY2tlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTA5Nyk7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL291dGxpbmVyLmpzXG52YXIgZWRpdG9yX291dGxpbmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NDA1KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9oaWdobGlnaHQuanNcblxuXG5cblxuXG5cbmNsYXNzIEhpZ2hsaWdodEVkaXRvciBleHRlbmRzIGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvciB7XG4gICNib3hlcztcbiAgI2NsaXBQYXRoSWQgPSBudWxsO1xuICAjY29sb3JQaWNrZXIgPSBudWxsO1xuICAjZm9jdXNPdXRsaW5lcyA9IG51bGw7XG4gICNoaWdobGlnaHREaXYgPSBudWxsO1xuICAjaGlnaGxpZ2h0T3V0bGluZXMgPSBudWxsO1xuICAjaWQgPSBudWxsO1xuICAjbGFzdFBvaW50ID0gbnVsbDtcbiAgI29wYWNpdHk7XG4gICNvdXRsaW5lSWQgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRDb2xvciA9IG51bGw7XG4gIHN0YXRpYyBfZGVmYXVsdE9wYWNpdHkgPSAxO1xuICBzdGF0aWMgX2wxMG5Qcm9taXNlO1xuICBzdGF0aWMgX3R5cGUgPSBcImhpZ2hsaWdodFwiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSB1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVDtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJoaWdobGlnaHRFZGl0b3JcIlxuICAgIH0pO1xuICAgIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yIHx8PSB0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzPy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgfHwgXCIjZmZmMDY2XCI7XG4gICAgdGhpcy5jb2xvciA9IHBhcmFtcy5jb2xvciB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvcjtcbiAgICB0aGlzLiNvcGFjaXR5ID0gcGFyYW1zLm9wYWNpdHkgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0T3BhY2l0eTtcbiAgICB0aGlzLiNib3hlcyA9IHBhcmFtcy5ib3hlcyB8fCBudWxsO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy4jY3JlYXRlT3V0bGluZXMoKTtcbiAgICB0aGlzLiNhZGRUb0RyYXdMYXllcigpO1xuICAgIHRoaXMucm90YXRlKHRoaXMucm90YXRpb24pO1xuICB9XG4gICNjcmVhdGVPdXRsaW5lcygpIHtcbiAgICBjb25zdCBvdXRsaW5lciA9IG5ldyBlZGl0b3Jfb3V0bGluZXIuT3V0bGluZXIodGhpcy4jYm94ZXMsIDAuMDAxKTtcbiAgICB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcyA9IG91dGxpbmVyLmdldE91dGxpbmVzKCk7XG4gICAgKHtcbiAgICAgIHg6IHRoaXMueCxcbiAgICAgIHk6IHRoaXMueSxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodFxuICAgIH0gPSB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5ib3gpO1xuICAgIGNvbnN0IG91dGxpbmVyRm9yT3V0bGluZSA9IG5ldyBlZGl0b3Jfb3V0bGluZXIuT3V0bGluZXIodGhpcy4jYm94ZXMsIDAuMDAyNSwgMC4wMDEsIHRoaXMuX3VpTWFuYWdlci5kaXJlY3Rpb24gPT09IFwibHRyXCIpO1xuICAgIHRoaXMuI2ZvY3VzT3V0bGluZXMgPSBvdXRsaW5lckZvck91dGxpbmUuZ2V0T3V0bGluZXMoKTtcbiAgICBjb25zdCB7XG4gICAgICBsYXN0UG9pbnRcbiAgICB9ID0gdGhpcy4jZm9jdXNPdXRsaW5lcy5ib3g7XG4gICAgdGhpcy4jbGFzdFBvaW50ID0gWyhsYXN0UG9pbnRbMF0gLSB0aGlzLngpIC8gdGhpcy53aWR0aCwgKGxhc3RQb2ludFsxXSAtIHRoaXMueSkgLyB0aGlzLmhlaWdodF07XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbikge1xuICAgIGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4pO1xuICB9XG4gIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0RFRkFVTFRfQ09MT1I6XG4gICAgICAgIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBnZXQgdG9vbGJhclBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXN0UG9pbnQ7XG4gIH1cbiAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SOlxuICAgICAgICB0aGlzLiN1cGRhdGVDb2xvcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfREVGQVVMVF9DT0xPUiwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3JdXTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SLCB0aGlzLmNvbG9yIHx8IEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yXV07XG4gIH1cbiAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG4gICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuY29sb3I7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuICAgICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuY2hhbmdlQ29sb3IodGhpcy4jaWQsIGNvbG9yKTtcbiAgICAgICAgdGhpcy4jY29sb3JQaWNrZXI/LnVwZGF0ZUNvbG9yKGNvbG9yKTtcbiAgICAgIH0sXG4gICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29sb3IgPSBzYXZlZENvbG9yO1xuICAgICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuY2hhbmdlQ29sb3IodGhpcy4jaWQsIHNhdmVkQ29sb3IpO1xuICAgICAgICB0aGlzLiNjb2xvclBpY2tlcj8udXBkYXRlQ29sb3Ioc2F2ZWRDb2xvcik7XG4gICAgICB9LFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiB1dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUixcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGFzeW5jIGFkZEVkaXRUb29sYmFyKCkge1xuICAgIGNvbnN0IHRvb2xiYXIgPSBhd2FpdCBzdXBlci5hZGRFZGl0VG9vbGJhcigpO1xuICAgIGlmICghdG9vbGJhcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzKSB7XG4gICAgICB0aGlzLiNjb2xvclBpY2tlciA9IG5ldyBjb2xvcl9waWNrZXIuQ29sb3JQaWNrZXIoe1xuICAgICAgICBlZGl0b3I6IHRoaXNcbiAgICAgIH0pO1xuICAgICAgdG9vbGJhci5hZGRDb2xvclBpY2tlcih0aGlzLiNjb2xvclBpY2tlcik7XG4gICAgfVxuICAgIHJldHVybiB0b29sYmFyO1xuICB9XG4gIGRpc2FibGVFZGl0aW5nKCkge1xuICAgIHN1cGVyLmRpc2FibGVFZGl0aW5nKCk7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImRpc2FibGVkXCIsIHRydWUpO1xuICB9XG4gIGVuYWJsZUVkaXRpbmcoKSB7XG4gICAgc3VwZXIuZW5hYmxlRWRpdGluZygpO1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gIH1cbiAgZml4QW5kU2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHN1cGVyLmZpeEFuZFNldFBvc2l0aW9uKDApO1xuICB9XG4gIGdldFJlY3QodHgsIHR5KSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFJlY3QodHgsIHR5LCAwKTtcbiAgfVxuICBvbmNlQWRkZWQoKSB7XG4gICAgdGhpcy5wYXJlbnQuYWRkVW5kb2FibGVFZGl0b3IodGhpcyk7XG4gICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgdGhpcy4jY2xlYW5EcmF3TGF5ZXIoKTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhZGRUb0RyYXdMYXllcigpO1xuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgIGxldCBtdXN0QmVTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnBhcmVudCAmJiAhcGFyZW50KSB7XG4gICAgICB0aGlzLiNjbGVhbkRyYXdMYXllcigpO1xuICAgIH0gZWxzZSBpZiAocGFyZW50KSB7XG4gICAgICB0aGlzLiNhZGRUb0RyYXdMYXllcihwYXJlbnQpO1xuICAgICAgbXVzdEJlU2VsZWN0ZWQgPSAhdGhpcy5wYXJlbnQgJiYgdGhpcy5kaXY/LmNsYXNzTGlzdC5jb250YWlucyhcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgIH1cbiAgICBzdXBlci5zZXRQYXJlbnQocGFyZW50KTtcbiAgICBpZiAobXVzdEJlU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0KCk7XG4gICAgfVxuICB9XG4gICNjbGVhbkRyYXdMYXllcigpIHtcbiAgICBpZiAodGhpcy4jaWQgPT09IG51bGwgfHwgIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5yZW1vdmUodGhpcy4jaWQpO1xuICAgIHRoaXMuI2lkID0gbnVsbDtcbiAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIucmVtb3ZlKHRoaXMuI291dGxpbmVJZCk7XG4gICAgdGhpcy4jb3V0bGluZUlkID0gbnVsbDtcbiAgfVxuICAjYWRkVG9EcmF3TGF5ZXIoKSB7XG4gICAgbGV0IHBhcmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJlbnQ7XG4gICAgaWYgKHRoaXMuI2lkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICh7XG4gICAgICBpZDogdGhpcy4jaWQsXG4gICAgICBjbGlwUGF0aElkOiB0aGlzLiNjbGlwUGF0aElkXG4gICAgfSA9IHBhcmVudC5kcmF3TGF5ZXIuaGlnaGxpZ2h0KHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLCB0aGlzLmNvbG9yLCB0aGlzLiNvcGFjaXR5KSk7XG4gICAgaWYgKHRoaXMuI2hpZ2hsaWdodERpdikge1xuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGl2LnN0eWxlLmNsaXBQYXRoID0gdGhpcy4jY2xpcFBhdGhJZDtcbiAgICB9XG4gICAgdGhpcy4jb3V0bGluZUlkID0gcGFyZW50LmRyYXdMYXllci5oaWdobGlnaHRPdXRsaW5lKHRoaXMuI2ZvY3VzT3V0bGluZXMpO1xuICB9XG4gIHN0YXRpYyAjcm90YXRlQmJveChfcmVmLCBhbmdsZSkge1xuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IF9yZWY7XG4gICAgc3dpdGNoIChhbmdsZSkge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiAxIC0geSAtIGhlaWdodCxcbiAgICAgICAgICB5OiB4LFxuICAgICAgICAgIHdpZHRoOiBoZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiB3aWR0aFxuICAgICAgICB9O1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogMSAtIHggLSB3aWR0aCxcbiAgICAgICAgICB5OiAxIC0geSAtIGhlaWdodCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHksXG4gICAgICAgICAgeTogMSAtIHggLSB3aWR0aCxcbiAgICAgICAgICB3aWR0aDogaGVpZ2h0LFxuICAgICAgICAgIGhlaWdodDogd2lkdGhcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9O1xuICB9XG4gIHJvdGF0ZShhbmdsZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRyYXdMYXllclxuICAgIH0gPSB0aGlzLnBhcmVudDtcbiAgICBkcmF3TGF5ZXIucm90YXRlKHRoaXMuI2lkLCBhbmdsZSk7XG4gICAgZHJhd0xheWVyLnJvdGF0ZSh0aGlzLiNvdXRsaW5lSWQsIGFuZ2xlKTtcbiAgICBkcmF3TGF5ZXIudXBkYXRlQm94KHRoaXMuI2lkLCBIaWdobGlnaHRFZGl0b3IuI3JvdGF0ZUJib3godGhpcywgYW5nbGUpKTtcbiAgICBkcmF3TGF5ZXIudXBkYXRlQm94KHRoaXMuI291dGxpbmVJZCwgSGlnaGxpZ2h0RWRpdG9yLiNyb3RhdGVCYm94KHRoaXMuI2ZvY3VzT3V0bGluZXMuYm94LCBhbmdsZSkpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICB9XG4gICAgY29uc3QgZGl2ID0gc3VwZXIucmVuZGVyKCk7XG4gICAgY29uc3QgaGlnaGxpZ2h0RGl2ID0gdGhpcy4jaGlnaGxpZ2h0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYuYXBwZW5kKGhpZ2hsaWdodERpdik7XG4gICAgaGlnaGxpZ2h0RGl2LmNsYXNzTmFtZSA9IFwiaW50ZXJuYWxcIjtcbiAgICBoaWdobGlnaHREaXYuc3R5bGUuY2xpcFBhdGggPSB0aGlzLiNjbGlwUGF0aElkO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnNldERpbXModGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgKDAsdG9vbHMuYmluZEV2ZW50cykodGhpcywgdGhpcy4jaGlnaGxpZ2h0RGl2LCBbXCJwb2ludGVyb3ZlclwiLCBcInBvaW50ZXJsZWF2ZVwiXSk7XG4gICAgdGhpcy5lbmFibGVFZGl0aW5nKCk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuICBwb2ludGVyb3ZlcigpIHtcbiAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuYWRkQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcImhvdmVyZWRcIik7XG4gIH1cbiAgcG9pbnRlcmxlYXZlKCkge1xuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5yZW1vdmVDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwiaG92ZXJlZFwiKTtcbiAgfVxuICBzZWxlY3QoKSB7XG4gICAgc3VwZXIuc2VsZWN0KCk7XG4gICAgdGhpcy5wYXJlbnQ/LmRyYXdMYXllci5yZW1vdmVDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwiaG92ZXJlZFwiKTtcbiAgICB0aGlzLnBhcmVudD8uZHJhd0xheWVyLmFkZENsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJzZWxlY3RlZFwiKTtcbiAgfVxuICB1bnNlbGVjdCgpIHtcbiAgICBzdXBlci51bnNlbGVjdCgpO1xuICAgIHRoaXMucGFyZW50Py5kcmF3TGF5ZXIucmVtb3ZlQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcInNlbGVjdGVkXCIpO1xuICB9XG4gICNzZXJpYWxpemVCb3hlcygpIHtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3QgYm94ZXMgPSB0aGlzLiNib3hlcztcbiAgICBjb25zdCBxdWFkUG9pbnRzID0gbmV3IEFycmF5KGJveGVzLmxlbmd0aCAqIDgpO1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9IG9mIGJveGVzKSB7XG4gICAgICBjb25zdCBzeCA9IHggKiBwYWdlV2lkdGg7XG4gICAgICBjb25zdCBzeSA9ICgxIC0geSAtIGhlaWdodCkgKiBwYWdlSGVpZ2h0O1xuICAgICAgcXVhZFBvaW50c1tpXSA9IHF1YWRQb2ludHNbaSArIDRdID0gc3g7XG4gICAgICBxdWFkUG9pbnRzW2kgKyAxXSA9IHF1YWRQb2ludHNbaSArIDNdID0gc3k7XG4gICAgICBxdWFkUG9pbnRzW2kgKyAyXSA9IHF1YWRQb2ludHNbaSArIDZdID0gc3ggKyB3aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICAgIHF1YWRQb2ludHNbaSArIDVdID0gcXVhZFBvaW50c1tpICsgN10gPSBzeSArIGhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgICBpICs9IDg7XG4gICAgfVxuICAgIHJldHVybiBxdWFkUG9pbnRzO1xuICB9XG4gICNzZXJpYWxpemVPdXRsaW5lcygpIHtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoICogcGFnZVdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICBjb25zdCB0eCA9IHRoaXMueCAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCB0eSA9ICgxIC0gdGhpcy55IC0gdGhpcy5oZWlnaHQpICogcGFnZUhlaWdodDtcbiAgICBjb25zdCBvdXRsaW5lcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3V0bGluZSBvZiB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5vdXRsaW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbmV3IEFycmF5KG91dGxpbmUubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0bGluZS5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwb2ludHNbaV0gPSB0eCArIG91dGxpbmVbaV0gKiB3aWR0aDtcbiAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHR5ICsgKDEgLSBvdXRsaW5lW2kgKyAxXSkgKiBoZWlnaHQ7XG4gICAgICB9XG4gICAgICBvdXRsaW5lcy5wdXNoKHBvaW50cyk7XG4gICAgfVxuICAgIHJldHVybiBvdXRsaW5lcztcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgY29uc3Qge1xuICAgICAgcmVjdCxcbiAgICAgIGNvbG9yLFxuICAgICAgcXVhZFBvaW50c1xuICAgIH0gPSBkYXRhO1xuICAgIGVkaXRvci5jb2xvciA9IHV0aWwuVXRpbC5tYWtlSGV4Q29sb3IoLi4uY29sb3IpO1xuICAgIGVkaXRvci4jb3BhY2l0eSA9IGRhdGEub3BhY2l0eTtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcbiAgICBlZGl0b3Iud2lkdGggPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gcGFnZVdpZHRoO1xuICAgIGVkaXRvci5oZWlnaHQgPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gcGFnZUhlaWdodDtcbiAgICBjb25zdCBib3hlcyA9IGVkaXRvci4jYm94ZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRQb2ludHMubGVuZ3RoOyBpICs9IDgpIHtcbiAgICAgIGJveGVzLnB1c2goe1xuICAgICAgICB4OiBxdWFkUG9pbnRzWzRdIC8gcGFnZVdpZHRoLFxuICAgICAgICB5OiAxIC0gcXVhZFBvaW50c1tpICsgNV0gLyBwYWdlSGVpZ2h0LFxuICAgICAgICB3aWR0aDogKHF1YWRQb2ludHNbaSArIDJdIC0gcXVhZFBvaW50c1tpXSkgLyBwYWdlV2lkdGgsXG4gICAgICAgIGhlaWdodDogKHF1YWRQb2ludHNbaSArIDVdIC0gcXVhZFBvaW50c1tpICsgMV0pIC8gcGFnZUhlaWdodFxuICAgICAgfSk7XG4gICAgfVxuICAgIGVkaXRvci4jY3JlYXRlT3V0bGluZXMoKTtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIHNlcmlhbGl6ZSgpIHtcbiAgICBsZXQgaXNGb3JDb3B5aW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgfHwgaXNGb3JDb3B5aW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0UmVjdCgwLCAwKTtcbiAgICBjb25zdCBjb2xvciA9IGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25UeXBlOiB1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCxcbiAgICAgIGNvbG9yLFxuICAgICAgb3BhY2l0eTogdGhpcy4jb3BhY2l0eSxcbiAgICAgIHF1YWRQb2ludHM6IHRoaXMuI3NlcmlhbGl6ZUJveGVzKCksXG4gICAgICBvdXRsaW5lczogdGhpcy4jc2VyaWFsaXplT3V0bGluZXMoKSxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICByZWN0LFxuICAgICAgcm90YXRpb246IDAsXG4gICAgICBzdHJ1Y3RUcmVlUGFyZW50SWQ6IHRoaXMuX3N0cnVjdFRyZWVQYXJlbnRJZFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGNhbkNyZWF0ZU5ld0VtcHR5RWRpdG9yKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qc1xudmFyIGVzX2Vycm9yX2NhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzUyKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzXG52YXIgZGlzcGxheV91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNDczKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9pbmsuanNcblxuXG5cblxuXG5cblxuXG5jbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyBlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3Ige1xuICAjYmFzZUhlaWdodCA9IDA7XG4gICNiYXNlV2lkdGggPSAwO1xuICAjYm91bmRDYW52YXNQb2ludGVybW92ZSA9IHRoaXMuY2FudmFzUG9pbnRlcm1vdmUuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcmxlYXZlID0gdGhpcy5jYW52YXNQb2ludGVybGVhdmUuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcnVwID0gdGhpcy5jYW52YXNQb2ludGVydXAuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24gPSB0aGlzLmNhbnZhc1BvaW50ZXJkb3duLmJpbmQodGhpcyk7XG4gICNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCA9IG51bGw7XG4gICNjdXJyZW50UGF0aDJEID0gbmV3IFBhdGgyRCgpO1xuICAjZGlzYWJsZUVkaXRpbmcgPSBmYWxzZTtcbiAgI2hhc1NvbWV0aGluZ1RvRHJhdyA9IGZhbHNlO1xuICAjaXNDYW52YXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAjb2JzZXJ2ZXIgPSBudWxsO1xuICAjcmVhbFdpZHRoID0gMDtcbiAgI3JlYWxIZWlnaHQgPSAwO1xuICAjcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRDb2xvciA9IG51bGw7XG4gIHN0YXRpYyBfZGVmYXVsdE9wYWNpdHkgPSAxO1xuICBzdGF0aWMgX2RlZmF1bHRUaGlja25lc3MgPSAxO1xuICBzdGF0aWMgX3R5cGUgPSBcImlua1wiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSB1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSztcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJpbmtFZGl0b3JcIlxuICAgIH0pO1xuICAgIHRoaXMuY29sb3IgPSBwYXJhbXMuY29sb3IgfHwgbnVsbDtcbiAgICB0aGlzLnRoaWNrbmVzcyA9IHBhcmFtcy50aGlja25lc3MgfHwgbnVsbDtcbiAgICB0aGlzLm9wYWNpdHkgPSBwYXJhbXMub3BhY2l0eSB8fCBudWxsO1xuICAgIHRoaXMucGF0aHMgPSBbXTtcbiAgICB0aGlzLmJlemllclBhdGgyRCA9IFtdO1xuICAgIHRoaXMuYWxsUmF3UGF0aHMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG4gICAgdGhpcy5zY2FsZUZhY3RvciA9IDE7XG4gICAgdGhpcy50cmFuc2xhdGlvblggPSB0aGlzLnRyYW5zbGF0aW9uWSA9IDA7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gPSB0cnVlO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4pIHtcbiAgICBlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuaW5pdGlhbGl6ZShsMTBuKTtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG4gICAgICAgIElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzcyA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgIElua0VkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB1dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZOlxuICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5ID0gdmFsdWUgLyAxMDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuICAgICAgICB0aGlzLiN1cGRhdGVUaGlja25lc3ModmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgIHRoaXMuI3VwZGF0ZU9wYWNpdHkodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUywgSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzXSwgW3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSwgTWF0aC5yb3VuZChJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5ICogMTAwKV1dO1xuICB9XG4gIGdldCBwcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCB0aGlzLnRoaWNrbmVzcyB8fCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsIHRoaXMuY29sb3IgfHwgSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgZWRpdG9yX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXSwgW3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksIE1hdGgucm91bmQoMTAwICogKHRoaXMub3BhY2l0eSA/PyBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5KSldXTtcbiAgfVxuICAjdXBkYXRlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuICAgIGNvbnN0IHNhdmVkVGhpY2tuZXNzID0gdGhpcy50aGlja25lc3M7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy50aGlja25lc3MgPSB0aGlja25lc3M7XG4gICAgICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgdGhpcy50aGlja25lc3MgPSBzYXZlZFRoaWNrbmVzcztcbiAgICAgICAgdGhpcy4jZml0VG9Db250ZW50KCk7XG4gICAgICB9LFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiB1dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICAjdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBjb25zdCBzYXZlZENvbG9yID0gdGhpcy5jb2xvcjtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xvciA9IHNhdmVkQ29sb3I7XG4gICAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgICAgfSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICAjdXBkYXRlT3BhY2l0eShvcGFjaXR5KSB7XG4gICAgb3BhY2l0eSAvPSAxMDA7XG4gICAgY29uc3Qgc2F2ZWRPcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgIHRoaXMub3BhY2l0eSA9IG9wYWNpdHk7XG4gICAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgdGhpcy5vcGFjaXR5ID0gc2F2ZWRPcGFjaXR5O1xuICAgICAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICAgIH0sXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IHV0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG4gICAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICB9XG4gICAgdGhpcy4jZml0VG9Db250ZW50KCk7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIGlmICh0aGlzLmNhbnZhcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmNvbW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlKCk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIGlmICh0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkKTtcbiAgICAgIHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCAmJiBwYXJlbnQpIHtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5yZW1vdmVTaG91bGRSZXNjYWxlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnQgJiYgcGFyZW50ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuYWRkU2hvdWxkUmVzY2FsZSh0aGlzKTtcbiAgICB9XG4gICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XG4gIH1cbiAgb25TY2FsZUNoYW5naW5nKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7XG4gIH1cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nIHx8IHRoaXMuY2FudmFzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93bik7XG4gIH1cbiAgZGlzYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICghdGhpcy5pc0luRWRpdE1vZGUoKSB8fCB0aGlzLmNhbnZhcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9ICF0aGlzLmlzRW1wdHkoKTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QucmVtb3ZlKFwiZWRpdGluZ1wiKTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93bik7XG4gIH1cbiAgb25jZUFkZGVkKCkge1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aHMubGVuZ3RoID09PSAwIHx8IHRoaXMucGF0aHMubGVuZ3RoID09PSAxICYmIHRoaXMucGF0aHNbMF0ubGVuZ3RoID09PSAwO1xuICB9XG4gICNnZXRJbml0aWFsQkJveCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYXJlbnRSb3RhdGlvbixcbiAgICAgIHBhcmVudERpbWVuc2lvbnM6IFt3aWR0aCwgaGVpZ2h0XVxuICAgIH0gPSB0aGlzO1xuICAgIHN3aXRjaCAocGFyZW50Um90YXRpb24pIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbMCwgaGVpZ2h0LCBoZWlnaHQsIHdpZHRoXTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gW3dpZHRoLCBoZWlnaHQsIHdpZHRoLCBoZWlnaHRdO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbd2lkdGgsIDAsIGhlaWdodCwgd2lkdGhdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFswLCAwLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICB9XG4gIH1cbiAgI3NldFN0cm9rZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjdHgsXG4gICAgICBjb2xvcixcbiAgICAgIG9wYWNpdHksXG4gICAgICB0aGlja25lc3MsXG4gICAgICBwYXJlbnRTY2FsZSxcbiAgICAgIHNjYWxlRmFjdG9yXG4gICAgfSA9IHRoaXM7XG4gICAgY3R4LmxpbmVXaWR0aCA9IHRoaWNrbmVzcyAqIHBhcmVudFNjYWxlIC8gc2NhbGVGYWN0b3I7XG4gICAgY3R4LmxpbmVDYXAgPSBcInJvdW5kXCI7XG4gICAgY3R4LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgIGN0eC5taXRlckxpbWl0ID0gMTA7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gYCR7Y29sb3J9JHsoMCx0b29scy5vcGFjaXR5VG9IZXgpKG9wYWNpdHkpfWA7XG4gIH1cbiAgI3N0YXJ0RHJhd2luZyh4LCB5KSB7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIGRpc3BsYXlfdXRpbHMubm9Db250ZXh0TWVudSk7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSk7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcm1vdmUpO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVydXApO1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJkb3duKTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgaWYgKCF0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICAgIHRoaXMudGhpY2tuZXNzIHx8PSBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3M7XG4gICAgICB0aGlzLmNvbG9yIHx8PSBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3I7XG4gICAgICB0aGlzLm9wYWNpdHkgPz89IElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBhdGgucHVzaChbeCwgeV0pO1xuICAgIHRoaXMuI2hhc1NvbWV0aGluZ1RvRHJhdyA9IGZhbHNlO1xuICAgIHRoaXMuI3NldFN0cm9rZSgpO1xuICAgIHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy4jZHJhd1BvaW50cygpO1xuICAgICAgaWYgKHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayk7XG4gIH1cbiAgI2RyYXcoeCwgeSkge1xuICAgIGNvbnN0IFtsYXN0WCwgbGFzdFldID0gdGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGgubGVuZ3RoID4gMSAmJiB4ID09PSBsYXN0WCAmJiB5ID09PSBsYXN0WSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgbGV0IHBhdGgyRCA9IHRoaXMuI2N1cnJlbnRQYXRoMkQ7XG4gICAgY3VycmVudFBhdGgucHVzaChbeCwgeV0pO1xuICAgIHRoaXMuI2hhc1NvbWV0aGluZ1RvRHJhdyA9IHRydWU7XG4gICAgaWYgKGN1cnJlbnRQYXRoLmxlbmd0aCA8PSAyKSB7XG4gICAgICBwYXRoMkQubW92ZVRvKC4uLmN1cnJlbnRQYXRoWzBdKTtcbiAgICAgIHBhdGgyRC5saW5lVG8oeCwgeSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPT09IDMpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRQYXRoMkQgPSBwYXRoMkQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBwYXRoMkQubW92ZVRvKC4uLmN1cnJlbnRQYXRoWzBdKTtcbiAgICB9XG4gICAgdGhpcy4jbWFrZUJlemllckN1cnZlKHBhdGgyRCwgLi4uY3VycmVudFBhdGguYXQoLTMpLCAuLi5jdXJyZW50UGF0aC5hdCgtMiksIHgsIHkpO1xuICB9XG4gICNlbmRQYXRoKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0UG9pbnQgPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcbiAgICB0aGlzLiNjdXJyZW50UGF0aDJELmxpbmVUbyguLi5sYXN0UG9pbnQpO1xuICB9XG4gICNzdG9wRHJhd2luZyh4LCB5KSB7XG4gICAgdGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuICAgIHggPSBNYXRoLm1pbihNYXRoLm1heCh4LCAwKSwgdGhpcy5jYW52YXMud2lkdGgpO1xuICAgIHkgPSBNYXRoLm1pbihNYXRoLm1heCh5LCAwKSwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLiNkcmF3KHgsIHkpO1xuICAgIHRoaXMuI2VuZFBhdGgoKTtcbiAgICBsZXQgYmV6aWVyO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCAhPT0gMSkge1xuICAgICAgYmV6aWVyID0gdGhpcy4jZ2VuZXJhdGVCZXppZXJQb2ludHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeHkgPSBbeCwgeV07XG4gICAgICBiZXppZXIgPSBbW3h5LCB4eS5zbGljZSgpLCB4eS5zbGljZSgpLCB4eV1dO1xuICAgIH1cbiAgICBjb25zdCBwYXRoMkQgPSB0aGlzLiNjdXJyZW50UGF0aDJEO1xuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5jdXJyZW50UGF0aDtcbiAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG4gICAgdGhpcy4jY3VycmVudFBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmFsbFJhd1BhdGhzLnB1c2goY3VycmVudFBhdGgpO1xuICAgICAgdGhpcy5wYXRocy5wdXNoKGJlemllcik7XG4gICAgICB0aGlzLmJlemllclBhdGgyRC5wdXNoKHBhdGgyRCk7XG4gICAgICB0aGlzLnJlYnVpbGQoKTtcbiAgICB9O1xuICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG4gICAgICB0aGlzLmFsbFJhd1BhdGhzLnBvcCgpO1xuICAgICAgdGhpcy5wYXRocy5wb3AoKTtcbiAgICAgIHRoaXMuYmV6aWVyUGF0aDJELnBvcCgpO1xuICAgICAgaWYgKHRoaXMucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI2RyYXdQb2ludHMoKSB7XG4gICAgaWYgKCF0aGlzLiNoYXNTb21ldGhpbmdUb0RyYXcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFzU29tZXRoaW5nVG9EcmF3ID0gZmFsc2U7XG4gICAgY29uc3QgdGhpY2tuZXNzID0gTWF0aC5jZWlsKHRoaXMudGhpY2tuZXNzICogdGhpcy5wYXJlbnRTY2FsZSk7XG4gICAgY29uc3QgbGFzdFBvaW50cyA9IHRoaXMuY3VycmVudFBhdGguc2xpY2UoLTMpO1xuICAgIGNvbnN0IHggPSBsYXN0UG9pbnRzLm1hcCh4eSA9PiB4eVswXSk7XG4gICAgY29uc3QgeSA9IGxhc3RQb2ludHMubWFwKHh5ID0+IHh5WzFdKTtcbiAgICBjb25zdCB4TWluID0gTWF0aC5taW4oLi4ueCkgLSB0aGlja25lc3M7XG4gICAgY29uc3QgeE1heCA9IE1hdGgubWF4KC4uLngpICsgdGhpY2tuZXNzO1xuICAgIGNvbnN0IHlNaW4gPSBNYXRoLm1pbiguLi55KSAtIHRoaWNrbmVzcztcbiAgICBjb25zdCB5TWF4ID0gTWF0aC5tYXgoLi4ueSkgKyB0aGlja25lc3M7XG4gICAgY29uc3Qge1xuICAgICAgY3R4XG4gICAgfSA9IHRoaXM7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLmJlemllclBhdGgyRCkge1xuICAgICAgY3R4LnN0cm9rZShwYXRoKTtcbiAgICB9XG4gICAgY3R4LnN0cm9rZSh0aGlzLiNjdXJyZW50UGF0aDJEKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG4gICNtYWtlQmV6aWVyQ3VydmUocGF0aDJELCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgY29uc3QgcHJldlggPSAoeDAgKyB4MSkgLyAyO1xuICAgIGNvbnN0IHByZXZZID0gKHkwICsgeTEpIC8gMjtcbiAgICBjb25zdCB4MyA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgeTMgPSAoeTEgKyB5MikgLyAyO1xuICAgIHBhdGgyRC5iZXppZXJDdXJ2ZVRvKHByZXZYICsgMiAqICh4MSAtIHByZXZYKSAvIDMsIHByZXZZICsgMiAqICh5MSAtIHByZXZZKSAvIDMsIHgzICsgMiAqICh4MSAtIHgzKSAvIDMsIHkzICsgMiAqICh5MSAtIHkzKSAvIDMsIHgzLCB5Myk7XG4gIH1cbiAgI2dlbmVyYXRlQmV6aWVyUG9pbnRzKCkge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgIGlmIChwYXRoLmxlbmd0aCA8PSAyKSB7XG4gICAgICByZXR1cm4gW1twYXRoWzBdLCBwYXRoWzBdLCBwYXRoLmF0KC0xKSwgcGF0aC5hdCgtMSldXTtcbiAgICB9XG4gICAgY29uc3QgYmV6aWVyUG9pbnRzID0gW107XG4gICAgbGV0IGk7XG4gICAgbGV0IFt4MCwgeTBdID0gcGF0aFswXTtcbiAgICBmb3IgKGkgPSAxOyBpIDwgcGF0aC5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgIGNvbnN0IFt4MSwgeTFdID0gcGF0aFtpXTtcbiAgICAgIGNvbnN0IFt4MiwgeTJdID0gcGF0aFtpICsgMV07XG4gICAgICBjb25zdCB4MyA9ICh4MSArIHgyKSAvIDI7XG4gICAgICBjb25zdCB5MyA9ICh5MSArIHkyKSAvIDI7XG4gICAgICBjb25zdCBjb250cm9sMSA9IFt4MCArIDIgKiAoeDEgLSB4MCkgLyAzLCB5MCArIDIgKiAoeTEgLSB5MCkgLyAzXTtcbiAgICAgIGNvbnN0IGNvbnRyb2wyID0gW3gzICsgMiAqICh4MSAtIHgzKSAvIDMsIHkzICsgMiAqICh5MSAtIHkzKSAvIDNdO1xuICAgICAgYmV6aWVyUG9pbnRzLnB1c2goW1t4MCwgeTBdLCBjb250cm9sMSwgY29udHJvbDIsIFt4MywgeTNdXSk7XG4gICAgICBbeDAsIHkwXSA9IFt4MywgeTNdO1xuICAgIH1cbiAgICBjb25zdCBbeDEsIHkxXSA9IHBhdGhbaV07XG4gICAgY29uc3QgW3gyLCB5Ml0gPSBwYXRoW2kgKyAxXTtcbiAgICBjb25zdCBjb250cm9sMSA9IFt4MCArIDIgKiAoeDEgLSB4MCkgLyAzLCB5MCArIDIgKiAoeTEgLSB5MCkgLyAzXTtcbiAgICBjb25zdCBjb250cm9sMiA9IFt4MiArIDIgKiAoeDEgLSB4MikgLyAzLCB5MiArIDIgKiAoeTEgLSB5MikgLyAzXTtcbiAgICBiZXppZXJQb2ludHMucHVzaChbW3gwLCB5MF0sIGNvbnRyb2wxLCBjb250cm9sMiwgW3gyLCB5Ml1dKTtcbiAgICByZXR1cm4gYmV6aWVyUG9pbnRzO1xuICB9XG4gICNyZWRyYXcoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLiN1cGRhdGVUcmFuc2Zvcm0oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2V0U3Ryb2tlKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzLFxuICAgICAgY3R4XG4gICAgfSA9IHRoaXM7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy4jdXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMuYmV6aWVyUGF0aDJEKSB7XG4gICAgICBjdHguc3Ryb2tlKHBhdGgpO1xuICAgIH1cbiAgfVxuICBjb21taXQoKSB7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmNvbW1pdCgpO1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgIHRoaXMuI2Rpc2FibGVFZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG4gICAgdGhpcy4jZml0VG9Db250ZW50KHRydWUpO1xuICAgIHRoaXMuc2VsZWN0KCk7XG4gICAgdGhpcy5wYXJlbnQuYWRkSW5rRWRpdG9ySWZOZWVkZWQodHJ1ZSk7XG4gICAgdGhpcy5tb3ZlSW5ET00oKTtcbiAgICB0aGlzLmRpdi5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgZm9jdXNpbihldmVudCkge1xuICAgIGlmICghdGhpcy5fZm9jdXNFdmVudHNBbGxvd2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmZvY3VzaW4oZXZlbnQpO1xuICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgfVxuICBjYW52YXNQb2ludGVyZG93bihldmVudCkge1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgIXRoaXMuaXNJbkVkaXRNb2RlKCkgfHwgdGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5kaXYuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuZGl2LmZvY3VzKHtcbiAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuI3N0YXJ0RHJhd2luZyhldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgfVxuICBjYW52YXNQb2ludGVybW92ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy4jZHJhdyhldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgfVxuICBjYW52YXNQb2ludGVydXAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuI2VuZERyYXdpbmcoZXZlbnQpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJsZWF2ZShldmVudCkge1xuICAgIHRoaXMuI2VuZERyYXdpbmcoZXZlbnQpO1xuICB9XG4gICNlbmREcmF3aW5nKGV2ZW50KSB7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSk7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcm1vdmUpO1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVydXApO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJkb3duKTtcbiAgICBpZiAodGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgZGlzcGxheV91dGlscy5ub0NvbnRleHRNZW51KTtcbiAgICB9LCAxMCk7XG4gICAgdGhpcy4jc3RvcERyYXdpbmcoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gICAgdGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKCk7XG4gICAgdGhpcy5zZXRJbkJhY2tncm91bmQoKTtcbiAgfVxuICAjY3JlYXRlQ2FudmFzKCkge1xuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgdGhpcy5jYW52YXMuY2xhc3NOYW1lID0gXCJpbmtFZGl0b3JDYW52YXNcIjtcbiAgICB0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1pbmstY2FudmFzXCIpO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIH1cbiAgI2NyZWF0ZU9ic2VydmVyKCkge1xuICAgIHRoaXMuI29ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IGVudHJpZXNbMF0uY29udGVudFJlY3Q7XG4gICAgICBpZiAocmVjdC53aWR0aCAmJiByZWN0LmhlaWdodCkge1xuICAgICAgICB0aGlzLnNldERpbWVuc2lvbnMocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuI29ic2VydmVyLm9ic2VydmUodGhpcy5kaXYpO1xuICB9XG4gIGdldCBpc1Jlc2l6YWJsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbXB0eSgpICYmIHRoaXMuI2Rpc2FibGVFZGl0aW5nO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICB9XG4gICAgbGV0IGJhc2VYLCBiYXNlWTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgYmFzZVggPSB0aGlzLng7XG4gICAgICBiYXNlWSA9IHRoaXMueTtcbiAgICB9XG4gICAgc3VwZXIucmVuZGVyKCk7XG4gICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtaW5rXCIpO1xuICAgIGNvbnN0IFt4LCB5LCB3LCBoXSA9IHRoaXMuI2dldEluaXRpYWxCQm94KCk7XG4gICAgdGhpcy5zZXRBdCh4LCB5LCAwLCAwKTtcbiAgICB0aGlzLnNldERpbXModywgaCk7XG4gICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgIHRoaXMuc2V0QXNwZWN0UmF0aW8odGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgICB0aGlzLnNldEF0KGJhc2VYICogcGFyZW50V2lkdGgsIGJhc2VZICogcGFyZW50SGVpZ2h0LCB0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICAgIHRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgICAgdGhpcy5zZXREaW1zKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJlZGl0aW5nXCIpO1xuICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgIH1cbiAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICAjc2V0Q2FudmFzRGltcygpIHtcbiAgICBpZiAoIXRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gTWF0aC5jZWlsKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCk7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICB0aGlzLiN1cGRhdGVUcmFuc2Zvcm0oKTtcbiAgfVxuICBzZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCByb3VuZGVkV2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoKTtcbiAgICBjb25zdCByb3VuZGVkSGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgIGlmICh0aGlzLiNyZWFsV2lkdGggPT09IHJvdW5kZWRXaWR0aCAmJiB0aGlzLiNyZWFsSGVpZ2h0ID09PSByb3VuZGVkSGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3JlYWxXaWR0aCA9IHJvdW5kZWRXaWR0aDtcbiAgICB0aGlzLiNyZWFsSGVpZ2h0ID0gcm91bmRlZEhlaWdodDtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoIC8gcGFyZW50V2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgLyBwYXJlbnRIZWlnaHQ7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgIGlmICh0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuICAgICAgdGhpcy4jc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgdGhpcy5maXhEaW1zKCk7XG4gIH1cbiAgI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy4jZ2V0UGFkZGluZygpO1xuICAgIGNvbnN0IHNjYWxlRmFjdG9yVyA9ICh3aWR0aCAtIHBhZGRpbmcpIC8gdGhpcy4jYmFzZVdpZHRoO1xuICAgIGNvbnN0IHNjYWxlRmFjdG9ySCA9IChoZWlnaHQgLSBwYWRkaW5nKSAvIHRoaXMuI2Jhc2VIZWlnaHQ7XG4gICAgdGhpcy5zY2FsZUZhY3RvciA9IE1hdGgubWluKHNjYWxlRmFjdG9yVywgc2NhbGVGYWN0b3JIKTtcbiAgfVxuICAjdXBkYXRlVHJhbnNmb3JtKCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCkgLyAyO1xuICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSh0aGlzLnNjYWxlRmFjdG9yLCAwLCAwLCB0aGlzLnNjYWxlRmFjdG9yLCB0aGlzLnRyYW5zbGF0aW9uWCAqIHRoaXMuc2NhbGVGYWN0b3IgKyBwYWRkaW5nLCB0aGlzLnRyYW5zbGF0aW9uWSAqIHRoaXMuc2NhbGVGYWN0b3IgKyBwYWRkaW5nKTtcbiAgfVxuICBzdGF0aWMgI2J1aWxkUGF0aDJEKGJlemllcikge1xuICAgIGNvbnN0IHBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgW2ZpcnN0LCBjb250cm9sMSwgY29udHJvbDIsIHNlY29uZF0gPSBiZXppZXJbaV07XG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICBwYXRoMkQubW92ZVRvKC4uLmZpcnN0KTtcbiAgICAgIH1cbiAgICAgIHBhdGgyRC5iZXppZXJDdXJ2ZVRvKGNvbnRyb2wxWzBdLCBjb250cm9sMVsxXSwgY29udHJvbDJbMF0sIGNvbnRyb2wyWzFdLCBzZWNvbmRbMF0sIHNlY29uZFsxXSk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoMkQ7XG4gIH1cbiAgc3RhdGljICN0b1BERkNvb3JkaW5hdGVzKHBvaW50cywgcmVjdCwgcm90YXRpb24pIHtcbiAgICBjb25zdCBbYmxYLCBibFksIHRyWCwgdHJZXSA9IHJlY3Q7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIHBvaW50c1tpXSArPSBibFg7XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHRyWSAtIHBvaW50c1tpICsgMV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2ldID0gcG9pbnRzW2kgKyAxXSArIGJsWDtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0geCArIGJsWTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIHBvaW50c1tpXSA9IHRyWCAtIHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaSArIDFdICs9IGJsWTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2ldID0gdHJYIC0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0gdHJZIC0geDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG4gIH1cbiAgc3RhdGljICNmcm9tUERGQ29vcmRpbmF0ZXMocG9pbnRzLCByZWN0LCByb3RhdGlvbikge1xuICAgIGNvbnN0IFtibFgsIGJsWSwgdHJYLCB0clldID0gcmVjdDtcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldIC09IGJsWDtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0gdHJZIC0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSBwb2ludHNbaSArIDFdIC0gYmxZO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB4IC0gYmxYO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldID0gdHJYIC0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gLT0gYmxZO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSB0clkgLSBwb2ludHNbaSArIDFdO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB0clggLSB4O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuICAjc2VyaWFsaXplUGF0aHMocywgdHgsIHR5LCByZWN0KSB7XG4gICAgY29uc3QgcGF0aHMgPSBbXTtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy50aGlja25lc3MgLyAyO1xuICAgIGNvbnN0IHNoaWZ0WCA9IHMgKiB0eCArIHBhZGRpbmc7XG4gICAgY29uc3Qgc2hpZnRZID0gcyAqIHR5ICsgcGFkZGluZztcbiAgICBmb3IgKGNvbnN0IGJlemllciBvZiB0aGlzLnBhdGhzKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBbXTtcbiAgICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gYmV6aWVyLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBjb250cm9sMSwgY29udHJvbDIsIHNlY29uZF0gPSBiZXppZXJbal07XG4gICAgICAgIGNvbnN0IHAxMCA9IHMgKiBmaXJzdFswXSArIHNoaWZ0WDtcbiAgICAgICAgY29uc3QgcDExID0gcyAqIGZpcnN0WzFdICsgc2hpZnRZO1xuICAgICAgICBjb25zdCBwMjAgPSBzICogY29udHJvbDFbMF0gKyBzaGlmdFg7XG4gICAgICAgIGNvbnN0IHAyMSA9IHMgKiBjb250cm9sMVsxXSArIHNoaWZ0WTtcbiAgICAgICAgY29uc3QgcDMwID0gcyAqIGNvbnRyb2wyWzBdICsgc2hpZnRYO1xuICAgICAgICBjb25zdCBwMzEgPSBzICogY29udHJvbDJbMV0gKyBzaGlmdFk7XG4gICAgICAgIGNvbnN0IHA0MCA9IHMgKiBzZWNvbmRbMF0gKyBzaGlmdFg7XG4gICAgICAgIGNvbnN0IHA0MSA9IHMgKiBzZWNvbmRbMV0gKyBzaGlmdFk7XG4gICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgYnVmZmVyLnB1c2gocDEwLCBwMTEpO1xuICAgICAgICAgIHBvaW50cy5wdXNoKHAxMCwgcDExKTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIucHVzaChwMjAsIHAyMSwgcDMwLCBwMzEsIHA0MCwgcDQxKTtcbiAgICAgICAgcG9pbnRzLnB1c2gocDIwLCBwMjEpO1xuICAgICAgICBpZiAoaiA9PT0gamogLSAxKSB7XG4gICAgICAgICAgcG9pbnRzLnB1c2gocDQwLCBwNDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgYmV6aWVyOiBJbmtFZGl0b3IuI3RvUERGQ29vcmRpbmF0ZXMoYnVmZmVyLCByZWN0LCB0aGlzLnJvdGF0aW9uKSxcbiAgICAgICAgcG9pbnRzOiBJbmtFZGl0b3IuI3RvUERGQ29vcmRpbmF0ZXMocG9pbnRzLCByZWN0LCB0aGlzLnJvdGF0aW9uKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXRocztcbiAgfVxuICAjZ2V0QmJveCgpIHtcbiAgICBsZXQgeE1pbiA9IEluZmluaXR5O1xuICAgIGxldCB4TWF4ID0gLUluZmluaXR5O1xuICAgIGxldCB5TWluID0gSW5maW5pdHk7XG4gICAgbGV0IHlNYXggPSAtSW5maW5pdHk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMucGF0aHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2ZpcnN0LCBjb250cm9sMSwgY29udHJvbDIsIHNlY29uZF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCBiYm94ID0gdXRpbC5VdGlsLmJlemllckJvdW5kaW5nQm94KC4uLmZpcnN0LCAuLi5jb250cm9sMSwgLi4uY29udHJvbDIsIC4uLnNlY29uZCk7XG4gICAgICAgIHhNaW4gPSBNYXRoLm1pbih4TWluLCBiYm94WzBdKTtcbiAgICAgICAgeU1pbiA9IE1hdGgubWluKHlNaW4sIGJib3hbMV0pO1xuICAgICAgICB4TWF4ID0gTWF0aC5tYXgoeE1heCwgYmJveFsyXSk7XG4gICAgICAgIHlNYXggPSBNYXRoLm1heCh5TWF4LCBiYm94WzNdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt4TWluLCB5TWluLCB4TWF4LCB5TWF4XTtcbiAgfVxuICAjZ2V0UGFkZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jZGlzYWJsZUVkaXRpbmcgPyBNYXRoLmNlaWwodGhpcy50aGlja25lc3MgKiB0aGlzLnBhcmVudFNjYWxlKSA6IDA7XG4gIH1cbiAgI2ZpdFRvQ29udGVudCgpIHtcbiAgICBsZXQgZmlyc3RUaW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuICAgICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJib3ggPSB0aGlzLiNnZXRCYm94KCk7XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMuI2dldFBhZGRpbmcoKTtcbiAgICB0aGlzLiNiYXNlV2lkdGggPSBNYXRoLm1heChlZGl0b3JfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGJib3hbMl0gLSBiYm94WzBdKTtcbiAgICB0aGlzLiNiYXNlSGVpZ2h0ID0gTWF0aC5tYXgoZWRpdG9yX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBiYm94WzNdIC0gYmJveFsxXSk7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuI2Jhc2VXaWR0aCAqIHRoaXMuc2NhbGVGYWN0b3IpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy4jYmFzZUhlaWdodCAqIHRoaXMuc2NhbGVGYWN0b3IpO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldEFzcGVjdFJhdGlvKHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IHByZXZUcmFuc2xhdGlvblggPSB0aGlzLnRyYW5zbGF0aW9uWDtcbiAgICBjb25zdCBwcmV2VHJhbnNsYXRpb25ZID0gdGhpcy50cmFuc2xhdGlvblk7XG4gICAgdGhpcy50cmFuc2xhdGlvblggPSAtYmJveFswXTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uWSA9IC1iYm94WzFdO1xuICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB0aGlzLiNyZWFsV2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLiNyZWFsSGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuc2V0RGltcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB1bnNjYWxlZFBhZGRpbmcgPSBmaXJzdFRpbWUgPyBwYWRkaW5nIC8gdGhpcy5zY2FsZUZhY3RvciAvIDIgOiAwO1xuICAgIHRoaXMudHJhbnNsYXRlKHByZXZUcmFuc2xhdGlvblggLSB0aGlzLnRyYW5zbGF0aW9uWCAtIHVuc2NhbGVkUGFkZGluZywgcHJldlRyYW5zbGF0aW9uWSAtIHRoaXMudHJhbnNsYXRpb25ZIC0gdW5zY2FsZWRQYWRkaW5nKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIGFubm90YXRpb25fbGF5ZXIuSW5rQW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgZWRpdG9yLnRoaWNrbmVzcyA9IGRhdGEudGhpY2tuZXNzO1xuICAgIGVkaXRvci5jb2xvciA9IHV0aWwuVXRpbC5tYWtlSGV4Q29sb3IoLi4uZGF0YS5jb2xvcik7XG4gICAgZWRpdG9yLm9wYWNpdHkgPSBkYXRhLm9wYWNpdHk7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3Qgd2lkdGggPSBlZGl0b3Iud2lkdGggKiBwYWdlV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWRpdG9yLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBlZGl0b3IucGFyZW50U2NhbGU7XG4gICAgY29uc3QgcGFkZGluZyA9IGRhdGEudGhpY2tuZXNzIC8gMjtcbiAgICBlZGl0b3IuI2Rpc2FibGVFZGl0aW5nID0gdHJ1ZTtcbiAgICBlZGl0b3IuI3JlYWxXaWR0aCA9IE1hdGgucm91bmQod2lkdGgpO1xuICAgIGVkaXRvci4jcmVhbEhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0KTtcbiAgICBjb25zdCB7XG4gICAgICBwYXRocyxcbiAgICAgIHJlY3QsXG4gICAgICByb3RhdGlvblxuICAgIH0gPSBkYXRhO1xuICAgIGZvciAobGV0IHtcbiAgICAgIGJlemllclxuICAgIH0gb2YgcGF0aHMpIHtcbiAgICAgIGJlemllciA9IElua0VkaXRvci4jZnJvbVBERkNvb3JkaW5hdGVzKGJlemllciwgcmVjdCwgcm90YXRpb24pO1xuICAgICAgY29uc3QgcGF0aCA9IFtdO1xuICAgICAgZWRpdG9yLnBhdGhzLnB1c2gocGF0aCk7XG4gICAgICBsZXQgcDAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbMF0gLSBwYWRkaW5nKTtcbiAgICAgIGxldCBwMSA9IHNjYWxlRmFjdG9yICogKGJlemllclsxXSAtIHBhZGRpbmcpO1xuICAgICAgZm9yIChsZXQgaSA9IDIsIGlpID0gYmV6aWVyLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHtcbiAgICAgICAgY29uc3QgcDEwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2ldIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAxMSA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgMV0gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDIwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyAyXSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMjEgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDNdIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAzMCA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgNF0gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDMxID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyA1XSAtIHBhZGRpbmcpO1xuICAgICAgICBwYXRoLnB1c2goW1twMCwgcDFdLCBbcDEwLCBwMTFdLCBbcDIwLCBwMjFdLCBbcDMwLCBwMzFdXSk7XG4gICAgICAgIHAwID0gcDMwO1xuICAgICAgICBwMSA9IHAzMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGgyRCA9IHRoaXMuI2J1aWxkUGF0aDJEKHBhdGgpO1xuICAgICAgZWRpdG9yLmJlemllclBhdGgyRC5wdXNoKHBhdGgyRCk7XG4gICAgfVxuICAgIGNvbnN0IGJib3ggPSBlZGl0b3IuI2dldEJib3goKTtcbiAgICBlZGl0b3IuI2Jhc2VXaWR0aCA9IE1hdGgubWF4KGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFsyXSAtIGJib3hbMF0pO1xuICAgIGVkaXRvci4jYmFzZUhlaWdodCA9IE1hdGgubWF4KGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFszXSAtIGJib3hbMV0pO1xuICAgIGVkaXRvci4jc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0UmVjdCgwLCAwKTtcbiAgICBjb25zdCBjb2xvciA9IGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jdHguc3Ryb2tlU3R5bGUpO1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkssXG4gICAgICBjb2xvcixcbiAgICAgIHRoaWNrbmVzczogdGhpcy50aGlja25lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHksXG4gICAgICBwYXRoczogdGhpcy4jc2VyaWFsaXplUGF0aHModGhpcy5zY2FsZUZhY3RvciAvIHRoaXMucGFyZW50U2NhbGUsIHRoaXMudHJhbnNsYXRpb25YLCB0aGlzLnRyYW5zbGF0aW9uWSwgcmVjdCksXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICB9XG59XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maWx0ZXIuanNcbnZhciBlc25leHRfaXRlcmF0b3JfZmlsdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOTkzKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tZXhjZXB0aW9uLnN0YWNrLmpzXG52YXIgd2ViX2RvbV9leGNlcHRpb25fc3RhY2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3MDkpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL3N0YW1wLmpzXG5cblxuXG5cblxuXG5cbmNsYXNzIFN0YW1wRWRpdG9yIGV4dGVuZHMgZWRpdG9yX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2JpdG1hcCA9IG51bGw7XG4gICNiaXRtYXBJZCA9IG51bGw7XG4gICNiaXRtYXBQcm9taXNlID0gbnVsbDtcbiAgI2JpdG1hcFVybCA9IG51bGw7XG4gICNiaXRtYXBGaWxlID0gbnVsbDtcbiAgI2JpdG1hcEZpbGVOYW1lID0gXCJcIjtcbiAgI2NhbnZhcyA9IG51bGw7XG4gICNvYnNlcnZlciA9IG51bGw7XG4gICNyZXNpemVUaW1lb3V0SWQgPSBudWxsO1xuICAjaXNTdmcgPSBmYWxzZTtcbiAgI2hhc0JlZW5BZGRlZEluVW5kb1N0YWNrID0gZmFsc2U7XG4gIHN0YXRpYyBfdHlwZSA9IFwic3RhbXBcIjtcbiAgc3RhdGljIF9lZGl0b3JUeXBlID0gdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJzdGFtcEVkaXRvclwiXG4gICAgfSk7XG4gICAgdGhpcy4jYml0bWFwVXJsID0gcGFyYW1zLmJpdG1hcFVybDtcbiAgICB0aGlzLiNiaXRtYXBGaWxlID0gcGFyYW1zLmJpdG1hcEZpbGU7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbikge1xuICAgIGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4pO1xuICB9XG4gIHN0YXRpYyBnZXQgc3VwcG9ydGVkVHlwZXMoKSB7XG4gICAgY29uc3QgdHlwZXMgPSBbXCJhcG5nXCIsIFwiYXZpZlwiLCBcImJtcFwiLCBcImdpZlwiLCBcImpwZWdcIiwgXCJwbmdcIiwgXCJzdmcreG1sXCIsIFwid2VicFwiLCBcIngtaWNvblwiXTtcbiAgICByZXR1cm4gKDAsdXRpbC5zaGFkb3cpKHRoaXMsIFwic3VwcG9ydGVkVHlwZXNcIiwgdHlwZXMubWFwKHR5cGUgPT4gYGltYWdlLyR7dHlwZX1gKSk7XG4gIH1cbiAgc3RhdGljIGdldCBzdXBwb3J0ZWRUeXBlc1N0cigpIHtcbiAgICByZXR1cm4gKDAsdXRpbC5zaGFkb3cpKHRoaXMsIFwic3VwcG9ydGVkVHlwZXNTdHJcIiwgdGhpcy5zdXBwb3J0ZWRUeXBlcy5qb2luKFwiLFwiKSk7XG4gIH1cbiAgc3RhdGljIGlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyhtaW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXMobWltZSk7XG4gIH1cbiAgc3RhdGljIHBhc3RlKGl0ZW0sIHBhcmVudCkge1xuICAgIHBhcmVudC5wYXN0ZUVkaXRvcih1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLCB7XG4gICAgICBiaXRtYXBGaWxlOiBpdGVtLmdldEFzRmlsZSgpXG4gICAgfSk7XG4gIH1cbiAgI2dldEJpdG1hcEZldGNoZWQoZGF0YSkge1xuICAgIGxldCBmcm9tSWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYml0bWFwID0gZGF0YS5iaXRtYXA7XG4gICAgaWYgKCFmcm9tSWQpIHtcbiAgICAgIHRoaXMuI2JpdG1hcElkID0gZGF0YS5pZDtcbiAgICAgIHRoaXMuI2lzU3ZnID0gZGF0YS5pc1N2ZztcbiAgICB9XG4gICAgaWYgKGRhdGEuZmlsZSkge1xuICAgICAgdGhpcy4jYml0bWFwRmlsZU5hbWUgPSBkYXRhLmZpbGUubmFtZTtcbiAgICB9XG4gICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gIH1cbiAgI2dldEJpdG1hcERvbmUoKSB7XG4gICAgdGhpcy4jYml0bWFwUHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcoZmFsc2UpO1xuICAgIGlmICh0aGlzLiNjYW52YXMpIHtcbiAgICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gICAgfVxuICB9XG4gICNnZXRCaXRtYXAoKSB7XG4gICAgaWYgKHRoaXMuI2JpdG1hcElkKSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyh0cnVlKTtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUlkKHRoaXMuI2JpdG1hcElkKS50aGVuKGRhdGEgPT4gdGhpcy4jZ2V0Qml0bWFwRmV0Y2hlZChkYXRhLCB0cnVlKSkuZmluYWxseSgoKSA9PiB0aGlzLiNnZXRCaXRtYXBEb25lKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYml0bWFwVXJsKSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLiNiaXRtYXBVcmw7XG4gICAgICB0aGlzLiNiaXRtYXBVcmwgPSBudWxsO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcodHJ1ZSk7XG4gICAgICB0aGlzLiNiaXRtYXBQcm9taXNlID0gdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tVXJsKHVybCkudGhlbihkYXRhID0+IHRoaXMuI2dldEJpdG1hcEZldGNoZWQoZGF0YSkpLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2JpdG1hcEZpbGUpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLiNiaXRtYXBGaWxlO1xuICAgICAgdGhpcy4jYml0bWFwRmlsZSA9IG51bGw7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyh0cnVlKTtcbiAgICAgIHRoaXMuI2JpdG1hcFByb21pc2UgPSB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldEZyb21GaWxlKGZpbGUpLnRoZW4oZGF0YSA9PiB0aGlzLiNnZXRCaXRtYXBGZXRjaGVkKGRhdGEpKS5maW5hbGx5KCgpID0+IHRoaXMuI2dldEJpdG1hcERvbmUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIGlucHV0LnR5cGUgPSBcImZpbGVcIjtcbiAgICBpbnB1dC5hY2NlcHQgPSBTdGFtcEVkaXRvci5zdXBwb3J0ZWRUeXBlc1N0cjtcbiAgICB0aGlzLiNiaXRtYXBQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFpbnB1dC5maWxlcyB8fCBpbnB1dC5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKHRydWUpO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldEZyb21GaWxlKGlucHV0LmZpbGVzWzBdKTtcbiAgICAgICAgICB0aGlzLiNnZXRCaXRtYXBGZXRjaGVkKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICBpbnB1dC5jbGljaygpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy4jYml0bWFwSWQpIHtcbiAgICAgIHRoaXMuI2JpdG1hcCA9IG51bGw7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmRlbGV0ZUlkKHRoaXMuI2JpdG1hcElkKTtcbiAgICAgIHRoaXMuI2NhbnZhcz8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLiNjYW52YXMgPSBudWxsO1xuICAgICAgdGhpcy4jb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLiNyZXNpemVUaW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCk7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLnJlbW92ZSgpO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgaWYgKHRoaXMuI2JpdG1hcElkKSB7XG4gICAgICAgIHRoaXMuI2dldEJpdG1hcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgaWYgKHRoaXMuZGl2ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNiaXRtYXBJZCkge1xuICAgICAgdGhpcy4jZ2V0Qml0bWFwKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgb25jZUFkZGVkKCkge1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICEodGhpcy4jYml0bWFwUHJvbWlzZSB8fCB0aGlzLiNiaXRtYXAgfHwgdGhpcy4jYml0bWFwVXJsIHx8IHRoaXMuI2JpdG1hcEZpbGUpO1xuICB9XG4gIGdldCBpc1Jlc2l6YWJsZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgfVxuICAgIGxldCBiYXNlWCwgYmFzZVk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGJhc2VYID0gdGhpcy54O1xuICAgICAgYmFzZVkgPSB0aGlzLnk7XG4gICAgfVxuICAgIHN1cGVyLnJlbmRlcigpO1xuICAgIHRoaXMuZGl2LmhpZGRlbiA9IHRydWU7XG4gICAgaWYgKHRoaXMuI2JpdG1hcCkge1xuICAgICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2dldEJpdG1hcCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgdGhpcy5zZXRBdChiYXNlWCAqIHBhcmVudFdpZHRoLCBiYXNlWSAqIHBhcmVudEhlaWdodCwgdGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICAjY3JlYXRlQ2FudmFzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRpdlxuICAgIH0gPSB0aGlzO1xuICAgIGxldCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzLiNiaXRtYXA7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIGNvbnN0IE1BWF9SQVRJTyA9IDAuNzU7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICB9IGVsc2UgaWYgKHdpZHRoID4gTUFYX1JBVElPICogcGFnZVdpZHRoIHx8IGhlaWdodCA+IE1BWF9SQVRJTyAqIHBhZ2VIZWlnaHQpIHtcbiAgICAgIGNvbnN0IGZhY3RvciA9IE1hdGgubWluKE1BWF9SQVRJTyAqIHBhZ2VXaWR0aCAvIHdpZHRoLCBNQVhfUkFUSU8gKiBwYWdlSGVpZ2h0IC8gaGVpZ2h0KTtcbiAgICAgIHdpZHRoICo9IGZhY3RvcjtcbiAgICAgIGhlaWdodCAqPSBmYWN0b3I7XG4gICAgfVxuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnNldERpbXMod2lkdGggKiBwYXJlbnRXaWR0aCAvIHBhZ2VXaWR0aCwgaGVpZ2h0ICogcGFyZW50SGVpZ2h0IC8gcGFnZUhlaWdodCk7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcoZmFsc2UpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuI2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgZGl2LmFwcGVuZChjYW52YXMpO1xuICAgIGRpdi5oaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLiNkcmF3Qml0bWFwKHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG4gICAgaWYgKCF0aGlzLiNoYXNCZWVuQWRkZWRJblVuZG9TdGFjaykge1xuICAgICAgdGhpcy5wYXJlbnQuYWRkVW5kb2FibGVFZGl0b3IodGhpcyk7XG4gICAgICB0aGlzLiNoYXNCZWVuQWRkZWRJblVuZG9TdGFjayA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX3VpTWFuYWdlci5fZXZlbnRCdXMuZGlzcGF0Y2goXCJyZXBvcnR0ZWxlbWV0cnlcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgZGV0YWlsczoge1xuICAgICAgICB0eXBlOiBcImVkaXRpbmdcIixcbiAgICAgICAgc3VidHlwZTogdGhpcy5lZGl0b3JUeXBlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgYWN0aW9uOiBcImluc2VydGVkX2ltYWdlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWRkQWx0VGV4dEJ1dHRvbigpO1xuICAgIGlmICh0aGlzLiNiaXRtYXBGaWxlTmFtZSkge1xuICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGhpcy4jYml0bWFwRmlsZU5hbWUpO1xuICAgIH1cbiAgfVxuICAjc2V0RGltZW5zaW9ucyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aCAvIHBhcmVudFdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuICAgIHRoaXMuc2V0RGltcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAodGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzQ2VudGVyZWQpIHtcbiAgICAgIHRoaXMuY2VudGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbE9wdGlvbnMgPSBudWxsO1xuICAgIGlmICh0aGlzLiNyZXNpemVUaW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNyZXNpemVUaW1lb3V0SWQpO1xuICAgIH1cbiAgICBjb25zdCBUSU1FX1RPX1dBSVQgPSAyMDA7XG4gICAgdGhpcy4jcmVzaXplVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNyZXNpemVUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgdGhpcy4jZHJhd0JpdG1hcCh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LCBUSU1FX1RPX1dBSVQpO1xuICB9XG4gICNzY2FsZUJpdG1hcCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGJpdG1hcFdpZHRoLFxuICAgICAgaGVpZ2h0OiBiaXRtYXBIZWlnaHRcbiAgICB9ID0gdGhpcy4jYml0bWFwO1xuICAgIGxldCBuZXdXaWR0aCA9IGJpdG1hcFdpZHRoO1xuICAgIGxldCBuZXdIZWlnaHQgPSBiaXRtYXBIZWlnaHQ7XG4gICAgbGV0IGJpdG1hcCA9IHRoaXMuI2JpdG1hcDtcbiAgICB3aGlsZSAobmV3V2lkdGggPiAyICogd2lkdGggfHwgbmV3SGVpZ2h0ID4gMiAqIGhlaWdodCkge1xuICAgICAgY29uc3QgcHJldldpZHRoID0gbmV3V2lkdGg7XG4gICAgICBjb25zdCBwcmV2SGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgaWYgKG5ld1dpZHRoID4gMiAqIHdpZHRoKSB7XG4gICAgICAgIG5ld1dpZHRoID0gbmV3V2lkdGggPj0gMTYzODQgPyBNYXRoLmZsb29yKG5ld1dpZHRoIC8gMikgLSAxIDogTWF0aC5jZWlsKG5ld1dpZHRoIC8gMik7XG4gICAgICB9XG4gICAgICBpZiAobmV3SGVpZ2h0ID4gMiAqIGhlaWdodCkge1xuICAgICAgICBuZXdIZWlnaHQgPSBuZXdIZWlnaHQgPj0gMTYzODQgPyBNYXRoLmZsb29yKG5ld0hlaWdodCAvIDIpIC0gMSA6IE1hdGguY2VpbChuZXdIZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHByZXZXaWR0aCwgcHJldkhlaWdodCwgMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICBiaXRtYXAgPSBvZmZzY3JlZW4udHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cbiAgI2RyYXdCaXRtYXAod2lkdGgsIGhlaWdodCkge1xuICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoKTtcbiAgICBoZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0KTtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLiNjYW52YXM7XG4gICAgaWYgKCFjYW52YXMgfHwgY2FudmFzLndpZHRoID09PSB3aWR0aCAmJiBjYW52YXMuaGVpZ2h0ID09PSBoZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCBiaXRtYXAgPSB0aGlzLiNpc1N2ZyA/IHRoaXMuI2JpdG1hcCA6IHRoaXMuI3NjYWxlQml0bWFwKHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY3R4LmZpbHRlciA9IHRoaXMuX3VpTWFuYWdlci5oY21GaWx0ZXI7XG4gICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIGJpdG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gIH1cbiAgZ2V0SW1hZ2VGb3JBbHRUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiNjYW52YXM7XG4gIH1cbiAgI3NlcmlhbGl6ZUJpdG1hcCh0b1VybCkge1xuICAgIGlmICh0b1VybCkge1xuICAgICAgaWYgKHRoaXMuI2lzU3ZnKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0U3ZnVXJsKHRoaXMuI2JpdG1hcElkKTtcbiAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAoe1xuICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IGNhbnZhcy5oZWlnaHRcbiAgICAgIH0gPSB0aGlzLiNiaXRtYXApO1xuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcy4jYml0bWFwLCAwLCAwKTtcbiAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNpc1N2Zykge1xuICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLnJvdW5kKHRoaXMud2lkdGggKiBwYWdlV2lkdGggKiBkaXNwbGF5X3V0aWxzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodCAqIGRpc3BsYXlfdXRpbHMuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcbiAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLiNiaXRtYXAsIDAsIDAsIHRoaXMuI2JpdG1hcC53aWR0aCwgdGhpcy4jYml0bWFwLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICByZXR1cm4gb2Zmc2NyZWVuLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHRoaXMuI2JpdG1hcCk7XG4gIH1cbiAgI2NyZWF0ZU9ic2VydmVyKCkge1xuICAgIHRoaXMuI29ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IGVudHJpZXNbMF0uY29udGVudFJlY3Q7XG4gICAgICBpZiAocmVjdC53aWR0aCAmJiByZWN0LmhlaWdodCkge1xuICAgICAgICB0aGlzLiNzZXREaW1lbnNpb25zKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLiNvYnNlcnZlci5vYnNlcnZlKHRoaXMuZGl2KTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIGFubm90YXRpb25fbGF5ZXIuU3RhbXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHN1cGVyLmRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKTtcbiAgICBjb25zdCB7XG4gICAgICByZWN0LFxuICAgICAgYml0bWFwVXJsLFxuICAgICAgYml0bWFwSWQsXG4gICAgICBpc1N2ZyxcbiAgICAgIGFjY2Vzc2liaWxpdHlEYXRhXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGJpdG1hcElkICYmIHVpTWFuYWdlci5pbWFnZU1hbmFnZXIuaXNWYWxpZElkKGJpdG1hcElkKSkge1xuICAgICAgZWRpdG9yLiNiaXRtYXBJZCA9IGJpdG1hcElkO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0b3IuI2JpdG1hcFVybCA9IGJpdG1hcFVybDtcbiAgICB9XG4gICAgZWRpdG9yLiNpc1N2ZyA9IGlzU3ZnO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcbiAgICBlZGl0b3Iud2lkdGggPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gcGFyZW50V2lkdGg7XG4gICAgZWRpdG9yLmhlaWdodCA9IChyZWN0WzNdIC0gcmVjdFsxXSkgLyBwYXJlbnRIZWlnaHQ7XG4gICAgaWYgKGFjY2Vzc2liaWxpdHlEYXRhKSB7XG4gICAgICBlZGl0b3IuYWx0VGV4dERhdGEgPSBhY2Nlc3NpYmlsaXR5RGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgbGV0IGlzRm9yQ29weWluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgbGV0IGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHtcbiAgICAgIGFubm90YXRpb25UeXBlOiB1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLFxuICAgICAgYml0bWFwSWQ6IHRoaXMuI2JpdG1hcElkLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHJlY3Q6IHRoaXMuZ2V0UmVjdCgwLCAwKSxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgaXNTdmc6IHRoaXMuI2lzU3ZnLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICAgIGlmIChpc0ZvckNvcHlpbmcpIHtcbiAgICAgIHNlcmlhbGl6ZWQuYml0bWFwVXJsID0gdGhpcy4jc2VyaWFsaXplQml0bWFwKHRydWUpO1xuICAgICAgc2VyaWFsaXplZC5hY2Nlc3NpYmlsaXR5RGF0YSA9IHRoaXMuYWx0VGV4dERhdGE7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgZGVjb3JhdGl2ZSxcbiAgICAgIGFsdFRleHRcbiAgICB9ID0gdGhpcy5hbHRUZXh0RGF0YTtcbiAgICBpZiAoIWRlY29yYXRpdmUgJiYgYWx0VGV4dCkge1xuICAgICAgc2VyaWFsaXplZC5hY2Nlc3NpYmlsaXR5RGF0YSA9IHtcbiAgICAgICAgdHlwZTogXCJGaWd1cmVcIixcbiAgICAgICAgYWx0OiBhbHRUZXh0XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIGNvbnRleHQuc3RhbXBzIHx8PSBuZXcgTWFwKCk7XG4gICAgY29uc3QgYXJlYSA9IHRoaXMuI2lzU3ZnID8gKHNlcmlhbGl6ZWQucmVjdFsyXSAtIHNlcmlhbGl6ZWQucmVjdFswXSkgKiAoc2VyaWFsaXplZC5yZWN0WzNdIC0gc2VyaWFsaXplZC5yZWN0WzFdKSA6IG51bGw7XG4gICAgaWYgKCFjb250ZXh0LnN0YW1wcy5oYXModGhpcy4jYml0bWFwSWQpKSB7XG4gICAgICBjb250ZXh0LnN0YW1wcy5zZXQodGhpcy4jYml0bWFwSWQsIHtcbiAgICAgICAgYXJlYSxcbiAgICAgICAgc2VyaWFsaXplZFxuICAgICAgfSk7XG4gICAgICBzZXJpYWxpemVkLmJpdG1hcCA9IHRoaXMuI3NlcmlhbGl6ZUJpdG1hcChmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNpc1N2Zykge1xuICAgICAgY29uc3QgcHJldkRhdGEgPSBjb250ZXh0LnN0YW1wcy5nZXQodGhpcy4jYml0bWFwSWQpO1xuICAgICAgaWYgKGFyZWEgPiBwcmV2RGF0YS5hcmVhKSB7XG4gICAgICAgIHByZXZEYXRhLmFyZWEgPSBhcmVhO1xuICAgICAgICBwcmV2RGF0YS5zZXJpYWxpemVkLmJpdG1hcC5jbG9zZSgpO1xuICAgICAgICBwcmV2RGF0YS5zZXJpYWxpemVkLmJpdG1hcCA9IHRoaXMuI3NlcmlhbGl6ZUJpdG1hcChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVkO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9hbm5vdGF0aW9uX2VkaXRvcl9sYXllci5qc1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jbGFzcyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIge1xuICAjYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG4gICNhbGxvd0NsaWNrID0gZmFsc2U7XG4gICNhbm5vdGF0aW9uTGF5ZXIgPSBudWxsO1xuICAjYm91bmRQb2ludGVydXAgPSB0aGlzLnBvaW50ZXJ1cC5iaW5kKHRoaXMpO1xuICAjYm91bmRQb2ludGVyVXBBZnRlclNlbGVjdGlvbiA9IHRoaXMucG9pbnRlclVwQWZ0ZXJTZWxlY3Rpb24uYmluZCh0aGlzKTtcbiAgI2JvdW5kUG9pbnRlcmRvd24gPSB0aGlzLnBvaW50ZXJkb3duLmJpbmQodGhpcyk7XG4gICNlZGl0b3JGb2N1c1RpbWVvdXRJZCA9IG51bGw7XG4gICNib3VuZFNlbGVjdGlvblN0YXJ0ID0gdGhpcy5zZWxlY3Rpb25TdGFydC5iaW5kKHRoaXMpO1xuICAjZWRpdG9ycyA9IG5ldyBNYXAoKTtcbiAgI2hhZFBvaW50ZXJEb3duID0gZmFsc2U7XG4gICNpc0NsZWFuaW5nVXAgPSBmYWxzZTtcbiAgI2lzRGlzYWJsaW5nID0gZmFsc2U7XG4gICN0ZXh0TGF5ZXIgPSBudWxsO1xuICAjdWlNYW5hZ2VyO1xuICBzdGF0aWMgX2luaXRpYWxpemVkID0gZmFsc2U7XG4gIHN0YXRpYyAjZWRpdG9yVHlwZXMgPSBuZXcgTWFwKFtGcmVlVGV4dEVkaXRvciwgSW5rRWRpdG9yLCBTdGFtcEVkaXRvciwgSGlnaGxpZ2h0RWRpdG9yXS5tYXAodHlwZSA9PiBbdHlwZS5fZWRpdG9yVHlwZSwgdHlwZV0pKTtcbiAgY29uc3RydWN0b3IoX3JlZikge1xuICAgIGxldCB7XG4gICAgICB1aU1hbmFnZXIsXG4gICAgICBwYWdlSW5kZXgsXG4gICAgICBkaXYsXG4gICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcixcbiAgICAgIGFubm90YXRpb25MYXllcixcbiAgICAgIGRyYXdMYXllcixcbiAgICAgIHRleHRMYXllcixcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgbDEwblxuICAgIH0gPSBfcmVmO1xuICAgIGNvbnN0IGVkaXRvclR5cGVzID0gWy4uLkFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCldO1xuICAgIGlmICghQW5ub3RhdGlvbkVkaXRvckxheWVyLl9pbml0aWFsaXplZCkge1xuICAgICAgQW5ub3RhdGlvbkVkaXRvckxheWVyLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgZWRpdG9yVHlwZXMpIHtcbiAgICAgICAgZWRpdG9yVHlwZS5pbml0aWFsaXplKGwxMG4pO1xuICAgICAgfVxuICAgIH1cbiAgICB1aU1hbmFnZXIucmVnaXN0ZXJFZGl0b3JUeXBlcyhlZGl0b3JUeXBlcyk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyID0gdWlNYW5hZ2VyO1xuICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMuZGl2ID0gZGl2O1xuICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyID0gYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG4gICAgdGhpcy4jYW5ub3RhdGlvbkxheWVyID0gYW5ub3RhdGlvbkxheWVyO1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICB0aGlzLiN0ZXh0TGF5ZXIgPSB0ZXh0TGF5ZXI7XG4gICAgdGhpcy5kcmF3TGF5ZXIgPSBkcmF3TGF5ZXI7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZExheWVyKHRoaXMpO1xuICB9XG4gIGdldCBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLiNlZGl0b3JzLnNpemUgPT09IDA7XG4gIH1cbiAgdXBkYXRlVG9vbGJhcihtb2RlKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVwZGF0ZVRvb2xiYXIobW9kZSk7XG4gIH1cbiAgdXBkYXRlTW9kZSgpIHtcbiAgICBsZXQgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKTtcbiAgICB0aGlzLiNjbGVhbnVwKCk7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORTpcbiAgICAgICAgdGhpcy5kaXNhYmxlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgICAgICB0aGlzLmRpc2FibGVDbGljaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks6XG4gICAgICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoZmFsc2UpO1xuICAgICAgICB0aGlzLmRpc2FibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHV0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOlxuICAgICAgICB0aGlzLmVuYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRpc2FibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICAgICAgdGhpcy5lbmFibGVDbGljaygpO1xuICAgIH1cbiAgICBpZiAobW9kZSAhPT0gdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNsYXNzTGlzdFxuICAgICAgfSA9IHRoaXMuZGl2O1xuICAgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCkpIHtcbiAgICAgICAgY2xhc3NMaXN0LnRvZ2dsZShgJHtlZGl0b3JUeXBlLl90eXBlfUVkaXRpbmdgLCBtb2RlID09PSBlZGl0b3JUeXBlLl9lZGl0b3JUeXBlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGl2LmhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBhZGRJbmtFZGl0b3JJZk5lZWRlZChpc0NvbW1pdHRpbmcpIHtcbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSAhPT0gdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc0NvbW1pdHRpbmcpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGVkaXRvci5pc0VtcHR5KCkpIHtcbiAgICAgICAgICBlZGl0b3Iuc2V0SW5CYWNrZ3JvdW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI2NyZWF0ZUFuZEFkZE5ld0VkaXRvcih7XG4gICAgICBvZmZzZXRYOiAwLFxuICAgICAgb2Zmc2V0WTogMFxuICAgIH0sIGZhbHNlKTtcbiAgICBlZGl0b3Iuc2V0SW5CYWNrZ3JvdW5kKCk7XG4gIH1cbiAgc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZykge1xuICAgIHRoaXMuI3VpTWFuYWdlci5zZXRFZGl0aW5nU3RhdGUoaXNFZGl0aW5nKTtcbiAgfVxuICBhZGRDb21tYW5kcyhwYXJhbXMpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIuYWRkQ29tbWFuZHMocGFyYW1zKTtcbiAgfVxuICB0b2dnbGVQb2ludGVyRXZlbnRzKCkge1xuICAgIGxldCBlbmFibGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZGlzYWJsZWRcIiwgIWVuYWJsZWQpO1xuICB9XG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbkVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgZWRpdG9yLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgIGlmIChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICBhbm5vdGF0aW9uRWxlbWVudElkcy5hZGQoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuI2Fubm90YXRpb25MYXllcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlZGl0YWJsZXMgPSB0aGlzLiNhbm5vdGF0aW9uTGF5ZXIuZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpO1xuICAgIGZvciAoY29uc3QgZWRpdGFibGUgb2YgZWRpdGFibGVzKSB7XG4gICAgICBlZGl0YWJsZS5oaWRlKCk7XG4gICAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRhYmxlLmRhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFubm90YXRpb25FbGVtZW50SWRzLmhhcyhlZGl0YWJsZS5kYXRhLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZGVzZXJpYWxpemUoZWRpdGFibGUpO1xuICAgICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgICAgZWRpdG9yLmVuYWJsZUVkaXRpbmcoKTtcbiAgICB9XG4gIH1cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLiNpc0Rpc2FibGluZyA9IHRydWU7XG4gICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICBjb25zdCBoaWRkZW5Bbm5vdGF0aW9uSWRzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGVkaXRvci5kaXNhYmxlRWRpdGluZygpO1xuICAgICAgaWYgKCFlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCB8fCBlZGl0b3Iuc2VyaWFsaXplKCkgIT09IG51bGwpIHtcbiAgICAgICAgaGlkZGVuQW5ub3RhdGlvbklkcy5hZGQoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RWRpdGFibGVBbm5vdGF0aW9uKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKT8uc2hvdygpO1xuICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICBjb25zdCBlZGl0YWJsZXMgPSB0aGlzLiNhbm5vdGF0aW9uTGF5ZXIuZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpO1xuICAgICAgZm9yIChjb25zdCBlZGl0YWJsZSBvZiBlZGl0YWJsZXMpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0gPSBlZGl0YWJsZS5kYXRhO1xuICAgICAgICBpZiAoaGlkZGVuQW5ub3RhdGlvbklkcy5oYXMoaWQpIHx8IHRoaXMuI3VpTWFuYWdlci5pc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChpZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlZGl0YWJsZS5zaG93KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NsZWFudXAoKTtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSB7XG4gICAgICB0aGlzLmRpdi5oaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjbGFzc0xpc3RcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCkpIHtcbiAgICAgIGNsYXNzTGlzdC5yZW1vdmUoYCR7ZWRpdG9yVHlwZS5fdHlwZX1FZGl0aW5nYCk7XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLiNpc0Rpc2FibGluZyA9IGZhbHNlO1xuICB9XG4gIGdldEVkaXRhYmxlQW5ub3RhdGlvbihpZCkge1xuICAgIHJldHVybiB0aGlzLiNhbm5vdGF0aW9uTGF5ZXI/LmdldEVkaXRhYmxlQW5ub3RhdGlvbihpZCkgfHwgbnVsbDtcbiAgfVxuICBzZXRBY3RpdmVFZGl0b3IoZWRpdG9yKSB7XG4gICAgY29uc3QgY3VycmVudEFjdGl2ZSA9IHRoaXMuI3VpTWFuYWdlci5nZXRBY3RpdmUoKTtcbiAgICBpZiAoY3VycmVudEFjdGl2ZSA9PT0gZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3VpTWFuYWdlci5zZXRBY3RpdmVFZGl0b3IoZWRpdG9yKTtcbiAgfVxuICBlbmFibGVUZXh0U2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLiN0ZXh0TGF5ZXI/LmRpdikge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdHN0YXJ0XCIsIHRoaXMuI2JvdW5kU2VsZWN0aW9uU3RhcnQpO1xuICAgIH1cbiAgfVxuICBkaXNhYmxlVGV4dFNlbGVjdGlvbigpIHtcbiAgICBpZiAodGhpcy4jdGV4dExheWVyPy5kaXYpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3RzdGFydFwiLCB0aGlzLiNib3VuZFNlbGVjdGlvblN0YXJ0KTtcbiAgICB9XG4gIH1cbiAgZW5hYmxlQ2xpY2soKSB7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlcmRvd24pO1xuICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRQb2ludGVydXApO1xuICB9XG4gIGRpc2FibGVDbGljaygpIHtcbiAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyZG93bik7XG4gICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJ1cCk7XG4gIH1cbiAgYXR0YWNoKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvcnMuc2V0KGVkaXRvci5pZCwgZWRpdG9yKTtcbiAgICBjb25zdCB7XG4gICAgICBhbm5vdGF0aW9uRWxlbWVudElkXG4gICAgfSA9IGVkaXRvcjtcbiAgICBpZiAoYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiB0aGlzLiN1aU1hbmFnZXIuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbkVsZW1lbnRJZCkpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgZGV0YWNoKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvcnMuZGVsZXRlKGVkaXRvci5pZCk7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/LnJlbW92ZVBvaW50ZXJJblRleHRMYXllcihlZGl0b3IuY29udGVudERpdik7XG4gICAgaWYgKCF0aGlzLiNpc0Rpc2FibGluZyAmJiBlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICByZW1vdmUoZWRpdG9yKSB7XG4gICAgdGhpcy5kZXRhY2goZWRpdG9yKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIucmVtb3ZlRWRpdG9yKGVkaXRvcik7XG4gICAgZWRpdG9yLmRpdi5yZW1vdmUoKTtcbiAgICBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLiNpc0NsZWFuaW5nVXApIHtcbiAgICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoZmFsc2UpO1xuICAgIH1cbiAgfVxuICBjaGFuZ2VQYXJlbnQoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5wYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgIGVkaXRvcl9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5kZWxldGVBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpO1xuICAgICAgZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmF0dGFjaChlZGl0b3IpO1xuICAgIGVkaXRvci5wYXJlbnQ/LmRldGFjaChlZGl0b3IpO1xuICAgIGVkaXRvci5zZXRQYXJlbnQodGhpcyk7XG4gICAgaWYgKGVkaXRvci5kaXYgJiYgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgZWRpdG9yLmRpdi5yZW1vdmUoKTtcbiAgICAgIHRoaXMuZGl2LmFwcGVuZChlZGl0b3IuZGl2KTtcbiAgICB9XG4gIH1cbiAgYWRkKGVkaXRvcikge1xuICAgIHRoaXMuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgIHRoaXMuYXR0YWNoKGVkaXRvcik7XG4gICAgaWYgKCFlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICBjb25zdCBkaXYgPSBlZGl0b3IucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpdi5hcHBlbmQoZGl2KTtcbiAgICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSB0cnVlO1xuICAgIH1cbiAgICBlZGl0b3IuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICBlZGl0b3Iub25jZUFkZGVkKCk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKTtcbiAgfVxuICBtb3ZlRWRpdG9ySW5ET00oZWRpdG9yKSB7XG4gICAgaWYgKCFlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFjdGl2ZUVsZW1lbnRcbiAgICB9ID0gZG9jdW1lbnQ7XG4gICAgaWYgKGVkaXRvci5kaXYuY29udGFpbnMoYWN0aXZlRWxlbWVudCkgJiYgIXRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkKSB7XG4gICAgICBlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICBpZiAoIWVkaXRvci5kaXYuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICBlZGl0b3IuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsICgpID0+IHtcbiAgICAgICAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICAgIGVkaXRvci5fc3RydWN0VHJlZVBhcmVudElkID0gdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIGVkaXRvci5kaXYsIGVkaXRvci5jb250ZW50RGl2LCB0cnVlKTtcbiAgfVxuICBhZGRPclJlYnVpbGQoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5uZWVkc1RvQmVSZWJ1aWx0KCkpIHtcbiAgICAgIGVkaXRvci5wYXJlbnQgfHw9IHRoaXM7XG4gICAgICBlZGl0b3IucmVidWlsZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBhZGRVbmRvYWJsZUVkaXRvcihlZGl0b3IpIHtcbiAgICBjb25zdCBjbWQgPSAoKSA9PiBlZGl0b3IuX3VpTWFuYWdlci5yZWJ1aWxkKGVkaXRvcik7XG4gICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIG11c3RFeGVjOiBmYWxzZVxuICAgIH0pO1xuICB9XG4gIGdldE5leHRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdWlNYW5hZ2VyLmdldElkKCk7XG4gIH1cbiAgZ2V0ICNjdXJyZW50RWRpdG9yVHlwZSgpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVkaXRvckxheWVyLiNlZGl0b3JUeXBlcy5nZXQodGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSk7XG4gIH1cbiAgI2NyZWF0ZU5ld0VkaXRvcihwYXJhbXMpIHtcbiAgICBjb25zdCBlZGl0b3JUeXBlID0gdGhpcy4jY3VycmVudEVkaXRvclR5cGU7XG4gICAgcmV0dXJuIGVkaXRvclR5cGUgPyBuZXcgZWRpdG9yVHlwZS5wcm90b3R5cGUuY29uc3RydWN0b3IocGFyYW1zKSA6IG51bGw7XG4gIH1cbiAgY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRFZGl0b3JUeXBlPy5jYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpO1xuICB9XG4gIHBhc3RlRWRpdG9yKG1vZGUsIHBhcmFtcykge1xuICAgIHRoaXMuI3VpTWFuYWdlci51cGRhdGVUb29sYmFyKG1vZGUpO1xuICAgIHRoaXMuI3VpTWFuYWdlci51cGRhdGVNb2RlKG1vZGUpO1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZXG4gICAgfSA9IHRoaXMuI2dldENlbnRlclBvaW50KCk7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldE5leHRJZCgpO1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI2NyZWF0ZU5ld0VkaXRvcih7XG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBpZCxcbiAgICAgIHg6IG9mZnNldFgsXG4gICAgICB5OiBvZmZzZXRZLFxuICAgICAgdWlNYW5hZ2VyOiB0aGlzLiN1aU1hbmFnZXIsXG4gICAgICBpc0NlbnRlcmVkOiB0cnVlLFxuICAgICAgLi4ucGFyYW1zXG4gICAgfSk7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgZGVzZXJpYWxpemUoZGF0YSkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuI2VkaXRvclR5cGVzLmdldChkYXRhLmFubm90YXRpb25UeXBlID8/IGRhdGEuYW5ub3RhdGlvbkVkaXRvclR5cGUpPy5kZXNlcmlhbGl6ZShkYXRhLCB0aGlzLCB0aGlzLiN1aU1hbmFnZXIpIHx8IG51bGw7XG4gIH1cbiAgI2NyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCwgaXNDZW50ZXJlZCkge1xuICAgIGxldCBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0TmV4dElkKCk7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy4jY3JlYXRlTmV3RWRpdG9yKHtcbiAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgIGlkLFxuICAgICAgeDogZXZlbnQub2Zmc2V0WCxcbiAgICAgIHk6IGV2ZW50Lm9mZnNldFksXG4gICAgICB1aU1hbmFnZXI6IHRoaXMuI3VpTWFuYWdlcixcbiAgICAgIGlzQ2VudGVyZWQsXG4gICAgICAuLi5kYXRhXG4gICAgfSk7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICAjZ2V0Q2VudGVyUG9pbnQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0bFggPSBNYXRoLm1heCgwLCB4KTtcbiAgICBjb25zdCB0bFkgPSBNYXRoLm1heCgwLCB5KTtcbiAgICBjb25zdCBiclggPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCwgeCArIHdpZHRoKTtcbiAgICBjb25zdCBiclkgPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHkgKyBoZWlnaHQpO1xuICAgIGNvbnN0IGNlbnRlclggPSAodGxYICsgYnJYKSAvIDIgLSB4O1xuICAgIGNvbnN0IGNlbnRlclkgPSAodGxZICsgYnJZKSAvIDIgLSB5O1xuICAgIGNvbnN0IFtvZmZzZXRYLCBvZmZzZXRZXSA9IHRoaXMudmlld3BvcnQucm90YXRpb24gJSAxODAgPT09IDAgPyBbY2VudGVyWCwgY2VudGVyWV0gOiBbY2VudGVyWSwgY2VudGVyWF07XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZXG4gICAgfTtcbiAgfVxuICBhZGROZXdFZGl0b3IoKSB7XG4gICAgdGhpcy4jY3JlYXRlQW5kQWRkTmV3RWRpdG9yKHRoaXMuI2dldENlbnRlclBvaW50KCksIHRydWUpO1xuICB9XG4gIHNldFNlbGVjdGVkKGVkaXRvcikge1xuICAgIHRoaXMuI3VpTWFuYWdlci5zZXRTZWxlY3RlZChlZGl0b3IpO1xuICB9XG4gIHRvZ2dsZVNlbGVjdGVkKGVkaXRvcikge1xuICAgIHRoaXMuI3VpTWFuYWdlci50b2dnbGVTZWxlY3RlZChlZGl0b3IpO1xuICB9XG4gIGlzU2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci5pc1NlbGVjdGVkKGVkaXRvcik7XG4gIH1cbiAgdW5zZWxlY3QoZWRpdG9yKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVuc2VsZWN0KGVkaXRvcik7XG4gIH1cbiAgc2VsZWN0aW9uU3RhcnQoX2V2ZW50KSB7XG4gICAgdGhpcy4jdGV4dExheWVyPy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJVcEFmdGVyU2VsZWN0aW9uLCB7XG4gICAgICBvbmNlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcG9pbnRlclVwQWZ0ZXJTZWxlY3Rpb24oZXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jdGV4dExheWVyPy5kaXYuY29udGFpbnMocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHg6IGxheWVyWCxcbiAgICAgIHk6IGxheWVyWSxcbiAgICAgIHdpZHRoOiBwYXJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogcGFyZW50SGVpZ2h0XG4gICAgfSA9IHRoaXMuI3RleHRMYXllci5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYmJveGVzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBsZXQgcm90YXRvcjtcbiAgICBzd2l0Y2ggKHRoaXMudmlld3BvcnQucm90YXRpb24pIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJvdGF0b3IgPSAoeCwgeSwgdywgaCkgPT4gKHtcbiAgICAgICAgICB4OiAoeSAtIGxheWVyWSkgLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgeTogMSAtICh4ICsgdyAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB3aWR0aDogaCAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICBoZWlnaHQ6IHcgLyBwYXJlbnRXaWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcm90YXRvciA9ICh4LCB5LCB3LCBoKSA9PiAoe1xuICAgICAgICAgIHg6IDEgLSAoeCArIHcgLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgeTogMSAtICh5ICsgaCAtIGxheWVyWSkgLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IHcgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGggLyBwYXJlbnRIZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJvdGF0b3IgPSAoeCwgeSwgdywgaCkgPT4gKHtcbiAgICAgICAgICB4OiAxIC0gKHkgKyBoIC0gbGF5ZXJZKSAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICB5OiAoeCAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB3aWR0aDogaCAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICBoZWlnaHQ6IHcgLyBwYXJlbnRXaWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogKHggLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgeTogKHkgLSBsYXllclkpIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiB3IC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoIC8gcGFyZW50SGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgYm94ZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9IG9mIGJib3hlcykge1xuICAgICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJveGVzLnB1c2gocm90YXRvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7XG4gICAgfVxuICAgIGlmIChib3hlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuI2NyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCwgZmFsc2UsIHtcbiAgICAgICAgYm94ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZWxlY3Rpb24uZW1wdHkoKTtcbiAgfVxuICBwb2ludGVydXAoZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmRpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2hhZFBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hhZFBvaW50ZXJEb3duID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLiNhbGxvd0NsaWNrKSB7XG4gICAgICB0aGlzLiNhbGxvd0NsaWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkgPT09IHV0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVApIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdEFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjcmVhdGVBbmRBZGROZXdFZGl0b3IoZXZlbnQsIGZhbHNlKTtcbiAgfVxuICBwb2ludGVyZG93bihldmVudCkge1xuICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpID09PSB1dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCkge1xuICAgICAgdGhpcy5lbmFibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNoYWRQb2ludGVyRG93bikge1xuICAgICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbC5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSB0cnVlO1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI3VpTWFuYWdlci5nZXRBY3RpdmUoKTtcbiAgICB0aGlzLiNhbGxvd0NsaWNrID0gIWVkaXRvciB8fCBlZGl0b3IuaXNFbXB0eSgpO1xuICB9XG4gIGZpbmROZXdQYXJlbnQoZWRpdG9yLCB4LCB5KSB7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLiN1aU1hbmFnZXIuZmluZFBhcmVudCh4LCB5KTtcbiAgICBpZiAobGF5ZXIgPT09IG51bGwgfHwgbGF5ZXIgPT09IHRoaXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGF5ZXIuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpPy5wYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5jb21taXRPclJlbW92ZSgpO1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLnNldEFjdGl2ZUVkaXRvcihudWxsKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ucmVtb3ZlUG9pbnRlckluVGV4dExheWVyKGVkaXRvci5jb250ZW50RGl2KTtcbiAgICAgIGVkaXRvci5zZXRQYXJlbnQobnVsbCk7XG4gICAgICBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NID0gZmFsc2U7XG4gICAgICBlZGl0b3IuZGl2LnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgdGhpcy4jZWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVMYXllcih0aGlzKTtcbiAgfVxuICAjY2xlYW51cCgpIHtcbiAgICB0aGlzLiNpc0NsZWFuaW5nVXAgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG4gICAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jaXNDbGVhbmluZ1VwID0gZmFsc2U7XG4gIH1cbiAgcmVuZGVyKF9yZWYyKSB7XG4gICAgbGV0IHtcbiAgICAgIHZpZXdwb3J0XG4gICAgfSA9IF9yZWYyO1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAoMCxkaXNwbGF5X3V0aWxzLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIHZpZXdwb3J0KTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiN1aU1hbmFnZXIuZ2V0RWRpdG9ycyh0aGlzLnBhZ2VJbmRleCkpIHtcbiAgICAgIHRoaXMuYWRkKGVkaXRvcik7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTW9kZSgpO1xuICB9XG4gIHVwZGF0ZShfcmVmMykge1xuICAgIGxldCB7XG4gICAgICB2aWV3cG9ydFxuICAgIH0gPSBfcmVmMztcbiAgICB0aGlzLiN1aU1hbmFnZXIuY29tbWl0T3JSZW1vdmUoKTtcbiAgICBjb25zdCBvbGRSb3RhdGlvbiA9IHRoaXMudmlld3BvcnQucm90YXRpb247XG4gICAgY29uc3Qgcm90YXRpb24gPSB2aWV3cG9ydC5yb3RhdGlvbjtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgKDAsZGlzcGxheV91dGlscy5zZXRMYXllckRpbWVuc2lvbnMpKHRoaXMuZGl2LCB7XG4gICAgICByb3RhdGlvblxuICAgIH0pO1xuICAgIGlmIChvbGRSb3RhdGlvbiAhPT0gcm90YXRpb24pIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgZWRpdG9yLnJvdGF0ZShyb3RhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTW9kZSgpO1xuICB9XG4gIGdldCBwYWdlRGltZW5zaW9ucygpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0XG4gICAgfSA9IHRoaXMudmlld3BvcnQucmF3RGltcztcbiAgICByZXR1cm4gW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF07XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNTA5Nzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQ29sb3JQaWNrZXI6ICgpID0+ICgvKiBiaW5kaW5nICovIENvbG9yUGlja2VyKVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF90b29sc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODEyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzMpO1xuXG5cblxuY2xhc3MgQ29sb3JQaWNrZXIge1xuICAjYm91bmRLZXlEb3duID0gdGhpcy4ja2V5RG93bi5iaW5kKHRoaXMpO1xuICAjYnV0dG9uID0gbnVsbDtcbiAgI2J1dHRvblN3YXRjaCA9IG51bGw7XG4gICNkZWZhdWx0Q29sb3I7XG4gICNkcm9wZG93biA9IG51bGw7XG4gICNkcm9wZG93bldhc0Zyb21LZXlib2FyZCA9IGZhbHNlO1xuICAjaXNNYWluQ29sb3JQaWNrZXIgPSBmYWxzZTtcbiAgI2V2ZW50QnVzO1xuICAjdWlNYW5hZ2VyID0gbnVsbDtcbiAgc3RhdGljIGdldCBfa2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5zaGFkb3cpKHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgX3Rvb2xzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiRXNjYXBlXCIsIFwibWFjK0VzY2FwZVwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9oaWRlRHJvcGRvd25Gcm9tS2V5Ym9hcmRdLCBbW1wiIFwiLCBcIm1hYysgXCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX2NvbG9yU2VsZWN0RnJvbUtleWJvYXJkXSwgW1tcIkFycm93RG93blwiLCBcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dEb3duXCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fbW92ZVRvTmV4dF0sIFtbXCJBcnJvd1VwXCIsIFwiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93VXBcIiwgXCJtYWMrQXJyb3dMZWZ0XCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX21vdmVUb1ByZXZpb3VzXSwgW1tcIkhvbWVcIiwgXCJtYWMrSG9tZVwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9tb3ZlVG9CZWdpbm5pbmddLCBbW1wiRW5kXCIsIFwibWFjK0VuZFwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9tb3ZlVG9FbmRdXSkpO1xuICB9XG4gIGNvbnN0cnVjdG9yKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgZWRpdG9yID0gbnVsbCxcbiAgICAgIHVpTWFuYWdlciA9IG51bGxcbiAgICB9ID0gX3JlZjtcbiAgICB0aGlzLiNpc01haW5Db2xvclBpY2tlciA9ICFlZGl0b3I7XG4gICAgdGhpcy4jdWlNYW5hZ2VyID0gZWRpdG9yPy5fdWlNYW5hZ2VyIHx8IHVpTWFuYWdlcjtcbiAgICB0aGlzLiNldmVudEJ1cyA9IHRoaXMuI3VpTWFuYWdlci5fZXZlbnRCdXM7XG4gICAgdGhpcy4jZGVmYXVsdENvbG9yID0gZWRpdG9yPy5jb2xvciB8fCB0aGlzLiN1aU1hbmFnZXI/LmhpZ2hsaWdodENvbG9ycy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgfHwgXCIjRkZGRjk4XCI7XG4gIH1cbiAgcmVuZGVyQnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuI2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLmNsYXNzTmFtZSA9IFwiY29sb3JQaWNrZXJcIjtcbiAgICBidXR0b24udGFiSW5kZXggPSBcIjBcIjtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtZWRpdG9yLWNvbG9ycGlja2VyLWJ1dHRvblwiKTtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCB0cnVlKTtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI29wZW5Ecm9wZG93bi5iaW5kKHRoaXMpKTtcbiAgICBjb25zdCBzd2F0Y2ggPSB0aGlzLiNidXR0b25Td2F0Y2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBzd2F0Y2guY2xhc3NOYW1lID0gXCJzd2F0Y2hcIjtcbiAgICBzd2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy4jZGVmYXVsdENvbG9yO1xuICAgIGJ1dHRvbi5hcHBlbmQoc3dhdGNoKTtcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG4gIHJlbmRlck1haW5Ecm9wZG93bigpIHtcbiAgICBjb25zdCBkcm9wZG93biA9IHRoaXMuI2Ryb3Bkb3duID0gdGhpcy4jZ2V0RHJvcGRvd25Sb290KF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SKTtcbiAgICBkcm9wZG93bi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiaG9yaXpvbnRhbFwiKTtcbiAgICBkcm9wZG93bi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJoaWdobGlnaHRDb2xvclBpY2tlckxhYmVsXCIpO1xuICAgIHJldHVybiBkcm9wZG93bjtcbiAgfVxuICAjZ2V0RHJvcGRvd25Sb290KHBhcmFtVHlwZSkge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLm5vQ29udGV4dE1lbnUpO1xuICAgIGRpdi5jbGFzc05hbWUgPSBcImRyb3Bkb3duXCI7XG4gICAgZGl2LnJvbGUgPSBcImxpc3Rib3hcIjtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgZmFsc2UpO1xuICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwidmVydGljYWxcIik7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWVkaXRvci1jb2xvcnBpY2tlci1kcm9wZG93blwiKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb2xvcl0gb2YgdGhpcy4jdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9ycykge1xuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgIGJ1dHRvbi50YWJJbmRleCA9IFwiMFwiO1xuICAgICAgYnV0dG9uLnJvbGUgPSBcIm9wdGlvblwiO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImRhdGEtY29sb3JcIiwgY29sb3IpO1xuICAgICAgYnV0dG9uLnRpdGxlID0gbmFtZTtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgYHBkZmpzLWVkaXRvci1jb2xvcnBpY2tlci0ke25hbWV9YCk7XG4gICAgICBjb25zdCBzd2F0Y2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIGJ1dHRvbi5hcHBlbmQoc3dhdGNoKTtcbiAgICAgIHN3YXRjaC5jbGFzc05hbWUgPSBcInN3YXRjaFwiO1xuICAgICAgc3dhdGNoLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIiwgY29sb3IgPT09IHRoaXMuI2RlZmF1bHRDb2xvcik7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2NvbG9yU2VsZWN0LmJpbmQodGhpcywgcGFyYW1UeXBlLCBjb2xvcikpO1xuICAgICAgZGl2LmFwcGVuZChidXR0b24pO1xuICAgIH1cbiAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlEb3duKTtcbiAgICByZXR1cm4gZGl2O1xuICB9XG4gICNjb2xvclNlbGVjdCh0eXBlLCBjb2xvciwgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLiNldmVudEJ1cy5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3JwYXJhbXNcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlOiBjb2xvclxuICAgIH0pO1xuICB9XG4gIF9jb2xvclNlbGVjdEZyb21LZXlib2FyZChldmVudCkge1xuICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtY29sb3JcIik7XG4gICAgaWYgKCFjb2xvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjb2xvclNlbGVjdChjb2xvciwgZXZlbnQpO1xuICB9XG4gIF9tb3ZlVG9OZXh0KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jYnV0dG9uKSB7XG4gICAgICB0aGlzLiNkcm9wZG93bi5maXJzdENoaWxkPy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC50YXJnZXQubmV4dFNpYmxpbmc/LmZvY3VzKCk7XG4gIH1cbiAgX21vdmVUb1ByZXZpb3VzKGV2ZW50KSB7XG4gICAgZXZlbnQudGFyZ2V0LnByZXZpb3VzU2libGluZz8uZm9jdXMoKTtcbiAgfVxuICBfbW92ZVRvQmVnaW5uaW5nKCkge1xuICAgIHRoaXMuI2Ryb3Bkb3duLmZpcnN0Q2hpbGQ/LmZvY3VzKCk7XG4gIH1cbiAgX21vdmVUb0VuZCgpIHtcbiAgICB0aGlzLiNkcm9wZG93bi5sYXN0Q2hpbGQ/LmZvY3VzKCk7XG4gIH1cbiAgI2tleURvd24oZXZlbnQpIHtcbiAgICBDb2xvclBpY2tlci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuICB9XG4gICNvcGVuRHJvcGRvd24oZXZlbnQpIHtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24gJiYgIXRoaXMuI2Ryb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhcImhpZGRlblwiKSkge1xuICAgICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgdGhpcy4jZHJvcGRvd25XYXNGcm9tS2V5Ym9hcmQgPSBldmVudC5kZXRhaWwgPT09IDA7XG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB7XG4gICAgICB0aGlzLiNkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb290ID0gdGhpcy4jZHJvcGRvd24gPSB0aGlzLiNnZXREcm9wZG93blJvb3QoX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SKTtcbiAgICB0aGlzLiNidXR0b24uYXBwZW5kKHJvb3QpO1xuICB9XG4gIGhpZGVEcm9wZG93bigpIHtcbiAgICB0aGlzLiNkcm9wZG93bj8uY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgfVxuICBfaGlkZURyb3Bkb3duRnJvbUtleWJvYXJkKCkge1xuICAgIGlmICh0aGlzLiNpc01haW5Db2xvclBpY2tlciB8fCAhdGhpcy4jZHJvcGRvd24gfHwgdGhpcy4jZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKFwiaGlkZGVuXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XG4gICAgdGhpcy4jYnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgdGhpcy4jYnV0dG9uLmZvY3VzKHtcbiAgICAgIHByZXZlbnRTY3JvbGw6IHRydWUsXG4gICAgICBmb2N1c1Zpc2libGU6IHRoaXMuI2Ryb3Bkb3duV2FzRnJvbUtleWJvYXJkXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBpZiAodGhpcy4jYnV0dG9uU3dhdGNoKSB7XG4gICAgICB0aGlzLiNidXR0b25Td2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgfVxuICAgIGlmICghdGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaSA9IHRoaXMuI3VpTWFuYWdlci5oaWdobGlnaHRDb2xvcnMudmFsdWVzKCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLiNkcm9wZG93bi5jaGlsZHJlbikge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCBpLm5leHQoKS52YWx1ZSA9PT0gY29sb3IpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2J1dHRvbj8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jYnV0dG9uID0gbnVsbDtcbiAgICB0aGlzLiNidXR0b25Td2F0Y2ggPSBudWxsO1xuICAgIHRoaXMuI2Ryb3Bkb3duPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNkcm9wZG93biA9IG51bGw7XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTExNTpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBBbm5vdGF0aW9uRWRpdG9yOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uRWRpdG9yKVxufSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzXG52YXIgZXNfZXJyb3JfY2F1c2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzNTIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci90b29scy5qc1xudmFyIHRvb2xzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODEyKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvc2hhcmVkL3V0aWwuanNcbnZhciB1dGlsID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzXG52YXIgZGlzcGxheV91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNDczKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9hbHRfdGV4dC5qc1xuXG5jbGFzcyBBbHRUZXh0IHtcbiAgI2FsdFRleHQgPSBcIlwiO1xuICAjYWx0VGV4dERlY29yYXRpdmUgPSBmYWxzZTtcbiAgI2FsdFRleHRCdXR0b24gPSBudWxsO1xuICAjYWx0VGV4dFRvb2x0aXAgPSBudWxsO1xuICAjYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgI2FsdFRleHRXYXNGcm9tS2V5Qm9hcmQgPSBmYWxzZTtcbiAgI2VkaXRvciA9IG51bGw7XG4gIHN0YXRpYyBfbDEwblByb21pc2UgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3IgPSBlZGl0b3I7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwblByb21pc2UpIHtcbiAgICBBbHRUZXh0Ll9sMTBuUHJvbWlzZSB8fD0gbDEwblByb21pc2U7XG4gIH1cbiAgYXN5bmMgcmVuZGVyKCkge1xuICAgIGNvbnN0IGFsdFRleHQgPSB0aGlzLiNhbHRUZXh0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBhbHRUZXh0LmNsYXNzTmFtZSA9IFwiYWx0VGV4dFwiO1xuICAgIGNvbnN0IG1zZyA9IGF3YWl0IEFsdFRleHQuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1idXR0b24tbGFiZWxcIik7XG4gICAgYWx0VGV4dC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBhbHRUZXh0LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKTtcbiAgICBhbHRUZXh0LnRhYkluZGV4ID0gXCIwXCI7XG4gICAgYWx0VGV4dC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgZGlzcGxheV91dGlscy5ub0NvbnRleHRNZW51KTtcbiAgICBhbHRUZXh0LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBldmVudCA9PiBldmVudC5zdG9wUHJvcGFnYXRpb24oKSk7XG4gICAgY29uc3Qgb25DbGljayA9IGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5lZGl0QWx0VGV4dCh0aGlzLiNlZGl0b3IpO1xuICAgIH07XG4gICAgYWx0VGV4dC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb25DbGljaywge1xuICAgICAgY2FwdHVyZTogdHJ1ZVxuICAgIH0pO1xuICAgIGFsdFRleHQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gYWx0VGV4dCAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgICB0aGlzLiNhbHRUZXh0V2FzRnJvbUtleUJvYXJkID0gdHJ1ZTtcbiAgICAgICAgb25DbGljayhldmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy4jc2V0U3RhdGUoKTtcbiAgICByZXR1cm4gYWx0VGV4dDtcbiAgfVxuICBmaW5pc2goKSB7XG4gICAgaWYgKCF0aGlzLiNhbHRUZXh0QnV0dG9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHRCdXR0b24uZm9jdXMoe1xuICAgICAgZm9jdXNWaXNpYmxlOiB0aGlzLiNhbHRUZXh0V2FzRnJvbUtleUJvYXJkXG4gICAgfSk7XG4gICAgdGhpcy4jYWx0VGV4dFdhc0Zyb21LZXlCb2FyZCA9IGZhbHNlO1xuICB9XG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbHRUZXh0OiB0aGlzLiNhbHRUZXh0LFxuICAgICAgZGVjb3JhdGl2ZTogdGhpcy4jYWx0VGV4dERlY29yYXRpdmVcbiAgICB9O1xuICB9XG4gIHNldCBkYXRhKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgYWx0VGV4dCxcbiAgICAgIGRlY29yYXRpdmVcbiAgICB9ID0gX3JlZjtcbiAgICBpZiAodGhpcy4jYWx0VGV4dCA9PT0gYWx0VGV4dCAmJiB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSA9PT0gZGVjb3JhdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0ID0gYWx0VGV4dDtcbiAgICB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSA9IGRlY29yYXRpdmU7XG4gICAgdGhpcy4jc2V0U3RhdGUoKTtcbiAgfVxuICB0b2dnbGUoKSB7XG4gICAgbGV0IGVuYWJsZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIGlmICghdGhpcy4jYWx0VGV4dEJ1dHRvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWVuYWJsZWQgJiYgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHRCdXR0b24uZGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2FsdFRleHRCdXR0b24/LnJlbW92ZSgpO1xuICAgIHRoaXMuI2FsdFRleHRCdXR0b24gPSBudWxsO1xuICAgIHRoaXMuI2FsdFRleHRUb29sdGlwID0gbnVsbDtcbiAgfVxuICBhc3luYyAjc2V0U3RhdGUoKSB7XG4gICAgY29uc3QgYnV0dG9uID0gdGhpcy4jYWx0VGV4dEJ1dHRvbjtcbiAgICBpZiAoIWJ1dHRvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2FsdFRleHQgJiYgIXRoaXMuI2FsdFRleHREZWNvcmF0aXZlKSB7XG4gICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZShcImRvbmVcIik7XG4gICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcD8ucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiZG9uZVwiKTtcbiAgICBBbHRUZXh0Ll9sMTBuUHJvbWlzZS5nZXQoXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtZWRpdC1idXR0b24tbGFiZWxcIikudGhlbihtc2cgPT4ge1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKTtcbiAgICB9KTtcbiAgICBsZXQgdG9vbHRpcCA9IHRoaXMuI2FsdFRleHRUb29sdGlwO1xuICAgIGlmICghdG9vbHRpcCkge1xuICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXAgPSB0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICB0b29sdGlwLmNsYXNzTmFtZSA9IFwidG9vbHRpcFwiO1xuICAgICAgdG9vbHRpcC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidG9vbHRpcFwiKTtcbiAgICAgIGNvbnN0IGlkID0gdG9vbHRpcC5pZCA9IGBhbHQtdGV4dC10b29sdGlwLSR7dGhpcy4jZWRpdG9yLmlkfWA7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiLCBpZCk7XG4gICAgICBjb25zdCBERUxBWV9UT19TSE9XX1RPT0xUSVAgPSAxMDA7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwLmNsYXNzTGlzdC5hZGQoXCJzaG93XCIpO1xuICAgICAgICAgIHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9ldmVudEJ1cy5kaXNwYXRjaChcInJlcG9ydHRlbGVtZXRyeVwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiZWRpdGluZ1wiLFxuICAgICAgICAgICAgICBzdWJ0eXBlOiB0aGlzLiNlZGl0b3IuZWRpdG9yVHlwZSxcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhbHRfdGV4dF90b29sdGlwXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBERUxBWV9UT19TSE9XX1RPT0xUSVApO1xuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCk7XG4gICAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcD8uY2xhc3NMaXN0LnJlbW92ZShcInNob3dcIik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdG9vbHRpcC5pbm5lclRleHQgPSB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSA/IGF3YWl0IEFsdFRleHQuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1kZWNvcmF0aXZlLXRvb2x0aXBcIikgOiB0aGlzLiNhbHRUZXh0O1xuICAgIGlmICghdG9vbHRpcC5wYXJlbnROb2RlKSB7XG4gICAgICBidXR0b24uYXBwZW5kKHRvb2x0aXApO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy4jZWRpdG9yLmdldEltYWdlRm9yQWx0VGV4dCgpO1xuICAgIGVsZW1lbnQ/LnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIiwgdG9vbHRpcC5pZCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL3Rvb2xiYXIuanNcblxuY2xhc3MgRWRpdG9yVG9vbGJhciB7XG4gICN0b29sYmFyID0gbnVsbDtcbiAgI2NvbG9yUGlja2VyID0gbnVsbDtcbiAgI2VkaXRvcjtcbiAgI2J1dHRvbnMgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3IgPSBlZGl0b3I7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVkaXRUb29sYmFyID0gdGhpcy4jdG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWRpdFRvb2xiYXIuY2xhc3NOYW1lID0gXCJlZGl0VG9vbGJhclwiO1xuICAgIGVkaXRUb29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBkaXNwbGF5X3V0aWxzLm5vQ29udGV4dE1lbnUpO1xuICAgIGVkaXRUb29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBFZGl0b3JUb29sYmFyLiNwb2ludGVyRG93bik7XG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuI2J1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGJ1dHRvbnMuY2xhc3NOYW1lID0gXCJidXR0b25zXCI7XG4gICAgZWRpdFRvb2xiYXIuYXBwZW5kKGJ1dHRvbnMpO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy4jZWRpdG9yLnRvb2xiYXJQb3NpdGlvbjtcbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBlZGl0VG9vbGJhcjtcbiAgICAgIGNvbnN0IHggPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5kaXJlY3Rpb24gPT09IFwibHRyXCIgPyAxIC0gcG9zaXRpb25bMF0gOiBwb3NpdGlvblswXTtcbiAgICAgIHN0eWxlLmluc2V0SW5saW5lRW5kID0gYCR7MTAwICogeH0lYDtcbiAgICAgIHN0eWxlLnRvcCA9IGBjYWxjKCR7MTAwICogcG9zaXRpb25bMV19JSArIHZhcigtLWVkaXRvci10b29sYmFyLXZlcnQtb2Zmc2V0KSlgO1xuICAgIH1cbiAgICB0aGlzLiNhZGREZWxldGVCdXR0b24oKTtcbiAgICByZXR1cm4gZWRpdFRvb2xiYXI7XG4gIH1cbiAgc3RhdGljICNwb2ludGVyRG93bihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjZm9jdXNJbihlKSB7XG4gICAgdGhpcy4jZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSBmYWxzZTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjZm9jdXNPdXQoZSkge1xuICAgIHRoaXMuI2VkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjYWRkTGlzdGVuZXJzVG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2ZvY3VzSW4uYmluZCh0aGlzKSwge1xuICAgICAgY2FwdHVyZTogdHJ1ZVxuICAgIH0pO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2ZvY3VzT3V0LmJpbmQodGhpcyksIHtcbiAgICAgIGNhcHR1cmU6IHRydWVcbiAgICB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBkaXNwbGF5X3V0aWxzLm5vQ29udGV4dE1lbnUpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgdGhpcy4jdG9vbGJhci5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHRoaXMuI2NvbG9yUGlja2VyPy5oaWRlRHJvcGRvd24oKTtcbiAgfVxuICBzaG93KCkge1xuICAgIHRoaXMuI3Rvb2xiYXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgfVxuICAjYWRkRGVsZXRlQnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLmNsYXNzTmFtZSA9IFwiZGVsZXRlXCI7XG4gICAgYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIGBwZGZqcy1lZGl0b3ItcmVtb3ZlLSR7dGhpcy4jZWRpdG9yLmVkaXRvclR5cGV9LWJ1dHRvbmApO1xuICAgIHRoaXMuI2FkZExpc3RlbmVyc1RvRWxlbWVudChidXR0b24pO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgICB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5kZWxldGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLiNidXR0b25zLmFwcGVuZChidXR0b24pO1xuICB9XG4gIGdldCAjZGl2aWRlcigpIHtcbiAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXZpZGVyLmNsYXNzTmFtZSA9IFwiZGl2aWRlclwiO1xuICAgIHJldHVybiBkaXZpZGVyO1xuICB9XG4gIGFkZEFsdFRleHRCdXR0b24oYnV0dG9uKSB7XG4gICAgdGhpcy4jYWRkTGlzdGVuZXJzVG9FbGVtZW50KGJ1dHRvbik7XG4gICAgdGhpcy4jYnV0dG9ucy5wcmVwZW5kKGJ1dHRvbiwgdGhpcy4jZGl2aWRlcik7XG4gIH1cbiAgYWRkQ29sb3JQaWNrZXIoY29sb3JQaWNrZXIpIHtcbiAgICB0aGlzLiNjb2xvclBpY2tlciA9IGNvbG9yUGlja2VyO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGNvbG9yUGlja2VyLnJlbmRlckJ1dHRvbigpO1xuICAgIHRoaXMuI2FkZExpc3RlbmVyc1RvRWxlbWVudChidXR0b24pO1xuICAgIHRoaXMuI2J1dHRvbnMucHJlcGVuZChidXR0b24sIHRoaXMuI2RpdmlkZXIpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLiN0b29sYmFyLnJlbW92ZSgpO1xuICAgIHRoaXMuI2NvbG9yUGlja2VyPy5kZXN0cm95KCk7XG4gICAgdGhpcy4jY29sb3JQaWNrZXIgPSBudWxsO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9lZGl0b3IuanNcblxuXG5cblxuXG5cbmNsYXNzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYWxsUmVzaXplckRpdnMgPSBudWxsO1xuICAjYWx0VGV4dCA9IG51bGw7XG4gICNrZWVwQXNwZWN0UmF0aW8gPSBmYWxzZTtcbiAgI3Jlc2l6ZXJzRGl2ID0gbnVsbDtcbiAgI3NhdmVkRGltZW5zaW9ucyA9IG51bGw7XG4gICNib3VuZEZvY3VzaW4gPSB0aGlzLmZvY3VzaW4uYmluZCh0aGlzKTtcbiAgI2JvdW5kRm9jdXNvdXQgPSB0aGlzLmZvY3Vzb3V0LmJpbmQodGhpcyk7XG4gICNlZGl0VG9vbGJhciA9IG51bGw7XG4gICNmb2N1c2VkUmVzaXplck5hbWUgPSBcIlwiO1xuICAjaGFzQmVlbkNsaWNrZWQgPSBmYWxzZTtcbiAgI2lzRWRpdGluZyA9IGZhbHNlO1xuICAjaXNJbkVkaXRNb2RlID0gZmFsc2U7XG4gICNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQgPSBmYWxzZTtcbiAgI21vdmVJbkRPTVRpbWVvdXQgPSBudWxsO1xuICBfaW5pdGlhbE9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBfdWlNYW5hZ2VyID0gbnVsbDtcbiAgX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IHRydWU7XG4gIF9sMTBuUHJvbWlzZSA9IG51bGw7XG4gICNpc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAjekluZGV4ID0gQW5ub3RhdGlvbkVkaXRvci5fekluZGV4Kys7XG4gIHN0YXRpYyBfYm9yZGVyTGluZVdpZHRoID0gLTE7XG4gIHN0YXRpYyBfY29sb3JNYW5hZ2VyID0gbmV3IHRvb2xzLkNvbG9yTWFuYWdlcigpO1xuICBzdGF0aWMgX3pJbmRleCA9IDE7XG4gIHN0YXRpYyBnZXQgX3Jlc2l6ZXJLZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3QgcmVzaXplID0gQW5ub3RhdGlvbkVkaXRvci5wcm90b3R5cGUuX3Jlc2l6ZVdpdGhLZXlib2FyZDtcbiAgICBjb25zdCBzbWFsbCA9IHRvb2xzLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX1NNQUxMO1xuICAgIGNvbnN0IGJpZyA9IHRvb2xzLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX0JJRztcbiAgICByZXR1cm4gKDAsdXRpbC5zaGFkb3cpKHRoaXMsIFwiX3Jlc2l6ZXJLZXlib2FyZE1hbmFnZXJcIiwgbmV3IHRvb2xzLktleWJvYXJkTWFuYWdlcihbW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWy1zbWFsbCwgMF1cbiAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbLWJpZywgMF1cbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbc21hbGwsIDBdXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93UmlnaHRcIiwgXCJtYWMrc2hpZnQrQXJyb3dSaWdodFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbYmlnLCAwXVxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFswLCAtc21hbGxdXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbMCwgLWJpZ11cbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWzAsIHNtYWxsXVxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFswLCBiaWddXG4gICAgfV0sIFtbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCBBbm5vdGF0aW9uRWRpdG9yLnByb3RvdHlwZS5fc3RvcFJlc2l6aW5nV2l0aEtleWJvYXJkXV0pKTtcbiAgfVxuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEFubm90YXRpb25FZGl0b3IpIHtcbiAgICAgICgwLHV0aWwudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQW5ub3RhdGlvbkVkaXRvci5cIik7XG4gICAgfVxuICAgIHRoaXMucGFyZW50ID0gcGFyYW1ldGVycy5wYXJlbnQ7XG4gICAgdGhpcy5pZCA9IHBhcmFtZXRlcnMuaWQ7XG4gICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhcmFtZXRlcnMucGFyZW50LnBhZ2VJbmRleDtcbiAgICB0aGlzLm5hbWUgPSBwYXJhbWV0ZXJzLm5hbWU7XG4gICAgdGhpcy5kaXYgPSBudWxsO1xuICAgIHRoaXMuX3VpTWFuYWdlciA9IHBhcmFtZXRlcnMudWlNYW5hZ2VyO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IG51bGw7XG4gICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9IGZhbHNlO1xuICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLmlzQ2VudGVyZWQgPSBwYXJhbWV0ZXJzLmlzQ2VudGVyZWQ7XG4gICAgdGhpcy5fc3RydWN0VHJlZVBhcmVudElkID0gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICByb3RhdGlvbixcbiAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgcGFnZVdpZHRoLFxuICAgICAgICBwYWdlSGVpZ2h0LFxuICAgICAgICBwYWdlWCxcbiAgICAgICAgcGFnZVlcbiAgICAgIH1cbiAgICB9ID0gdGhpcy5wYXJlbnQudmlld3BvcnQ7XG4gICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uO1xuICAgIHRoaXMucGFnZVJvdGF0aW9uID0gKDM2MCArIHJvdGF0aW9uIC0gdGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uKSAlIDM2MDtcbiAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF07XG4gICAgdGhpcy5wYWdlVHJhbnNsYXRpb24gPSBbcGFnZVgsIHBhZ2VZXTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy54ID0gcGFyYW1ldGVycy54IC8gd2lkdGg7XG4gICAgdGhpcy55ID0gcGFyYW1ldGVycy55IC8gaGVpZ2h0O1xuICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NID0gZmFsc2U7XG4gICAgdGhpcy5kZWxldGVkID0gZmFsc2U7XG4gIH1cbiAgZ2V0IGVkaXRvclR5cGUoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvci5fdHlwZTtcbiAgfVxuICBzdGF0aWMgZ2V0IF9kZWZhdWx0TGluZUNvbG9yKCkge1xuICAgIHJldHVybiAoMCx1dGlsLnNoYWRvdykodGhpcywgXCJfZGVmYXVsdExpbmVDb2xvclwiLCB0aGlzLl9jb2xvck1hbmFnZXIuZ2V0SGV4Q29kZShcIkNhbnZhc1RleHRcIikpO1xuICB9XG4gIHN0YXRpYyBkZWxldGVBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpIHtcbiAgICBjb25zdCBmYWtlRWRpdG9yID0gbmV3IEZha2VFZGl0b3Ioe1xuICAgICAgaWQ6IGVkaXRvci5wYXJlbnQuZ2V0TmV4dElkKCksXG4gICAgICBwYXJlbnQ6IGVkaXRvci5wYXJlbnQsXG4gICAgICB1aU1hbmFnZXI6IGVkaXRvci5fdWlNYW5hZ2VyXG4gICAgfSk7XG4gICAgZmFrZUVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkID0gZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgZmFrZUVkaXRvci5kZWxldGVkID0gdHJ1ZTtcbiAgICBmYWtlRWRpdG9yLl91aU1hbmFnZXIuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShmYWtlRWRpdG9yKTtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UgfHw9IG5ldyBNYXAoW1wicGRmanMtZWRpdG9yLWFsdC10ZXh0LWJ1dHRvbi1sYWJlbFwiLCBcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1lZGl0LWJ1dHRvbi1sYWJlbFwiLCBcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1kZWNvcmF0aXZlLXRvb2x0aXBcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC10b3BMZWZ0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtdG9wTWlkZGxlXCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtdG9wUmlnaHRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1taWRkbGVSaWdodFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLWJvdHRvbVJpZ2h0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtYm90dG9tTWlkZGxlXCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtYm90dG9tTGVmdFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLW1pZGRsZUxlZnRcIl0ubWFwKHN0ciA9PiBbc3RyLCBsMTBuLmdldChzdHIucmVwbGFjZUFsbCgvKFtBLVpdKS9nLCBjID0+IGAtJHtjLnRvTG93ZXJDYXNlKCl9YCkpXSkpO1xuICAgIGlmIChvcHRpb25zPy5zdHJpbmdzKSB7XG4gICAgICBmb3IgKGNvbnN0IHN0ciBvZiBvcHRpb25zLnN0cmluZ3MpIHtcbiAgICAgICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2Uuc2V0KHN0ciwgbDEwbi5nZXQoc3RyKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChBbm5vdGF0aW9uRWRpdG9yLl9ib3JkZXJMaW5lV2lkdGggIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgIEFubm90YXRpb25FZGl0b3IuX2JvcmRlckxpbmVXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0tb3V0bGluZS13aWR0aFwiKSkgfHwgMDtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyhfdHlwZSwgX3ZhbHVlKSB7fVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHN0YXRpYyBpc0hhbmRsaW5nTWltZUZvclBhc3RpbmcobWltZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGF0aWMgcGFzdGUoaXRlbSwgcGFyZW50KSB7XG4gICAgKDAsdXRpbC51bnJlYWNoYWJsZSkoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZ2V0IF9pc0RyYWdnYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNEcmFnZ2FibGU7XG4gIH1cbiAgc2V0IF9pc0RyYWdnYWJsZSh2YWx1ZSkge1xuICAgIHRoaXMuI2lzRHJhZ2dhYmxlID0gdmFsdWU7XG4gICAgdGhpcy5kaXY/LmNsYXNzTGlzdC50b2dnbGUoXCJkcmFnZ2FibGVcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBpc0VudGVySGFuZGxlZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjZW50ZXIoKSB7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgdGhpcy54IC09IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodCAvIChwYWdlV2lkdGggKiAyKTtcbiAgICAgICAgdGhpcy55ICs9IHRoaXMud2lkdGggKiBwYWdlV2lkdGggLyAocGFnZUhlaWdodCAqIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnggKz0gdGhpcy53aWR0aCAvIDI7XG4gICAgICAgIHRoaXMueSArPSB0aGlzLmhlaWdodCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHRoaXMueCArPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQgLyAocGFnZVdpZHRoICogMik7XG4gICAgICAgIHRoaXMueSAtPSB0aGlzLndpZHRoICogcGFnZVdpZHRoIC8gKHBhZ2VIZWlnaHQgKiAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnggLT0gdGhpcy53aWR0aCAvIDI7XG4gICAgICAgIHRoaXMueSAtPSB0aGlzLmhlaWdodCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgYWRkQ29tbWFuZHMocGFyYW1zKSB7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmFkZENvbW1hbmRzKHBhcmFtcyk7XG4gIH1cbiAgZ2V0IGN1cnJlbnRMYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdWlNYW5hZ2VyLmN1cnJlbnRMYXllcjtcbiAgfVxuICBzZXRJbkJhY2tncm91bmQoKSB7XG4gICAgdGhpcy5kaXYuc3R5bGUuekluZGV4ID0gMDtcbiAgfVxuICBzZXRJbkZvcmVncm91bmQoKSB7XG4gICAgdGhpcy5kaXYuc3R5bGUuekluZGV4ID0gdGhpcy4jekluZGV4O1xuICB9XG4gIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHBhcmVudC5wYWdlSW5kZXg7XG4gICAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gcGFyZW50LnBhZ2VEaW1lbnNpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIH1cbiAgZm9jdXNpbihldmVudCkge1xuICAgIGlmICghdGhpcy5fZm9jdXNFdmVudHNBbGxvd2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jaGFzQmVlbkNsaWNrZWQpIHtcbiAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoYXNCZWVuQ2xpY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb2N1c291dChldmVudCkge1xuICAgIGlmICghdGhpcy5fZm9jdXNFdmVudHNBbGxvd2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICBpZiAodGFyZ2V0Py5jbG9zZXN0KGAjJHt0aGlzLmlkfWApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLnBhcmVudD8uaXNNdWx0aXBsZVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIH1cbiAgfVxuICBjb21taXRPclJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgfVxuICB9XG4gIGNvbW1pdCgpIHtcbiAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKTtcbiAgfVxuICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKCkge1xuICAgIHRoaXMuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKHRoaXMpO1xuICB9XG4gIHNldEF0KHgsIHksIHR4LCB0eSkge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBbdHgsIHR5XSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24odHgsIHR5KTtcbiAgICB0aGlzLnggPSAoeCArIHR4KSAvIHdpZHRoO1xuICAgIHRoaXMueSA9ICh5ICsgdHkpIC8gaGVpZ2h0O1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICAjdHJhbnNsYXRlKF9yZWYsIHgsIHkpIHtcbiAgICBsZXQgW3dpZHRoLCBoZWlnaHRdID0gX3JlZjtcbiAgICBbeCwgeV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHgsIHkpO1xuICAgIHRoaXMueCArPSB4IC8gd2lkdGg7XG4gICAgdGhpcy55ICs9IHkgLyBoZWlnaHQ7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIHRyYW5zbGF0ZSh4LCB5KSB7XG4gICAgdGhpcy4jdHJhbnNsYXRlKHRoaXMucGFyZW50RGltZW5zaW9ucywgeCwgeSk7XG4gIH1cbiAgdHJhbnNsYXRlSW5QYWdlKHgsIHkpIHtcbiAgICB0aGlzLiN0cmFuc2xhdGUodGhpcy5wYWdlRGltZW5zaW9ucywgeCwgeSk7XG4gICAgdGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgYmxvY2s6IFwibmVhcmVzdFwiXG4gICAgfSk7XG4gIH1cbiAgZHJhZyh0eCwgdHkpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy54ICs9IHR4IC8gcGFyZW50V2lkdGg7XG4gICAgdGhpcy55ICs9IHR5IC8gcGFyZW50SGVpZ2h0O1xuICAgIGlmICh0aGlzLnBhcmVudCAmJiAodGhpcy54IDwgMCB8fCB0aGlzLnggPiAxIHx8IHRoaXMueSA8IDAgfHwgdGhpcy55ID4gMSkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHRoaXMucGFyZW50LmZpbmROZXdQYXJlbnQodGhpcywgeCwgeSkpIHtcbiAgICAgICAgdGhpcy54IC09IE1hdGguZmxvb3IodGhpcy54KTtcbiAgICAgICAgdGhpcy55IC09IE1hdGguZmxvb3IodGhpcy55KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3QgW2J4LCBieV0gPSB0aGlzLiNnZXRCYXNlVHJhbnNsYXRpb24oKTtcbiAgICB4ICs9IGJ4O1xuICAgIHkgKz0gYnk7XG4gICAgdGhpcy5kaXYuc3R5bGUubGVmdCA9IGAkeygxMDAgKiB4KS50b0ZpeGVkKDIpfSVgO1xuICAgIHRoaXMuZGl2LnN0eWxlLnRvcCA9IGAkeygxMDAgKiB5KS50b0ZpeGVkKDIpfSVgO1xuICAgIHRoaXMuZGl2LnNjcm9sbEludG9WaWV3KHtcbiAgICAgIGJsb2NrOiBcIm5lYXJlc3RcIlxuICAgIH0pO1xuICB9XG4gICNnZXRCYXNlVHJhbnNsYXRpb24oKSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGNvbnN0IHtcbiAgICAgIF9ib3JkZXJMaW5lV2lkdGhcbiAgICB9ID0gQW5ub3RhdGlvbkVkaXRvcjtcbiAgICBjb25zdCB4ID0gX2JvcmRlckxpbmVXaWR0aCAvIHBhcmVudFdpZHRoO1xuICAgIGNvbnN0IHkgPSBfYm9yZGVyTGluZVdpZHRoIC8gcGFyZW50SGVpZ2h0O1xuICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFsteCwgeV07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3gsIC15XTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbLXgsIC15XTtcbiAgICB9XG4gIH1cbiAgZml4QW5kU2V0UG9zaXRpb24oKSB7XG4gICAgbGV0IHJvdGF0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnJvdGF0aW9uO1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBsZXQge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzO1xuICAgIHdpZHRoICo9IHBhZ2VXaWR0aDtcbiAgICBoZWlnaHQgKj0gcGFnZUhlaWdodDtcbiAgICB4ICo9IHBhZ2VXaWR0aDtcbiAgICB5ICo9IHBhZ2VIZWlnaHQ7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVdpZHRoIC0gd2lkdGgsIHgpKTtcbiAgICAgICAgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VIZWlnaHQgLSBoZWlnaHQsIHkpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVdpZHRoIC0gaGVpZ2h0LCB4KSk7XG4gICAgICAgIHkgPSBNYXRoLm1pbihwYWdlSGVpZ2h0LCBNYXRoLm1heCh3aWR0aCwgeSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB4ID0gTWF0aC5taW4ocGFnZVdpZHRoLCBNYXRoLm1heCh3aWR0aCwgeCkpO1xuICAgICAgICB5ID0gTWF0aC5taW4ocGFnZUhlaWdodCwgTWF0aC5tYXgoaGVpZ2h0LCB5KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHggPSBNYXRoLm1pbihwYWdlV2lkdGgsIE1hdGgubWF4KGhlaWdodCwgeCkpO1xuICAgICAgICB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZUhlaWdodCAtIHdpZHRoLCB5KSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLnggPSB4IC89IHBhZ2VXaWR0aDtcbiAgICB0aGlzLnkgPSB5IC89IHBhZ2VIZWlnaHQ7XG4gICAgY29uc3QgW2J4LCBieV0gPSB0aGlzLiNnZXRCYXNlVHJhbnNsYXRpb24oKTtcbiAgICB4ICs9IGJ4O1xuICAgIHkgKz0gYnk7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgc3R5bGUubGVmdCA9IGAkeygxMDAgKiB4KS50b0ZpeGVkKDIpfSVgO1xuICAgIHN0eWxlLnRvcCA9IGAkeygxMDAgKiB5KS50b0ZpeGVkKDIpfSVgO1xuICAgIHRoaXMubW92ZUluRE9NKCk7XG4gIH1cbiAgc3RhdGljICNyb3RhdGVQb2ludCh4LCB5LCBhbmdsZSkge1xuICAgIHN3aXRjaCAoYW5nbGUpIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbeSwgLXhdO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbLXgsIC15XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gWy15LCB4XTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICB9XG4gIHNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVkaXRvci4jcm90YXRlUG9pbnQoeCwgeSwgdGhpcy5wYXJlbnRSb3RhdGlvbik7XG4gIH1cbiAgcGFnZVRyYW5zbGF0aW9uVG9TY3JlZW4oeCwgeSkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWRpdG9yLiNyb3RhdGVQb2ludCh4LCB5LCAzNjAgLSB0aGlzLnBhcmVudFJvdGF0aW9uKTtcbiAgfVxuICAjZ2V0Um90YXRpb25NYXRyaXgocm90YXRpb24pIHtcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgICAgIHJldHVybiBbMCwgLXBhZ2VXaWR0aCAvIHBhZ2VIZWlnaHQsIHBhZ2VIZWlnaHQgLyBwYWdlV2lkdGgsIDBdO1xuICAgICAgICB9XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFstMSwgMCwgMCwgLTFdO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgICAgcmV0dXJuIFswLCBwYWdlV2lkdGggLyBwYWdlSGVpZ2h0LCAtcGFnZUhlaWdodCAvIHBhZ2VXaWR0aCwgMF07XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbMSwgMCwgMCwgMV07XG4gICAgfVxuICB9XG4gIGdldCBwYXJlbnRTY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJlYWxTY2FsZTtcbiAgfVxuICBnZXQgcGFyZW50Um90YXRpb24oKSB7XG4gICAgcmV0dXJuICh0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24gKyB0aGlzLnBhZ2VSb3RhdGlvbikgJSAzNjA7XG4gIH1cbiAgZ2V0IHBhcmVudERpbWVuc2lvbnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyZW50U2NhbGUsXG4gICAgICBwYWdlRGltZW5zaW9uczogW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF1cbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBzY2FsZWRXaWR0aCA9IHBhZ2VXaWR0aCAqIHBhcmVudFNjYWxlO1xuICAgIGNvbnN0IHNjYWxlZEhlaWdodCA9IHBhZ2VIZWlnaHQgKiBwYXJlbnRTY2FsZTtcbiAgICByZXR1cm4gdXRpbC5GZWF0dXJlVGVzdC5pc0NTU1JvdW5kU3VwcG9ydGVkID8gW01hdGgucm91bmQoc2NhbGVkV2lkdGgpLCBNYXRoLnJvdW5kKHNjYWxlZEhlaWdodCldIDogW3NjYWxlZFdpZHRoLCBzY2FsZWRIZWlnaHRdO1xuICB9XG4gIHNldERpbXMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IGAkeygxMDAgKiB3aWR0aCAvIHBhcmVudFdpZHRoKS50b0ZpeGVkKDIpfSVgO1xuICAgIGlmICghdGhpcy4ja2VlcEFzcGVjdFJhdGlvKSB7XG4gICAgICB0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSBgJHsoMTAwICogaGVpZ2h0IC8gcGFyZW50SGVpZ2h0KS50b0ZpeGVkKDIpfSVgO1xuICAgIH1cbiAgfVxuICBmaXhEaW1zKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuZGl2O1xuICAgIGNvbnN0IHtcbiAgICAgIGhlaWdodCxcbiAgICAgIHdpZHRoXG4gICAgfSA9IHN0eWxlO1xuICAgIGNvbnN0IHdpZHRoUGVyY2VudCA9IHdpZHRoLmVuZHNXaXRoKFwiJVwiKTtcbiAgICBjb25zdCBoZWlnaHRQZXJjZW50ID0gIXRoaXMuI2tlZXBBc3BlY3RSYXRpbyAmJiBoZWlnaHQuZW5kc1dpdGgoXCIlXCIpO1xuICAgIGlmICh3aWR0aFBlcmNlbnQgJiYgaGVpZ2h0UGVyY2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgaWYgKCF3aWR0aFBlcmNlbnQpIHtcbiAgICAgIHN0eWxlLndpZHRoID0gYCR7KDEwMCAqIHBhcnNlRmxvYXQod2lkdGgpIC8gcGFyZW50V2lkdGgpLnRvRml4ZWQoMil9JWA7XG4gICAgfVxuICAgIGlmICghdGhpcy4ja2VlcEFzcGVjdFJhdGlvICYmICFoZWlnaHRQZXJjZW50KSB7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBgJHsoMTAwICogcGFyc2VGbG9hdChoZWlnaHQpIC8gcGFyZW50SGVpZ2h0KS50b0ZpeGVkKDIpfSVgO1xuICAgIH1cbiAgfVxuICBnZXRJbml0aWFsVHJhbnNsYXRpb24oKSB7XG4gICAgcmV0dXJuIFswLCAwXTtcbiAgfVxuICAjY3JlYXRlUmVzaXplcnMoKSB7XG4gICAgaWYgKHRoaXMuI3Jlc2l6ZXJzRGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3Jlc2l6ZXJzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLiNyZXNpemVyc0Rpdi5jbGFzc0xpc3QuYWRkKFwicmVzaXplcnNcIik7XG4gICAgY29uc3QgY2xhc3NlcyA9IHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gPyBbXCJ0b3BMZWZ0XCIsIFwidG9wUmlnaHRcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbUxlZnRcIl0gOiBbXCJ0b3BMZWZ0XCIsIFwidG9wTWlkZGxlXCIsIFwidG9wUmlnaHRcIiwgXCJtaWRkbGVSaWdodFwiLCBcImJvdHRvbVJpZ2h0XCIsIFwiYm90dG9tTWlkZGxlXCIsIFwiYm90dG9tTGVmdFwiLCBcIm1pZGRsZUxlZnRcIl07XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGNsYXNzZXMpIHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0aGlzLiNyZXNpemVyc0Rpdi5hcHBlbmQoZGl2KTtcbiAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwicmVzaXplclwiLCBuYW1lKTtcbiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc2l6ZXItbmFtZVwiLCBuYW1lKTtcbiAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jcmVzaXplclBvaW50ZXJkb3duLmJpbmQodGhpcywgbmFtZSkpO1xuICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBkaXNwbGF5X3V0aWxzLm5vQ29udGV4dE1lbnUpO1xuICAgICAgZGl2LnRhYkluZGV4ID0gLTE7XG4gICAgfVxuICAgIHRoaXMuZGl2LnByZXBlbmQodGhpcy4jcmVzaXplcnNEaXYpO1xuICB9XG4gICNyZXNpemVyUG9pbnRlcmRvd24obmFtZSwgZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWwuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHQ/LnRvZ2dsZShmYWxzZSk7XG4gICAgY29uc3QgYm91bmRSZXNpemVyUG9pbnRlcm1vdmUgPSB0aGlzLiNyZXNpemVyUG9pbnRlcm1vdmUuYmluZCh0aGlzLCBuYW1lKTtcbiAgICBjb25zdCBzYXZlZERyYWdnYWJsZSA9IHRoaXMuX2lzRHJhZ2dhYmxlO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgY29uc3QgcG9pbnRlck1vdmVPcHRpb25zID0ge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIGNhcHR1cmU6IHRydWVcbiAgICB9O1xuICAgIHRoaXMucGFyZW50LnRvZ2dsZVBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgYm91bmRSZXNpemVyUG9pbnRlcm1vdmUsIHBvaW50ZXJNb3ZlT3B0aW9ucyk7XG4gICAgY29uc3Qgc2F2ZWRYID0gdGhpcy54O1xuICAgIGNvbnN0IHNhdmVkWSA9IHRoaXMueTtcbiAgICBjb25zdCBzYXZlZFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICBjb25zdCBzYXZlZEhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGNvbnN0IHNhdmVkUGFyZW50Q3Vyc29yID0gdGhpcy5wYXJlbnQuZGl2LnN0eWxlLmN1cnNvcjtcbiAgICBjb25zdCBzYXZlZEN1cnNvciA9IHRoaXMuZGl2LnN0eWxlLmN1cnNvcjtcbiAgICB0aGlzLmRpdi5zdHlsZS5jdXJzb3IgPSB0aGlzLnBhcmVudC5kaXYuc3R5bGUuY3Vyc29yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZXZlbnQudGFyZ2V0KS5jdXJzb3I7XG4gICAgY29uc3QgcG9pbnRlclVwQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLnBhcmVudC50b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgdGhpcy4jYWx0VGV4dD8udG9nZ2xlKHRydWUpO1xuICAgICAgdGhpcy5faXNEcmFnZ2FibGUgPSBzYXZlZERyYWdnYWJsZTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGJvdW5kUmVzaXplclBvaW50ZXJtb3ZlLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgICAgdGhpcy5wYXJlbnQuZGl2LnN0eWxlLmN1cnNvciA9IHNhdmVkUGFyZW50Q3Vyc29yO1xuICAgICAgdGhpcy5kaXYuc3R5bGUuY3Vyc29yID0gc2F2ZWRDdXJzb3I7XG4gICAgICB0aGlzLiNhZGRSZXNpemVUb1VuZG9TdGFjayhzYXZlZFgsIHNhdmVkWSwgc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gIH1cbiAgI2FkZFJlc2l6ZVRvVW5kb1N0YWNrKHNhdmVkWCwgc2F2ZWRZLCBzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCkge1xuICAgIGNvbnN0IG5ld1ggPSB0aGlzLng7XG4gICAgY29uc3QgbmV3WSA9IHRoaXMueTtcbiAgICBjb25zdCBuZXdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY29uc3QgbmV3SGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgaWYgKG5ld1ggPT09IHNhdmVkWCAmJiBuZXdZID09PSBzYXZlZFkgJiYgbmV3V2lkdGggPT09IHNhdmVkV2lkdGggJiYgbmV3SGVpZ2h0ID09PSBzYXZlZEhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICB0aGlzLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgICB0aGlzLnggPSBuZXdYO1xuICAgICAgICB0aGlzLnkgPSBuZXdZO1xuICAgICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMuc2V0RGltcyhwYXJlbnRXaWR0aCAqIG5ld1dpZHRoLCBwYXJlbnRIZWlnaHQgKiBuZXdIZWlnaHQpO1xuICAgICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgICB9LFxuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICB0aGlzLndpZHRoID0gc2F2ZWRXaWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBzYXZlZEhlaWdodDtcbiAgICAgICAgdGhpcy54ID0gc2F2ZWRYO1xuICAgICAgICB0aGlzLnkgPSBzYXZlZFk7XG4gICAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy5zZXREaW1zKHBhcmVudFdpZHRoICogc2F2ZWRXaWR0aCwgcGFyZW50SGVpZ2h0ICogc2F2ZWRIZWlnaHQpO1xuICAgICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgICB9LFxuICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICB9KTtcbiAgfVxuICAjcmVzaXplclBvaW50ZXJtb3ZlKG5hbWUsIGV2ZW50KSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGNvbnN0IHNhdmVkWCA9IHRoaXMueDtcbiAgICBjb25zdCBzYXZlZFkgPSB0aGlzLnk7XG4gICAgY29uc3Qgc2F2ZWRXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY29uc3Qgc2F2ZWRIZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICBjb25zdCBtaW5XaWR0aCA9IEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUgLyBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCBtaW5IZWlnaHQgPSBBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFIC8gcGFyZW50SGVpZ2h0O1xuICAgIGNvbnN0IHJvdW5kID0geCA9PiBNYXRoLnJvdW5kKHggKiAxMDAwMCkgLyAxMDAwMDtcbiAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IHRoaXMuI2dldFJvdGF0aW9uTWF0cml4KHRoaXMucm90YXRpb24pO1xuICAgIGNvbnN0IHRyYW5zZiA9ICh4LCB5KSA9PiBbcm90YXRpb25NYXRyaXhbMF0gKiB4ICsgcm90YXRpb25NYXRyaXhbMl0gKiB5LCByb3RhdGlvbk1hdHJpeFsxXSAqIHggKyByb3RhdGlvbk1hdHJpeFszXSAqIHldO1xuICAgIGNvbnN0IGludlJvdGF0aW9uTWF0cml4ID0gdGhpcy4jZ2V0Um90YXRpb25NYXRyaXgoMzYwIC0gdGhpcy5yb3RhdGlvbik7XG4gICAgY29uc3QgaW52VHJhbnNmID0gKHgsIHkpID0+IFtpbnZSb3RhdGlvbk1hdHJpeFswXSAqIHggKyBpbnZSb3RhdGlvbk1hdHJpeFsyXSAqIHksIGludlJvdGF0aW9uTWF0cml4WzFdICogeCArIGludlJvdGF0aW9uTWF0cml4WzNdICogeV07XG4gICAgbGV0IGdldFBvaW50O1xuICAgIGxldCBnZXRPcHBvc2l0ZTtcbiAgICBsZXQgaXNEaWFnb25hbCA9IGZhbHNlO1xuICAgIGxldCBpc0hvcml6b250YWwgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgXCJ0b3BMZWZ0XCI6XG4gICAgICAgIGlzRGlhZ29uYWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbMCwgMF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3LCBoXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9wTWlkZGxlXCI6XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3IC8gMiwgMF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3IC8gMiwgaF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvcFJpZ2h0XCI6XG4gICAgICAgIGlzRGlhZ29uYWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdywgMF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFswLCBoXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWlkZGxlUmlnaHRcIjpcbiAgICAgICAgaXNIb3Jpem9udGFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3csIGggLyAyXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gWzAsIGggLyAyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYm90dG9tUmlnaHRcIjpcbiAgICAgICAgaXNEaWFnb25hbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3LCBoXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gWzAsIDBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJib3R0b21NaWRkbGVcIjpcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3cgLyAyLCBoXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3cgLyAyLCAwXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYm90dG9tTGVmdFwiOlxuICAgICAgICBpc0RpYWdvbmFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gWzAsIGhdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdywgMF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1pZGRsZUxlZnRcIjpcbiAgICAgICAgaXNIb3Jpem9udGFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gWzAsIGggLyAyXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3csIGggLyAyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnQoc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgIGNvbnN0IG9wcG9zaXRlUG9pbnQgPSBnZXRPcHBvc2l0ZShzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCk7XG4gICAgbGV0IHRyYW5zZk9wcG9zaXRlUG9pbnQgPSB0cmFuc2YoLi4ub3Bwb3NpdGVQb2ludCk7XG4gICAgY29uc3Qgb3Bwb3NpdGVYID0gcm91bmQoc2F2ZWRYICsgdHJhbnNmT3Bwb3NpdGVQb2ludFswXSk7XG4gICAgY29uc3Qgb3Bwb3NpdGVZID0gcm91bmQoc2F2ZWRZICsgdHJhbnNmT3Bwb3NpdGVQb2ludFsxXSk7XG4gICAgbGV0IHJhdGlvWCA9IDE7XG4gICAgbGV0IHJhdGlvWSA9IDE7XG4gICAgbGV0IFtkZWx0YVgsIGRlbHRhWV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKGV2ZW50Lm1vdmVtZW50WCwgZXZlbnQubW92ZW1lbnRZKTtcbiAgICBbZGVsdGFYLCBkZWx0YVldID0gaW52VHJhbnNmKGRlbHRhWCAvIHBhcmVudFdpZHRoLCBkZWx0YVkgLyBwYXJlbnRIZWlnaHQpO1xuICAgIGlmIChpc0RpYWdvbmFsKSB7XG4gICAgICBjb25zdCBvbGREaWFnID0gTWF0aC5oeXBvdChzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCk7XG4gICAgICByYXRpb1ggPSByYXRpb1kgPSBNYXRoLm1heChNYXRoLm1pbihNYXRoLmh5cG90KG9wcG9zaXRlUG9pbnRbMF0gLSBwb2ludFswXSAtIGRlbHRhWCwgb3Bwb3NpdGVQb2ludFsxXSAtIHBvaW50WzFdIC0gZGVsdGFZKSAvIG9sZERpYWcsIDEgLyBzYXZlZFdpZHRoLCAxIC8gc2F2ZWRIZWlnaHQpLCBtaW5XaWR0aCAvIHNhdmVkV2lkdGgsIG1pbkhlaWdodCAvIHNhdmVkSGVpZ2h0KTtcbiAgICB9IGVsc2UgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgcmF0aW9YID0gTWF0aC5tYXgobWluV2lkdGgsIE1hdGgubWluKDEsIE1hdGguYWJzKG9wcG9zaXRlUG9pbnRbMF0gLSBwb2ludFswXSAtIGRlbHRhWCkpKSAvIHNhdmVkV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhdGlvWSA9IE1hdGgubWF4KG1pbkhlaWdodCwgTWF0aC5taW4oMSwgTWF0aC5hYnMob3Bwb3NpdGVQb2ludFsxXSAtIHBvaW50WzFdIC0gZGVsdGFZKSkpIC8gc2F2ZWRIZWlnaHQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1dpZHRoID0gcm91bmQoc2F2ZWRXaWR0aCAqIHJhdGlvWCk7XG4gICAgY29uc3QgbmV3SGVpZ2h0ID0gcm91bmQoc2F2ZWRIZWlnaHQgKiByYXRpb1kpO1xuICAgIHRyYW5zZk9wcG9zaXRlUG9pbnQgPSB0cmFuc2YoLi4uZ2V0T3Bwb3NpdGUobmV3V2lkdGgsIG5ld0hlaWdodCkpO1xuICAgIGNvbnN0IG5ld1ggPSBvcHBvc2l0ZVggLSB0cmFuc2ZPcHBvc2l0ZVBvaW50WzBdO1xuICAgIGNvbnN0IG5ld1kgPSBvcHBvc2l0ZVkgLSB0cmFuc2ZPcHBvc2l0ZVBvaW50WzFdO1xuICAgIHRoaXMud2lkdGggPSBuZXdXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICB0aGlzLnggPSBuZXdYO1xuICAgIHRoaXMueSA9IG5ld1k7XG4gICAgdGhpcy5zZXREaW1zKHBhcmVudFdpZHRoICogbmV3V2lkdGgsIHBhcmVudEhlaWdodCAqIG5ld0hlaWdodCk7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIGFsdFRleHRGaW5pc2goKSB7XG4gICAgdGhpcy4jYWx0VGV4dD8uZmluaXNoKCk7XG4gIH1cbiAgYXN5bmMgYWRkRWRpdFRvb2xiYXIoKSB7XG4gICAgaWYgKHRoaXMuI2VkaXRUb29sYmFyIHx8IHRoaXMuI2lzSW5FZGl0TW9kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2VkaXRUb29sYmFyO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhciA9IG5ldyBFZGl0b3JUb29sYmFyKHRoaXMpO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLiNlZGl0VG9vbGJhci5yZW5kZXIoKSk7XG4gICAgaWYgKHRoaXMuI2FsdFRleHQpIHtcbiAgICAgIHRoaXMuI2VkaXRUb29sYmFyLmFkZEFsdFRleHRCdXR0b24oYXdhaXQgdGhpcy4jYWx0VGV4dC5yZW5kZXIoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNlZGl0VG9vbGJhcjtcbiAgfVxuICByZW1vdmVFZGl0VG9vbGJhcigpIHtcbiAgICBpZiAoIXRoaXMuI2VkaXRUb29sYmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2VkaXRUb29sYmFyLnJlbW92ZSgpO1xuICAgIHRoaXMuI2VkaXRUb29sYmFyID0gbnVsbDtcbiAgICB0aGlzLiNhbHRUZXh0Py5kZXN0cm95KCk7XG4gIH1cbiAgZ2V0Q2xpZW50RGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cbiAgYXN5bmMgYWRkQWx0VGV4dEJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy4jYWx0VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBBbHRUZXh0LmluaXRpYWxpemUoQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UpO1xuICAgIHRoaXMuI2FsdFRleHQgPSBuZXcgQWx0VGV4dCh0aGlzKTtcbiAgICBhd2FpdCB0aGlzLmFkZEVkaXRUb29sYmFyKCk7XG4gIH1cbiAgZ2V0IGFsdFRleHREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNhbHRUZXh0Py5kYXRhO1xuICB9XG4gIHNldCBhbHRUZXh0RGF0YShkYXRhKSB7XG4gICAgaWYgKCF0aGlzLiNhbHRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHQuZGF0YSA9IGRhdGE7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXRvci1yb3RhdGlvblwiLCAoMzYwIC0gdGhpcy5yb3RhdGlvbikgJSAzNjApO1xuICAgIHRoaXMuZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCAwKTtcbiAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbik7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQpO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBpZiAodGhpcy5wYXJlbnRSb3RhdGlvbiAlIDE4MCAhPT0gMCkge1xuICAgICAgdGhpcy5kaXYuc3R5bGUubWF4V2lkdGggPSBgJHsoMTAwICogcGFyZW50SGVpZ2h0IC8gcGFyZW50V2lkdGgpLnRvRml4ZWQoMil9JWA7XG4gICAgICB0aGlzLmRpdi5zdHlsZS5tYXhIZWlnaHQgPSBgJHsoMTAwICogcGFyZW50V2lkdGggLyBwYXJlbnRIZWlnaHQpLnRvRml4ZWQoMil9JWA7XG4gICAgfVxuICAgIGNvbnN0IFt0eCwgdHldID0gdGhpcy5nZXRJbml0aWFsVHJhbnNsYXRpb24oKTtcbiAgICB0aGlzLnRyYW5zbGF0ZSh0eCwgdHkpO1xuICAgICgwLHRvb2xzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJwb2ludGVyZG93blwiXSk7XG4gICAgcmV0dXJuIHRoaXMuZGl2O1xuICB9XG4gIHBvaW50ZXJkb3duKGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbC5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hhc0JlZW5DbGlja2VkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5faXNEcmFnZ2FibGUpIHtcbiAgICAgIHRoaXMuI3NldFVwRHJhZ1Nlc3Npb24oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RPblBvaW50ZXJFdmVudChldmVudCk7XG4gIH1cbiAgI3NlbGVjdE9uUG9pbnRlckV2ZW50KGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbC5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuY3RybEtleSAmJiAhaXNNYWMgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQubWV0YUtleSAmJiBpc01hYykge1xuICAgICAgdGhpcy5wYXJlbnQudG9nZ2xlU2VsZWN0ZWQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgIH1cbiAgfVxuICAjc2V0VXBEcmFnU2Vzc2lvbihldmVudCkge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLl91aU1hbmFnZXIuaXNTZWxlY3RlZCh0aGlzKTtcbiAgICB0aGlzLl91aU1hbmFnZXIuc2V0VXBEcmFnU2Vzc2lvbigpO1xuICAgIGxldCBwb2ludGVyTW92ZU9wdGlvbnMsIHBvaW50ZXJNb3ZlQ2FsbGJhY2s7XG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHBvaW50ZXJNb3ZlT3B0aW9ucyA9IHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgY2FwdHVyZTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHBvaW50ZXJNb3ZlQ2FsbGJhY2sgPSBlID0+IHtcbiAgICAgICAgY29uc3QgW3R4LCB0eV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKGUubW92ZW1lbnRYLCBlLm1vdmVtZW50WSk7XG4gICAgICAgIHRoaXMuX3VpTWFuYWdlci5kcmFnU2VsZWN0ZWRFZGl0b3JzKHR4LCB0eSk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBwb2ludGVyTW92ZUNhbGxiYWNrLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyVXBDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHBvaW50ZXJNb3ZlQ2FsbGJhY2ssIHBvaW50ZXJNb3ZlT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLiNoYXNCZWVuQ2xpY2tlZCA9IGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLl91aU1hbmFnZXIuZW5kRHJhZ1Nlc3Npb24oKSkge1xuICAgICAgICB0aGlzLiNzZWxlY3RPblBvaW50ZXJFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgfVxuICBtb3ZlSW5ET00oKSB7XG4gICAgaWYgKHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNtb3ZlSW5ET01UaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy4jbW92ZUluRE9NVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jbW92ZUluRE9NVGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLnBhcmVudD8ubW92ZUVkaXRvckluRE9NKHRoaXMpO1xuICAgIH0sIDApO1xuICB9XG4gIF9zZXRQYXJlbnRBbmRQb3NpdGlvbihwYXJlbnQsIHgsIHkpIHtcbiAgICBwYXJlbnQuY2hhbmdlUGFyZW50KHRoaXMpO1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgZ2V0UmVjdCh0eCwgdHkpIHtcbiAgICBsZXQgcm90YXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRoaXMucm90YXRpb247XG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLnBhcmVudFNjYWxlO1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCBbcGFnZVgsIHBhZ2VZXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uO1xuICAgIGNvbnN0IHNoaWZ0WCA9IHR4IC8gc2NhbGU7XG4gICAgY29uc3Qgc2hpZnRZID0gdHkgLyBzY2FsZTtcbiAgICBjb25zdCB4ID0gdGhpcy54ICogcGFnZVdpZHRoO1xuICAgIGNvbnN0IHkgPSB0aGlzLnkgKiBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gW3ggKyBzaGlmdFggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFkgLSBoZWlnaHQgKyBwYWdlWSwgeCArIHNoaWZ0WCArIHdpZHRoICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRZICsgcGFnZVldO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFt4ICsgc2hpZnRZICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRYICsgcGFnZVksIHggKyBzaGlmdFkgKyBoZWlnaHQgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFggKyB3aWR0aCArIHBhZ2VZXTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gW3ggLSBzaGlmdFggLSB3aWR0aCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WSArIHBhZ2VZLCB4IC0gc2hpZnRYICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRZICsgaGVpZ2h0ICsgcGFnZVldO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbeCAtIHNoaWZ0WSAtIGhlaWdodCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WCAtIHdpZHRoICsgcGFnZVksIHggLSBzaGlmdFkgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFggKyBwYWdlWV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgIH1cbiAgfVxuICBnZXRSZWN0SW5DdXJyZW50Q29vcmRzKHJlY3QsIHBhZ2VIZWlnaHQpIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDtcbiAgICBjb25zdCB3aWR0aCA9IHgyIC0geDE7XG4gICAgY29uc3QgaGVpZ2h0ID0geTIgLSB5MTtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIFt4MSwgcGFnZUhlaWdodCAtIHkyLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbeDEsIHBhZ2VIZWlnaHQgLSB5MSwgaGVpZ2h0LCB3aWR0aF07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt4MiwgcGFnZUhlaWdodCAtIHkxLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3gyLCBwYWdlSGVpZ2h0IC0geTIsIGhlaWdodCwgd2lkdGhdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gIH1cbiAgb25jZUFkZGVkKCkge31cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gdHJ1ZTtcbiAgfVxuICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gZmFsc2U7XG4gIH1cbiAgaXNJbkVkaXRNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLiNpc0luRWRpdE1vZGU7XG4gIH1cbiAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZDtcbiAgfVxuICBuZWVkc1RvQmVSZWJ1aWx0KCkge1xuICAgIHJldHVybiB0aGlzLmRpdiAmJiAhdGhpcy5pc0F0dGFjaGVkVG9ET007XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICB0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jYm91bmRGb2N1c2luKTtcbiAgICB0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQpO1xuICB9XG4gIHJvdGF0ZShfYW5nbGUpIHt9XG4gIHNlcmlhbGl6ZSgpIHtcbiAgICBsZXQgaXNGb3JDb3B5aW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBsZXQgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAoMCx1dGlsLnVucmVhY2hhYmxlKShcIkFuIGVkaXRvciBtdXN0IGJlIHNlcmlhbGl6YWJsZVwiKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3Ioe1xuICAgICAgcGFyZW50LFxuICAgICAgaWQ6IHBhcmVudC5nZXROZXh0SWQoKSxcbiAgICAgIHVpTWFuYWdlclxuICAgIH0pO1xuICAgIGVkaXRvci5yb3RhdGlvbiA9IGRhdGEucm90YXRpb247XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3QgW3gsIHksIHdpZHRoLCBoZWlnaHRdID0gZWRpdG9yLmdldFJlY3RJbkN1cnJlbnRDb29yZHMoZGF0YS5yZWN0LCBwYWdlSGVpZ2h0KTtcbiAgICBlZGl0b3IueCA9IHggLyBwYWdlV2lkdGg7XG4gICAgZWRpdG9yLnkgPSB5IC8gcGFnZUhlaWdodDtcbiAgICBlZGl0b3Iud2lkdGggPSB3aWR0aCAvIHBhZ2VXaWR0aDtcbiAgICBlZGl0b3IuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFnZUhlaWdodDtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNib3VuZEZvY3VzaW4pO1xuICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCB0aGlzLiNib3VuZEZvY3Vzb3V0KTtcbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmNvbW1pdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcih0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNtb3ZlSW5ET01UaW1lb3V0KTtcbiAgICAgIHRoaXMuI21vdmVJbkRPTVRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB0aGlzLnJlbW92ZUVkaXRUb29sYmFyKCk7XG4gIH1cbiAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBtYWtlUmVzaXphYmxlKCkge1xuICAgIGlmICh0aGlzLmlzUmVzaXphYmxlKSB7XG4gICAgICB0aGlzLiNjcmVhdGVSZXNpemVycygpO1xuICAgICAgdGhpcy4jcmVzaXplcnNEaXYuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICgwLHRvb2xzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJrZXlkb3duXCJdKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHRvb2xiYXJQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBrZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzUmVzaXphYmxlIHx8IGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXYgfHwgZXZlbnQua2V5ICE9PSBcIkVudGVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdWlNYW5hZ2VyLnNldFNlbGVjdGVkKHRoaXMpO1xuICAgIHRoaXMuI3NhdmVkRGltZW5zaW9ucyA9IHtcbiAgICAgIHNhdmVkWDogdGhpcy54LFxuICAgICAgc2F2ZWRZOiB0aGlzLnksXG4gICAgICBzYXZlZFdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgc2F2ZWRIZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgfTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuI3Jlc2l6ZXJzRGl2LmNoaWxkcmVuO1xuICAgIGlmICghdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIHRoaXMuI2FsbFJlc2l6ZXJEaXZzID0gQXJyYXkuZnJvbShjaGlsZHJlbik7XG4gICAgICBjb25zdCBib3VuZFJlc2l6ZXJLZXlkb3duID0gdGhpcy4jcmVzaXplcktleWRvd24uYmluZCh0aGlzKTtcbiAgICAgIGNvbnN0IGJvdW5kUmVzaXplckJsdXIgPSB0aGlzLiNyZXNpemVyQmx1ci5iaW5kKHRoaXMpO1xuICAgICAgZm9yIChjb25zdCBkaXYgb2YgdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGRpdi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc2l6ZXItbmFtZVwiKTtcbiAgICAgICAgZGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJzcGluYnV0dG9uXCIpO1xuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgYm91bmRSZXNpemVyS2V5ZG93bik7XG4gICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBib3VuZFJlc2l6ZXJCbHVyKTtcbiAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNyZXNpemVyRm9jdXMuYmluZCh0aGlzLCBuYW1lKSk7XG4gICAgICAgIEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlLmdldChgcGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtJHtuYW1lfWApLnRoZW4obXNnID0+IGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuI2FsbFJlc2l6ZXJEaXZzWzBdO1xuICAgIGxldCBmaXJzdFBvc2l0aW9uID0gMDtcbiAgICBmb3IgKGNvbnN0IGRpdiBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKGRpdiA9PT0gZmlyc3QpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBmaXJzdFBvc2l0aW9uKys7XG4gICAgfVxuICAgIGNvbnN0IG5leHRGaXJzdFBvc2l0aW9uID0gKDM2MCAtIHRoaXMucm90YXRpb24gKyB0aGlzLnBhcmVudFJvdGF0aW9uKSAlIDM2MCAvIDkwICogKHRoaXMuI2FsbFJlc2l6ZXJEaXZzLmxlbmd0aCAvIDQpO1xuICAgIGlmIChuZXh0Rmlyc3RQb3NpdGlvbiAhPT0gZmlyc3RQb3NpdGlvbikge1xuICAgICAgaWYgKG5leHRGaXJzdFBvc2l0aW9uIDwgZmlyc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0UG9zaXRpb24gLSBuZXh0Rmlyc3RQb3NpdGlvbjsgaSsrKSB7XG4gICAgICAgICAgdGhpcy4jcmVzaXplcnNEaXYuYXBwZW5kKHRoaXMuI3Jlc2l6ZXJzRGl2LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5leHRGaXJzdFBvc2l0aW9uID4gZmlyc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHRGaXJzdFBvc2l0aW9uIC0gZmlyc3RQb3NpdGlvbjsgaSsrKSB7XG4gICAgICAgICAgdGhpcy4jcmVzaXplcnNEaXYuZmlyc3RDaGlsZC5iZWZvcmUodGhpcy4jcmVzaXplcnNEaXYubGFzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBkaXYgPSB0aGlzLiNhbGxSZXNpemVyRGl2c1tpKytdO1xuICAgICAgICBjb25zdCBuYW1lID0gZGl2LmdldEF0dHJpYnV0ZShcImRhdGEtcmVzaXplci1uYW1lXCIpO1xuICAgICAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoYHBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLSR7bmFtZX1gKS50aGVuKG1zZyA9PiBjaGlsZC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZykpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNzZXRSZXNpemVyVGFiSW5kZXgoMCk7XG4gICAgdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID0gdHJ1ZTtcbiAgICB0aGlzLiNyZXNpemVyc0Rpdi5maXJzdENoaWxkLmZvY3VzKHtcbiAgICAgIGZvY3VzVmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgI3Jlc2l6ZXJLZXlkb3duKGV2ZW50KSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fcmVzaXplcktleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgfVxuICAjcmVzaXplckJsdXIoZXZlbnQpIHtcbiAgICBpZiAodGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQ/LnBhcmVudE5vZGUgIT09IHRoaXMuI3Jlc2l6ZXJzRGl2KSB7XG4gICAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB9XG4gIH1cbiAgI3Jlc2l6ZXJGb2N1cyhuYW1lKSB7XG4gICAgdGhpcy4jZm9jdXNlZFJlc2l6ZXJOYW1lID0gdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID8gbmFtZSA6IFwiXCI7XG4gIH1cbiAgI3NldFJlc2l6ZXJUYWJJbmRleCh2YWx1ZSkge1xuICAgIGlmICghdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXYgb2YgdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIGRpdi50YWJJbmRleCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBfcmVzaXplV2l0aEtleWJvYXJkKHgsIHkpIHtcbiAgICBpZiAoIXRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNyZXNpemVyUG9pbnRlcm1vdmUodGhpcy4jZm9jdXNlZFJlc2l6ZXJOYW1lLCB7XG4gICAgICBtb3ZlbWVudFg6IHgsXG4gICAgICBtb3ZlbWVudFk6IHlcbiAgICB9KTtcbiAgfVxuICAjc3RvcFJlc2l6aW5nKCkge1xuICAgIHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuI3NldFJlc2l6ZXJUYWJJbmRleCgtMSk7XG4gICAgaWYgKHRoaXMuI3NhdmVkRGltZW5zaW9ucykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzYXZlZFgsXG4gICAgICAgIHNhdmVkWSxcbiAgICAgICAgc2F2ZWRXaWR0aCxcbiAgICAgICAgc2F2ZWRIZWlnaHRcbiAgICAgIH0gPSB0aGlzLiNzYXZlZERpbWVuc2lvbnM7XG4gICAgICB0aGlzLiNhZGRSZXNpemVUb1VuZG9TdGFjayhzYXZlZFgsIHNhdmVkWSwgc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgICAgdGhpcy4jc2F2ZWREaW1lbnNpb25zID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgX3N0b3BSZXNpemluZ1dpdGhLZXlib2FyZCgpIHtcbiAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9XG4gIHNlbGVjdCgpIHtcbiAgICB0aGlzLm1ha2VSZXNpemFibGUoKTtcbiAgICB0aGlzLmRpdj8uY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgIGlmICghdGhpcy4jZWRpdFRvb2xiYXIpIHtcbiAgICAgIHRoaXMuYWRkRWRpdFRvb2xiYXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGl2Py5jbGFzc0xpc3QuY29udGFpbnMoXCJzZWxlY3RlZEVkaXRvclwiKSkge1xuICAgICAgICAgIHRoaXMuI2VkaXRUb29sYmFyPy5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhcj8uc2hvdygpO1xuICB9XG4gIHVuc2VsZWN0KCkge1xuICAgIHRoaXMuI3Jlc2l6ZXJzRGl2Py5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHRoaXMuZGl2Py5jbGFzc0xpc3QucmVtb3ZlKFwic2VsZWN0ZWRFZGl0b3JcIik7XG4gICAgaWYgKHRoaXMuZGl2Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmN1cnJlbnRMYXllci5kaXYuZm9jdXMoKTtcbiAgICB9XG4gICAgdGhpcy4jZWRpdFRvb2xiYXI/LmhpZGUoKTtcbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHt9XG4gIGRpc2FibGVFZGl0aW5nKCkge31cbiAgZW5hYmxlRWRpdGluZygpIHt9XG4gIGVudGVySW5FZGl0TW9kZSgpIHt9XG4gIGdldEltYWdlRm9yQWx0VGV4dCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgY29udGVudERpdigpIHtcbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgZ2V0IGlzRWRpdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNFZGl0aW5nO1xuICB9XG4gIHNldCBpc0VkaXRpbmcodmFsdWUpIHtcbiAgICB0aGlzLiNpc0VkaXRpbmcgPSB2YWx1ZTtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgICB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50LnNldEFjdGl2ZUVkaXRvcihudWxsKTtcbiAgICB9XG4gIH1cbiAgc2V0QXNwZWN0UmF0aW8od2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMuI2tlZXBBc3BlY3RSYXRpbyA9IHRydWU7XG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBzdHlsZS5hc3BlY3RSYXRpbyA9IGFzcGVjdFJhdGlvO1xuICAgIHN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICB9XG4gIHN0YXRpYyBnZXQgTUlOX1NJWkUoKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9XG4gIHN0YXRpYyBjYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuY2xhc3MgRmFrZUVkaXRvciBleHRlbmRzIEFubm90YXRpb25FZGl0b3Ige1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IHBhcmFtcy5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgIHRoaXMuZGVsZXRlZCA9IHRydWU7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgZGVsZXRlZDogdHJ1ZSxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXhcbiAgICB9O1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDc0MDU6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIE91dGxpbmVyOiAoKSA9PiAoLyogYmluZGluZyAqLyBPdXRsaW5lcilcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9wdXNoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2RpZmZlcmVuY2VfdjJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTU2MSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfaW50ZXJzZWN0aW9uX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1ODcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2lzX2Rpc2pvaW50X2Zyb21fdjJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI0Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfaXNfc3Vic2V0X29mX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzMDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2lzX3N1cGVyc2V0X29mX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0OTApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0MzgpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X3VuaW9uX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MTQpO1xuXG5cblxuXG5cblxuXG5cbmNsYXNzIE91dGxpbmVyIHtcbiAgI2JveDtcbiAgI3ZlcnRpY2FsRWRnZXMgPSBbXTtcbiAgI2ludGVydmFscyA9IFtdO1xuICBjb25zdHJ1Y3Rvcihib3hlcykge1xuICAgIGxldCBib3JkZXJXaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgICBsZXQgaW5uZXJNYXJnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG4gICAgbGV0IGlzTFRSID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBjb25zdCBOVU1CRVJfT0ZfRElHSVRTID0gNDtcbiAgICBjb25zdCBFUFNJTE9OID0gMTAgKiogLU5VTUJFUl9PRl9ESUdJVFM7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSBvZiBib3hlcykge1xuICAgICAgY29uc3QgeDEgPSBNYXRoLmZsb29yKCh4IC0gYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgeDIgPSBNYXRoLmNlaWwoKHggKyB3aWR0aCArIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IHkxID0gTWF0aC5mbG9vcigoeSAtIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IHkyID0gTWF0aC5jZWlsKCh5ICsgaGVpZ2h0ICsgYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgbGVmdCA9IFt4MSwgeTEsIHkyLCB0cnVlXTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gW3gyLCB5MSwgeTIsIGZhbHNlXTtcbiAgICAgIHRoaXMuI3ZlcnRpY2FsRWRnZXMucHVzaChsZWZ0LCByaWdodCk7XG4gICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeDEpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgyKTtcbiAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5MSk7XG4gICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeTIpO1xuICAgIH1cbiAgICBjb25zdCBiYm94V2lkdGggPSBtYXhYIC0gbWluWCArIDIgKiBpbm5lck1hcmdpbjtcbiAgICBjb25zdCBiYm94SGVpZ2h0ID0gbWF4WSAtIG1pblkgKyAyICogaW5uZXJNYXJnaW47XG4gICAgY29uc3Qgc2hpZnRlZE1pblggPSBtaW5YIC0gaW5uZXJNYXJnaW47XG4gICAgY29uc3Qgc2hpZnRlZE1pblkgPSBtaW5ZIC0gaW5uZXJNYXJnaW47XG4gICAgY29uc3QgbGFzdEVkZ2UgPSB0aGlzLiN2ZXJ0aWNhbEVkZ2VzLmF0KGlzTFRSID8gLTEgOiAtMik7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gW2xhc3RFZGdlWzBdLCBsYXN0RWRnZVsyXV07XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIHRoaXMuI3ZlcnRpY2FsRWRnZXMpIHtcbiAgICAgIGNvbnN0IFt4LCB5MSwgeTJdID0gZWRnZTtcbiAgICAgIGVkZ2VbMF0gPSAoeCAtIHNoaWZ0ZWRNaW5YKSAvIGJib3hXaWR0aDtcbiAgICAgIGVkZ2VbMV0gPSAoeTEgLSBzaGlmdGVkTWluWSkgLyBiYm94SGVpZ2h0O1xuICAgICAgZWRnZVsyXSA9ICh5MiAtIHNoaWZ0ZWRNaW5ZKSAvIGJib3hIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuI2JveCA9IHtcbiAgICAgIHg6IHNoaWZ0ZWRNaW5YLFxuICAgICAgeTogc2hpZnRlZE1pblksXG4gICAgICB3aWR0aDogYmJveFdpZHRoLFxuICAgICAgaGVpZ2h0OiBiYm94SGVpZ2h0LFxuICAgICAgbGFzdFBvaW50XG4gICAgfTtcbiAgfVxuICBnZXRPdXRsaW5lcygpIHtcbiAgICB0aGlzLiN2ZXJ0aWNhbEVkZ2VzLnNvcnQoKGEsIGIpID0+IGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdIHx8IGFbMl0gLSBiWzJdKTtcbiAgICBjb25zdCBvdXRsaW5lVmVydGljYWxFZGdlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiB0aGlzLiN2ZXJ0aWNhbEVkZ2VzKSB7XG4gICAgICBpZiAoZWRnZVszXSkge1xuICAgICAgICBvdXRsaW5lVmVydGljYWxFZGdlcy5wdXNoKC4uLnRoaXMuI2JyZWFrRWRnZShlZGdlKSk7XG4gICAgICAgIHRoaXMuI2luc2VydChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3JlbW92ZShlZGdlKTtcbiAgICAgICAgb3V0bGluZVZlcnRpY2FsRWRnZXMucHVzaCguLi50aGlzLiNicmVha0VkZ2UoZWRnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZ2V0T3V0bGluZXMob3V0bGluZVZlcnRpY2FsRWRnZXMpO1xuICB9XG4gICNnZXRPdXRsaW5lcyhvdXRsaW5lVmVydGljYWxFZGdlcykge1xuICAgIGNvbnN0IGVkZ2VzID0gW107XG4gICAgY29uc3QgYWxsRWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGxpbmVWZXJ0aWNhbEVkZ2VzKSB7XG4gICAgICBjb25zdCBbeCwgeTEsIHkyXSA9IGVkZ2U7XG4gICAgICBlZGdlcy5wdXNoKFt4LCB5MSwgZWRnZV0sIFt4LCB5MiwgZWRnZV0pO1xuICAgIH1cbiAgICBlZGdlcy5zb3J0KChhLCBiKSA9PiBhWzFdIC0gYlsxXSB8fCBhWzBdIC0gYlswXSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZWRnZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgY29uc3QgZWRnZTEgPSBlZGdlc1tpXVsyXTtcbiAgICAgIGNvbnN0IGVkZ2UyID0gZWRnZXNbaSArIDFdWzJdO1xuICAgICAgZWRnZTEucHVzaChlZGdlMik7XG4gICAgICBlZGdlMi5wdXNoKGVkZ2UxKTtcbiAgICAgIGFsbEVkZ2VzLmFkZChlZGdlMSk7XG4gICAgICBhbGxFZGdlcy5hZGQoZWRnZTIpO1xuICAgIH1cbiAgICBjb25zdCBvdXRsaW5lcyA9IFtdO1xuICAgIGxldCBvdXRsaW5lO1xuICAgIHdoaWxlIChhbGxFZGdlcy5zaXplID4gMCkge1xuICAgICAgY29uc3QgZWRnZSA9IGFsbEVkZ2VzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGxldCBbeCwgeTEsIHkyLCBlZGdlMSwgZWRnZTJdID0gZWRnZTtcbiAgICAgIGFsbEVkZ2VzLmRlbGV0ZShlZGdlKTtcbiAgICAgIGxldCBsYXN0UG9pbnRYID0geDtcbiAgICAgIGxldCBsYXN0UG9pbnRZID0geTE7XG4gICAgICBvdXRsaW5lID0gW3gsIHkyXTtcbiAgICAgIG91dGxpbmVzLnB1c2gob3V0bGluZSk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgZTtcbiAgICAgICAgaWYgKGFsbEVkZ2VzLmhhcyhlZGdlMSkpIHtcbiAgICAgICAgICBlID0gZWRnZTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYWxsRWRnZXMuaGFzKGVkZ2UyKSkge1xuICAgICAgICAgIGUgPSBlZGdlMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhbGxFZGdlcy5kZWxldGUoZSk7XG4gICAgICAgIFt4LCB5MSwgeTIsIGVkZ2UxLCBlZGdlMl0gPSBlO1xuICAgICAgICBpZiAobGFzdFBvaW50WCAhPT0geCkge1xuICAgICAgICAgIG91dGxpbmUucHVzaChsYXN0UG9pbnRYLCBsYXN0UG9pbnRZLCB4LCBsYXN0UG9pbnRZID09PSB5MSA/IHkxIDogeTIpO1xuICAgICAgICAgIGxhc3RQb2ludFggPSB4O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQb2ludFkgPSBsYXN0UG9pbnRZID09PSB5MSA/IHkyIDogeTE7XG4gICAgICB9XG4gICAgICBvdXRsaW5lLnB1c2gobGFzdFBvaW50WCwgbGFzdFBvaW50WSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvdXRsaW5lcyxcbiAgICAgIGJveDogdGhpcy4jYm94XG4gICAgfTtcbiAgfVxuICAjYmluYXJ5U2VhcmNoKHkpIHtcbiAgICBjb25zdCBhcnJheSA9IHRoaXMuI2ludGVydmFscztcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBlbmQgPSBhcnJheS5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAgIGNvbnN0IG1pZGRsZSA9IHN0YXJ0ICsgZW5kID4+IDE7XG4gICAgICBjb25zdCB5MSA9IGFycmF5W21pZGRsZV1bMF07XG4gICAgICBpZiAoeTEgPT09IHkpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIGlmICh5MSA8IHkpIHtcbiAgICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gbWlkZGxlIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuZCArIDE7XG4gIH1cbiAgI2luc2VydChfcmVmKSB7XG4gICAgbGV0IFssIHkxLCB5Ml0gPSBfcmVmO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jYmluYXJ5U2VhcmNoKHkxKTtcbiAgICB0aGlzLiNpbnRlcnZhbHMuc3BsaWNlKGluZGV4LCAwLCBbeTEsIHkyXSk7XG4gIH1cbiAgI3JlbW92ZShfcmVmMikge1xuICAgIGxldCBbLCB5MSwgeTJdID0gX3JlZjI7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNiaW5hcnlTZWFyY2goeTEpO1xuICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuI2ludGVydmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy4jaW50ZXJ2YWxzW2ldO1xuICAgICAgaWYgKHN0YXJ0ICE9PSB5MSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA9PT0geTEgJiYgZW5kID09PSB5Mikge1xuICAgICAgICB0aGlzLiNpbnRlcnZhbHMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBpbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLiNpbnRlcnZhbHNbaV07XG4gICAgICBpZiAoc3RhcnQgIT09IHkxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID09PSB5MSAmJiBlbmQgPT09IHkyKSB7XG4gICAgICAgIHRoaXMuI2ludGVydmFscy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2JyZWFrRWRnZShlZGdlKSB7XG4gICAgY29uc3QgW3gsIHkxLCB5Ml0gPSBlZGdlO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbW3gsIHkxLCB5Ml1dO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jYmluYXJ5U2VhcmNoKHkyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuI2ludGVydmFsc1tpXTtcbiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJlc3VsdHMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBjb25zdCBbLCB5MywgeTRdID0gcmVzdWx0c1tqXTtcbiAgICAgICAgaWYgKGVuZCA8PSB5MyB8fCB5NCA8PSBzdGFydCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5MyA+PSBzdGFydCkge1xuICAgICAgICAgIGlmICh5NCA+IGVuZCkge1xuICAgICAgICAgICAgcmVzdWx0c1tqXVsxXSA9IGVuZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGpqID09PSAxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMuc3BsaWNlKGosIDEpO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgamotLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0c1tqXVsyXSA9IHN0YXJ0O1xuICAgICAgICBpZiAoeTQgPiBlbmQpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goW3gsIGVuZCwgeTRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0ODEyOlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX19fd2VicGFja19tb2R1bGVfXywgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG4vKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuLyogaGFybW9ueSBleHBvcnQgKi8gICBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQ29sb3JNYW5hZ2VyOiAoKSA9PiAoLyogYmluZGluZyAqLyBDb2xvck1hbmFnZXIpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBLZXlib2FyZE1hbmFnZXI6ICgpID0+ICgvKiBiaW5kaW5nICovIEtleWJvYXJkTWFuYWdlciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGJpbmRFdmVudHM6ICgpID0+ICgvKiBiaW5kaW5nICovIGJpbmRFdmVudHMpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBvcGFjaXR5VG9IZXg6ICgpID0+ICgvKiBiaW5kaW5nICovIG9wYWNpdHlUb0hleClcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogdW51c2VkIGhhcm1vbnkgZXhwb3J0IENvbW1hbmRNYW5hZ2VyICovXG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODM3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmluZF9sYXN0X2luZGV4X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4MDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zZXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODM0Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3JldmVyc2VkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5OTUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19zb3J0ZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV93aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2MDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX2RldGFjaGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0NCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDMwNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfdG9fZml4ZWRfbGVuZ3RoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1ODMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9wdXNoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2RpZmZlcmVuY2VfdjJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1NjEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2ludGVyc2VjdGlvbl92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODU4Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfaXNfZGlzam9pbnRfZnJvbV92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI0Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfaXNfc3Vic2V0X29mX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzAyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9pc19zdXBlcnNldF9vZl92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQ5MCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9zZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfdjJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE1X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0MzgpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X3VuaW9uX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTE0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2l0ZXJhdG9yX2NvbnN0cnVjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MTIxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2l0ZXJhdG9yX2V2ZXJ5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzODUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfaXRlcmF0b3JfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTQ0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2pzb25fcGFyc2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4MDgpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfaXRlcmF0b3Jfc29tZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODUxOCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDczKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uIGJpbmRFdmVudHMob2JqLCBlbGVtZW50LCBuYW1lcykge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgb2JqW25hbWVdLmJpbmQob2JqKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9wYWNpdHlUb0hleChvcGFjaXR5KSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKE1hdGgubWluKDI1NSwgTWF0aC5tYXgoMSwgMjU1ICogb3BhY2l0eSkpKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xufVxuY2xhc3MgSWRNYW5hZ2VyIHtcbiAgI2lkID0gMDtcbiAgZ2V0SWQoKSB7XG4gICAgcmV0dXJuIGAke19zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXy5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4fSR7dGhpcy4jaWQrK31gO1xuICB9XG59XG5jbGFzcyBJbWFnZU1hbmFnZXIge1xuICAjYmFzZUlkID0gKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMl9fLmdldFV1aWQpKCk7XG4gICNpZCA9IDA7XG4gICNjYWNoZSA9IG51bGw7XG4gIHN0YXRpYyBnZXQgX2lzU1ZHRml0dGluZ0NhbnZhcygpIHtcbiAgICBjb25zdCBzdmcgPSBgZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9VVRGLTgsPHN2ZyB2aWV3Qm94PVwiMCAwIDEgMVwiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3Qgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMVwiIHN0eWxlPVwiZmlsbDpyZWQ7XCIvPjwvc3ZnPmA7XG4gICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcygxLCAzKTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgaW1hZ2Uuc3JjID0gc3ZnO1xuICAgIGNvbnN0IHByb21pc2UgPSBpbWFnZS5kZWNvZGUoKS50aGVuKCgpID0+IHtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDMpO1xuICAgICAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGEuYnVmZmVyKVswXSA9PT0gMDtcbiAgICB9KTtcbiAgICByZXR1cm4gKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMl9fLnNoYWRvdykodGhpcywgXCJfaXNTVkdGaXR0aW5nQ2FudmFzXCIsIHByb21pc2UpO1xuICB9XG4gIGFzeW5jICNnZXQoa2V5LCByYXdEYXRhKSB7XG4gICAgdGhpcy4jY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgICBsZXQgZGF0YSA9IHRoaXMuI2NhY2hlLmdldChrZXkpO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRhdGE/LmJpdG1hcCkge1xuICAgICAgZGF0YS5yZWZDb3VudGVyICs9IDE7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgfHw9IHtcbiAgICAgICAgYml0bWFwOiBudWxsLFxuICAgICAgICBpZDogYGltYWdlXyR7dGhpcy4jYmFzZUlkfV8ke3RoaXMuI2lkKyt9YCxcbiAgICAgICAgcmVmQ291bnRlcjogMCxcbiAgICAgICAgaXNTdmc6IGZhbHNlXG4gICAgICB9O1xuICAgICAgbGV0IGltYWdlO1xuICAgICAgaWYgKHR5cGVvZiByYXdEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRhdGEudXJsID0gcmF3RGF0YTtcbiAgICAgICAgaW1hZ2UgPSBhd2FpdCAoMCxfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5mZXRjaERhdGEpKHJhd0RhdGEsIFwiYmxvYlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlID0gZGF0YS5maWxlID0gcmF3RGF0YTtcbiAgICAgIH1cbiAgICAgIGlmIChpbWFnZS50eXBlID09PSBcImltYWdlL3N2Zyt4bWxcIikge1xuICAgICAgICBjb25zdCBtdXN0UmVtb3ZlQXNwZWN0UmF0aW9Qcm9taXNlID0gSW1hZ2VNYW5hZ2VyLl9pc1NWR0ZpdHRpbmdDYW52YXM7XG4gICAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgY29uc3QgaW1hZ2VQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGltYWdlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBkYXRhLmJpdG1hcCA9IGltYWdlRWxlbWVudDtcbiAgICAgICAgICAgIGRhdGEuaXNTdmcgPSB0cnVlO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBkYXRhLnN2Z1VybCA9IGZpbGVSZWFkZXIucmVzdWx0O1xuICAgICAgICAgICAgaW1hZ2VFbGVtZW50LnNyYyA9IChhd2FpdCBtdXN0UmVtb3ZlQXNwZWN0UmF0aW9Qcm9taXNlKSA/IGAke3VybH0jc3ZnVmlldyhwcmVzZXJ2ZUFzcGVjdFJhdGlvKG5vbmUpKWAgOiB1cmw7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbWFnZUVsZW1lbnQub25lcnJvciA9IGZpbGVSZWFkZXIub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChpbWFnZSk7XG4gICAgICAgIGF3YWl0IGltYWdlUHJvbWlzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEuYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoaW1hZ2UpO1xuICAgICAgfVxuICAgICAgZGF0YS5yZWZDb3VudGVyID0gMTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgZGF0YSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI2NhY2hlLnNldChrZXksIGRhdGEpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLiNjYWNoZS5zZXQoZGF0YS5pZCwgZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGFzeW5jIGdldEZyb21GaWxlKGZpbGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsYXN0TW9kaWZpZWQsXG4gICAgICBuYW1lLFxuICAgICAgc2l6ZSxcbiAgICAgIHR5cGVcbiAgICB9ID0gZmlsZTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0KGAke2xhc3RNb2RpZmllZH1fJHtuYW1lfV8ke3NpemV9XyR7dHlwZX1gLCBmaWxlKTtcbiAgfVxuICBhc3luYyBnZXRGcm9tVXJsKHVybCkge1xuICAgIHJldHVybiB0aGlzLiNnZXQodXJsLCB1cmwpO1xuICB9XG4gIGFzeW5jIGdldEZyb21JZChpZCkge1xuICAgIHRoaXMuI2NhY2hlIHx8PSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuI2NhY2hlLmdldChpZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRhdGEuYml0bWFwKSB7XG4gICAgICBkYXRhLnJlZkNvdW50ZXIgKz0gMTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAoZGF0YS5maWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGcm9tRmlsZShkYXRhLmZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRGcm9tVXJsKGRhdGEudXJsKTtcbiAgfVxuICBnZXRTdmdVcmwoaWQpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy4jY2FjaGUuZ2V0KGlkKTtcbiAgICBpZiAoIWRhdGE/LmlzU3ZnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEuc3ZnVXJsO1xuICB9XG4gIGRlbGV0ZUlkKGlkKSB7XG4gICAgdGhpcy4jY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy4jY2FjaGUuZ2V0KGlkKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YS5yZWZDb3VudGVyIC09IDE7XG4gICAgaWYgKGRhdGEucmVmQ291bnRlciAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLmJpdG1hcCA9IG51bGw7XG4gIH1cbiAgaXNWYWxpZElkKGlkKSB7XG4gICAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoYGltYWdlXyR7dGhpcy4jYmFzZUlkfV9gKTtcbiAgfVxufVxuY2xhc3MgQ29tbWFuZE1hbmFnZXIge1xuICAjY29tbWFuZHMgPSBbXTtcbiAgI2xvY2tlZCA9IGZhbHNlO1xuICAjbWF4U2l6ZTtcbiAgI3Bvc2l0aW9uID0gLTE7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCBtYXhTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxMjg7XG4gICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gIH1cbiAgYWRkKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIG11c3RFeGVjLFxuICAgICAgdHlwZSA9IE5hTixcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGUgPSBmYWxzZSxcbiAgICAgIGtlZXBVbmRvID0gZmFsc2VcbiAgICB9ID0gX3JlZjtcbiAgICBpZiAobXVzdEV4ZWMpIHtcbiAgICAgIGNtZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNhdmUgPSB7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgdHlwZVxuICAgIH07XG4gICAgaWYgKHRoaXMuI3Bvc2l0aW9uID09PSAtMSkge1xuICAgICAgaWYgKHRoaXMuI2NvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy4jY29tbWFuZHMubGVuZ3RoID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3Bvc2l0aW9uID0gMDtcbiAgICAgIHRoaXMuI2NvbW1hbmRzLnB1c2goc2F2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvdmVyd3JpdGVJZlNhbWVUeXBlICYmIHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXS50eXBlID09PSB0eXBlKSB7XG4gICAgICBpZiAoa2VlcFVuZG8pIHtcbiAgICAgICAgc2F2ZS51bmRvID0gdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dLnVuZG87XG4gICAgICB9XG4gICAgICB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0gPSBzYXZlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy4jcG9zaXRpb24gKyAxO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLiNtYXhTaXplKSB7XG4gICAgICB0aGlzLiNjb21tYW5kcy5zcGxpY2UoMCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI3Bvc2l0aW9uID0gbmV4dDtcbiAgICAgIGlmIChuZXh0IDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuI2NvbW1hbmRzLnNwbGljZShuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY29tbWFuZHMucHVzaChzYXZlKTtcbiAgfVxuICB1bmRvKCkge1xuICAgIGlmICh0aGlzLiNwb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0udW5kbygpO1xuICAgIHRoaXMuI2xvY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuI3Bvc2l0aW9uIC09IDE7XG4gIH1cbiAgcmVkbygpIHtcbiAgICBpZiAodGhpcy4jcG9zaXRpb24gPCB0aGlzLiNjb21tYW5kcy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLiNwb3NpdGlvbiArPSAxO1xuICAgICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXS5jbWQoKTtcbiAgICAgIHRoaXMuI2xvY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBoYXNTb21ldGhpbmdUb1VuZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uICE9PSAtMTtcbiAgfVxuICBoYXNTb21ldGhpbmdUb1JlZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uIDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoIC0gMTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2NvbW1hbmRzID0gbnVsbDtcbiAgfVxufVxuY2xhc3MgS2V5Ym9hcmRNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoY2FsbGJhY2tzKSB7XG4gICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmFsbEtleXMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMl9fLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGZvciAoY29uc3QgW2tleXMsIGNhbGxiYWNrLCBvcHRpb25zID0ge31dIG9mIGNhbGxiYWNrcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBpc01hY0tleSA9IGtleS5zdGFydHNXaXRoKFwibWFjK1wiKTtcbiAgICAgICAgaWYgKGlzTWFjICYmIGlzTWFjS2V5KSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0KGtleS5zbGljZSg0KSwge1xuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hbGxLZXlzLmFkZChrZXkuc3BsaXQoXCIrXCIpLmF0KC0xKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzTWFjICYmICFpc01hY0tleSkge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChrZXksIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQoa2V5LnNwbGl0KFwiK1wiKS5hdCgtMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNzZXJpYWxpemUoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwiYWx0XCIpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaChcImN0cmxcIik7XG4gICAgfVxuICAgIGlmIChldmVudC5tZXRhS2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwibWV0YVwiKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwic2hpZnRcIik7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyLnB1c2goZXZlbnQua2V5KTtcbiAgICBjb25zdCBzdHIgPSB0aGlzLmJ1ZmZlci5qb2luKFwiK1wiKTtcbiAgICB0aGlzLmJ1ZmZlci5sZW5ndGggPSAwO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgZXhlYyhzZWxmLCBldmVudCkge1xuICAgIGlmICghdGhpcy5hbGxLZXlzLmhhcyhldmVudC5rZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmNhbGxiYWNrcy5nZXQodGhpcy4jc2VyaWFsaXplKGV2ZW50KSk7XG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBidWJibGVzID0gZmFsc2UsXG4gICAgICAgIGFyZ3MgPSBbXSxcbiAgICAgICAgY2hlY2tlciA9IG51bGxcbiAgICAgIH1cbiAgICB9ID0gaW5mbztcbiAgICBpZiAoY2hlY2tlciAmJiAhY2hlY2tlcihzZWxmLCBldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGJhY2suYmluZChzZWxmLCAuLi5hcmdzLCBldmVudCkoKTtcbiAgICBpZiAoIWJ1YmJsZXMpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIENvbG9yTWFuYWdlciB7XG4gIHN0YXRpYyBfY29sb3JzTWFwcGluZyA9IG5ldyBNYXAoW1tcIkNhbnZhc1RleHRcIiwgWzAsIDAsIDBdXSwgW1wiQ2FudmFzXCIsIFsyNTUsIDI1NSwgMjU1XV1dKTtcbiAgZ2V0IF9jb2xvcnMoKSB7XG4gICAgY29uc3QgY29sb3JzID0gbmV3IE1hcChbW1wiQ2FudmFzVGV4dFwiLCBudWxsXSwgW1wiQ2FudmFzXCIsIG51bGxdXSk7XG4gICAgKDAsX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX18uZ2V0Q29sb3JWYWx1ZXMpKGNvbG9ycyk7XG4gICAgcmV0dXJuICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXy5zaGFkb3cpKHRoaXMsIFwiX2NvbG9yc1wiLCBjb2xvcnMpO1xuICB9XG4gIGNvbnZlcnQoY29sb3IpIHtcbiAgICBjb25zdCByZ2IgPSAoMCxfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5nZXRSR0IpKGNvbG9yKTtcbiAgICBpZiAoIXdpbmRvdy5tYXRjaE1lZGlhKFwiKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSlcIikubWF0Y2hlcykge1xuICAgICAgcmV0dXJuIHJnYjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbmFtZSwgUkdCXSBvZiB0aGlzLl9jb2xvcnMpIHtcbiAgICAgIGlmIChSR0IuZXZlcnkoKHgsIGkpID0+IHggPT09IHJnYltpXSkpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yTWFuYWdlci5fY29sb3JzTWFwcGluZy5nZXQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZ2I7XG4gIH1cbiAgZ2V0SGV4Q29kZShuYW1lKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fY29sb3JzLmdldChuYW1lKTtcbiAgICBpZiAoIXJnYikge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIHJldHVybiBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18uVXRpbC5tYWtlSGV4Q29sb3IoLi4ucmdiKTtcbiAgfVxufVxuY2xhc3MgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciB7XG4gICNhY3RpdmVFZGl0b3IgPSBudWxsO1xuICAjYWxsRWRpdG9ycyA9IG5ldyBNYXAoKTtcbiAgI2FsbExheWVycyA9IG5ldyBNYXAoKTtcbiAgI2FsdFRleHRNYW5hZ2VyID0gbnVsbDtcbiAgI2Fubm90YXRpb25TdG9yYWdlID0gbnVsbDtcbiAgI2NvbW1hbmRNYW5hZ2VyID0gbmV3IENvbW1hbmRNYW5hZ2VyKCk7XG4gICNjdXJyZW50UGFnZUluZGV4ID0gMDtcbiAgI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gICNkcmFnZ2luZ0VkaXRvcnMgPSBudWxsO1xuICAjZWRpdG9yVHlwZXMgPSBudWxsO1xuICAjZWRpdG9yc1RvUmVzY2FsZSA9IG5ldyBTZXQoKTtcbiAgI2ZpbHRlckZhY3RvcnkgPSBudWxsO1xuICAjZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gbnVsbDtcbiAgI2hpZ2hsaWdodENvbG9ycyA9IG51bGw7XG4gICNpZE1hbmFnZXIgPSBuZXcgSWRNYW5hZ2VyKCk7XG4gICNpc0VuYWJsZWQgPSBmYWxzZTtcbiAgI2lzV2FpdGluZyA9IGZhbHNlO1xuICAjbGFzdEFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAjbWFpbkhpZ2hsaWdodENvbG9yUGlja2VyID0gbnVsbDtcbiAgI21vZGUgPSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18uQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORTtcbiAgI3NlbGVjdGVkRWRpdG9ycyA9IG5ldyBTZXQoKTtcbiAgI3BhZ2VDb2xvcnMgPSBudWxsO1xuICAjYm91bmRCbHVyID0gdGhpcy5ibHVyLmJpbmQodGhpcyk7XG4gICNib3VuZEZvY3VzID0gdGhpcy5mb2N1cy5iaW5kKHRoaXMpO1xuICAjYm91bmRDb3B5ID0gdGhpcy5jb3B5LmJpbmQodGhpcyk7XG4gICNib3VuZEN1dCA9IHRoaXMuY3V0LmJpbmQodGhpcyk7XG4gICNib3VuZFBhc3RlID0gdGhpcy5wYXN0ZS5iaW5kKHRoaXMpO1xuICAjYm91bmRLZXlkb3duID0gdGhpcy5rZXlkb3duLmJpbmQodGhpcyk7XG4gICNib3VuZE9uRWRpdGluZ0FjdGlvbiA9IHRoaXMub25FZGl0aW5nQWN0aW9uLmJpbmQodGhpcyk7XG4gICNib3VuZE9uUGFnZUNoYW5naW5nID0gdGhpcy5vblBhZ2VDaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjYm91bmRPblNjYWxlQ2hhbmdpbmcgPSB0aGlzLm9uU2NhbGVDaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcgPSB0aGlzLm9uUm90YXRpb25DaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjcHJldmlvdXNTdGF0ZXMgPSB7XG4gICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICBpc0VtcHR5OiB0cnVlLFxuICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogZmFsc2UsXG4gICAgaGFzU29tZXRoaW5nVG9SZWRvOiBmYWxzZSxcbiAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2VcbiAgfTtcbiAgI3RyYW5zbGF0aW9uID0gWzAsIDBdO1xuICAjdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBudWxsO1xuICAjY29udGFpbmVyID0gbnVsbDtcbiAgI3ZpZXdlciA9IG51bGw7XG4gIHN0YXRpYyBUUkFOU0xBVEVfU01BTEwgPSAxO1xuICBzdGF0aWMgVFJBTlNMQVRFX0JJRyA9IDEwO1xuICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3QgcHJvdG8gPSBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLnByb3RvdHlwZTtcbiAgICBjb25zdCBhcnJvd0NoZWNrZXIgPSBzZWxmID0+IHtcbiAgICAgIHJldHVybiBzZWxmLiNjb250YWluZXIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lICE9PSBcIkJVVFRPTlwiICYmIHNlbGYuaGFzU29tZXRoaW5nVG9Db250cm9sKCk7XG4gICAgfTtcbiAgICBjb25zdCB0ZXh0SW5wdXRDaGVja2VyID0gKF9zZWxmLCBfcmVmMikgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgdGFyZ2V0OiBlbFxuICAgICAgfSA9IF9yZWYyO1xuICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdHlwZVxuICAgICAgICB9ID0gZWw7XG4gICAgICAgIHJldHVybiB0eXBlICE9PSBcInRleHRcIiAmJiB0eXBlICE9PSBcIm51bWJlclwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBzbWFsbCA9IHRoaXMuVFJBTlNMQVRFX1NNQUxMO1xuICAgIGNvbnN0IGJpZyA9IHRoaXMuVFJBTlNMQVRFX0JJRztcbiAgICByZXR1cm4gKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMl9fLnNoYWRvdykodGhpcywgXCJfa2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK2FcIiwgXCJtYWMrbWV0YSthXCJdLCBwcm90by5zZWxlY3RBbGwsIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrelwiLCBcIm1hYyttZXRhK3pcIl0sIHByb3RvLnVuZG8sIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwreVwiLCBcImN0cmwrc2hpZnQrelwiLCBcIm1hYyttZXRhK3NoaWZ0K3pcIiwgXCJjdHJsK3NoaWZ0K1pcIiwgXCJtYWMrbWV0YStzaGlmdCtaXCJdLCBwcm90by5yZWRvLCB7XG4gICAgICBjaGVja2VyOiB0ZXh0SW5wdXRDaGVja2VyXG4gICAgfV0sIFtbXCJCYWNrc3BhY2VcIiwgXCJhbHQrQmFja3NwYWNlXCIsIFwiY3RybCtCYWNrc3BhY2VcIiwgXCJzaGlmdCtCYWNrc3BhY2VcIiwgXCJtYWMrQmFja3NwYWNlXCIsIFwibWFjK2FsdCtCYWNrc3BhY2VcIiwgXCJtYWMrY3RybCtCYWNrc3BhY2VcIiwgXCJEZWxldGVcIiwgXCJjdHJsK0RlbGV0ZVwiLCBcInNoaWZ0K0RlbGV0ZVwiLCBcIm1hYytEZWxldGVcIl0sIHByb3RvLmRlbGV0ZSwge1xuICAgICAgY2hlY2tlcjogdGV4dElucHV0Q2hlY2tlclxuICAgIH1dLCBbW1wiRW50ZXJcIiwgXCJtYWMrRW50ZXJcIl0sIHByb3RvLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCwge1xuICAgICAgY2hlY2tlcjogKHNlbGYsIF9yZWYzKSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdGFyZ2V0OiBlbFxuICAgICAgICB9ID0gX3JlZjM7XG4gICAgICAgIHJldHVybiAhKGVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpICYmIHNlbGYuI2NvbnRhaW5lci5jb250YWlucyhlbCkgJiYgIXNlbGYuaXNFbnRlckhhbmRsZWQ7XG4gICAgICB9XG4gICAgfV0sIFtbXCIgXCIsIFwibWFjKyBcIl0sIHByb3RvLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCwge1xuICAgICAgY2hlY2tlcjogc2VsZiA9PiBzZWxmLiNjb250YWluZXIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICB9XSwgW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHByb3RvLnVuc2VsZWN0QWxsXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWy1zbWFsbCwgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbLWJpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93UmlnaHRcIiwgXCJtYWMrc2hpZnQrQXJyb3dSaWdodFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbYmlnLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCAtc21hbGxdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbMCwgLWJpZ10sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWzAsIHNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCBiaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV1dKSk7XG4gIH1cbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCB2aWV3ZXIsIGFsdFRleHRNYW5hZ2VyLCBldmVudEJ1cywgcGRmRG9jdW1lbnQsIHBhZ2VDb2xvcnMsIGhpZ2hsaWdodENvbG9ycykge1xuICAgIHRoaXMuI2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiN2aWV3ZXIgPSB2aWV3ZXI7XG4gICAgdGhpcy4jYWx0VGV4dE1hbmFnZXIgPSBhbHRUZXh0TWFuYWdlcjtcbiAgICB0aGlzLl9ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcImVkaXRpbmdhY3Rpb25cIiwgdGhpcy4jYm91bmRPbkVkaXRpbmdBY3Rpb24pO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcInBhZ2VjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUGFnZUNoYW5naW5nKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb24oXCJzY2FsZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25TY2FsZUNoYW5naW5nKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb24oXCJyb3RhdGlvbmNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25Sb3RhdGlvbkNoYW5naW5nKTtcbiAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZSA9IHBkZkRvY3VtZW50LmFubm90YXRpb25TdG9yYWdlO1xuICAgIHRoaXMuI2ZpbHRlckZhY3RvcnkgPSBwZGZEb2N1bWVudC5maWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuI3BhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuICAgIHRoaXMuI2hpZ2hsaWdodENvbG9ycyA9IGhpZ2hsaWdodENvbG9ycyB8fCBudWxsO1xuICAgIHRoaXMudmlld1BhcmFtZXRlcnMgPSB7XG4gICAgICByZWFsU2NhbGU6IF9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyxcbiAgICAgIHJvdGF0aW9uOiAwXG4gICAgfTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI3JlbW92ZUtleWJvYXJkTWFuYWdlcigpO1xuICAgIHRoaXMuI3JlbW92ZUZvY3VzTWFuYWdlcigpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJlZGl0aW5nYWN0aW9uXCIsIHRoaXMuI2JvdW5kT25FZGl0aW5nQWN0aW9uKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb2ZmKFwicGFnZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25QYWdlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJzY2FsZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25TY2FsZUNoYW5naW5nKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb2ZmKFwicm90YXRpb25jaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUm90YXRpb25DaGFuZ2luZyk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGxheWVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy4jYWxsTGF5ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy4jYWxsRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUuY2xlYXIoKTtcbiAgICB0aGlzLiNhY3RpdmVFZGl0b3IgPSBudWxsO1xuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLiNhbHRUZXh0TWFuYWdlcj8uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBnZXQgaGNtRmlsdGVyKCkge1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18uc2hhZG93KSh0aGlzLCBcImhjbUZpbHRlclwiLCB0aGlzLiNwYWdlQ29sb3JzID8gdGhpcy4jZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy4jcGFnZUNvbG9ycy5mb3JlZ3JvdW5kLCB0aGlzLiNwYWdlQ29sb3JzLmJhY2tncm91bmQpIDogXCJub25lXCIpO1xuICB9XG4gIGdldCBkaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXy5zaGFkb3cpKHRoaXMsIFwiZGlyZWN0aW9uXCIsIGdldENvbXB1dGVkU3R5bGUodGhpcy4jY29udGFpbmVyKS5kaXJlY3Rpb24pO1xuICB9XG4gIGdldCBoaWdobGlnaHRDb2xvcnMoKSB7XG4gICAgcmV0dXJuICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXy5zaGFkb3cpKHRoaXMsIFwiaGlnaGxpZ2h0Q29sb3JzXCIsIHRoaXMuI2hpZ2hsaWdodENvbG9ycyA/IG5ldyBNYXAodGhpcy4jaGlnaGxpZ2h0Q29sb3JzLnNwbGl0KFwiLFwiKS5tYXAocGFpciA9PiBwYWlyLnNwbGl0KFwiPVwiKS5tYXAoeCA9PiB4LnRyaW0oKSkpKSA6IG51bGwpO1xuICB9XG4gIHNldE1haW5IaWdobGlnaHRDb2xvclBpY2tlcihjb2xvclBpY2tlcikge1xuICAgIHRoaXMuI21haW5IaWdobGlnaHRDb2xvclBpY2tlciA9IGNvbG9yUGlja2VyO1xuICB9XG4gIGVkaXRBbHRUZXh0KGVkaXRvcikge1xuICAgIHRoaXMuI2FsdFRleHRNYW5hZ2VyPy5lZGl0QWx0VGV4dCh0aGlzLCBlZGl0b3IpO1xuICB9XG4gIG9uUGFnZUNoYW5naW5nKF9yZWY0KSB7XG4gICAgbGV0IHtcbiAgICAgIHBhZ2VOdW1iZXJcbiAgICB9ID0gX3JlZjQ7XG4gICAgdGhpcy4jY3VycmVudFBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxO1xuICB9XG4gIGZvY3VzTWFpbkNvbnRhaW5lcigpIHtcbiAgICB0aGlzLiNjb250YWluZXIuZm9jdXMoKTtcbiAgfVxuICBmaW5kUGFyZW50KHgsIHkpIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiBsYXllclgsXG4gICAgICAgIHk6IGxheWVyWSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSA9IGxheWVyLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh4ID49IGxheWVyWCAmJiB4IDw9IGxheWVyWCArIHdpZHRoICYmIHkgPj0gbGF5ZXJZICYmIHkgPD0gbGF5ZXJZICsgaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZGlzYWJsZVVzZXJTZWxlY3QoKSB7XG4gICAgbGV0IHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB0aGlzLiN2aWV3ZXIuY2xhc3NMaXN0LnRvZ2dsZShcIm5vVXNlclNlbGVjdFwiLCB2YWx1ZSk7XG4gIH1cbiAgYWRkU2hvdWxkUmVzY2FsZShlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3JzVG9SZXNjYWxlLmFkZChlZGl0b3IpO1xuICB9XG4gIHJlbW92ZVNob3VsZFJlc2NhbGUoZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5kZWxldGUoZWRpdG9yKTtcbiAgfVxuICBvblNjYWxlQ2hhbmdpbmcoX3JlZjUpIHtcbiAgICBsZXQge1xuICAgICAgc2NhbGVcbiAgICB9ID0gX3JlZjU7XG4gICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIHRoaXMudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlID0gc2NhbGUgKiBfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXy5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFM7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZSkge1xuICAgICAgZWRpdG9yLm9uU2NhbGVDaGFuZ2luZygpO1xuICAgIH1cbiAgfVxuICBvblJvdGF0aW9uQ2hhbmdpbmcoX3JlZjYpIHtcbiAgICBsZXQge1xuICAgICAgcGFnZXNSb3RhdGlvblxuICAgIH0gPSBfcmVmNjtcbiAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgdGhpcy52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiA9IHBhZ2VzUm90YXRpb247XG4gIH1cbiAgYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlZGl0b3IpIHtcbiAgICBpZiAoIWVkaXRvci5pc0VtcHR5KCkgJiYgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2UgJiYgIXRoaXMuI2Fubm90YXRpb25TdG9yYWdlLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZShlZGl0b3IuaWQsIGVkaXRvcik7XG4gICAgfVxuICB9XG4gICNhZGRGb2N1c01hbmFnZXIoKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEZvY3VzKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy4jYm91bmRCbHVyKTtcbiAgfVxuICAjcmVtb3ZlRm9jdXNNYW5hZ2VyKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jYm91bmRGb2N1cyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kQmx1cik7XG4gIH1cbiAgYmx1cigpIHtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFjdGl2ZUVsZW1lbnRcbiAgICB9ID0gZG9jdW1lbnQ7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBpZiAoZWRpdG9yLmRpdi5jb250YWlucyhhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLiNsYXN0QWN0aXZlRWxlbWVudCA9IFtlZGl0b3IsIGFjdGl2ZUVsZW1lbnRdO1xuICAgICAgICBlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLiNsYXN0QWN0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbbGFzdEVkaXRvciwgbGFzdEFjdGl2ZUVsZW1lbnRdID0gdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgIGxhc3RBY3RpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsICgpID0+IHtcbiAgICAgIGxhc3RFZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IHRydWU7XG4gICAgfSwge1xuICAgICAgb25jZTogdHJ1ZVxuICAgIH0pO1xuICAgIGxhc3RBY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cbiAgI2FkZEtleWJvYXJkTWFuYWdlcigpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlkb3duKTtcbiAgfVxuICAjcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24pO1xuICB9XG4gICNhZGRDb3B5UGFzdGVMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgdGhpcy4jYm91bmRDb3B5KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY3V0XCIsIHRoaXMuI2JvdW5kQ3V0KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRQYXN0ZSk7XG4gIH1cbiAgI3JlbW92ZUNvcHlQYXN0ZUxpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29weVwiLCB0aGlzLiNib3VuZENvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgdGhpcy4jYm91bmRDdXQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCB0aGlzLiNib3VuZFBhc3RlKTtcbiAgfVxuICBhZGRFZGl0TGlzdGVuZXJzKCkge1xuICAgIHRoaXMuI2FkZEtleWJvYXJkTWFuYWdlcigpO1xuICAgIHRoaXMuI2FkZENvcHlQYXN0ZUxpc3RlbmVycygpO1xuICB9XG4gIHJlbW92ZUVkaXRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy4jcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCk7XG4gICAgdGhpcy4jcmVtb3ZlQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gIH1cbiAgY29weShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy4jYWN0aXZlRWRpdG9yPy5jb21taXRPclJlbW92ZSgpO1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9ycyA9IFtdO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IGVkaXRvci5zZXJpYWxpemUodHJ1ZSk7XG4gICAgICBpZiAoc2VyaWFsaXplZCkge1xuICAgICAgICBlZGl0b3JzLnB1c2goc2VyaWFsaXplZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlZGl0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJhcHBsaWNhdGlvbi9wZGZqc1wiLCBKU09OLnN0cmluZ2lmeShlZGl0b3JzKSk7XG4gIH1cbiAgY3V0KGV2ZW50KSB7XG4gICAgdGhpcy5jb3B5KGV2ZW50KTtcbiAgICB0aGlzLmRlbGV0ZSgpO1xuICB9XG4gIHBhc3RlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjbGlwYm9hcmREYXRhXG4gICAgfSA9IGV2ZW50O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjbGlwYm9hcmREYXRhLml0ZW1zKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgICAgaWYgKGVkaXRvclR5cGUuaXNIYW5kbGluZ01pbWVGb3JQYXN0aW5nKGl0ZW0udHlwZSkpIHtcbiAgICAgICAgICBlZGl0b3JUeXBlLnBhc3RlKGl0ZW0sIHRoaXMuY3VycmVudExheWVyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGRhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJhcHBsaWNhdGlvbi9wZGZqc1wiKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18ud2FybikoYHBhc3RlOiBcIiR7ZXgubWVzc2FnZX1cIi5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuY3VycmVudExheWVyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuZXdFZGl0b3JzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZEVkaXRvciA9IGxheWVyLmRlc2VyaWFsaXplKGVkaXRvcik7XG4gICAgICAgIGlmICghZGVzZXJpYWxpemVkRWRpdG9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5ld0VkaXRvcnMucHVzaChkZXNlcmlhbGl6ZWRFZGl0b3IpO1xuICAgICAgfVxuICAgICAgY29uc3QgY21kID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBuZXdFZGl0b3JzKSB7XG4gICAgICAgICAgdGhpcy4jYWRkRWRpdG9yVG9MYXllcihlZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NlbGVjdEVkaXRvcnMobmV3RWRpdG9ycyk7XG4gICAgICB9O1xuICAgICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgbmV3RWRpdG9ycykge1xuICAgICAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICBjbWQsXG4gICAgICAgIHVuZG8sXG4gICAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMl9fLndhcm4pKGBwYXN0ZTogXCIke2V4Lm1lc3NhZ2V9XCIuYCk7XG4gICAgfVxuICB9XG4gIGtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNFZGl0b3JIYW5kbGluZ0tleWJvYXJkKSB7XG4gICAgICBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gICAgfVxuICB9XG4gIG9uRWRpdGluZ0FjdGlvbihkZXRhaWxzKSB7XG4gICAgaWYgKFtcInVuZG9cIiwgXCJyZWRvXCIsIFwiZGVsZXRlXCIsIFwic2VsZWN0QWxsXCJdLmluY2x1ZGVzKGRldGFpbHMubmFtZSkpIHtcbiAgICAgIHRoaXNbZGV0YWlscy5uYW1lXSgpO1xuICAgIH1cbiAgfVxuICAjZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoZGV0YWlscykge1xuICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBPYmplY3QuZW50cmllcyhkZXRhaWxzKS5zb21lKF9yZWY3ID0+IHtcbiAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBfcmVmNztcbiAgICAgIHJldHVybiB0aGlzLiNwcmV2aW91c1N0YXRlc1trZXldICE9PSB2YWx1ZTtcbiAgICB9KTtcbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9yc3RhdGVzY2hhbmdlZFwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgZGV0YWlsczogT2JqZWN0LmFzc2lnbih0aGlzLiNwcmV2aW91c1N0YXRlcywgZGV0YWlscylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAjZGlzcGF0Y2hVcGRhdGVVSShkZXRhaWxzKSB7XG4gICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9ycGFyYW1zY2hhbmdlZFwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBkZXRhaWxzXG4gICAgfSk7XG4gIH1cbiAgc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZykge1xuICAgIGlmIChpc0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuI2FkZEZvY3VzTWFuYWdlcigpO1xuICAgICAgdGhpcy4jYWRkS2V5Ym9hcmRNYW5hZ2VyKCk7XG4gICAgICB0aGlzLiNhZGRDb3B5UGFzdGVMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgICAgaXNFZGl0aW5nOiB0aGlzLiNtb2RlICE9PSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18uQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSxcbiAgICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpLFxuICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvUmVkbygpLFxuICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNyZW1vdmVGb2N1c01hbmFnZXIoKTtcbiAgICAgIHRoaXMuI3JlbW92ZUtleWJvYXJkTWFuYWdlcigpO1xuICAgICAgdGhpcy4jcmVtb3ZlQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgIGlzRWRpdGluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kaXNhYmxlVXNlclNlbGVjdChmYWxzZSk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyRWRpdG9yVHlwZXModHlwZXMpIHtcbiAgICBpZiAodGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZWRpdG9yVHlwZXMgPSB0eXBlcztcbiAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yVHlwZS5kZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB9XG4gIH1cbiAgZ2V0SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkTWFuYWdlci5nZXRJZCgpO1xuICB9XG4gIGdldCBjdXJyZW50TGF5ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FsbExheWVycy5nZXQodGhpcy4jY3VycmVudFBhZ2VJbmRleCk7XG4gIH1cbiAgZ2V0TGF5ZXIocGFnZUluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuI2FsbExheWVycy5nZXQocGFnZUluZGV4KTtcbiAgfVxuICBnZXQgY3VycmVudFBhZ2VJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudFBhZ2VJbmRleDtcbiAgfVxuICBhZGRMYXllcihsYXllcikge1xuICAgIHRoaXMuI2FsbExheWVycy5zZXQobGF5ZXIucGFnZUluZGV4LCBsYXllcik7XG4gICAgaWYgKHRoaXMuI2lzRW5hYmxlZCkge1xuICAgICAgbGF5ZXIuZW5hYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlTGF5ZXIobGF5ZXIpIHtcbiAgICB0aGlzLiNhbGxMYXllcnMuZGVsZXRlKGxheWVyLnBhZ2VJbmRleCk7XG4gIH1cbiAgdXBkYXRlTW9kZShtb2RlKSB7XG4gICAgbGV0IGVkaXRJZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICBsZXQgaXNGcm9tS2V5Ym9hcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgIGlmICh0aGlzLiNtb2RlID09PSBtb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI21vZGUgPSBtb2RlO1xuICAgIGlmIChtb2RlID09PSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18uQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUoZmFsc2UpO1xuICAgICAgdGhpcy4jZGlzYWJsZUFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcbiAgICB0aGlzLiNlbmFibGVBbGwoKTtcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGxheWVyLnVwZGF0ZU1vZGUobW9kZSk7XG4gICAgfVxuICAgIGlmICghZWRpdElkICYmIGlzRnJvbUtleWJvYXJkKSB7XG4gICAgICB0aGlzLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWVkaXRJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPT09IGVkaXRJZCkge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGVkaXRvcik7XG4gICAgICAgIGVkaXRvci5lbnRlckluRWRpdE1vZGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFkZE5ld0VkaXRvckZyb21LZXlib2FyZCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5ZXIuY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSkge1xuICAgICAgdGhpcy5jdXJyZW50TGF5ZXIuYWRkTmV3RWRpdG9yKCk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVRvb2xiYXIobW9kZSkge1xuICAgIGlmIChtb2RlID09PSB0aGlzLiNtb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgbW9kZVxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXy5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5DUkVBVEU6XG4gICAgICAgIHRoaXMuY3VycmVudExheWVyLmFkZE5ld0VkaXRvcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXy5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfREVGQVVMVF9DT0xPUjpcbiAgICAgICAgdGhpcy4jbWFpbkhpZ2hsaWdodENvbG9yUGlja2VyPy51cGRhdGVDb2xvcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci51cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIGVkaXRvclR5cGUudXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIGVuYWJsZVdhaXRpbmcoKSB7XG4gICAgbGV0IG11c3RXYWl0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBpZiAodGhpcy4jaXNXYWl0aW5nID09PSBtdXN0V2FpdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNpc1dhaXRpbmcgPSBtdXN0V2FpdDtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKG11c3RXYWl0KSB7XG4gICAgICAgIGxheWVyLmRpc2FibGVDbGljaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGF5ZXIuZW5hYmxlQ2xpY2soKTtcbiAgICAgIH1cbiAgICAgIGxheWVyLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwid2FpdGluZ1wiLCBtdXN0V2FpdCk7XG4gICAgfVxuICB9XG4gICNlbmFibGVBbGwoKSB7XG4gICAgaWYgKCF0aGlzLiNpc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuI2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgICBsYXllci5lbmFibGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2Rpc2FibGVBbGwoKSB7XG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuICAgIGlmICh0aGlzLiNpc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuI2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgICAgbGF5ZXIuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXRFZGl0b3JzKHBhZ2VJbmRleCkge1xuICAgIGNvbnN0IGVkaXRvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLnBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7XG4gICAgICAgIGVkaXRvcnMucHVzaChlZGl0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWRpdG9ycztcbiAgfVxuICBnZXRFZGl0b3IoaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsRWRpdG9ycy5nZXQoaWQpO1xuICB9XG4gIGFkZEVkaXRvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNhbGxFZGl0b3JzLnNldChlZGl0b3IuaWQsIGVkaXRvcik7XG4gIH1cbiAgcmVtb3ZlRWRpdG9yKGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IuZGl2LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICBpZiAodGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXNNYWluQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgdGhpcy4jYWxsRWRpdG9ycy5kZWxldGUoZWRpdG9yLmlkKTtcbiAgICB0aGlzLnVuc2VsZWN0KGVkaXRvcik7XG4gICAgaWYgKCFlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCB8fCAhdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5oYXMoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpKSB7XG4gICAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZT8ucmVtb3ZlKGVkaXRvci5pZCk7XG4gICAgfVxuICB9XG4gIGFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpIHtcbiAgICB0aGlzLiNkZWxldGVkQW5ub3RhdGlvbnNFbGVtZW50SWRzLmFkZChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gICAgZWRpdG9yLmRlbGV0ZWQgPSB0cnVlO1xuICB9XG4gIGlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5oYXMoYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gIH1cbiAgcmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvcikge1xuICAgIHRoaXMuI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMuZGVsZXRlKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICBlZGl0b3IuZGVsZXRlZCA9IGZhbHNlO1xuICB9XG4gICNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcikge1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy4jYWxsTGF5ZXJzLmdldChlZGl0b3IucGFnZUluZGV4KTtcbiAgICBpZiAobGF5ZXIpIHtcbiAgICAgIGxheWVyLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBzZXRBY3RpdmVFZGl0b3IoZWRpdG9yKSB7XG4gICAgaWYgKHRoaXMuI2FjdGl2ZUVkaXRvciA9PT0gZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FjdGl2ZUVkaXRvciA9IGVkaXRvcjtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgIH1cbiAgfVxuICB0b2dnbGVTZWxlY3RlZChlZGl0b3IpIHtcbiAgICBpZiAodGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmhhcyhlZGl0b3IpKSB7XG4gICAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuZGVsZXRlKGVkaXRvcik7XG4gICAgICBlZGl0b3IudW5zZWxlY3QoKTtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuICAgIGVkaXRvci5zZWxlY3QoKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgc2V0U2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgZm9yIChjb25zdCBlZCBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGlmIChlZCAhPT0gZWRpdG9yKSB7XG4gICAgICAgIGVkLnVuc2VsZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5hZGQoZWRpdG9yKTtcbiAgICBlZGl0b3Iuc2VsZWN0KCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGlzU2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5oYXMoZWRpdG9yKTtcbiAgfVxuICBnZXQgZmlyc3RTZWxlY3RlZEVkaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgfVxuICB1bnNlbGVjdChlZGl0b3IpIHtcbiAgICBlZGl0b3IudW5zZWxlY3QoKTtcbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuZGVsZXRlKGVkaXRvcik7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGhhc1NlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnNpemUgIT09IDA7XG4gIH1cbiAgZ2V0IGlzRW50ZXJIYW5kbGVkKCkge1xuICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuc2l6ZSA9PT0gMSAmJiB0aGlzLmZpcnN0U2VsZWN0ZWRFZGl0b3IuaXNFbnRlckhhbmRsZWQ7XG4gIH1cbiAgdW5kbygpIHtcbiAgICB0aGlzLiNjb21tYW5kTWFuYWdlci51bmRvKCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1VuZG8oKSxcbiAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogdHJ1ZSxcbiAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKVxuICAgIH0pO1xuICB9XG4gIHJlZG8oKSB7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIucmVkbygpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdHJ1ZSxcbiAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KClcbiAgICB9KTtcbiAgfVxuICBhZGRDb21tYW5kcyhwYXJhbXMpIHtcbiAgICB0aGlzLiNjb21tYW5kTWFuYWdlci5hZGQocGFyYW1zKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRydWUsXG4gICAgICBoYXNTb21ldGhpbmdUb1JlZG86IGZhbHNlLFxuICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpXG4gICAgfSk7XG4gIH1cbiAgI2lzRW1wdHkoKSB7XG4gICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLnNpemUgPT09IDEpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRvci5pc0VtcHR5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBkZWxldGUoKSB7XG4gICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9ycyA9IFsuLi50aGlzLiNzZWxlY3RlZEVkaXRvcnNdO1xuICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgdGhpcy4jYWRkRWRpdG9yVG9MYXllcihlZGl0b3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICB9KTtcbiAgfVxuICBjb21taXRPclJlbW92ZSgpIHtcbiAgICB0aGlzLiNhY3RpdmVFZGl0b3I/LmNvbW1pdE9yUmVtb3ZlKCk7XG4gIH1cbiAgaGFzU29tZXRoaW5nVG9Db250cm9sKCkge1xuICAgIHJldHVybiB0aGlzLiNhY3RpdmVFZGl0b3IgfHwgdGhpcy5oYXNTZWxlY3Rpb247XG4gIH1cbiAgI3NlbGVjdEVkaXRvcnMoZWRpdG9ycykge1xuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuICAgICAgZWRpdG9yLnNlbGVjdCgpO1xuICAgIH1cbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHNlbGVjdEFsbCgpIHtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci5jb21taXQoKTtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0RWRpdG9ycyh0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKTtcbiAgfVxuICB1bnNlbGVjdEFsbCgpIHtcbiAgICBpZiAodGhpcy4jYWN0aXZlRWRpdG9yKSB7XG4gICAgICB0aGlzLiNhY3RpdmVFZGl0b3IuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgIGlmICh0aGlzLiNtb2RlICE9PSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18uQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBlZGl0b3IudW5zZWxlY3QoKTtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IGZhbHNlXG4gICAgfSk7XG4gIH1cbiAgdHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzKHgsIHkpIHtcbiAgICBsZXQgbm9Db21taXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgIGlmICghbm9Db21taXQpIHtcbiAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiN0cmFuc2xhdGlvblswXSArPSB4O1xuICAgIHRoaXMuI3RyYW5zbGF0aW9uWzFdICs9IHk7XG4gICAgY29uc3QgW3RvdGFsWCwgdG90YWxZXSA9IHRoaXMuI3RyYW5zbGF0aW9uO1xuICAgIGNvbnN0IGVkaXRvcnMgPSBbLi4udGhpcy4jc2VsZWN0ZWRFZGl0b3JzXTtcbiAgICBjb25zdCBUSU1FX1RPX1dBSVQgPSAxMDAwO1xuICAgIGlmICh0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKTtcbiAgICB9XG4gICAgdGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkID0gbnVsbDtcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uWzBdID0gdGhpcy4jdHJhbnNsYXRpb25bMV0gPSAwO1xuICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICAgICAgICAgIGVkaXRvci50cmFuc2xhdGVJblBhZ2UodG90YWxYLCB0b3RhbFkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICAgICAgICAgIGVkaXRvci50cmFuc2xhdGVJblBhZ2UoLXRvdGFsWCwgLXRvdGFsWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtdXN0RXhlYzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0sIFRJTUVfVE9fV0FJVCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgZWRpdG9yLnRyYW5zbGF0ZUluUGFnZSh4LCB5KTtcbiAgICB9XG4gIH1cbiAgc2V0VXBEcmFnU2Vzc2lvbigpIHtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVVzZXJTZWxlY3QodHJ1ZSk7XG4gICAgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzLnNldChlZGl0b3IsIHtcbiAgICAgICAgc2F2ZWRYOiBlZGl0b3IueCxcbiAgICAgICAgc2F2ZWRZOiBlZGl0b3IueSxcbiAgICAgICAgc2F2ZWRQYWdlSW5kZXg6IGVkaXRvci5wYWdlSW5kZXgsXG4gICAgICAgIG5ld1g6IDAsXG4gICAgICAgIG5ld1k6IDAsXG4gICAgICAgIG5ld1BhZ2VJbmRleDogLTFcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBlbmREcmFnU2Vzc2lvbigpIHtcbiAgICBpZiAoIXRoaXMuI2RyYWdnaW5nRWRpdG9ycykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVVc2VyU2VsZWN0KGZhbHNlKTtcbiAgICBjb25zdCBtYXAgPSB0aGlzLiNkcmFnZ2luZ0VkaXRvcnM7XG4gICAgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzID0gbnVsbDtcbiAgICBsZXQgbXVzdEJlQWRkZWRJblVuZG9TdGFjayA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW3tcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgcGFnZUluZGV4XG4gICAgfSwgdmFsdWVdIG9mIG1hcCkge1xuICAgICAgdmFsdWUubmV3WCA9IHg7XG4gICAgICB2YWx1ZS5uZXdZID0geTtcbiAgICAgIHZhbHVlLm5ld1BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICAgIG11c3RCZUFkZGVkSW5VbmRvU3RhY2sgfHw9IHggIT09IHZhbHVlLnNhdmVkWCB8fCB5ICE9PSB2YWx1ZS5zYXZlZFkgfHwgcGFnZUluZGV4ICE9PSB2YWx1ZS5zYXZlZFBhZ2VJbmRleDtcbiAgICB9XG4gICAgaWYgKCFtdXN0QmVBZGRlZEluVW5kb1N0YWNrKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG1vdmUgPSAoZWRpdG9yLCB4LCB5LCBwYWdlSW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuI2FsbExheWVycy5nZXQocGFnZUluZGV4KTtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIGVkaXRvci5fc2V0UGFyZW50QW5kUG9zaXRpb24ocGFyZW50LCB4LCB5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGl0b3IucGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgICAgICAgIGVkaXRvci54ID0geDtcbiAgICAgICAgICBlZGl0b3IueSA9IHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2VkaXRvciwge1xuICAgICAgICAgIG5ld1gsXG4gICAgICAgICAgbmV3WSxcbiAgICAgICAgICBuZXdQYWdlSW5kZXhcbiAgICAgICAgfV0gb2YgbWFwKSB7XG4gICAgICAgICAgbW92ZShlZGl0b3IsIG5ld1gsIG5ld1ksIG5ld1BhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2VkaXRvciwge1xuICAgICAgICAgIHNhdmVkWCxcbiAgICAgICAgICBzYXZlZFksXG4gICAgICAgICAgc2F2ZWRQYWdlSW5kZXhcbiAgICAgICAgfV0gb2YgbWFwKSB7XG4gICAgICAgICAgbW92ZShlZGl0b3IsIHNhdmVkWCwgc2F2ZWRZLCBzYXZlZFBhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtdXN0RXhlYzogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRyYWdTZWxlY3RlZEVkaXRvcnModHgsIHR5KSB7XG4gICAgaWYgKCF0aGlzLiNkcmFnZ2luZ0VkaXRvcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzLmtleXMoKSkge1xuICAgICAgZWRpdG9yLmRyYWcodHgsIHR5KTtcbiAgICB9XG4gIH1cbiAgcmVidWlsZChlZGl0b3IpIHtcbiAgICBpZiAoZWRpdG9yLnBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5nZXRMYXllcihlZGl0b3IucGFnZUluZGV4KTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LmNoYW5nZVBhcmVudChlZGl0b3IpO1xuICAgICAgICBwYXJlbnQuYWRkT3JSZWJ1aWxkKGVkaXRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgICAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKTtcbiAgICAgICAgZWRpdG9yLnJlYnVpbGQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdG9yLnBhcmVudC5hZGRPclJlYnVpbGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzRWRpdG9ySGFuZGxpbmdLZXlib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmUoKT8uc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB8fCB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuc2l6ZSA9PT0gMSAmJiB0aGlzLmZpcnN0U2VsZWN0ZWRFZGl0b3Iuc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKTtcbiAgfVxuICBpc0FjdGl2ZShlZGl0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4jYWN0aXZlRWRpdG9yID09PSBlZGl0b3I7XG4gIH1cbiAgZ2V0QWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLiNhY3RpdmVFZGl0b3I7XG4gIH1cbiAgZ2V0TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbW9kZTtcbiAgfVxuICBnZXQgaW1hZ2VNYW5hZ2VyKCkge1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18uc2hhZG93KSh0aGlzLCBcImltYWdlTWFuYWdlclwiLCBuZXcgSW1hZ2VNYW5hZ2VyKCkpO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDUxNzE6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFBERkZldGNoU3RyZWFtOiAoKSA9PiAoLyogYmluZGluZyAqLyBQREZGZXRjaFN0cmVhbSlcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgzNyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5ODAzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfc2V0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNDcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19yZXZlcnNlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTk1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjAyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2FycmF5X2J1ZmZlcl9kZXRhY2hlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX3RyYW5zZmVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzMDUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX3RyYW5zZmVyX3RvX2ZpeGVkX2xlbmd0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTgzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjI2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9uZXR3b3JrX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MjUzKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbjtcbmZ1bmN0aW9uIGNyZWF0ZUZldGNoT3B0aW9ucyhoZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHMsIGFib3J0Q29udHJvbGxlcikge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBoZWFkZXJzLFxuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBtb2RlOiBcImNvcnNcIixcbiAgICBjcmVkZW50aWFsczogd2l0aENyZWRlbnRpYWxzID8gXCJpbmNsdWRlXCIgOiBcInNhbWUtb3JpZ2luXCIsXG4gICAgcmVkaXJlY3Q6IFwiZm9sbG93XCJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnMoaHR0cEhlYWRlcnMpIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaHR0cEhlYWRlcnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0dHBIZWFkZXJzW3Byb3BlcnR5XTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGhlYWRlcnMuYXBwZW5kKHByb3BlcnR5LCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gdmFsLmJ1ZmZlcjtcbiAgfVxuICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy53YXJuKShgZ2V0QXJyYXlCdWZmZXIgLSB1bmV4cGVjdGVkIGRhdGEgZm9ybWF0OiAke3ZhbH1gKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCkuYnVmZmVyO1xufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuICB9XG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERkZldGNoU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmVhZGVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9XG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSB7XG4gICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICB9XG59XG5jbGFzcyBQREZGZXRjaFN0cmVhbVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTtcbiAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG4gICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghKDAsX25ldHdvcmtfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18udmFsaWRhdGVSZXNwb25zZVN0YXR1cykocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICB0aHJvdyAoMCxfbmV0d29ya191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXy5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKShyZXNwb25zZS5zdGF0dXMsIHVybCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KG5hbWUpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgICBzdWdnZXN0ZWRMZW5ndGhcbiAgICAgIH0gPSAoMCxfbmV0d29ya191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgaXNIdHRwOiB0aGlzLl9zdHJlYW0uaXNIdHRwLFxuICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7XG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLF9uZXR3b3JrX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGdldFJlc3BvbnNlSGVhZGVyKTtcbiAgICAgIGlmICghdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLmNhbmNlbChuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLkFib3J0RXhjZXB0aW9uKFwiU3RyZWFtaW5nIGlzIGRpc2FibGVkLlwiKSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2godGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGRvbmVcbiAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRvbmVcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLFxuICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGhcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGdldEFycmF5QnVmZmVyKHZhbHVlKSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fcmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBzb3VyY2Uud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuICAgIHRoaXMuX2hlYWRlcnMuYXBwZW5kKFwiUmFuZ2VcIiwgYGJ5dGVzPSR7YmVnaW59LSR7ZW5kIC0gMX1gKTtcbiAgICBjb25zdCB1cmwgPSBzb3VyY2UudXJsO1xuICAgIGZldGNoKHVybCwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAoISgwLF9uZXR3b3JrX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgdGhyb3cgKDAsX25ldHdvcmtfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18uY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICB9KS5jYXRjaCh0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWUsXG4gICAgICBkb25lXG4gICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb25lXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogZ2V0QXJyYXlCdWZmZXIodmFsdWUpLFxuICAgICAgZG9uZTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9yZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDM3NDI6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEZvbnRGYWNlT2JqZWN0OiAoKSA9PiAoLyogYmluZGluZyAqLyBGb250RmFjZU9iamVjdCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEZvbnRMb2FkZXI6ICgpID0+ICgvKiBiaW5kaW5nICovIEZvbnRMb2FkZXIpXG4vKiBoYXJtb255IGV4cG9ydCAqLyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9kaWZmZXJlbmNlX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1NjEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2ludGVyc2VjdGlvbl92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTg3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9pc19kaXNqb2ludF9mcm9tX3YyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNDcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfc2V0X2lzX3N1YnNldF9vZl92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzAyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9pc19zdXBlcnNldF9vZl92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDkwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDM4KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X3NldF91bmlvbl92Ml9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTE0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjI2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fc3RhY2tfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTcwOSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuXG5cblxuXG5cblxuXG5cblxuXG5jbGFzcyBGb250TG9hZGVyIHtcbiAgI3N5c3RlbUZvbnRzID0gbmV3IFNldCgpO1xuICBjb25zdHJ1Y3RvcihfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50LFxuICAgICAgc3R5bGVFbGVtZW50ID0gbnVsbFxuICAgIH0gPSBfcmVmO1xuICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5sb2FkaW5nUmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLmxvYWRUZXN0Rm9udElkID0gMDtcbiAgfVxuICBhZGROYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSkge1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmFkZChuYXRpdmVGb250RmFjZSk7XG4gICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuYWRkKG5hdGl2ZUZvbnRGYWNlKTtcbiAgfVxuICByZW1vdmVOYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSkge1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7XG4gICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgfVxuICBpbnNlcnRSdWxlKHJ1bGUpIHtcbiAgICBpZiAoIXRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0uYXBwZW5kKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGVTaGVldCA9IHRoaXMuc3R5bGVFbGVtZW50LnNoZWV0O1xuICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBuYXRpdmVGb250RmFjZSBvZiB0aGlzLm5hdGl2ZUZvbnRGYWNlcykge1xuICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICB9XG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMuY2xlYXIoKTtcbiAgICB0aGlzLiNzeXN0ZW1Gb250cy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGFzeW5jIGxvYWRTeXN0ZW1Gb250KF9yZWYyKSB7XG4gICAgbGV0IHtcbiAgICAgIHN5c3RlbUZvbnRJbmZvOiBpbmZvLFxuICAgICAgX2luc3BlY3RGb250XG4gICAgfSA9IF9yZWYyO1xuICAgIGlmICghaW5mbyB8fCB0aGlzLiNzeXN0ZW1Gb250cy5oYXMoaW5mby5sb2FkZWROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5hc3NlcnQpKCF0aGlzLmRpc2FibGVGb250RmFjZSwgXCJsb2FkU3lzdGVtRm9udCBzaG91bGRuJ3QgYmUgY2FsbGVkIHdoZW4gYGRpc2FibGVGb250RmFjZWAgaXMgc2V0LlwiKTtcbiAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxvYWRlZE5hbWUsXG4gICAgICAgIHNyYyxcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBpbmZvO1xuICAgICAgY29uc3QgZm9udEZhY2UgPSBuZXcgRm9udEZhY2UobG9hZGVkTmFtZSwgc3JjLCBzdHlsZSk7XG4gICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKGZvbnRGYWNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZvbnRGYWNlLmxvYWQoKTtcbiAgICAgICAgdGhpcy4jc3lzdGVtRm9udHMuYWRkKGxvYWRlZE5hbWUpO1xuICAgICAgICBfaW5zcGVjdEZvbnQ/LihpbmZvKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy53YXJuKShgQ2Fubm90IGxvYWQgc3lzdGVtIGZvbnQ6ICR7aW5mby5iYXNlRm9udE5hbWV9LCBpbnN0YWxsaW5nIGl0IGNvdWxkIGhlbHAgdG8gaW1wcm92ZSBQREYgcmVuZGVyaW5nLmApO1xuICAgICAgICB0aGlzLnJlbW92ZU5hdGl2ZUZvbnRGYWNlKGZvbnRGYWNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18udW5yZWFjaGFibGUpKFwiTm90IGltcGxlbWVudGVkOiBsb2FkU3lzdGVtRm9udCB3aXRob3V0IHRoZSBGb250IExvYWRpbmcgQVBJLlwiKTtcbiAgfVxuICBhc3luYyBiaW5kKGZvbnQpIHtcbiAgICBpZiAoZm9udC5hdHRhY2hlZCB8fCBmb250Lm1pc3NpbmdGaWxlICYmICFmb250LnN5c3RlbUZvbnRJbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvbnQuYXR0YWNoZWQgPSB0cnVlO1xuICAgIGlmIChmb250LnN5c3RlbUZvbnRJbmZvKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRTeXN0ZW1Gb250KGZvbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICBjb25zdCBuYXRpdmVGb250RmFjZSA9IGZvbnQuY3JlYXRlTmF0aXZlRm9udEZhY2UoKTtcbiAgICAgIGlmIChuYXRpdmVGb250RmFjZSkge1xuICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBuYXRpdmVGb250RmFjZS5sb2FkZWQ7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18ud2FybikoYEZhaWxlZCB0byBsb2FkIGZvbnQgJyR7bmF0aXZlRm9udEZhY2UuZmFtaWx5fSc6ICcke2V4fScuYCk7XG4gICAgICAgICAgZm9udC5kaXNhYmxlRm9udEZhY2UgPSB0cnVlO1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuICAgIGlmIChydWxlKSB7XG4gICAgICB0aGlzLmluc2VydFJ1bGUocnVsZSk7XG4gICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRm9udExvYWRFdmVudChmb250LCByZXF1ZXN0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCgpIHtcbiAgICBjb25zdCBoYXNGb250cyA9ICEhdGhpcy5fZG9jdW1lbnQ/LmZvbnRzO1xuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5zaGFkb3cpKHRoaXMsIFwiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZFwiLCBoYXNGb250cyk7XG4gIH1cbiAgZ2V0IGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKCkge1xuICAgIGxldCBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICBpZiAoX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18uaXNOb2RlSlMpIHtcbiAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBuYXZpZ2F0b3I/LnVzZXJBZ2VudCA9PT0gXCJzdHJpbmdcIiAmJiAvTW96aWxsYVxcLzUuMC4qP3J2OlxcZCsuKj8gR2Vja28vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5zaGFkb3cpKHRoaXMsIFwiaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRcIiwgc3VwcG9ydGVkKTtcbiAgfVxuICBfcXVldWVMb2FkaW5nQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKSB7XG4gICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5hc3NlcnQpKCFyZXF1ZXN0LmRvbmUsIFwiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS5cIik7XG4gICAgICByZXF1ZXN0LmRvbmUgPSB0cnVlO1xuICAgICAgd2hpbGUgKGxvYWRpbmdSZXF1ZXN0cy5sZW5ndGggPiAwICYmIGxvYWRpbmdSZXF1ZXN0c1swXS5kb25lKSB7XG4gICAgICAgIGNvbnN0IG90aGVyUmVxdWVzdCA9IGxvYWRpbmdSZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KG90aGVyUmVxdWVzdC5jYWxsYmFjaywgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGxvYWRpbmdSZXF1ZXN0c1xuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVJlcXVlc3QsXG4gICAgICBjYWxsYmFja1xuICAgIH07XG4gICAgbG9hZGluZ1JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cbiAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG4gICAgY29uc3QgdGVzdEZvbnQgPSBhdG9iKFwiVDFSVVR3QUxBSUFBQXdBd1EwWkdJREh0Wmc0QUFBT1lBQUFBZ1VaR1ZFMWxrelp3QUFBRUhBQUFBQnhIUkVWR0FCUUFcIiArIFwiRlFBQUJEZ0FBQUFlVDFNdk1sWU5Zd2tBQUFFZ0FBQUFZR050WVhBQkRRTFVBQUFDTkFBQUFVSm9aV0ZrL3hWRkRRQUFcIiArIFwiQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0FcIiArIFwiQUFBR2JtRnRaVmptZEg0QUFBR0FBQUFBc1hCdmMzVC9oZ0F6QUFBRGVBQUFBQ0FBQVFBQUFBRUFBTFpSRnNSZkR6ejFcIiArIFwiQUFzRDZBQUFBQURPQk9UTEFBQUFBTTRLSER3QUFBQUFBK2dESVFBQUFBZ0FBZ0FBQUFBQUFBQUJBQUFESVFBQUFGb0RcIiArIFwiNkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ01cIiArIFwiQW9vQ3ZBQUFBZUFBTVFFQ0FBQUNBQVlKQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFGQm1SV1FBd0FBdUFDNERcIiArIFwiSVA4NEFGb0RJUUFBQUFBQUFRQUFBQUFBQUFBQUFDQUFJQUFCQUFBQURnQ3VBQUVBQUFBQUFBQUFBUUFBQUFFQUFBQUFcIiArIFwiQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUFcIiArIFwiQVFBQUFBRUFBQUFBQUFZQUFRQUFBQU1BQVFRSkFBQUFBZ0FCQUFNQUFRUUpBQUVBQWdBQkFBTUFBUVFKQUFJQUFnQUJcIiArIFwiQUFNQUFRUUpBQU1BQWdBQkFBTUFBUVFKQUFRQUFnQUJBQU1BQVFRSkFBVUFBZ0FCQUFNQUFRUUpBQVlBQWdBQldBQllcIiArIFwiQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUFcIiArIFwiQUM3Ly8vL1RBQUVBQUFBQUFBQUJCZ0FBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQkFBUUVBQUVCQVFKWUFBRUJBU0g0RHdENEd3SEVBdmdjQS9nWEJJd01BWXVMK256NXRRWGtENWozQ0JMbkVRQUNcIiArIFwiQVFFQklWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZQUFBQkFRQUFEd0FDQVFFRUUvdDNcIiArIFwiRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGpcIiArIFwiRlFBQUFBRE9CT1FwQUFFQUFBQUFBQUFBREFBVUFBUUFBQUFCQUFBQUFnQUJBQUFBQUFBQUFBQUQ2QUFBQUFBQUFBPT1cIik7XG4gICAgcmV0dXJuICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fLnNoYWRvdykodGhpcywgXCJfbG9hZFRlc3RGb250XCIsIHRlc3RGb250KTtcbiAgfVxuICBfcHJlcGFyZUZvbnRMb2FkRXZlbnQoZm9udCwgcmVxdWVzdCkge1xuICAgIGZ1bmN0aW9uIGludDMyKGRhdGEsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGRhdGEuY2hhckNvZGVBdChvZmZzZXQpIDw8IDI0IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDIpIDw8IDggfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMykgJiAweGZmO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzcGxpY2VTdHJpbmcocywgb2Zmc2V0LCByZW1vdmUsIGluc2VydCkge1xuICAgICAgY29uc3QgY2h1bmsxID0gcy5zdWJzdHJpbmcoMCwgb2Zmc2V0KTtcbiAgICAgIGNvbnN0IGNodW5rMiA9IHMuc3Vic3RyaW5nKG9mZnNldCArIHJlbW92ZSk7XG4gICAgICByZXR1cm4gY2h1bmsxICsgaW5zZXJ0ICsgY2h1bmsyO1xuICAgIH1cbiAgICBsZXQgaSwgaWk7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgbGV0IGNhbGxlZCA9IDA7XG4gICAgZnVuY3Rpb24gaXNGb250UmVhZHkobmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmICgrK2NhbGxlZCA+IDMwKSB7XG4gICAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fLndhcm4pKFwiTG9hZCB0ZXN0IGZvbnQgbmV2ZXIgbG9hZGVkLlwiKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3R4LmZvbnQgPSBcIjMwcHggXCIgKyBuYW1lO1xuICAgICAgY3R4LmZpbGxUZXh0KFwiLlwiLCAwLCAyMCk7XG4gICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpO1xuICAgICAgaWYgKGltYWdlRGF0YS5kYXRhWzNdID4gMCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KGlzRm9udFJlYWR5LmJpbmQobnVsbCwgbmFtZSwgY2FsbGJhY2spKTtcbiAgICB9XG4gICAgY29uc3QgbG9hZFRlc3RGb250SWQgPSBgbHQke0RhdGUubm93KCl9JHt0aGlzLmxvYWRUZXN0Rm9udElkKyt9YDtcbiAgICBsZXQgZGF0YSA9IHRoaXMuX2xvYWRUZXN0Rm9udDtcbiAgICBjb25zdCBDT01NRU5UX09GRlNFVCA9IDk3NjtcbiAgICBkYXRhID0gc3BsaWNlU3RyaW5nKGRhdGEsIENPTU1FTlRfT0ZGU0VULCBsb2FkVGVzdEZvbnRJZC5sZW5ndGgsIGxvYWRUZXN0Rm9udElkKTtcbiAgICBjb25zdCBDRkZfQ0hFQ0tTVU1fT0ZGU0VUID0gMTY7XG4gICAgY29uc3QgWFhYWF9WQUxVRSA9IDB4NTg1ODU4NTg7XG4gICAgbGV0IGNoZWNrc3VtID0gaW50MzIoZGF0YSwgQ0ZGX0NIRUNLU1VNX09GRlNFVCk7XG4gICAgZm9yIChpID0gMCwgaWkgPSBsb2FkVGVzdEZvbnRJZC5sZW5ndGggLSAzOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCwgaSkgfCAwO1xuICAgIH1cbiAgICBpZiAoaSA8IGxvYWRUZXN0Rm9udElkLmxlbmd0aCkge1xuICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCArIFwiWFhYXCIsIGkpIHwgMDtcbiAgICB9XG4gICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDRkZfQ0hFQ0tTVU1fT0ZGU0VULCA0LCAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5zdHJpbmczMikoY2hlY2tzdW0pKTtcbiAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcbiAgICBjb25zdCBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiJHtsb2FkVGVzdEZvbnRJZH1cIjtzcmM6JHt1cmx9fWA7XG4gICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSBcIjEwcHhcIjtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgZGl2LnN0eWxlLnRvcCA9IGRpdi5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW2ZvbnQubG9hZGVkTmFtZSwgbG9hZFRlc3RGb250SWRdKSB7XG4gICAgICBjb25zdCBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBzcGFuLnRleHRDb250ZW50ID0gXCJIaVwiO1xuICAgICAgc3Bhbi5zdHlsZS5mb250RmFtaWx5ID0gbmFtZTtcbiAgICAgIGRpdi5hcHBlbmQoc3Bhbik7XG4gICAgfVxuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG4gICAgaXNGb250UmVhZHkobG9hZFRlc3RGb250SWQsICgpID0+IHtcbiAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgIHJlcXVlc3QuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgRm9udEZhY2VPYmplY3Qge1xuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVkRGF0YSwgX3JlZjMpIHtcbiAgICBsZXQge1xuICAgICAgaXNFdmFsU3VwcG9ydGVkID0gdHJ1ZSxcbiAgICAgIGRpc2FibGVGb250RmFjZSA9IGZhbHNlLFxuICAgICAgaWdub3JlRXJyb3JzID0gZmFsc2UsXG4gICAgICBpbnNwZWN0Rm9udCA9IG51bGxcbiAgICB9ID0gX3JlZjM7XG4gICAgdGhpcy5jb21waWxlZEdseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBpIGluIHRyYW5zbGF0ZWREYXRhKSB7XG4gICAgICB0aGlzW2ldID0gdHJhbnNsYXRlZERhdGFbaV07XG4gICAgfVxuICAgIHRoaXMuaXNFdmFsU3VwcG9ydGVkID0gaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVGb250RmFjZSA9IGRpc2FibGVGb250RmFjZSA9PT0gdHJ1ZTtcbiAgICB0aGlzLmlnbm9yZUVycm9ycyA9IGlnbm9yZUVycm9ycyA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9pbnNwZWN0Rm9udCA9IGluc3BlY3RGb250O1xuICB9XG4gIGNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCkge1xuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IG5hdGl2ZUZvbnRGYWNlO1xuICAgIGlmICghdGhpcy5jc3NGb250SW5mbykge1xuICAgICAgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3NzID0ge1xuICAgICAgICB3ZWlnaHQ6IHRoaXMuY3NzRm9udEluZm8uZm9udFdlaWdodFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlKSB7XG4gICAgICAgIGNzcy5zdHlsZSA9IGBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWdgO1xuICAgICAgfVxuICAgICAgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5jc3NGb250SW5mby5mb250RmFtaWx5LCB0aGlzLmRhdGEsIGNzcyk7XG4gICAgfVxuICAgIHRoaXMuX2luc3BlY3RGb250Py4odGhpcyk7XG4gICAgcmV0dXJuIG5hdGl2ZUZvbnRGYWNlO1xuICB9XG4gIGNyZWF0ZUZvbnRGYWNlUnVsZSgpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5ieXRlc1RvU3RyaW5nKSh0aGlzLmRhdGEpO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoZGF0YToke3RoaXMubWltZXR5cGV9O2Jhc2U2NCwke2J0b2EoZGF0YSl9KTtgO1xuICAgIGxldCBydWxlO1xuICAgIGlmICghdGhpcy5jc3NGb250SW5mbykge1xuICAgICAgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7dGhpcy5sb2FkZWROYW1lfVwiO3NyYzoke3VybH19YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNzcyA9IGBmb250LXdlaWdodDogJHt0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHR9O2A7XG4gICAgICBpZiAodGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSkge1xuICAgICAgICBjc3MgKz0gYGZvbnQtc3R5bGU6IG9ibGlxdWUgJHt0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlfWRlZztgO1xuICAgICAgfVxuICAgICAgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7dGhpcy5jc3NGb250SW5mby5mb250RmFtaWx5fVwiOyR7Y3NzfXNyYzoke3VybH19YDtcbiAgICB9XG4gICAgdGhpcy5faW5zcGVjdEZvbnQ/Lih0aGlzLCB1cmwpO1xuICAgIHJldHVybiBydWxlO1xuICB9XG4gIGdldFBhdGhHZW5lcmF0b3Iob2JqcywgY2hhcmFjdGVyKSB7XG4gICAgaWYgKHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdO1xuICAgIH1cbiAgICBsZXQgY21kcztcbiAgICB0cnkge1xuICAgICAgY21kcyA9IG9ianMuZ2V0KHRoaXMubG9hZGVkTmFtZSArIFwiX3BhdGhfXCIgKyBjaGFyYWN0ZXIpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoIXRoaXMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18ud2FybikoYGdldFBhdGhHZW5lcmF0b3IgLSBpZ25vcmluZyBjaGFyYWN0ZXI6IFwiJHtleH1cIi5gKTtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkge307XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRXZhbFN1cHBvcnRlZCAmJiBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5GZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnN0IGpzQnVmID0gW107XG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnQgb2YgY21kcykge1xuICAgICAgICBjb25zdCBhcmdzID0gY3VycmVudC5hcmdzICE9PSB1bmRlZmluZWQgPyBjdXJyZW50LmFyZ3Muam9pbihcIixcIikgOiBcIlwiO1xuICAgICAgICBqc0J1Zi5wdXNoKFwiYy5cIiwgY3VycmVudC5jbWQsIFwiKFwiLCBhcmdzLCBcIik7XFxuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IG5ldyBGdW5jdGlvbihcImNcIiwgXCJzaXplXCIsIGpzQnVmLmpvaW4oXCJcIikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gKGMsIHNpemUpIHtcbiAgICAgIGZvciAoY29uc3QgY3VycmVudCBvZiBjbWRzKSB7XG4gICAgICAgIGlmIChjdXJyZW50LmNtZCA9PT0gXCJzY2FsZVwiKSB7XG4gICAgICAgICAgY3VycmVudC5hcmdzID0gW3NpemUsIC1zaXplXTtcbiAgICAgICAgfVxuICAgICAgICBjW2N1cnJlbnQuY21kXS5hcHBseShjLCBjdXJyZW50LmFyZ3MpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzQ3Mjpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgTWV0YWRhdGE6ICgpID0+ICgvKiBiaW5kaW5nICovIE1ldGFkYXRhKVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuXG5jbGFzcyBNZXRhZGF0YSB7XG4gICNtZXRhZGF0YU1hcDtcbiAgI2RhdGE7XG4gIGNvbnN0cnVjdG9yKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgcGFyc2VkRGF0YSxcbiAgICAgIHJhd0RhdGFcbiAgICB9ID0gX3JlZjtcbiAgICB0aGlzLiNtZXRhZGF0YU1hcCA9IHBhcnNlZERhdGE7XG4gICAgdGhpcy4jZGF0YSA9IHJhd0RhdGE7XG4gIH1cbiAgZ2V0UmF3KCkge1xuICAgIHJldHVybiB0aGlzLiNkYXRhO1xuICB9XG4gIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuI21ldGFkYXRhTWFwLmdldChuYW1lKSA/PyBudWxsO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ub2JqZWN0RnJvbU1hcCkodGhpcy4jbWV0YWRhdGFNYXApO1xuICB9XG4gIGhhcyhuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuI21ldGFkYXRhTWFwLmhhcyhuYW1lKTtcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNDc0OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX19fd2VicGFja19tb2R1bGVfXywgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG4vKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuLyogaGFybW9ueSBleHBvcnQgKi8gICBQREZOZXR3b3JrU3RyZWFtOiAoKSA9PiAoLyogYmluZGluZyAqLyBQREZOZXR3b3JrU3RyZWFtKVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDIyNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9uZXR3b3JrX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyNTMpO1xuXG5cblxuO1xuY29uc3QgT0tfUkVTUE9OU0UgPSAyMDA7XG5jb25zdCBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UgPSAyMDY7XG5mdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih4aHIpIHtcbiAgY29uc3QgZGF0YSA9IHhoci5yZXNwb25zZTtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgcmV0dXJuICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLnN0cmluZ1RvQnl0ZXMpKGRhdGEpLmJ1ZmZlcjtcbn1cbmNsYXNzIE5ldHdvcmtNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IodXJsKSB7XG4gICAgbGV0IGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh1cmwpO1xuICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBhcmdzLmh0dHBIZWFkZXJzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPSBhcmdzLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLmN1cnJYaHJJZCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBsaXN0ZW5lcnMpIHtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgYmVnaW4sXG4gICAgICBlbmRcbiAgICB9O1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGFyZ3NbcHJvcF0gPSBsaXN0ZW5lcnNbcHJvcF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoYXJncyk7XG4gIH1cbiAgcmVxdWVzdEZ1bGwobGlzdGVuZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChsaXN0ZW5lcnMpO1xuICB9XG4gIHJlcXVlc3QoYXJncykge1xuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGNvbnN0IHhocklkID0gdGhpcy5jdXJyWGhySWQrKztcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXSA9IHtcbiAgICAgIHhoclxuICAgIH07XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy51cmwpO1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFscztcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSHR0cCAmJiBcImJlZ2luXCIgaW4gYXJncyAmJiBcImVuZFwiIGluIGFyZ3MpIHtcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIiwgYGJ5dGVzPSR7YXJncy5iZWdpbn0tJHthcmdzLmVuZCAtIDF9YCk7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBPS19SRVNQT05TRTtcbiAgICB9XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcbiAgICBpZiAoYXJncy5vbkVycm9yKSB7XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgYXJncy5vbkVycm9yKHhoci5zdGF0dXMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsIHhocklkKTtcbiAgICB4aHIub25wcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMsIHhocklkKTtcbiAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCA9IGFyZ3Mub25IZWFkZXJzUmVjZWl2ZWQ7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lID0gYXJncy5vbkRvbmU7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvciA9IGFyZ3Mub25FcnJvcjtcbiAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzID0gYXJncy5vblByb2dyZXNzO1xuICAgIHhoci5zZW5kKG51bGwpO1xuICAgIHJldHVybiB4aHJJZDtcbiAgfVxuICBvblByb2dyZXNzKHhocklkLCBldnQpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcbiAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3M/LihldnQpO1xuICB9XG4gIG9uU3RhdGVDaGFuZ2UoeGhySWQsIGV2dCkge1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeGhyID0gcGVuZGluZ1JlcXVlc3QueGhyO1xuICAgIGlmICh4aHIucmVhZHlTdGF0ZSA+PSAyICYmIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCgpO1xuICAgICAgZGVsZXRlIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgIH1cbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEoeGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgaWYgKHhoci5zdGF0dXMgPT09IDAgJiYgdGhpcy5pc0h0dHApIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3I/Lih4aHIuc3RhdHVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeGhyU3RhdHVzID0geGhyLnN0YXR1cyB8fCBPS19SRVNQT05TRTtcbiAgICBjb25zdCBva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ID0geGhyU3RhdHVzID09PSBPS19SRVNQT05TRSAmJiBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFO1xuICAgIGlmICghb2tfcmVzcG9uc2Vfb25fcmFuZ2VfcmVxdWVzdCAmJiB4aHJTdGF0dXMgIT09IHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yPy4oeGhyLnN0YXR1cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNodW5rID0gZ2V0QXJyYXlCdWZmZXIoeGhyKTtcbiAgICBpZiAoeGhyU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UpIHtcbiAgICAgIGNvbnN0IHJhbmdlSGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1SYW5nZVwiKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSAvYnl0ZXMgKFxcZCspLShcXGQrKVxcLyhcXGQrKS8uZXhlYyhyYW5nZUhlYWRlcik7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoe1xuICAgICAgICBiZWdpbjogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLFxuICAgICAgICBjaHVua1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjaHVuaykge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHtcbiAgICAgICAgYmVnaW46IDAsXG4gICAgICAgIGNodW5rXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuICAgIH1cbiAgfVxuICBnZXRSZXF1ZXN0WGhyKHhocklkKSB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7XG4gIH1cbiAgaXNQZW5kaW5nUmVxdWVzdCh4aHJJZCkge1xuICAgIHJldHVybiB4aHJJZCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0cztcbiAgfVxuICBhYm9ydFJlcXVlc3QoeGhySWQpIHtcbiAgICBjb25zdCB4aHIgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyO1xuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgeGhyLmFib3J0KCk7XG4gIH1cbn1cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5fbWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcihzb3VyY2UudXJsLCB7XG4gICAgICBodHRwSGVhZGVyczogc291cmNlLmh0dHBIZWFkZXJzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBzb3VyY2Uud2l0aENyZWRlbnRpYWxzXG4gICAgfSk7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQocmVhZGVyKSB7XG4gICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuICBnZXRGdWxsUmVhZGVyKCkge1xuICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERk5ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsIHRoaXMuX3NvdXJjZSk7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICB9XG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCBiZWdpbiwgZW5kKTtcbiAgICByZWFkZXIub25DbG9zZWQgPSB0aGlzLl9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKG1hbmFnZXIsIHNvdXJjZSkge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBvbkhlYWRlcnNSZWNlaXZlZDogdGhpcy5fb25IZWFkZXJzUmVjZWl2ZWQuYmluZCh0aGlzKSxcbiAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcbiAgICB9O1xuICAgIHRoaXMuX3VybCA9IHNvdXJjZS51cmw7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdEZ1bGwoYXJncyk7XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBfb25IZWFkZXJzUmVjZWl2ZWQoKSB7XG4gICAgY29uc3QgZnVsbFJlcXVlc3RYaHJJZCA9IHRoaXMuX2Z1bGxSZXF1ZXN0SWQ7XG4gICAgY29uc3QgZnVsbFJlcXVlc3RYaHIgPSB0aGlzLl9tYW5hZ2VyLmdldFJlcXVlc3RYaHIoZnVsbFJlcXVlc3RYaHJJZCk7XG4gICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHtcbiAgICAgIHJldHVybiBmdWxsUmVxdWVzdFhoci5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTtcbiAgICB9O1xuICAgIGNvbnN0IHtcbiAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgIHN1Z2dlc3RlZExlbmd0aFxuICAgIH0gPSAoMCxfbmV0d29ya191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7XG4gICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgIGlzSHR0cDogdGhpcy5fbWFuYWdlci5pc0h0dHAsXG4gICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgIH0pO1xuICAgIGlmIChhbGxvd1JhbmdlUmVxdWVzdHMpIHtcbiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSAoMCxfbmV0d29ya191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGdldFJlc3BvbnNlSGVhZGVyKTtcbiAgICBpZiAodGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QoZnVsbFJlcXVlc3RYaHJJZCk7XG4gICAgfVxuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG4gIF9vbkRvbmUoZGF0YSkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgIHZhbHVlOiBkYXRhLmNodW5rLFxuICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkQ2h1bmtzLnB1c2goZGF0YS5jaHVuayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gIH1cbiAgX29uRXJyb3Ioc3RhdHVzKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSAoMCxfbmV0d29ya191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHN0YXR1cywgdGhpcy5fdXJsKTtcbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID0gMDtcbiAgfVxuICBfb25Qcm9ncmVzcyhldnQpIHtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICB0b3RhbDogZXZ0Lmxlbmd0aENvbXB1dGFibGUgPyBldnQudG90YWwgOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jYWNoZWRDaHVua3Muc2hpZnQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpKSB7XG4gICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKTtcbiAgICB9XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICB9XG59XG5jbGFzcyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyIHtcbiAgY29uc3RydWN0b3IobWFuYWdlciwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBvbkRvbmU6IHRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLFxuICAgICAgb25FcnJvcjogdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLFxuICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpXG4gICAgfTtcbiAgICB0aGlzLl91cmwgPSBtYW5hZ2VyLnVybDtcbiAgICB0aGlzLl9yZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBhcmdzKTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICB0aGlzLm9uQ2xvc2VkID0gbnVsbDtcbiAgfVxuICBfY2xvc2UoKSB7XG4gICAgdGhpcy5vbkNsb3NlZD8uKHRoaXMpO1xuICB9XG4gIF9vbkRvbmUoZGF0YSkge1xuICAgIGNvbnN0IGNodW5rID0gZGF0YS5jaHVuaztcbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rO1xuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgfVxuICBfb25FcnJvcihzdGF0dXMpIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9ICgwLF9uZXR3b3JrX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikoc3RhdHVzLCB0aGlzLl91cmwpO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICB9XG4gIF9vblByb2dyZXNzKGV2dCkge1xuICAgIGlmICghdGhpcy5pc1N0cmVhbWluZ1N1cHBvcnRlZCkge1xuICAgICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rO1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gbmV3IF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCkpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHRoaXMuX2Nsb3NlKCk7XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODI1Mzpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yOiAoKSA9PiAoLyogYmluZGluZyAqLyBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSxcbiAgZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlciksXG4gIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzOiAoKSA9PiAoLyogYmluZGluZyAqLyB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyksXG4gIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXM6ICgpID0+ICgvKiBiaW5kaW5nICovIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpXG59KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9zaGFyZWQvdXRpbC5qc1xudmFyIHV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyNjYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qc1xudmFyIGVzX2FycmF5X3B1c2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMjYpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanNcbnZhciB3ZWJfZG9tX2V4Y2VwdGlvbl9zdGFjayA9IF9fd2VicGFja19yZXF1aXJlX18oOTcwOSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9jb250ZW50X2Rpc3Bvc2l0aW9uLmpzXG5cblxuXG5mdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKSB7XG4gIGxldCBuZWVkc0VuY29kaW5nRml4dXAgPSB0cnVlO1xuICBsZXQgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCpcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIHRtcCA9IHRtcFsxXTtcbiAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuICAgIGZpbGVuYW1lID0gdW5lc2NhcGUoZmlsZW5hbWUpO1xuICAgIGZpbGVuYW1lID0gcmZjNTk4N2RlY29kZShmaWxlbmFtZSk7XG4gICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cbiAgdG1wID0gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUodG1wKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cbiAgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXCIsIFwiaVwiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICB0bXAgPSB0bXBbMV07XG4gICAgbGV0IGZpbGVuYW1lID0gcmZjMjYxNnVucXVvdGUodG1wKTtcbiAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpO1xuICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcbiAgfVxuICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKGF0dHJpYnV0ZVBhdHRlcm4sIGZsYWdzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoPzpefDspXFxcXHMqXCIgKyBhdHRyaWJ1dGVQYXR0ZXJuICsgXCJcXFxccyo9XFxcXHMqXCIgKyBcIihcIiArICdbXlwiO1xcXFxzXVteO1xcXFxzXSonICsgXCJ8XCIgKyAnXCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcXCI/KStcIj8nICsgXCIpXCIsIGZsYWdzKTtcbiAgfVxuICBmdW5jdGlvbiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSkge1xuICAgIGlmIChlbmNvZGluZykge1xuICAgICAgaWYgKCEvXltcXHgwMC1cXHhGRl0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywge1xuICAgICAgICAgIGZhdGFsOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXIgPSAoMCx1dGlsLnN0cmluZ1RvQnl0ZXMpKHZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xuICAgICAgICBuZWVkc0VuY29kaW5nRml4dXAgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGZpeHVwRW5jb2RpbmcodmFsdWUpIHtcbiAgICBpZiAobmVlZHNFbmNvZGluZ0ZpeHVwICYmIC9bXFx4ODAtXFx4ZmZdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwidXRmLThcIiwgdmFsdWUpO1xuICAgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCkge1xuICAgICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoXCJpc28tODg1OS0xXCIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb25TdHIpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgbGV0IG1hdGNoO1xuICAgIGNvbnN0IGl0ZXIgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcXFxcKigoPyEwXFxcXGQpXFxcXGQrKShcXFxcKj8pXCIsIFwiaWdcIik7XG4gICAgd2hpbGUgKChtYXRjaCA9IGl0ZXIuZXhlYyhjb250ZW50RGlzcG9zaXRpb25TdHIpKSAhPT0gbnVsbCkge1xuICAgICAgbGV0IFssIG4sIHF1b3QsIHBhcnRdID0gbWF0Y2g7XG4gICAgICBuID0gcGFyc2VJbnQobiwgMTApO1xuICAgICAgaWYgKG4gaW4gbWF0Y2hlcykge1xuICAgICAgICBpZiAobiA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbWF0Y2hlc1tuXSA9IFtxdW90LCBwYXJ0XTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG1hdGNoZXMubGVuZ3RoOyArK24pIHtcbiAgICAgIGlmICghKG4gaW4gbWF0Y2hlcykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgW3F1b3QsIHBhcnRdID0gbWF0Y2hlc1tuXTtcbiAgICAgIHBhcnQgPSByZmMyNjE2dW5xdW90ZShwYXJ0KTtcbiAgICAgIGlmIChxdW90KSB7XG4gICAgICAgIHBhcnQgPSB1bmVzY2FwZShwYXJ0KTtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBwYXJ0ID0gcmZjNTk4N2RlY29kZShwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMucHVzaChwYXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gcmZjMjYxNnVucXVvdGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zbGljZSgxKS5zcGxpdCgnXFxcXFwiJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHF1b3RpbmRleCA9IHBhcnRzW2ldLmluZGV4T2YoJ1wiJyk7XG4gICAgICAgIGlmIChxdW90aW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5zbGljZSgwLCBxdW90aW5kZXgpO1xuICAgICAgICAgIHBhcnRzLmxlbmd0aCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0ucmVwbGFjZUFsbCgvXFxcXCguKS9nLCBcIiQxXCIpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBwYXJ0cy5qb2luKCdcIicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gcmZjNTk4N2RlY29kZShleHR2YWx1ZSkge1xuICAgIGNvbnN0IGVuY29kaW5nZW5kID0gZXh0dmFsdWUuaW5kZXhPZihcIidcIik7XG4gICAgaWYgKGVuY29kaW5nZW5kID09PSAtMSkge1xuICAgICAgcmV0dXJuIGV4dHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGluZyA9IGV4dHZhbHVlLnNsaWNlKDAsIGVuY29kaW5nZW5kKTtcbiAgICBjb25zdCBsYW5ndmFsdWUgPSBleHR2YWx1ZS5zbGljZShlbmNvZGluZ2VuZCArIDEpO1xuICAgIGNvbnN0IHZhbHVlID0gbGFuZ3ZhbHVlLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKTtcbiAgICByZXR1cm4gdGV4dGRlY29kZShlbmNvZGluZywgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIwNDdkZWNvZGUodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCI9P1wiKSB8fCAvW1xceDAwLVxceDE5XFx4ODAtXFx4ZmZdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvPVxcPyhbXFx3LV0qKVxcPyhbUXFCYl0pXFw/KCg/OlteP118XFw/KD8hPSkpKilcXD89L2csIGZ1bmN0aW9uIChtYXRjaGVzLCBjaGFyc2V0LCBlbmNvZGluZywgdGV4dCkge1xuICAgICAgaWYgKGVuY29kaW5nID09PSBcInFcIiB8fCBlbmNvZGluZyA9PT0gXCJRXCIpIHtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKC89KFswLTlhLWZBLUZdezJ9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIGhleCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKGNoYXJzZXQsIHRleHQpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGV4dCA9IGF0b2IodGV4dCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcbnZhciBkaXNwbGF5X3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzMpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbmV0d29ya191dGlscy5qc1xuXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoX3JlZikge1xuICBsZXQge1xuICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgIGlzSHR0cCxcbiAgICByYW5nZUNodW5rU2l6ZSxcbiAgICBkaXNhYmxlUmFuZ2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHJldHVyblZhbHVlcyA9IHtcbiAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGZhbHNlLFxuICAgIHN1Z2dlc3RlZExlbmd0aDogdW5kZWZpbmVkXG4gIH07XG4gIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIiksIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxlbmd0aCkpIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIHJldHVyblZhbHVlcy5zdWdnZXN0ZWRMZW5ndGggPSBsZW5ndGg7XG4gIGlmIChsZW5ndGggPD0gMiAqIHJhbmdlQ2h1bmtTaXplKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICBpZiAoZGlzYWJsZVJhbmdlIHx8ICFpc0h0dHApIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIGlmIChnZXRSZXNwb25zZUhlYWRlcihcIkFjY2VwdC1SYW5nZXNcIikgIT09IFwiYnl0ZXNcIikge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgY29uc3QgY29udGVudEVuY29kaW5nID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LUVuY29kaW5nXCIpIHx8IFwiaWRlbnRpdHlcIjtcbiAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPT0gXCJpZGVudGl0eVwiKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICByZXR1cm5WYWx1ZXMuYWxsb3dSYW5nZVJlcXVlc3RzID0gdHJ1ZTtcbiAgcmV0dXJuIHJldHVyblZhbHVlcztcbn1cbmZ1bmN0aW9uIGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpIHtcbiAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIpO1xuICBpZiAoY29udGVudERpc3Bvc2l0aW9uKSB7XG4gICAgbGV0IGZpbGVuYW1lID0gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gICAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKFwiJVwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmlsZW5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBpZiAoKDAsZGlzcGxheV91dGlscy5pc1BkZkZpbGUpKGZpbGVuYW1lKSkge1xuICAgICAgcmV0dXJuIGZpbGVuYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB1cmwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gMCAmJiB1cmwuc3RhcnRzV2l0aChcImZpbGU6XCIpKSB7XG4gICAgcmV0dXJuIG5ldyB1dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGIFwiJyArIHVybCArICdcIi4nKTtcbiAgfVxuICByZXR1cm4gbmV3IHV0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSAoJHtzdGF0dXN9KSB3aGlsZSByZXRyaWV2aW5nIFBERiBcIiR7dXJsfVwiLmAsIHN0YXR1cyk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHN0YXR1cykge1xuICByZXR1cm4gc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDY7XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDM0OTg6XG4vKioqLyAoKF9fd2VicGFja19tb2R1bGVfXywgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmEoX193ZWJwYWNrX21vZHVsZV9fLCBhc3luYyAoX193ZWJwYWNrX2hhbmRsZV9hc3luY19kZXBlbmRlbmNpZXNfXywgX193ZWJwYWNrX2FzeW5jX3Jlc3VsdF9fKSA9PiB7IHRyeSB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuLyogaGFybW9ueSBleHBvcnQgKi8gICBQREZOb2RlU3RyZWFtOiAoKSA9PiAoLyogYmluZGluZyAqLyBQREZOb2RlU3RyZWFtKVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDIyNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODM3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmluZF9sYXN0X2luZGV4X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4MDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zZXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODM0Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3JldmVyc2VkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5OTUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19zb3J0ZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV93aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2MDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX2RldGFjaGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0NCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDMwNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfdG9fZml4ZWRfbGVuZ3RoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1ODMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI2Nik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX25ldHdvcmtfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyNTMpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuO1xubGV0IGZzLCBodHRwLCBodHRwcywgdXJsO1xuaWYgKF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy5pc05vZGVKUykge1xuICBmcyA9IGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovIFwiZnNcIik7XG4gIGh0dHAgPSBhd2FpdCBpbXBvcnQoLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqLyBcImh0dHBcIik7XG4gIGh0dHBzID0gYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gXCJodHRwc1wiKTtcbiAgdXJsID0gYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gXCJ1cmxcIik7XG59XG5jb25zdCBmaWxlVXJpUmVnZXggPSAvXmZpbGU6XFwvXFwvXFwvW2EtekEtWl06XFwvLztcbmZ1bmN0aW9uIHBhcnNlVXJsKHNvdXJjZVVybCkge1xuICBjb25zdCBwYXJzZWRVcmwgPSB1cmwucGFyc2Uoc291cmNlVXJsKTtcbiAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gXCJmaWxlOlwiIHx8IHBhcnNlZFVybC5ob3N0KSB7XG4gICAgcmV0dXJuIHBhcnNlZFVybDtcbiAgfVxuICBpZiAoL15bYS16XTpbL1xcXFxdL2kudGVzdChzb3VyY2VVcmwpKSB7XG4gICAgcmV0dXJuIHVybC5wYXJzZShgZmlsZTovLy8ke3NvdXJjZVVybH1gKTtcbiAgfVxuICBpZiAoIXBhcnNlZFVybC5ob3N0KSB7XG4gICAgcGFyc2VkVXJsLnByb3RvY29sID0gXCJmaWxlOlwiO1xuICB9XG4gIHJldHVybiBwYXJzZWRVcmw7XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy51cmwgPSBwYXJzZVVybChzb3VyY2UudXJsKTtcbiAgICB0aGlzLmlzSHR0cCA9IHRoaXMudXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgfHwgdGhpcy51cmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XG4gICAgdGhpcy5pc0ZzVXJsID0gdGhpcy51cmwucHJvdG9jb2wgPT09IFwiZmlsZTpcIjtcbiAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzIHx8IHt9O1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG4gIH1cbiAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkID8/IDA7XG4gIH1cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTm9kZVN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IHRoaXMuaXNGc1VybCA/IG5ldyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyKHRoaXMpIDogbmV3IFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuICBnZXRSYW5nZVJlYWRlcihzdGFydCwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMuaXNGc1VybCA/IG5ldyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKSA6IG5ldyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgc3RhcnQsIGVuZCk7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJhbmdlUmVhZGVyKTtcbiAgICByZXR1cm4gcmFuZ2VSZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEJhc2VGdWxsUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVJhbmdlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gbnVsbDtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgfVxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpO1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKCk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5sZW5ndGg7XG4gICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG4gICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aFxuICAgIH0pO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBidWZmZXIsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcbiAgfVxuICBfZXJyb3IocmVhc29uKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG4gIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX2Vycm9yKG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uQWJvcnRFeGNlcHRpb24oXCJzdHJlYW1pbmcgaXMgZGlzYWJsZWRcIikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQmFzZVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZFxuICAgIH0pO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBidWZmZXIsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcbiAgfVxuICBfZXJyb3IocmVhc29uKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG4gIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUmVxdWVzdE9wdGlvbnMocGFyc2VkVXJsLCBoZWFkZXJzKSB7XG4gIHJldHVybiB7XG4gICAgcHJvdG9jb2w6IHBhcnNlZFVybC5wcm90b2NvbCxcbiAgICBhdXRoOiBwYXJzZWRVcmwuYXV0aCxcbiAgICBob3N0OiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgcG9ydDogcGFyc2VkVXJsLnBvcnQsXG4gICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnNcbiAgfTtcbn1cbmNsYXNzIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3RoaXMuX3VybH1cIi5gKTtcbiAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpO1xuICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmhlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG4gICAgICB9ID0gKDAsX25ldHdvcmtfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18udmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtcbiAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gICAgICAgIGlzSHR0cDogc3RyZWFtLmlzSHR0cCxcbiAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gYWxsb3dSYW5nZVJlcXVlc3RzO1xuICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCxfbmV0d29ya191dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgfTtcbiAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5fdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcbiAgfVxufVxuY2xhc3MgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBzdGFydCwgZW5kKSB7XG4gICAgc3VwZXIoc3RyZWFtKTtcbiAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc3RyZWFtLmh0dHBIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHN0cmVhbS5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2h0dHBIZWFkZXJzW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9odHRwSGVhZGVycy5SYW5nZSA9IGBieXRlcz0ke3N0YXJ0fS0ke2VuZCAtIDF9YDtcbiAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLk1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG4gICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIikge1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gIH1cbn1cbmNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbiAgICB9XG4gICAgZnMubHN0YXQocGF0aCwgKGVycm9yLCBzdGF0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3BhdGh9XCIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN0YXQuc2l6ZTtcbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCkpO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLCB7XG4gICAgICBzdGFydCxcbiAgICAgIGVuZDogZW5kIC0gMVxuICAgIH0pKTtcbiAgfVxufVxuXG5fX3dlYnBhY2tfYXN5bmNfcmVzdWx0X18oKTtcbn0gY2F0Y2goZSkgeyBfX3dlYnBhY2tfYXN5bmNfcmVzdWx0X18oZSk7IH0gfSwgMSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NzM4OlxuLyoqKi8gKChfX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuX193ZWJwYWNrX3JlcXVpcmVfXy5hKF9fd2VicGFja19tb2R1bGVfXywgYXN5bmMgKF9fd2VicGFja19oYW5kbGVfYXN5bmNfZGVwZW5kZW5jaWVzX18sIF9fd2VicGFja19hc3luY19yZXN1bHRfXykgPT4geyB0cnkge1xuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgTm9kZUNNYXBSZWFkZXJGYWN0b3J5OiAoKSA9PiAoLyogYmluZGluZyAqLyBOb2RlQ01hcFJlYWRlckZhY3RvcnkpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBOb2RlQ2FudmFzRmFjdG9yeTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gTm9kZUNhbnZhc0ZhY3RvcnkpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBOb2RlRmlsdGVyRmFjdG9yeTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gTm9kZUZpbHRlckZhY3RvcnkpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk6ICgpID0+ICgvKiBiaW5kaW5nICovIE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSlcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19lcnJvcl9jYXVzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzUyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmluZF9sYXN0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4MzcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfaW5kZXhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTgwMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NldF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MzQ3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fcmV2ZXJzZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzk5NSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3NvcnRlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDYwMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfZGV0YWNoZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2FycmF5X2J1ZmZlcl90cmFuc2Zlcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzA1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2FycmF5X2J1ZmZlcl90cmFuc2Zlcl90b19maXhlZF9sZW5ndGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzU4Myk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Jhc2VfZmFjdG9yeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjgyMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbjtcbmxldCBmcywgY2FudmFzLCBwYXRoMmRfcG9seWZpbGw7XG5pZiAoX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fLmlzTm9kZUpTKSB7XG4gIGZzID0gYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gXCJmc1wiKTtcbiAgdHJ5IHtcbiAgICBjYW52YXMgPSBhd2FpdCBpbXBvcnQoLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqLyBcImNhbnZhc1wiKTtcbiAgfSBjYXRjaCB7fVxuICB0cnkge1xuICAgIHBhdGgyZF9wb2x5ZmlsbCA9IGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovIFwicGF0aDJkLXBvbHlmaWxsXCIpO1xuICB9IGNhdGNoIHt9XG59XG57XG4gIChmdW5jdGlvbiBjaGVja0RPTU1hdHJpeCgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5ET01NYXRyaXggfHwgIV9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXy5pc05vZGVKUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBET01NYXRyaXggPSBjYW52YXM/LkRPTU1hdHJpeDtcbiAgICBpZiAoRE9NTWF0cml4KSB7XG4gICAgICBnbG9iYWxUaGlzLkRPTU1hdHJpeCA9IERPTU1hdHJpeDtcbiAgICB9IGVsc2Uge1xuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fLndhcm4pKFwiQ2Fubm90IHBvbHlmaWxsIGBET01NYXRyaXhgLCByZW5kZXJpbmcgbWF5IGJlIGJyb2tlbi5cIik7XG4gICAgfVxuICB9KSgpO1xuICAoZnVuY3Rpb24gY2hlY2tQYXRoMkQoKSB7XG4gICAgaWYgKGdsb2JhbFRoaXMuUGF0aDJEIHx8ICFfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18uaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzPy5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gICAgY29uc3QgcG9seWZpbGxQYXRoMkQgPSBwYXRoMmRfcG9seWZpbGw/LnBvbHlmaWxsUGF0aDJEO1xuICAgIGlmIChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgJiYgcG9seWZpbGxQYXRoMkQpIHtcbiAgICAgIGdsb2JhbFRoaXMuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgICAgcG9seWZpbGxQYXRoMkQoZ2xvYmFsVGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXy53YXJuKShcIkNhbm5vdCBwb2x5ZmlsbCBgUGF0aDJEYCwgcmVuZGVyaW5nIG1heSBiZSBicm9rZW4uXCIpO1xuICAgIH1cbiAgfSkoKTtcbn1cbmNvbnN0IGZldGNoRGF0YSA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy5yZWFkRmlsZSh1cmwsIChlcnJvciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVycm9yIHx8ICFkYXRhKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShkYXRhKSk7XG4gICAgfSk7XG4gIH0pO1xufTtcbmNsYXNzIE5vZGVGaWx0ZXJGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy5CYXNlRmlsdGVyRmFjdG9yeSB7fVxuY2xhc3MgTm9kZUNhbnZhc0ZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLkJhc2VDYW52YXNGYWN0b3J5IHtcbiAgX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgcmV0dXJuIGNhbnZhcy5jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIH1cbn1cbmNsYXNzIE5vZGVDTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18uQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIHJldHVybiBmZXRjaERhdGEodXJsKS50aGVuKGRhdGEgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY01hcERhdGE6IGRhdGEsXG4gICAgICAgIGNvbXByZXNzaW9uVHlwZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICBfZmV0Y2hEYXRhKHVybCkge1xuICAgIHJldHVybiBmZXRjaERhdGEodXJsKTtcbiAgfVxufVxuXG5fX3dlYnBhY2tfYXN5bmNfcmVzdWx0X18oKTtcbn0gY2F0Y2goZSkgeyBfX3dlYnBhY2tfYXN5bmNfcmVzdWx0X18oZSk7IH0gfSwgMSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzODkwOlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX19fd2VicGFja19tb2R1bGVfXywgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG4vKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuLyogaGFybW9ueSBleHBvcnQgKi8gICBPcHRpb25hbENvbnRlbnRDb25maWc6ICgpID0+ICgvKiBiaW5kaW5nICovIE9wdGlvbmFsQ29udGVudENvbmZpZylcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX211cm11cmhhc2gzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4MjUpO1xuXG5cbmNvbnN0IElOVEVSTkFMID0gU3ltYm9sKFwiSU5URVJOQUxcIik7XG5jbGFzcyBPcHRpb25hbENvbnRlbnRHcm91cCB7XG4gICN2aXNpYmxlID0gdHJ1ZTtcbiAgY29uc3RydWN0b3IobmFtZSwgaW50ZW50KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmludGVudCA9IGludGVudDtcbiAgfVxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdmlzaWJsZTtcbiAgfVxuICBfc2V0VmlzaWJsZShpbnRlcm5hbCwgdmlzaWJsZSkge1xuICAgIGlmIChpbnRlcm5hbCAhPT0gSU5URVJOQUwpIHtcbiAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLnVucmVhY2hhYmxlKShcIkludGVybmFsIG1ldGhvZCBgX3NldFZpc2libGVgIGNhbGxlZC5cIik7XG4gICAgfVxuICAgIHRoaXMuI3Zpc2libGUgPSB2aXNpYmxlO1xuICB9XG59XG5jbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcge1xuICAjY2FjaGVkR2V0SGFzaCA9IG51bGw7XG4gICNncm91cHMgPSBuZXcgTWFwKCk7XG4gICNpbml0aWFsSGFzaCA9IG51bGw7XG4gICNvcmRlciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuY3JlYXRvciA9IG51bGw7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY3JlYXRvciA9IGRhdGEuY3JlYXRvcjtcbiAgICB0aGlzLiNvcmRlciA9IGRhdGEub3JkZXI7XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBkYXRhLmdyb3Vwcykge1xuICAgICAgdGhpcy4jZ3JvdXBzLnNldChncm91cC5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwLm5hbWUsIGdyb3VwLmludGVudCkpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5iYXNlU3RhdGUgPT09IFwiT0ZGXCIpIHtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy4jZ3JvdXBzLnZhbHVlcygpKSB7XG4gICAgICAgIGdyb3VwLl9zZXRWaXNpYmxlKElOVEVSTkFMLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb24gb2YgZGF0YS5vbikge1xuICAgICAgdGhpcy4jZ3JvdXBzLmdldChvbikuX3NldFZpc2libGUoSU5URVJOQUwsIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9mZiBvZiBkYXRhLm9mZikge1xuICAgICAgdGhpcy4jZ3JvdXBzLmdldChvZmYpLl9zZXRWaXNpYmxlKElOVEVSTkFMLCBmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuI2luaXRpYWxIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG4gIH1cbiAgI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oYXJyYXkpIHtcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvcGVyYXRvciA9IGFycmF5WzBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpXTtcbiAgICAgIGxldCBzdGF0ZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICAgIHN0YXRlID0gdGhpcy4jZXZhbHVhdGVWaXNpYmlsaXR5RXhwcmVzc2lvbihlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy4jZ3JvdXBzLmhhcyhlbGVtZW50KSkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuI2dyb3Vwcy5nZXQoZWxlbWVudCkudmlzaWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtlbGVtZW50fWApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBcIkFuZFwiOlxuICAgICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJPclwiOlxuICAgICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTm90XCI6XG4gICAgICAgICAgcmV0dXJuICFzdGF0ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdG9yID09PSBcIkFuZFwiO1xuICB9XG4gIGlzVmlzaWJsZShncm91cCkge1xuICAgIGlmICh0aGlzLiNncm91cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghZ3JvdXApIHtcbiAgICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZGVmaW5lZC5cIik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NHXCIpIHtcbiAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhncm91cC5pZCkpIHtcbiAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2dyb3VwLmlkfWApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLiNncm91cHMuZ2V0KGdyb3VwLmlkKS52aXNpYmxlO1xuICAgIH0gZWxzZSBpZiAoZ3JvdXAudHlwZSA9PT0gXCJPQ01EXCIpIHtcbiAgICAgIGlmIChncm91cC5leHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNldmFsdWF0ZVZpc2liaWxpdHlFeHByZXNzaW9uKGdyb3VwLmV4cHJlc3Npb24pO1xuICAgICAgfVxuICAgICAgaWYgKCFncm91cC5wb2xpY3kgfHwgZ3JvdXAucG9saWN5ID09PSBcIkFueU9uXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbGxPblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFueU9mZlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFsbE9mZlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoYFVua25vd24gb3B0aW9uYWwgY29udGVudCBwb2xpY3kgJHtncm91cC5wb2xpY3l9LmApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLndhcm4pKGBVbmtub3duIGdyb3VwIHR5cGUgJHtncm91cC50eXBlfS5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXRWaXNpYmlsaXR5KGlkKSB7XG4gICAgbGV0IHZpc2libGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNncm91cHMuZ2V0KGlkKS5fc2V0VmlzaWJsZShJTlRFUk5BTCwgISF2aXNpYmxlKTtcbiAgICB0aGlzLiNjYWNoZWRHZXRIYXNoID0gbnVsbDtcbiAgfVxuICBnZXQgaGFzSW5pdGlhbFZpc2liaWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luaXRpYWxIYXNoID09PSBudWxsIHx8IHRoaXMuZ2V0SGFzaCgpID09PSB0aGlzLiNpbml0aWFsSGFzaDtcbiAgfVxuICBnZXRPcmRlcigpIHtcbiAgICBpZiAoIXRoaXMuI2dyb3Vwcy5zaXplKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuI29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy4jb3JkZXIuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi50aGlzLiNncm91cHMua2V5cygpXTtcbiAgfVxuICBnZXRHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5zaXplID4gMCA/ICgwLF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLm9iamVjdEZyb21NYXApKHRoaXMuI2dyb3VwcykgOiBudWxsO1xuICB9XG4gIGdldEdyb3VwKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5nZXQoaWQpIHx8IG51bGw7XG4gIH1cbiAgZ2V0SGFzaCgpIHtcbiAgICBpZiAodGhpcy4jY2FjaGVkR2V0SGFzaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuI2NhY2hlZEdldEhhc2g7XG4gICAgfVxuICAgIGNvbnN0IGhhc2ggPSBuZXcgX3NoYXJlZF9tdXJtdXJoYXNoM19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLk11cm11ckhhc2gzXzY0KCk7XG4gICAgZm9yIChjb25zdCBbaWQsIGdyb3VwXSBvZiB0aGlzLiNncm91cHMpIHtcbiAgICAgIGhhc2gudXBkYXRlKGAke2lkfToke2dyb3VwLnZpc2libGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNjYWNoZWRHZXRIYXNoID0gaGFzaC5oZXhkaWdlc3QoKTtcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NzM5OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX19fd2VicGFja19tb2R1bGVfXywgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG4vKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuLyogaGFybW9ueSBleHBvcnQgKi8gICByZW5kZXJUZXh0TGF5ZXI6ICgpID0+ICgvKiBiaW5kaW5nICovIHJlbmRlclRleHRMYXllciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIHVwZGF0ZVRleHRMYXllcjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gdXBkYXRlVGV4dExheWVyKVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiB1bnVzZWQgaGFybW9ueSBleHBvcnQgVGV4dExheWVyUmVuZGVyVGFzayAqL1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9wdXNoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19lcnJvcl9jYXVzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzUyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI2Nik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDczKTtcblxuXG5cblxuY29uc3QgTUFYX1RFWFRfRElWU19UT19SRU5ERVIgPSAxMDAwMDA7XG5jb25zdCBERUZBVUxUX0ZPTlRfU0laRSA9IDMwO1xuY29uc3QgREVGQVVMVF9GT05UX0FTQ0VOVCA9IDAuODtcbmNvbnN0IGFzY2VudENhY2hlID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0Q3R4KHNpemUsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7XG4gIGxldCBjdHg7XG4gIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJiBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5GZWF0dXJlVGVzdC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkge1xuICAgIGN0eCA9IG5ldyBPZmZzY3JlZW5DYW52YXMoc2l6ZSwgc2l6ZSkuZ2V0Q29udGV4dChcIjJkXCIsIHtcbiAgICAgIGFscGhhOiBmYWxzZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IHNpemU7XG4gICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiLCB7XG4gICAgICBhbHBoYTogZmFsc2VcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY3R4O1xufVxuZnVuY3Rpb24gZ2V0QXNjZW50KGZvbnRGYW1pbHksIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7XG4gIGNvbnN0IGNhY2hlZEFzY2VudCA9IGFzY2VudENhY2hlLmdldChmb250RmFtaWx5KTtcbiAgaWYgKGNhY2hlZEFzY2VudCkge1xuICAgIHJldHVybiBjYWNoZWRBc2NlbnQ7XG4gIH1cbiAgY29uc3QgY3R4ID0gZ2V0Q3R4KERFRkFVTFRfRk9OVF9TSVpFLCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCk7XG4gIGN0eC5mb250ID0gYCR7REVGQVVMVF9GT05UX1NJWkV9cHggJHtmb250RmFtaWx5fWA7XG4gIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoXCJcIik7XG4gIGxldCBhc2NlbnQgPSBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveEFzY2VudDtcbiAgbGV0IGRlc2NlbnQgPSBNYXRoLmFicyhtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpO1xuICBpZiAoYXNjZW50KSB7XG4gICAgY29uc3QgcmF0aW8gPSBhc2NlbnQgLyAoYXNjZW50ICsgZGVzY2VudCk7XG4gICAgYXNjZW50Q2FjaGUuc2V0KGZvbnRGYW1pbHksIHJhdGlvKTtcbiAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgIHJldHVybiByYXRpbztcbiAgfVxuICBjdHguc3Ryb2tlU3R5bGUgPSBcInJlZFwiO1xuICBjdHguY2xlYXJSZWN0KDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSk7XG4gIGN0eC5zdHJva2VUZXh0KFwiZ1wiLCAwLCAwKTtcbiAgbGV0IHBpeGVscyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKS5kYXRhO1xuICBkZXNjZW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IHBpeGVscy5sZW5ndGggLSAxIC0gMzsgaSA+PSAwOyBpIC09IDQpIHtcbiAgICBpZiAocGl4ZWxzW2ldID4gMCkge1xuICAgICAgZGVzY2VudCA9IE1hdGguY2VpbChpIC8gNCAvIERFRkFVTFRfRk9OVF9TSVpFKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjdHguY2xlYXJSZWN0KDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSk7XG4gIGN0eC5zdHJva2VUZXh0KFwiQVwiLCAwLCBERUZBVUxUX0ZPTlRfU0laRSk7XG4gIHBpeGVscyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKS5kYXRhO1xuICBhc2NlbnQgPSAwO1xuICBmb3IgKGxldCBpID0gMCwgaWkgPSBwaXhlbHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgIGlmIChwaXhlbHNbaV0gPiAwKSB7XG4gICAgICBhc2NlbnQgPSBERUZBVUxUX0ZPTlRfU0laRSAtIE1hdGguZmxvb3IoaSAvIDQgLyBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgY3R4LmNhbnZhcy53aWR0aCA9IGN0eC5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgaWYgKGFzY2VudCkge1xuICAgIGNvbnN0IHJhdGlvID0gYXNjZW50IC8gKGFzY2VudCArIGRlc2NlbnQpO1xuICAgIGFzY2VudENhY2hlLnNldChmb250RmFtaWx5LCByYXRpbyk7XG4gICAgcmV0dXJuIHJhdGlvO1xuICB9XG4gIGFzY2VudENhY2hlLnNldChmb250RmFtaWx5LCBERUZBVUxUX0ZPTlRfQVNDRU5UKTtcbiAgcmV0dXJuIERFRkFVTFRfRk9OVF9BU0NFTlQ7XG59XG5mdW5jdGlvbiBhcHBlbmRUZXh0KHRhc2ssIGdlb20sIHN0eWxlcykge1xuICBjb25zdCB0ZXh0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIGNvbnN0IHRleHREaXZQcm9wZXJ0aWVzID0ge1xuICAgIGFuZ2xlOiAwLFxuICAgIGNhbnZhc1dpZHRoOiAwLFxuICAgIGhhc1RleHQ6IGdlb20uc3RyICE9PSBcIlwiLFxuICAgIGhhc0VPTDogZ2VvbS5oYXNFT0wsXG4gICAgZm9udFNpemU6IDBcbiAgfTtcbiAgdGFzay5fdGV4dERpdnMucHVzaCh0ZXh0RGl2KTtcbiAgY29uc3QgdHggPSBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5VdGlsLnRyYW5zZm9ybSh0YXNrLl90cmFuc2Zvcm0sIGdlb20udHJhbnNmb3JtKTtcbiAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMih0eFsxXSwgdHhbMF0pO1xuICBjb25zdCBzdHlsZSA9IHN0eWxlc1tnZW9tLmZvbnROYW1lXTtcbiAgaWYgKHN0eWxlLnZlcnRpY2FsKSB7XG4gICAgYW5nbGUgKz0gTWF0aC5QSSAvIDI7XG4gIH1cbiAgY29uc3QgZm9udEZhbWlseSA9IHRhc2suX2ZvbnRJbnNwZWN0b3JFbmFibGVkICYmIHN0eWxlLmZvbnRTdWJzdGl0dXRpb24gfHwgc3R5bGUuZm9udEZhbWlseTtcbiAgY29uc3QgZm9udEhlaWdodCA9IE1hdGguaHlwb3QodHhbMl0sIHR4WzNdKTtcbiAgY29uc3QgZm9udEFzY2VudCA9IGZvbnRIZWlnaHQgKiBnZXRBc2NlbnQoZm9udEZhbWlseSwgdGFzay5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO1xuICBsZXQgbGVmdCwgdG9wO1xuICBpZiAoYW5nbGUgPT09IDApIHtcbiAgICBsZWZ0ID0gdHhbNF07XG4gICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50O1xuICB9IGVsc2Uge1xuICAgIGxlZnQgPSB0eFs0XSArIGZvbnRBc2NlbnQgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50ICogTWF0aC5jb3MoYW5nbGUpO1xuICB9XG4gIGNvbnN0IHNjYWxlRmFjdG9yU3RyID0gXCJjYWxjKHZhcigtLXNjYWxlLWZhY3RvcikqXCI7XG4gIGNvbnN0IGRpdlN0eWxlID0gdGV4dERpdi5zdHlsZTtcbiAgaWYgKHRhc2suX2NvbnRhaW5lciA9PT0gdGFzay5fcm9vdENvbnRhaW5lcikge1xuICAgIGRpdlN0eWxlLmxlZnQgPSBgJHsoMTAwICogbGVmdCAvIHRhc2suX3BhZ2VXaWR0aCkudG9GaXhlZCgyKX0lYDtcbiAgICBkaXZTdHlsZS50b3AgPSBgJHsoMTAwICogdG9wIC8gdGFzay5fcGFnZUhlaWdodCkudG9GaXhlZCgyKX0lYDtcbiAgfSBlbHNlIHtcbiAgICBkaXZTdHlsZS5sZWZ0ID0gYCR7c2NhbGVGYWN0b3JTdHJ9JHtsZWZ0LnRvRml4ZWQoMil9cHgpYDtcbiAgICBkaXZTdHlsZS50b3AgPSBgJHtzY2FsZUZhY3RvclN0cn0ke3RvcC50b0ZpeGVkKDIpfXB4KWA7XG4gIH1cbiAgZGl2U3R5bGUuZm9udFNpemUgPSBgJHtzY2FsZUZhY3RvclN0cn0ke2ZvbnRIZWlnaHQudG9GaXhlZCgyKX1weClgO1xuICBkaXZTdHlsZS5mb250RmFtaWx5ID0gZm9udEZhbWlseTtcbiAgdGV4dERpdlByb3BlcnRpZXMuZm9udFNpemUgPSBmb250SGVpZ2h0O1xuICB0ZXh0RGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gIHRleHREaXYudGV4dENvbnRlbnQgPSBnZW9tLnN0cjtcbiAgdGV4dERpdi5kaXIgPSBnZW9tLmRpcjtcbiAgaWYgKHRhc2suX2ZvbnRJbnNwZWN0b3JFbmFibGVkKSB7XG4gICAgdGV4dERpdi5kYXRhc2V0LmZvbnROYW1lID0gc3R5bGUuZm9udFN1YnN0aXR1dGlvbkxvYWRlZE5hbWUgfHwgZ2VvbS5mb250TmFtZTtcbiAgfVxuICBpZiAoYW5nbGUgIT09IDApIHtcbiAgICB0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSA9IGFuZ2xlICogKDE4MCAvIE1hdGguUEkpO1xuICB9XG4gIGxldCBzaG91bGRTY2FsZVRleHQgPSBmYWxzZTtcbiAgaWYgKGdlb20uc3RyLmxlbmd0aCA+IDEpIHtcbiAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGdlb20uc3RyICE9PSBcIiBcIiAmJiBnZW9tLnRyYW5zZm9ybVswXSAhPT0gZ2VvbS50cmFuc2Zvcm1bM10pIHtcbiAgICBjb25zdCBhYnNTY2FsZVggPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVswXSksXG4gICAgICBhYnNTY2FsZVkgPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVszXSk7XG4gICAgaWYgKGFic1NjYWxlWCAhPT0gYWJzU2NhbGVZICYmIE1hdGgubWF4KGFic1NjYWxlWCwgYWJzU2NhbGVZKSAvIE1hdGgubWluKGFic1NjYWxlWCwgYWJzU2NhbGVZKSA+IDEuNSkge1xuICAgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHNob3VsZFNjYWxlVGV4dCkge1xuICAgIHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoID0gc3R5bGUudmVydGljYWwgPyBnZW9tLmhlaWdodCA6IGdlb20ud2lkdGg7XG4gIH1cbiAgdGFzay5fdGV4dERpdlByb3BlcnRpZXMuc2V0KHRleHREaXYsIHRleHREaXZQcm9wZXJ0aWVzKTtcbiAgaWYgKHRhc2suX2lzUmVhZGFibGVTdHJlYW0pIHtcbiAgICB0YXNrLl9sYXlvdXRUZXh0KHRleHREaXYpO1xuICB9XG59XG5mdW5jdGlvbiBsYXlvdXQocGFyYW1zKSB7XG4gIGNvbnN0IHtcbiAgICBkaXYsXG4gICAgc2NhbGUsXG4gICAgcHJvcGVydGllcyxcbiAgICBjdHgsXG4gICAgcHJldkZvbnRTaXplLFxuICAgIHByZXZGb250RmFtaWx5XG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBzdHlsZVxuICB9ID0gZGl2O1xuICBsZXQgdHJhbnNmb3JtID0gXCJcIjtcbiAgaWYgKHByb3BlcnRpZXMuY2FudmFzV2lkdGggIT09IDAgJiYgcHJvcGVydGllcy5oYXNUZXh0KSB7XG4gICAgY29uc3Qge1xuICAgICAgZm9udEZhbWlseVxuICAgIH0gPSBzdHlsZTtcbiAgICBjb25zdCB7XG4gICAgICBjYW52YXNXaWR0aCxcbiAgICAgIGZvbnRTaXplXG4gICAgfSA9IHByb3BlcnRpZXM7XG4gICAgaWYgKHByZXZGb250U2l6ZSAhPT0gZm9udFNpemUgfHwgcHJldkZvbnRGYW1pbHkgIT09IGZvbnRGYW1pbHkpIHtcbiAgICAgIGN0eC5mb250ID0gYCR7Zm9udFNpemUgKiBzY2FsZX1weCAke2ZvbnRGYW1pbHl9YDtcbiAgICAgIHBhcmFtcy5wcmV2Rm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgIHBhcmFtcy5wcmV2Rm9udEZhbWlseSA9IGZvbnRGYW1pbHk7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoXG4gICAgfSA9IGN0eC5tZWFzdXJlVGV4dChkaXYudGV4dENvbnRlbnQpO1xuICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgIHRyYW5zZm9ybSA9IGBzY2FsZVgoJHtjYW52YXNXaWR0aCAqIHNjYWxlIC8gd2lkdGh9KWA7XG4gICAgfVxuICB9XG4gIGlmIChwcm9wZXJ0aWVzLmFuZ2xlICE9PSAwKSB7XG4gICAgdHJhbnNmb3JtID0gYHJvdGF0ZSgke3Byb3BlcnRpZXMuYW5nbGV9ZGVnKSAke3RyYW5zZm9ybX1gO1xuICB9XG4gIGlmICh0cmFuc2Zvcm0ubGVuZ3RoID4gMCkge1xuICAgIHN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyKHRhc2spIHtcbiAgaWYgKHRhc2suX2NhbmNlbGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRleHREaXZzID0gdGFzay5fdGV4dERpdnM7XG4gIGNvbnN0IGNhcGFiaWxpdHkgPSB0YXNrLl9jYXBhYmlsaXR5O1xuICBjb25zdCB0ZXh0RGl2c0xlbmd0aCA9IHRleHREaXZzLmxlbmd0aDtcbiAgaWYgKHRleHREaXZzTGVuZ3RoID4gTUFYX1RFWFRfRElWU19UT19SRU5ERVIpIHtcbiAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF0YXNrLl9pc1JlYWRhYmxlU3RyZWFtKSB7XG4gICAgZm9yIChjb25zdCB0ZXh0RGl2IG9mIHRleHREaXZzKSB7XG4gICAgICB0YXNrLl9sYXlvdXRUZXh0KHRleHREaXYpO1xuICAgIH1cbiAgfVxuICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbn1cbmNsYXNzIFRleHRMYXllclJlbmRlclRhc2sge1xuICBjb25zdHJ1Y3RvcihfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIHRleHRDb250ZW50U291cmNlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdmlld3BvcnQsXG4gICAgICB0ZXh0RGl2cyxcbiAgICAgIHRleHREaXZQcm9wZXJ0aWVzLFxuICAgICAgdGV4dENvbnRlbnRJdGVtc1N0cixcbiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkXG4gICAgfSA9IF9yZWY7XG4gICAgdGhpcy5fdGV4dENvbnRlbnRTb3VyY2UgPSB0ZXh0Q29udGVudFNvdXJjZTtcbiAgICB0aGlzLl9pc1JlYWRhYmxlU3RyZWFtID0gdGV4dENvbnRlbnRTb3VyY2UgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9yb290Q29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuX3RleHREaXZzID0gdGV4dERpdnMgfHwgW107XG4gICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRleHRDb250ZW50SXRlbXNTdHIgfHwgW107XG4gICAgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDtcbiAgICB0aGlzLl9mb250SW5zcGVjdG9yRW5hYmxlZCA9ICEhZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yPy5lbmFibGVkO1xuICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSB0ZXh0RGl2UHJvcGVydGllcyB8fCBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuX2NhbmNlbGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIHRoaXMuX2xheW91dFRleHRQYXJhbXMgPSB7XG4gICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG4gICAgICBwcmV2Rm9udEZhbWlseTogbnVsbCxcbiAgICAgIGRpdjogbnVsbCxcbiAgICAgIHNjYWxlOiB2aWV3cG9ydC5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSksXG4gICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgY3R4OiBnZXRDdHgoMCwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpXG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0LFxuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuICAgIHRoaXMuX3RyYW5zZm9ybSA9IFsxLCAwLCAwLCAtMSwgLXBhZ2VYLCBwYWdlWSArIHBhZ2VIZWlnaHRdO1xuICAgIHRoaXMuX3BhZ2VXaWR0aCA9IHBhZ2VXaWR0aDtcbiAgICB0aGlzLl9wYWdlSGVpZ2h0ID0gcGFnZUhlaWdodDtcbiAgICAoMCxfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLnNldExheWVyRGltZW5zaW9ucykoY29udGFpbmVyLCB2aWV3cG9ydCk7XG4gICAgdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5fbGF5b3V0VGV4dFBhcmFtcyA9IG51bGw7XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuX2NhbmNlbGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVhZGVyKSB7XG4gICAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5BYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIikpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5BYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIikpO1xuICB9XG4gIF9wcm9jZXNzSXRlbXMoaXRlbXMsIHN0eWxlQ2FjaGUpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiYmVnaW5NYXJrZWRDb250ZW50UHJvcHNcIiB8fCBpdGVtLnR5cGUgPT09IFwiYmVnaW5NYXJrZWRDb250ZW50XCIpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXJrZWRDb250ZW50XCIpO1xuICAgICAgICAgIGlmIChpdGVtLmlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKFwiaWRcIiwgYCR7aXRlbS5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50LmFwcGVuZCh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJlbmRNYXJrZWRDb250ZW50XCIpIHtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RleHRDb250ZW50SXRlbXNTdHIucHVzaChpdGVtLnN0cik7XG4gICAgICBhcHBlbmRUZXh0KHRoaXMsIGl0ZW0sIHN0eWxlQ2FjaGUpO1xuICAgIH1cbiAgfVxuICBfbGF5b3V0VGV4dCh0ZXh0RGl2KSB7XG4gICAgY29uc3QgdGV4dERpdlByb3BlcnRpZXMgPSB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zLnByb3BlcnRpZXMgPSB0aGlzLl90ZXh0RGl2UHJvcGVydGllcy5nZXQodGV4dERpdik7XG4gICAgdGhpcy5fbGF5b3V0VGV4dFBhcmFtcy5kaXYgPSB0ZXh0RGl2O1xuICAgIGxheW91dCh0aGlzLl9sYXlvdXRUZXh0UGFyYW1zKTtcbiAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuaGFzVGV4dCkge1xuICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZCh0ZXh0RGl2KTtcbiAgICB9XG4gICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmhhc0VPTCkge1xuICAgICAgY29uc3QgYnIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIik7XG4gICAgICBici5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZChicik7XG4gICAgfVxuICB9XG4gIF9yZW5kZXIoKSB7XG4gICAgY29uc3QgY2FwYWJpbGl0eSA9IG5ldyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgIGxldCBzdHlsZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAodGhpcy5faXNSZWFkYWJsZVN0cmVhbSkge1xuICAgICAgY29uc3QgcHVtcCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKS50aGVuKF9yZWYyID0+IHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBkb25lXG4gICAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZUNhY2hlLCB2YWx1ZS5zdHlsZXMpO1xuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJdGVtcyh2YWx1ZS5pdGVtcywgc3R5bGVDYWNoZSk7XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9LCBjYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5fcmVhZGVyID0gdGhpcy5fdGV4dENvbnRlbnRTb3VyY2UuZ2V0UmVhZGVyKCk7XG4gICAgICBwdW1wKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl90ZXh0Q29udGVudFNvdXJjZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgc3R5bGVzXG4gICAgICB9ID0gdGhpcy5fdGV4dENvbnRlbnRTb3VyY2U7XG4gICAgICB0aGlzLl9wcm9jZXNzSXRlbXMoaXRlbXMsIHN0eWxlcyk7XG4gICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcInRleHRDb250ZW50U291cmNlXCIgcGFyYW1ldGVyIHNwZWNpZmllZC4nKTtcbiAgICB9XG4gICAgY2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgc3R5bGVDYWNoZSA9IG51bGw7XG4gICAgICByZW5kZXIodGhpcyk7XG4gICAgfSwgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QpO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIocGFyYW1zKSB7XG4gIGNvbnN0IHRhc2sgPSBuZXcgVGV4dExheWVyUmVuZGVyVGFzayhwYXJhbXMpO1xuICB0YXNrLl9yZW5kZXIoKTtcbiAgcmV0dXJuIHRhc2s7XG59XG5mdW5jdGlvbiB1cGRhdGVUZXh0TGF5ZXIoX3JlZjMpIHtcbiAgbGV0IHtcbiAgICBjb250YWluZXIsXG4gICAgdmlld3BvcnQsXG4gICAgdGV4dERpdnMsXG4gICAgdGV4dERpdlByb3BlcnRpZXMsXG4gICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQsXG4gICAgbXVzdFJvdGF0ZSA9IHRydWUsXG4gICAgbXVzdFJlc2NhbGUgPSB0cnVlXG4gIH0gPSBfcmVmMztcbiAgaWYgKG11c3RSb3RhdGUpIHtcbiAgICAoMCxfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLnNldExheWVyRGltZW5zaW9ucykoY29udGFpbmVyLCB7XG4gICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb25cbiAgICB9KTtcbiAgfVxuICBpZiAobXVzdFJlc2NhbGUpIHtcbiAgICBjb25zdCBjdHggPSBnZXRDdHgoMCwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO1xuICAgIGNvbnN0IHNjYWxlID0gdmlld3BvcnQuc2NhbGUgKiAoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHByZXZGb250U2l6ZTogbnVsbCxcbiAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuICAgICAgZGl2OiBudWxsLFxuICAgICAgc2NhbGUsXG4gICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgY3R4XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGRpdiBvZiB0ZXh0RGl2cykge1xuICAgICAgcGFyYW1zLnByb3BlcnRpZXMgPSB0ZXh0RGl2UHJvcGVydGllcy5nZXQoZGl2KTtcbiAgICAgIHBhcmFtcy5kaXYgPSBkaXY7XG4gICAgICBsYXlvdXQocGFyYW1zKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gNDA5Mjpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUERGRGF0YVRyYW5zcG9ydFN0cmVhbTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gUERGRGF0YVRyYW5zcG9ydFN0cmVhbSlcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgzNyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5ODAzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfc2V0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNDcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19yZXZlcnNlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTk1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjAyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2FycmF5X2J1ZmZlcl9kZXRhY2hlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX3RyYW5zZmVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzMDUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX3RyYW5zZmVyX3RvX2ZpeGVkX2xlbmd0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTgzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjI2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2l0ZXJhdG9yX2NvbnN0cnVjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MTIxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNuZXh0X2l0ZXJhdG9yX3NvbWVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1MTgpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI2Nik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3Myk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKF9yZWYsIHBkZkRhdGFSYW5nZVRyYW5zcG9ydCkge1xuICAgIGxldCB7XG4gICAgICBsZW5ndGgsXG4gICAgICBpbml0aWFsRGF0YSxcbiAgICAgIHByb2dyZXNzaXZlRG9uZSA9IGZhbHNlLFxuICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBudWxsLFxuICAgICAgZGlzYWJsZVJhbmdlID0gZmFsc2UsXG4gICAgICBkaXNhYmxlU3RyZWFtID0gZmFsc2VcbiAgICB9ID0gX3JlZjtcbiAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18uYXNzZXJ0KShwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsICdQREZEYXRhVHJhbnNwb3J0U3RyZWFtIC0gbWlzc2luZyByZXF1aXJlZCBcInBkZkRhdGFSYW5nZVRyYW5zcG9ydFwiIGFyZ3VtZW50LicpO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHByb2dyZXNzaXZlRG9uZTtcbiAgICB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lO1xuICAgIGlmIChpbml0aWFsRGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYnVmZmVyID0gaW5pdGlhbERhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGluaXRpYWxEYXRhLmJ5dGVMZW5ndGggPT09IGluaXRpYWxEYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoID8gaW5pdGlhbERhdGEuYnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoaW5pdGlhbERhdGEpLmJ1ZmZlcjtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG4gICAgfVxuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydCA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydDtcbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFkaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhZGlzYWJsZVJhbmdlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVhZGVycyA9IFtdO1xuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRSYW5nZUxpc3RlbmVyKChiZWdpbiwgY2h1bmspID0+IHtcbiAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoe1xuICAgICAgICBiZWdpbixcbiAgICAgICAgY2h1bmtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc0xpc3RlbmVyKChsb2FkZWQsIHRvdGFsKSA9PiB7XG4gICAgICB0aGlzLl9vblByb2dyZXNzKHtcbiAgICAgICAgbG9hZGVkLFxuICAgICAgICB0b3RhbFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGNodW5rID0+IHtcbiAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoe1xuICAgICAgICBjaHVua1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKCgpID0+IHtcbiAgICAgIHRoaXMuX29uUHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgfSk7XG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnRyYW5zcG9ydFJlYWR5KCk7XG4gIH1cbiAgX29uUmVjZWl2ZURhdGEoX3JlZjIpIHtcbiAgICBsZXQge1xuICAgICAgYmVnaW4sXG4gICAgICBjaHVua1xuICAgIH0gPSBfcmVmMjtcbiAgICBjb25zdCBidWZmZXIgPSBjaHVuayBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgY2h1bmsuYnl0ZUxlbmd0aCA9PT0gY2h1bmsuYnVmZmVyLmJ5dGVMZW5ndGggPyBjaHVuay5idWZmZXIgOiBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyO1xuICAgIGlmIChiZWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcbiAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2VucXVldWUoYnVmZmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHJhbmdlUmVhZGVyKSB7XG4gICAgICAgIGlmIChyYW5nZVJlYWRlci5fYmVnaW4gIT09IGJlZ2luKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJhbmdlUmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgICAoMCxfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18uYXNzZXJ0KShmb3VuZCwgXCJfb25SZWNlaXZlRGF0YSAtIG5vIGBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXJgIGluc3RhbmNlIGZvdW5kLlwiKTtcbiAgICB9XG4gIH1cbiAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkID8/IDA7XG4gIH1cbiAgX29uUHJvZ3Jlc3MoZXZ0KSB7XG4gICAgaWYgKGV2dC50b3RhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yYW5nZVJlYWRlcnNbMF0/Lm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5vblByb2dyZXNzPy4oe1xuICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICAgIHRvdGFsOiBldnQudG90YWxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBfb25Qcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LnByb2dyZXNzaXZlRG9uZSgpO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHRydWU7XG4gIH1cbiAgX3JlbW92ZVJhbmdlUmVhZGVyKHJlYWRlcikge1xuICAgIGNvbnN0IGkgPSB0aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgKDAsX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERkRhdGFUcmFuc3BvcnRTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgY29uc3QgcXVldWVkQ2h1bmtzID0gdGhpcy5fcXVldWVkQ2h1bmtzO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IG51bGw7XG4gICAgcmV0dXJuIG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyKHRoaXMsIHF1ZXVlZENodW5rcywgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lLCB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSk7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWJvcnQoKTtcbiAgfVxufVxuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgcXVldWVkQ2h1bmtzKSB7XG4gICAgbGV0IHByb2dyZXNzaXZlRG9uZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgbGV0IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9kb25lID0gcHJvZ3Jlc3NpdmVEb25lIHx8IGZhbHNlO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsX2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX18uaXNQZGZGaWxlKShjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSkgPyBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA6IG51bGw7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gcXVldWVkQ2h1bmtzIHx8IFtdO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiB0aGlzLl9xdWV1ZWRDaHVua3MpIHtcbiAgICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHN0cmVhbS5fZnVsbFJlcXVlc3RSZWFkZXIgPSB0aGlzO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgX2VucXVldWUoY2h1bmspIHtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTtcbiAgfVxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bmtzLnNoaWZ0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgfVxuICBwcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gIH1cbn1cbmNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9iZWdpbiA9IGJlZ2luO1xuICAgIHRoaXMuX2VuZCA9IGVuZDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBfZW5xdWV1ZShjaHVuaykge1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RzQ2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0c0NhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmspIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBuZXcgX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDEzNjg6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEdsb2JhbFdvcmtlck9wdGlvbnM6ICgpID0+ICgvKiBiaW5kaW5nICovIEdsb2JhbFdvcmtlck9wdGlvbnMpXG4vKiBoYXJtb255IGV4cG9ydCAqLyB9KTtcbmNvbnN0IEdsb2JhbFdvcmtlck9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0ID0gbnVsbDtcbkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gXCJcIjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODI2Njpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgWGZhTGF5ZXI6ICgpID0+ICgvKiBiaW5kaW5nICovIFhmYUxheWVyKVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDIyNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3hmYV90ZXh0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1MjEpO1xuXG5cbmNsYXNzIFhmYUxheWVyIHtcbiAgc3RhdGljIHNldHVwU3RvcmFnZShodG1sLCBpZCwgZWxlbWVudCwgc3RvcmFnZSwgaW50ZW50KSB7XG4gICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfSk7XG4gICAgc3dpdGNoIChlbGVtZW50Lm5hbWUpIHtcbiAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGh0bWwudGV4dENvbnRlbnQgPSBzdG9yZWREYXRhLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlbnQgPT09IFwicHJpbnRcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICBpZiAoZWxlbWVudC5hdHRyaWJ1dGVzLnR5cGUgPT09IFwicmFkaW9cIiB8fCBlbGVtZW50LmF0dHJpYnV0ZXMudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgPT09IGVsZW1lbnQuYXR0cmlidXRlcy54ZmFPbikge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcmVkRGF0YS52YWx1ZSA9PT0gZWxlbWVudC5hdHRyaWJ1dGVzLnhmYU9mZikge1xuICAgICAgICAgICAgaHRtbC5yZW1vdmVBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW50ZW50ID09PSBcInByaW50XCIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LmNoZWNrZWQgPyBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKFwieGZhT25cIikgOiBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKFwieGZhT2ZmXCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzdG9yZWREYXRhLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHN0b3JlZERhdGEudmFsdWUpO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uYXR0cmlidXRlcy52YWx1ZSA9PT0gc3RvcmVkRGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgICBvcHRpb24uYXR0cmlidXRlcy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KFwic2VsZWN0ZWRcIikpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbi5hdHRyaWJ1dGVzLnNlbGVjdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5zZWxlY3RlZEluZGV4ID09PSAtMSA/IFwiXCIgOiBvcHRpb25zW29wdGlvbnMuc2VsZWN0ZWRJbmRleF0udmFsdWU7XG4gICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgc2V0QXR0cmlidXRlcyhfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGh0bWwsXG4gICAgICBlbGVtZW50LFxuICAgICAgc3RvcmFnZSA9IG51bGwsXG4gICAgICBpbnRlbnQsXG4gICAgICBsaW5rU2VydmljZVxuICAgIH0gPSBfcmVmO1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICB9ID0gZWxlbWVudDtcbiAgICBjb25zdCBpc0hUTUxBbmNob3JFbGVtZW50ID0gaHRtbCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGlmIChhdHRyaWJ1dGVzLnR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgYXR0cmlidXRlcy5uYW1lID0gYCR7YXR0cmlidXRlcy5uYW1lfS0ke2ludGVudH1gO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlLmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkYXRhSWRcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImlkXCI6XG4gICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGh0bWwuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgaHRtbC50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghaXNIVE1MQW5jaG9yRWxlbWVudCB8fCBrZXkgIT09IFwiaHJlZlwiICYmIGtleSAhPT0gXCJuZXdXaW5kb3dcIikge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgICAgbGlua1NlcnZpY2UuYWRkTGlua0F0dHJpYnV0ZXMoaHRtbCwgYXR0cmlidXRlcy5ocmVmLCBhdHRyaWJ1dGVzLm5ld1dpbmRvdyk7XG4gICAgfVxuICAgIGlmIChzdG9yYWdlICYmIGF0dHJpYnV0ZXMuZGF0YUlkKSB7XG4gICAgICB0aGlzLnNldHVwU3RvcmFnZShodG1sLCBhdHRyaWJ1dGVzLmRhdGFJZCwgZWxlbWVudCwgc3RvcmFnZSk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyByZW5kZXIocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gcGFyYW1ldGVycy5saW5rU2VydmljZTtcbiAgICBjb25zdCByb290ID0gcGFyYW1ldGVycy54ZmFIdG1sO1xuICAgIGNvbnN0IGludGVudCA9IHBhcmFtZXRlcnMuaW50ZW50IHx8IFwiZGlzcGxheVwiO1xuICAgIGNvbnN0IHJvb3RIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyb290Lm5hbWUpO1xuICAgIGlmIChyb290LmF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIGh0bWw6IHJvb3RIdG1sLFxuICAgICAgICBlbGVtZW50OiByb290LFxuICAgICAgICBpbnRlbnQsXG4gICAgICAgIGxpbmtTZXJ2aWNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaXNOb3RGb3JSaWNoVGV4dCA9IGludGVudCAhPT0gXCJyaWNoVGV4dFwiO1xuICAgIGNvbnN0IHJvb3REaXYgPSBwYXJhbWV0ZXJzLmRpdjtcbiAgICByb290RGl2LmFwcGVuZChyb290SHRtbCk7XG4gICAgaWYgKHBhcmFtZXRlcnMudmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGBtYXRyaXgoJHtwYXJhbWV0ZXJzLnZpZXdwb3J0LnRyYW5zZm9ybS5qb2luKFwiLFwiKX0pYDtcbiAgICAgIHJvb3REaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIH1cbiAgICBpZiAoaXNOb3RGb3JSaWNoVGV4dCkge1xuICAgICAgcm9vdERpdi5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInhmYUxheWVyIHhmYUZvbnRcIik7XG4gICAgfVxuICAgIGNvbnN0IHRleHREaXZzID0gW107XG4gICAgaWYgKHJvb3QuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAocm9vdC52YWx1ZSkge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocm9vdC52YWx1ZSk7XG4gICAgICAgIHJvb3RIdG1sLmFwcGVuZChub2RlKTtcbiAgICAgICAgaWYgKGlzTm90Rm9yUmljaFRleHQgJiYgX3hmYV90ZXh0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uWGZhVGV4dC5zaG91bGRCdWlsZFRleHQocm9vdC5uYW1lKSkge1xuICAgICAgICAgIHRleHREaXZzLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHREaXZzXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IFtbcm9vdCwgLTEsIHJvb3RIdG1sXV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtwYXJlbnQsIGksIGh0bWxdID0gc3RhY2suYXQoLTEpO1xuICAgICAgaWYgKGkgKyAxID09PSBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkID0gcGFyZW50LmNoaWxkcmVuWysrc3RhY2suYXQoLTEpWzFdXTtcbiAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZVxuICAgICAgfSA9IGNoaWxkO1xuICAgICAgaWYgKG5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQudmFsdWUpO1xuICAgICAgICB0ZXh0RGl2cy5wdXNoKG5vZGUpO1xuICAgICAgICBodG1sLmFwcGVuZChub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZEh0bWwgPSBjaGlsZD8uYXR0cmlidXRlcz8ueG1sbnMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoY2hpbGQuYXR0cmlidXRlcy54bWxucywgbmFtZSkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xuICAgICAgaHRtbC5hcHBlbmQoY2hpbGRIdG1sKTtcbiAgICAgIGlmIChjaGlsZC5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgaHRtbDogY2hpbGRIdG1sLFxuICAgICAgICAgIGVsZW1lbnQ6IGNoaWxkLFxuICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgaW50ZW50LFxuICAgICAgICAgIGxpbmtTZXJ2aWNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCAtMSwgY2hpbGRIdG1sXSk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZC52YWx1ZSk7XG4gICAgICAgIGlmIChpc05vdEZvclJpY2hUZXh0ICYmIF94ZmFfdGV4dF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLlhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KG5hbWUpKSB7XG4gICAgICAgICAgdGV4dERpdnMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZEh0bWwuYXBwZW5kKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIG9mIHJvb3REaXYucXVlcnlTZWxlY3RvckFsbChcIi54ZmFOb25JbnRlcmFjdGl2ZSBpbnB1dCwgLnhmYU5vbkludGVyYWN0aXZlIHRleHRhcmVhXCIpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJyZWFkT25seVwiLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHREaXZzXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgdXBkYXRlKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIil9KWA7XG4gICAgcGFyYW1ldGVycy5kaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIHBhcmFtZXRlcnMuZGl2LmhpZGRlbiA9IGZhbHNlO1xuICB9XG59XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDE1MjE6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFhmYVRleHQ6ICgpID0+ICgvKiBiaW5kaW5nICovIFhmYVRleHQpXG4vKiBoYXJtb255IGV4cG9ydCAqLyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjI2KTtcblxuY2xhc3MgWGZhVGV4dCB7XG4gIHN0YXRpYyB0ZXh0Q29udGVudCh4ZmEpIHtcbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgfTtcbiAgICBmdW5jdGlvbiB3YWxrKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgc3RyID0gbnVsbDtcbiAgICAgIGNvbnN0IG5hbWUgPSBub2RlLm5hbWU7XG4gICAgICBpZiAobmFtZSA9PT0gXCIjdGV4dFwiKSB7XG4gICAgICAgIHN0ciA9IG5vZGUudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKCFYZmFUZXh0LnNob3VsZEJ1aWxkVGV4dChuYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKG5vZGU/LmF0dHJpYnV0ZXM/LnRleHRDb250ZW50KSB7XG4gICAgICAgIHN0ciA9IG5vZGUuYXR0cmlidXRlcy50ZXh0Q29udGVudDtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgICBzdHIgPSBub2RlLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHN0ciAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICBzdHJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHdhbGsoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICB3YWxrKHhmYSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBzdGF0aWMgc2hvdWxkQnVpbGRUZXh0KG5hbWUpIHtcbiAgICByZXR1cm4gIShuYW1lID09PSBcInRleHRhcmVhXCIgfHwgbmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwib3B0aW9uXCIgfHwgbmFtZSA9PT0gXCJzZWxlY3RcIik7XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gOTkwNzpcbi8qKiovICgoX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbl9fd2VicGFja19yZXF1aXJlX18uYShfX3dlYnBhY2tfbW9kdWxlX18sIGFzeW5jIChfX3dlYnBhY2tfaGFuZGxlX2FzeW5jX2RlcGVuZGVuY2llc19fLCBfX3dlYnBhY2tfYXN5bmNfcmVzdWx0X18pID0+IHsgdHJ5IHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFib3J0RXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5BYm9ydEV4Y2VwdGlvbiksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFubm90YXRpb25FZGl0b3JMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZWRpdG9yX2Fubm90YXRpb25fZWRpdG9yX2xheWVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uQW5ub3RhdGlvbkVkaXRvckxheWVyKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQW5ub3RhdGlvbkVkaXRvclR5cGU6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkFubm90YXRpb25FZGl0b3JUeXBlKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZWRpdG9yX3Rvb2xzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFubm90YXRpb25MYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfYW5ub3RhdGlvbl9sYXllcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLkFubm90YXRpb25MYXllciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFubm90YXRpb25Nb2RlOiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5Bbm5vdGF0aW9uTW9kZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIENNYXBDb21wcmVzc2lvblR5cGU6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkNNYXBDb21wcmVzc2lvblR5cGUpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBDb2xvclBpY2tlcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZWRpdG9yX2NvbG9yX3BpY2tlcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLkNvbG9yUGlja2VyKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgRE9NU1ZHRmFjdG9yeTogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLkRPTVNWR0ZhY3RvcnkpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBEcmF3TGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9kaXNwbGF5X2RyYXdfbGF5ZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXy5EcmF3TGF5ZXIpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBGZWF0dXJlVGVzdDogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uRmVhdHVyZVRlc3QpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBHbG9iYWxXb3JrZXJPcHRpb25zOiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfZGlzcGxheV93b3JrZXJfb3B0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fLkdsb2JhbFdvcmtlck9wdGlvbnMpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBJbWFnZUtpbmQ6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkltYWdlS2luZCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEludmFsaWRQREZFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkludmFsaWRQREZFeGNlcHRpb24pLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBNaXNzaW5nUERGRXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5NaXNzaW5nUERGRXhjZXB0aW9uKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgT1BTOiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfc2hhcmVkX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5PUFMpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBPdXRsaW5lcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZWRpdG9yX291dGxpbmVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fLk91dGxpbmVyKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUERGRGF0YVJhbmdlVHJhbnNwb3J0OiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfZGlzcGxheV9hcGlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5QREZEYXRhUmFuZ2VUcmFuc3BvcnQpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBQREZEYXRlU3RyaW5nOiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfZGlzcGxheV9kaXNwbGF5X3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uUERGRGF0ZVN0cmluZyksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFBERldvcmtlcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfYXBpX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uUERGV29ya2VyKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUGFzc3dvcmRSZXNwb25zZXM6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLlBhc3N3b3JkUmVzcG9uc2VzKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUGVybWlzc2lvbkZsYWc6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLlBlcm1pc3Npb25GbGFnKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUGl4ZWxzUGVySW5jaDogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLlBpeGVsc1BlckluY2gpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBQcm9taXNlQ2FwYWJpbGl0eTogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uUHJvbWlzZUNhcGFiaWxpdHkpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9kaXNwbGF5X2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFV0aWw6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLlV0aWwpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBWZXJib3NpdHlMZXZlbDogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uVmVyYm9zaXR5TGV2ZWwpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBYZmFMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfeGZhX2xheWVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fLlhmYUxheWVyKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgYnVpbGQ6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9kaXNwbGF5X2FwaV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmJ1aWxkKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGZldGNoRGF0YTogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmZldGNoRGF0YSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldERvY3VtZW50OiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfZGlzcGxheV9hcGlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5nZXREb2N1bWVudCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldEZpbGVuYW1lRnJvbVVybDogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmdldEZpbGVuYW1lRnJvbVVybCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldFBkZkZpbGVuYW1lRnJvbVVybDogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmdldFBkZkZpbGVuYW1lRnJvbVVybCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldFhmYVBhZ2VWaWV3cG9ydDogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmdldFhmYVBhZ2VWaWV3cG9ydCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGlzRGF0YVNjaGVtZTogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmlzRGF0YVNjaGVtZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGlzUGRmRmlsZTogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmlzUGRmRmlsZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIG5vQ29udGV4dE1lbnU6ICgpID0+ICgvKiByZWV4cG9ydCBzYWZlICovIF9kaXNwbGF5X2Rpc3BsYXlfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5ub0NvbnRleHRNZW51KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgbm9ybWFsaXplVW5pY29kZTogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18ubm9ybWFsaXplVW5pY29kZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIHJlbmRlclRleHRMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfdGV4dF9sYXllcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLnJlbmRlclRleHRMYXllciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIHNldExheWVyRGltZW5zaW9uczogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLnNldExheWVyRGltZW5zaW9ucyksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIHNoYWRvdzogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX3NoYXJlZF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc2hhZG93KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgdXBkYXRlVGV4dExheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgc2FmZSAqLyBfZGlzcGxheV90ZXh0X2xheWVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18udXBkYXRlVGV4dExheWVyKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgdmVyc2lvbjogKCkgPT4gKC8qIHJlZXhwb3J0IHNhZmUgKi8gX2Rpc3BsYXlfYXBpX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18udmVyc2lvbilcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZGlzcGxheV9hcGlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQwNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Rpc3BsYXlfZGlzcGxheV91dGlsc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NzMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9kaXNwbGF5X3RleHRfbGF5ZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTczOSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Rpc3BsYXlfZWRpdG9yX2Fubm90YXRpb25fZWRpdG9yX2xheWVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2MjkpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9kaXNwbGF5X2VkaXRvcl90b29sc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0ODEyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZGlzcGxheV9hbm5vdGF0aW9uX2xheWVyX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9kaXNwbGF5X2VkaXRvcl9jb2xvcl9waWNrZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTA5Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Rpc3BsYXlfZHJhd19sYXllcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDIzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZGlzcGxheV93b3JrZXJfb3B0aW9uc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzY4KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZGlzcGxheV9lZGl0b3Jfb3V0bGluZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0MDUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9kaXNwbGF5X3hmYV9sYXllcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODI2Nik7XG52YXIgX193ZWJwYWNrX2FzeW5jX2RlcGVuZGVuY2llc19fID0gX193ZWJwYWNrX2hhbmRsZV9hc3luY19kZXBlbmRlbmNpZXNfXyhbX2Rpc3BsYXlfYXBpX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19dKTtcbl9kaXNwbGF5X2FwaV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gKF9fd2VicGFja19hc3luY19kZXBlbmRlbmNpZXNfXy50aGVuID8gKGF3YWl0IF9fd2VicGFja19hc3luY19kZXBlbmRlbmNpZXNfXykoKSA6IF9fd2VicGFja19hc3luY19kZXBlbmRlbmNpZXNfXylbMF07XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBwZGZqc1ZlcnNpb24gPSAnNC4wLjM3OSc7XG5jb25zdCBwZGZqc0J1aWxkID0gJzllMTRkMDRmZCc7XG5cbl9fd2VicGFja19hc3luY19yZXN1bHRfXygpO1xufSBjYXRjaChlKSB7IF9fd2VicGFja19hc3luY19yZXN1bHRfXyhlKTsgfSB9KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDY2OTQ6XG4vKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfX193ZWJwYWNrX21vZHVsZV9fLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cbi8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIE1lc3NhZ2VIYW5kbGVyOiAoKSA9PiAoLyogYmluZGluZyAqLyBNZXNzYWdlSGFuZGxlcilcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19lcnJvcl9jYXVzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzUyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjY2KTtcblxuXG5jb25zdCBDYWxsYmFja0tpbmQgPSB7XG4gIFVOS05PV046IDAsXG4gIERBVEE6IDEsXG4gIEVSUk9SOiAyXG59O1xuY29uc3QgU3RyZWFtS2luZCA9IHtcbiAgVU5LTk9XTjogMCxcbiAgQ0FOQ0VMOiAxLFxuICBDQU5DRUxfQ09NUExFVEU6IDIsXG4gIENMT1NFOiAzLFxuICBFTlFVRVVFOiA0LFxuICBFUlJPUjogNSxcbiAgUFVMTDogNixcbiAgUFVMTF9DT01QTEVURTogNyxcbiAgU1RBUlRfQ09NUExFVEU6IDhcbn07XG5mdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikge1xuICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgcmVhc29uID09PSBcIm9iamVjdFwiICYmIHJlYXNvbiAhPT0gbnVsbCkpIHtcbiAgICAoMCxfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLnVucmVhY2hhYmxlKSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgXCJyZWFzb25cIiB0byBiZSBhIChwb3NzaWJseSBjbG9uZWQpIEVycm9yLicpO1xuICB9XG4gIHN3aXRjaCAocmVhc29uLm5hbWUpIHtcbiAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5BYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7XG4gICAgY2FzZSBcIk1pc3NpbmdQREZFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5NaXNzaW5nUERGRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTtcbiAgICBjYXNlIFwiUGFzc3dvcmRFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5QYXNzd29yZEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmNvZGUpO1xuICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5zdGF0dXMpO1xuICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5Vbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5kZXRhaWxzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ldyBfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLlVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnRvU3RyaW5nKCkpO1xuICB9XG59XG5jbGFzcyBNZXNzYWdlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZU5hbWUsIHRhcmdldE5hbWUsIGNvbU9iaikge1xuICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7XG4gICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTtcbiAgICB0aGlzLmNvbU9iaiA9IGNvbU9iajtcbiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgIGlmIChkYXRhLnRhcmdldE5hbWUgIT09IHRoaXMuc291cmNlTmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdHJlYW0pIHtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSBkYXRhLmNhbGxiYWNrSWQ7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdO1xuICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGNhbGxiYWNrICR7Y2FsbGJhY2tJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcbiAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5EQVRBKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEuZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHtcbiAgICAgICAgY29uc3QgY2JTb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhKSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkRBVEEsXG4gICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLFxuICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7XG4gICAgICAgIHRoaXMuI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFjdGlvbihkYXRhLmRhdGEpO1xuICAgIH07XG4gICAgY29tT2JqLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgfVxuICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgYWggPSB0aGlzLmFjdGlvbkhhbmRsZXI7XG4gICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgXCIke2FjdGlvbk5hbWV9XCJgKTtcbiAgICB9XG4gICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyO1xuICB9XG4gIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgZGF0YVxuICAgIH0sIHRyYW5zZmVycyk7XG4gIH1cbiAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKztcbiAgICBjb25zdCBjYXBhYmlsaXR5ID0gbmV3IF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdID0gY2FwYWJpbGl0eTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICBjYWxsYmFja0lkLFxuICAgICAgICBkYXRhXG4gICAgICB9LCB0cmFuc2ZlcnMpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgfVxuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgc2VuZFdpdGhTdHJlYW0oYWN0aW9uTmFtZSwgZGF0YSwgcXVldWVpbmdTdHJhdGVneSwgdHJhbnNmZXJzKSB7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSB0aGlzLnN0cmVhbUlkKyssXG4gICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZSA9IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgc3RhcnQ6IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCBzdGFydENhcGFiaWxpdHkgPSBuZXcgX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSA9IHtcbiAgICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICAgIHN0YXJ0Q2FsbDogc3RhcnRDYXBhYmlsaXR5LFxuICAgICAgICAgIHB1bGxDYWxsOiBudWxsLFxuICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsXG4gICAgICAgICAgaXNDbG9zZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplXG4gICAgICAgIH0sIHRyYW5zZmVycyk7XG4gICAgICAgIHJldHVybiBzdGFydENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBwdWxsOiBjb250cm9sbGVyID0+IHtcbiAgICAgICAgY29uc3QgcHVsbENhcGFiaWxpdHkgPSBuZXcgX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCA9IHB1bGxDYXBhYmlsaXR5O1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9LFxuICAgICAgY2FuY2VsOiByZWFzb24gPT4ge1xuICAgICAgICAoMCxfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmFzc2VydCkocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiY2FuY2VsIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcbiAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5O1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9XG4gICAgfSwgcXVldWVpbmdTdHJhdGVneSk7XG4gIH1cbiAgI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCxcbiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLFxuICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMsXG4gICAgICBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgIGNvbnN0IHN0cmVhbVNpbmsgPSB7XG4gICAgICBlbnF1ZXVlKGNodW5rKSB7XG4gICAgICAgIGxldCBzaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuICAgICAgICBsZXQgdHJhbnNmZXJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3REZXNpcmVkU2l6ZSA9IHRoaXMuZGVzaXJlZFNpemU7XG4gICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gc2l6ZTtcbiAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5zaW5rQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5yZWFkeSA9IHRoaXMuc2lua0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBjaHVua1xuICAgICAgICB9LCB0cmFuc2ZlcnMpO1xuICAgICAgfSxcbiAgICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNMT1NFLFxuICAgICAgICAgIHN0cmVhbUlkXG4gICAgICAgIH0pO1xuICAgICAgICBkZWxldGUgc2VsZi5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICB9LFxuICAgICAgZXJyb3IocmVhc29uKSB7XG4gICAgICAgICgwLF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgXCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgc2lua0NhcGFiaWxpdHk6IG5ldyBfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLlByb21pc2VDYXBhYmlsaXR5KCksXG4gICAgICBvblB1bGw6IG51bGwsXG4gICAgICBvbkNhbmNlbDogbnVsbCxcbiAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSxcbiAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLFxuICAgICAgcmVhZHk6IG51bGxcbiAgICB9O1xuICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIHN0cmVhbVNpbmsucmVhZHkgPSBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rO1xuICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEsIHN0cmVhbVNpbmspKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAjcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCxcbiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLFxuICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG4gICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciA9IHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLFxuICAgICAgc3RyZWFtU2luayA9IHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuICAgIHN3aXRjaCAoZGF0YS5zdHJlYW0pIHtcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDpcbiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA8PSAwICYmIGRhdGEuZGVzaXJlZFNpemUgPiAwKSB7XG4gICAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShzdHJlYW1TaW5rLm9uUHVsbD8uKCkpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOlxuICAgICAgICAoMCxfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmFzc2VydCkoc3RyZWFtQ29udHJvbGxlciwgXCJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCIpO1xuICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRTpcbiAgICAgICAgKDAsX3V0aWxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5hc3NlcnQpKHN0cmVhbUNvbnRyb2xsZXIsIFwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6XG4gICAgICAgICgwLF91dGlsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uYXNzZXJ0KShzdHJlYW1Db250cm9sbGVyLCBcImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCIpO1xuICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOlxuICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoc3RyZWFtU2luay5vbkNhbmNlbD8uKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIHN0cmVhbVNpbmsuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBzdHJlYW0gY2FzZVwiKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGw/LnByb21pc2VdKTtcbiAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjgyNTpcbi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgTXVybXVySGFzaDNfNjQ6ICgpID0+ICgvKiBiaW5kaW5nICovIE11cm11ckhhc2gzXzY0KVxuLyogaGFybW9ueSBleHBvcnQgKi8gfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODM3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmluZF9sYXN0X2luZGV4X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk4MDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zZXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODM0Nyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3JldmVyc2VkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5OTUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19zb3J0ZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV93aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2MDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX2RldGFjaGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0NCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDMwNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfdG9fZml4ZWRfbGVuZ3RoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1ODMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19lcnJvcl9jYXVzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMzUyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzI2Nik7XG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgU0VFRCA9IDB4YzNkMmUxZjA7XG5jb25zdCBNQVNLX0hJR0ggPSAweGZmZmYwMDAwO1xuY29uc3QgTUFTS19MT1cgPSAweGZmZmY7XG5jbGFzcyBNdXJtdXJIYXNoM182NCB7XG4gIGNvbnN0cnVjdG9yKHNlZWQpIHtcbiAgICB0aGlzLmgxID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDtcbiAgICB0aGlzLmgyID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDtcbiAgfVxuICB1cGRhdGUoaW5wdXQpIHtcbiAgICBsZXQgZGF0YSwgbGVuZ3RoO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTtcbiAgICAgIGxlbmd0aCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbnB1dC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7XG4gICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSA+Pj4gODtcbiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgJiAweGZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgoMCxfdXRpbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy5pc0FycmF5QnVmZmVyKShpbnB1dCkpIHtcbiAgICAgIGRhdGEgPSBpbnB1dC5zbGljZSgpO1xuICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBkYXRhIGZvcm1hdCBpbiBNdXJtdXJIYXNoM182NF91cGRhdGUuIFwiICsgXCJJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LlwiKTtcbiAgICB9XG4gICAgY29uc3QgYmxvY2tDb3VudHMgPSBsZW5ndGggPj4gMjtcbiAgICBjb25zdCB0YWlsTGVuZ3RoID0gbGVuZ3RoIC0gYmxvY2tDb3VudHMgKiA0O1xuICAgIGNvbnN0IGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTtcbiAgICBsZXQgazEgPSAwLFxuICAgICAgazIgPSAwO1xuICAgIGxldCBoMSA9IHRoaXMuaDEsXG4gICAgICBoMiA9IHRoaXMuaDI7XG4gICAgY29uc3QgQzEgPSAweGNjOWUyZDUxLFxuICAgICAgQzIgPSAweDFiODczNTkzO1xuICAgIGNvbnN0IEMxX0xPVyA9IEMxICYgTUFTS19MT1csXG4gICAgICBDMl9MT1cgPSBDMiAmIE1BU0tfTE9XO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykge1xuICAgICAgaWYgKGkgJiAxKSB7XG4gICAgICAgIGsxID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNztcbiAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgaDEgXj0gazE7XG4gICAgICAgIGgxID0gaDEgPDwgMTMgfCBoMSA+Pj4gMTk7XG4gICAgICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsyID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazIgPSBrMiAqIEMxICYgTUFTS19ISUdIIHwgazIgKiBDMV9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNztcbiAgICAgICAgazIgPSBrMiAqIEMyICYgTUFTS19ISUdIIHwgazIgKiBDMl9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgaDIgXj0gazI7XG4gICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7XG4gICAgICAgIGgyID0gaDIgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH1cbiAgICB9XG4gICAgazEgPSAwO1xuICAgIHN3aXRjaCAodGFpbExlbmd0aCkge1xuICAgICAgY2FzZSAzOlxuICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDJdIDw8IDE2O1xuICAgICAgY2FzZSAyOlxuICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0XTtcbiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNztcbiAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgaWYgKGJsb2NrQ291bnRzICYgMSkge1xuICAgICAgICAgIGgxIF49IGsxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGgyIF49IGsxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuaDEgPSBoMTtcbiAgICB0aGlzLmgyID0gaDI7XG4gIH1cbiAgaGV4ZGlnZXN0KCkge1xuICAgIGxldCBoMSA9IHRoaXMuaDEsXG4gICAgICBoMiA9IHRoaXMuaDI7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG4gICAgaDEgPSBoMSAqIDB4ZWQ1NThjY2QgJiBNQVNLX0hJR0ggfCBoMSAqIDB4OGNjZCAmIE1BU0tfTE9XO1xuICAgIGgyID0gaDIgKiAweGZmNTFhZmQ3ICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGFmZDdlZDU1ICYgTUFTS19ISUdIKSA+Pj4gMTY7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG4gICAgaDEgPSBoMSAqIDB4MWE4NWVjNTMgJiBNQVNLX0hJR0ggfCBoMSAqIDB4ZWM1MyAmIE1BU0tfTE9XO1xuICAgIGgyID0gaDIgKiAweGM0Y2ViOWZlICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGI5ZmUxYTg1ICYgTUFTS19ISUdIKSA+Pj4gMTY7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG4gICAgcmV0dXJuIChoMSA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsIFwiMFwiKSArIChoMiA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsIFwiMFwiKTtcbiAgfVxufVxuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMjY2OlxuLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX19fd2VicGFja19tb2R1bGVfXywgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG4vKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuLyogaGFybW9ueSBleHBvcnQgKi8gICBBYm9ydEV4Y2VwdGlvbjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gQWJvcnRFeGNlcHRpb24pLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU6ICgpID0+ICgvKiBiaW5kaW5nICovIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQW5ub3RhdGlvbkVkaXRvclByZWZpeDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gQW5ub3RhdGlvbkVkaXRvclByZWZpeCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFubm90YXRpb25FZGl0b3JUeXBlOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uRWRpdG9yVHlwZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFubm90YXRpb25Nb2RlOiAoKSA9PiAoLyogYmluZGluZyAqLyBBbm5vdGF0aW9uTW9kZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEFubm90YXRpb25QcmVmaXg6ICgpID0+ICgvKiBiaW5kaW5nICovIEFubm90YXRpb25QcmVmaXgpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBBbm5vdGF0aW9uVHlwZTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gQW5ub3RhdGlvblR5cGUpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBCYXNlRXhjZXB0aW9uOiAoKSA9PiAoLyogYmluZGluZyAqLyBCYXNlRXhjZXB0aW9uKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgQ01hcENvbXByZXNzaW9uVHlwZTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gQ01hcENvbXByZXNzaW9uVHlwZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEZPTlRfSURFTlRJVFlfTUFUUklYOiAoKSA9PiAoLyogYmluZGluZyAqLyBGT05UX0lERU5USVRZX01BVFJJWCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEZlYXR1cmVUZXN0OiAoKSA9PiAoLyogYmluZGluZyAqLyBGZWF0dXJlVGVzdCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIEZvcm1hdEVycm9yOiAoKSA9PiAoLyogYmluZGluZyAqLyBGb3JtYXRFcnJvciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIElERU5USVRZX01BVFJJWDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gSURFTlRJVFlfTUFUUklYKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgSW1hZ2VLaW5kOiAoKSA9PiAoLyogYmluZGluZyAqLyBJbWFnZUtpbmQpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBJbnZhbGlkUERGRXhjZXB0aW9uOiAoKSA9PiAoLyogYmluZGluZyAqLyBJbnZhbGlkUERGRXhjZXB0aW9uKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgTElORV9GQUNUT1I6ICgpID0+ICgvKiBiaW5kaW5nICovIExJTkVfRkFDVE9SKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEU6ICgpID0+ICgvKiBiaW5kaW5nICovIE1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgTWlzc2luZ1BERkV4Y2VwdGlvbjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gTWlzc2luZ1BERkV4Y2VwdGlvbiksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIE9QUzogKCkgPT4gKC8qIGJpbmRpbmcgKi8gT1BTKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUGFzc3dvcmRFeGNlcHRpb246ICgpID0+ICgvKiBiaW5kaW5nICovIFBhc3N3b3JkRXhjZXB0aW9uKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUGFzc3dvcmRSZXNwb25zZXM6ICgpID0+ICgvKiBiaW5kaW5nICovIFBhc3N3b3JkUmVzcG9uc2VzKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUGVybWlzc2lvbkZsYWc6ICgpID0+ICgvKiBiaW5kaW5nICovIFBlcm1pc3Npb25GbGFnKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUHJvbWlzZUNhcGFiaWxpdHk6ICgpID0+ICgvKiBiaW5kaW5nICovIFByb21pc2VDYXBhYmlsaXR5KSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgUmVuZGVyaW5nSW50ZW50RmxhZzogKCkgPT4gKC8qIGJpbmRpbmcgKi8gUmVuZGVyaW5nSW50ZW50RmxhZyksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFRleHRSZW5kZXJpbmdNb2RlOiAoKSA9PiAoLyogYmluZGluZyAqLyBUZXh0UmVuZGVyaW5nTW9kZSksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgVW5rbm93bkVycm9yRXhjZXB0aW9uOiAoKSA9PiAoLyogYmluZGluZyAqLyBVbmtub3duRXJyb3JFeGNlcHRpb24pLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBVdGlsOiAoKSA9PiAoLyogYmluZGluZyAqLyBVdGlsKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgVmVyYm9zaXR5TGV2ZWw6ICgpID0+ICgvKiBiaW5kaW5nICovIFZlcmJvc2l0eUxldmVsKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgYXNzZXJ0OiAoKSA9PiAoLyogYmluZGluZyAqLyBhc3NlcnQpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBieXRlc1RvU3RyaW5nOiAoKSA9PiAoLyogYmluZGluZyAqLyBieXRlc1RvU3RyaW5nKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldFV1aWQ6ICgpID0+ICgvKiBiaW5kaW5nICovIGdldFV1aWQpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBnZXRWZXJib3NpdHlMZXZlbDogKCkgPT4gKC8qIGJpbmRpbmcgKi8gZ2V0VmVyYm9zaXR5TGV2ZWwpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBpbmZvOiAoKSA9PiAoLyogYmluZGluZyAqLyBpbmZvKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgaXNBcnJheUJ1ZmZlcjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gaXNBcnJheUJ1ZmZlciksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIGlzTm9kZUpTOiAoKSA9PiAoLyogYmluZGluZyAqLyBpc05vZGVKUyksXG4vKiBoYXJtb255IGV4cG9ydCAqLyAgIG5vcm1hbGl6ZVVuaWNvZGU6ICgpID0+ICgvKiBiaW5kaW5nICovIG5vcm1hbGl6ZVVuaWNvZGUpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBvYmplY3RGcm9tTWFwOiAoKSA9PiAoLyogYmluZGluZyAqLyBvYmplY3RGcm9tTWFwKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgc2V0VmVyYm9zaXR5TGV2ZWw6ICgpID0+ICgvKiBiaW5kaW5nICovIHNldFZlcmJvc2l0eUxldmVsKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgc2hhZG93OiAoKSA9PiAoLyogYmluZGluZyAqLyBzaGFkb3cpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBzdHJpbmczMjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gc3RyaW5nMzIpLFxuLyogaGFybW9ueSBleHBvcnQgKi8gICBzdHJpbmdUb0J5dGVzOiAoKSA9PiAoLyogYmluZGluZyAqLyBzdHJpbmdUb0J5dGVzKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgdW5yZWFjaGFibGU6ICgpID0+ICgvKiBiaW5kaW5nICovIHVucmVhY2hhYmxlKSxcbi8qIGhhcm1vbnkgZXhwb3J0ICovICAgd2FybjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gd2Fybilcbi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pO1xuLyogdW51c2VkIGhhcm1vbnkgZXhwb3J0cyBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlLCBBbm5vdGF0aW9uRmllbGRGbGFnLCBBbm5vdGF0aW9uRmxhZywgQW5ub3RhdGlvblJlcGx5VHlwZSwgQkFTRUxJTkVfRkFDVE9SLCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSwgZ2V0TW9kaWZpY2F0aW9uRGF0ZSwgaXNBcnJheUVxdWFsLCBMSU5FX0RFU0NFTlRfRkFDVE9SLCBvYmplY3RTaXplLCBQYWdlQWN0aW9uRXZlbnRUeXBlLCBzdHJpbmdUb1BERlN0cmluZywgc3RyaW5nVG9VVEY4U3RyaW5nLCB1dGY4U3RyaW5nVG9TdHJpbmcgKi9cbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfZXJyb3JfY2F1c2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzM1Mik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19kZWxldGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzY1NSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19oYXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjU1NSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19zaXplX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyMDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9wdXNoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMjYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgzNyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5ODAzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfc2V0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgzNDcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19yZXZlcnNlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OTk1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDYwMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfZGV0YWNoZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0NCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9hcnJheV9idWZmZXJfdHJhbnNmZXJfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzMDUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc25leHRfYXJyYXlfYnVmZmVyX3RyYW5zZmVyX3RvX2ZpeGVkX2xlbmd0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzU4Myk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzbmV4dF9pdGVyYXRvcl9tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5NDQpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBwcm9jZXNzICsgXCJcIiA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09IFwiYnJvd3NlclwiKTtcbmNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTtcbmNvbnN0IEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07XG5jb25zdCBNQVhfSU1BR0VfU0laRV9UT19DQUNIRSA9IDEwZTY7XG5jb25zdCBMSU5FX0ZBQ1RPUiA9IDEuMzU7XG5jb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTtcbmNvbnN0IEJBU0VMSU5FX0ZBQ1RPUiA9IExJTkVfREVTQ0VOVF9GQUNUT1IgLyBMSU5FX0ZBQ1RPUjtcbmNvbnN0IFJlbmRlcmluZ0ludGVudEZsYWcgPSB7XG4gIEFOWTogMHgwMSxcbiAgRElTUExBWTogMHgwMixcbiAgUFJJTlQ6IDB4MDQsXG4gIFNBVkU6IDB4MDgsXG4gIEFOTk9UQVRJT05TX0ZPUk1TOiAweDEwLFxuICBBTk5PVEFUSU9OU19TVE9SQUdFOiAweDIwLFxuICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLFxuICBPUExJU1Q6IDB4MTAwXG59O1xuY29uc3QgQW5ub3RhdGlvbk1vZGUgPSB7XG4gIERJU0FCTEU6IDAsXG4gIEVOQUJMRTogMSxcbiAgRU5BQkxFX0ZPUk1TOiAyLFxuICBFTkFCTEVfU1RPUkFHRTogM1xufTtcbmNvbnN0IEFubm90YXRpb25FZGl0b3JQcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2VkaXRvcl9cIjtcbmNvbnN0IEFubm90YXRpb25FZGl0b3JUeXBlID0ge1xuICBESVNBQkxFOiAtMSxcbiAgTk9ORTogMCxcbiAgRlJFRVRFWFQ6IDMsXG4gIEhJR0hMSUdIVDogOSxcbiAgU1RBTVA6IDEzLFxuICBJTks6IDE1XG59O1xuY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7XG4gIFJFU0laRTogMSxcbiAgQ1JFQVRFOiAyLFxuICBGUkVFVEVYVF9TSVpFOiAxMSxcbiAgRlJFRVRFWFRfQ09MT1I6IDEyLFxuICBGUkVFVEVYVF9PUEFDSVRZOiAxMyxcbiAgSU5LX0NPTE9SOiAyMSxcbiAgSU5LX1RISUNLTkVTUzogMjIsXG4gIElOS19PUEFDSVRZOiAyMyxcbiAgSElHSExJR0hUX0NPTE9SOiAzMSxcbiAgSElHSExJR0hUX0RFRkFVTFRfQ09MT1I6IDMyXG59O1xuY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG4gIFBSSU5UOiAweDA0LFxuICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsXG4gIENPUFk6IDB4MTAsXG4gIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcbiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsXG4gIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuICBBU1NFTUJMRTogMHg0MDAsXG4gIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDBcbn07XG5jb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHtcbiAgRklMTDogMCxcbiAgU1RST0tFOiAxLFxuICBGSUxMX1NUUk9LRTogMixcbiAgSU5WSVNJQkxFOiAzLFxuICBGSUxMX0FERF9UT19QQVRIOiA0LFxuICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsXG4gIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuICBBRERfVE9fUEFUSDogNyxcbiAgRklMTF9TVFJPS0VfTUFTSzogMyxcbiAgQUREX1RPX1BBVEhfRkxBRzogNFxufTtcbmNvbnN0IEltYWdlS2luZCA9IHtcbiAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gIFJHQl8yNEJQUDogMixcbiAgUkdCQV8zMkJQUDogM1xufTtcbmNvbnN0IEFubm90YXRpb25UeXBlID0ge1xuICBURVhUOiAxLFxuICBMSU5LOiAyLFxuICBGUkVFVEVYVDogMyxcbiAgTElORTogNCxcbiAgU1FVQVJFOiA1LFxuICBDSVJDTEU6IDYsXG4gIFBPTFlHT046IDcsXG4gIFBPTFlMSU5FOiA4LFxuICBISUdITElHSFQ6IDksXG4gIFVOREVSTElORTogMTAsXG4gIFNRVUlHR0xZOiAxMSxcbiAgU1RSSUtFT1VUOiAxMixcbiAgU1RBTVA6IDEzLFxuICBDQVJFVDogMTQsXG4gIElOSzogMTUsXG4gIFBPUFVQOiAxNixcbiAgRklMRUFUVEFDSE1FTlQ6IDE3LFxuICBTT1VORDogMTgsXG4gIE1PVklFOiAxOSxcbiAgV0lER0VUOiAyMCxcbiAgU0NSRUVOOiAyMSxcbiAgUFJJTlRFUk1BUks6IDIyLFxuICBUUkFQTkVUOiAyMyxcbiAgV0FURVJNQVJLOiAyNCxcbiAgVEhSRUVEOiAyNSxcbiAgUkVEQUNUOiAyNlxufTtcbmNvbnN0IEFubm90YXRpb25SZXBseVR5cGUgPSB7XG4gIEdST1VQOiBcIkdyb3VwXCIsXG4gIFJFUExZOiBcIlJcIlxufTtcbmNvbnN0IEFubm90YXRpb25GbGFnID0ge1xuICBJTlZJU0lCTEU6IDB4MDEsXG4gIEhJRERFTjogMHgwMixcbiAgUFJJTlQ6IDB4MDQsXG4gIE5PWk9PTTogMHgwOCxcbiAgTk9ST1RBVEU6IDB4MTAsXG4gIE5PVklFVzogMHgyMCxcbiAgUkVBRE9OTFk6IDB4NDAsXG4gIExPQ0tFRDogMHg4MCxcbiAgVE9HR0xFTk9WSUVXOiAweDEwMCxcbiAgTE9DS0VEQ09OVEVOVFM6IDB4MjAwXG59O1xuY29uc3QgQW5ub3RhdGlvbkZpZWxkRmxhZyA9IHtcbiAgUkVBRE9OTFk6IDB4MDAwMDAwMSxcbiAgUkVRVUlSRUQ6IDB4MDAwMDAwMixcbiAgTk9FWFBPUlQ6IDB4MDAwMDAwNCxcbiAgTVVMVElMSU5FOiAweDAwMDEwMDAsXG4gIFBBU1NXT1JEOiAweDAwMDIwMDAsXG4gIE5PVE9HR0xFVE9PRkY6IDB4MDAwNDAwMCxcbiAgUkFESU86IDB4MDAwODAwMCxcbiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLFxuICBDT01CTzogMHgwMDIwMDAwLFxuICBFRElUOiAweDAwNDAwMDAsXG4gIFNPUlQ6IDB4MDA4MDAwMCxcbiAgRklMRVNFTEVDVDogMHgwMTAwMDAwLFxuICBNVUxUSVNFTEVDVDogMHgwMjAwMDAwLFxuICBET05PVFNQRUxMQ0hFQ0s6IDB4MDQwMDAwMCxcbiAgRE9OT1RTQ1JPTEw6IDB4MDgwMDAwMCxcbiAgQ09NQjogMHgxMDAwMDAwLFxuICBSSUNIVEVYVDogMHgyMDAwMDAwLFxuICBSQURJT1NJTlVOSVNPTjogMHgyMDAwMDAwLFxuICBDT01NSVRPTlNFTENIQU5HRTogMHg0MDAwMDAwXG59O1xuY29uc3QgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHtcbiAgU09MSUQ6IDEsXG4gIERBU0hFRDogMixcbiAgQkVWRUxFRDogMyxcbiAgSU5TRVQ6IDQsXG4gIFVOREVSTElORTogNVxufTtcbmNvbnN0IEFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSB7XG4gIEU6IFwiTW91c2UgRW50ZXJcIixcbiAgWDogXCJNb3VzZSBFeGl0XCIsXG4gIEQ6IFwiTW91c2UgRG93blwiLFxuICBVOiBcIk1vdXNlIFVwXCIsXG4gIEZvOiBcIkZvY3VzXCIsXG4gIEJsOiBcIkJsdXJcIixcbiAgUE86IFwiUGFnZU9wZW5cIixcbiAgUEM6IFwiUGFnZUNsb3NlXCIsXG4gIFBWOiBcIlBhZ2VWaXNpYmxlXCIsXG4gIFBJOiBcIlBhZ2VJbnZpc2libGVcIixcbiAgSzogXCJLZXlzdHJva2VcIixcbiAgRjogXCJGb3JtYXRcIixcbiAgVjogXCJWYWxpZGF0ZVwiLFxuICBDOiBcIkNhbGN1bGF0ZVwiXG59O1xuY29uc3QgRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUgPSB7XG4gIFdDOiBcIldpbGxDbG9zZVwiLFxuICBXUzogXCJXaWxsU2F2ZVwiLFxuICBEUzogXCJEaWRTYXZlXCIsXG4gIFdQOiBcIldpbGxQcmludFwiLFxuICBEUDogXCJEaWRQcmludFwiXG59O1xuY29uc3QgUGFnZUFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgTzogXCJQYWdlT3BlblwiLFxuICBDOiBcIlBhZ2VDbG9zZVwiXG59O1xuY29uc3QgVmVyYm9zaXR5TGV2ZWwgPSB7XG4gIEVSUk9SUzogMCxcbiAgV0FSTklOR1M6IDEsXG4gIElORk9TOiA1XG59O1xuY29uc3QgQ01hcENvbXByZXNzaW9uVHlwZSA9IHtcbiAgTk9ORTogMCxcbiAgQklOQVJZOiAxXG59O1xuY29uc3QgT1BTID0ge1xuICBkZXBlbmRlbmN5OiAxLFxuICBzZXRMaW5lV2lkdGg6IDIsXG4gIHNldExpbmVDYXA6IDMsXG4gIHNldExpbmVKb2luOiA0LFxuICBzZXRNaXRlckxpbWl0OiA1LFxuICBzZXREYXNoOiA2LFxuICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gIHNldEZsYXRuZXNzOiA4LFxuICBzZXRHU3RhdGU6IDksXG4gIHNhdmU6IDEwLFxuICByZXN0b3JlOiAxMSxcbiAgdHJhbnNmb3JtOiAxMixcbiAgbW92ZVRvOiAxMyxcbiAgbGluZVRvOiAxNCxcbiAgY3VydmVUbzogMTUsXG4gIGN1cnZlVG8yOiAxNixcbiAgY3VydmVUbzM6IDE3LFxuICBjbG9zZVBhdGg6IDE4LFxuICByZWN0YW5nbGU6IDE5LFxuICBzdHJva2U6IDIwLFxuICBjbG9zZVN0cm9rZTogMjEsXG4gIGZpbGw6IDIyLFxuICBlb0ZpbGw6IDIzLFxuICBmaWxsU3Ryb2tlOiAyNCxcbiAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICBlbmRQYXRoOiAyOCxcbiAgY2xpcDogMjksXG4gIGVvQ2xpcDogMzAsXG4gIGJlZ2luVGV4dDogMzEsXG4gIGVuZFRleHQ6IDMyLFxuICBzZXRDaGFyU3BhY2luZzogMzMsXG4gIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgc2V0SFNjYWxlOiAzNSxcbiAgc2V0TGVhZGluZzogMzYsXG4gIHNldEZvbnQ6IDM3LFxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gIHNldFRleHRSaXNlOiAzOSxcbiAgbW92ZVRleHQ6IDQwLFxuICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICBzZXRUZXh0TWF0cml4OiA0MixcbiAgbmV4dExpbmU6IDQzLFxuICBzaG93VGV4dDogNDQsXG4gIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICBzZXRTdHJva2VDb2xvck46IDUzLFxuICBzZXRGaWxsQ29sb3I6IDU0LFxuICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgc2V0U3Ryb2tlR3JheTogNTYsXG4gIHNldEZpbGxHcmF5OiA1NyxcbiAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgc2hhZGluZ0ZpbGw6IDYyLFxuICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gIHBhaW50WE9iamVjdDogNjYsXG4gIG1hcmtQb2ludDogNjcsXG4gIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgYmVnaW5Db21wYXQ6IDcyLFxuICBlbmRDb21wYXQ6IDczLFxuICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgYmVnaW5Hcm91cDogNzYsXG4gIGVuZEdyb3VwOiA3NyxcbiAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgZW5kQW5ub3RhdGlvbjogODEsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiA4NCxcbiAgcGFpbnRJbWFnZVhPYmplY3Q6IDg1LFxuICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsXG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IDg3LFxuICBwYWludEltYWdlWE9iamVjdFJlcGVhdDogODgsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksXG4gIHBhaW50U29saWRDb2xvckltYWdlTWFzazogOTAsXG4gIGNvbnN0cnVjdFBhdGg6IDkxXG59O1xuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gIE5FRURfUEFTU1dPUkQ6IDEsXG4gIElOQ09SUkVDVF9QQVNTV09SRDogMlxufTtcbmxldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcbmZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsKSB7XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkge1xuICAgIHZlcmJvc2l0eSA9IGxldmVsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIHZlcmJvc2l0eTtcbn1cbmZ1bmN0aW9uIGluZm8obXNnKSB7XG4gIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MpIHtcbiAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MpIHtcbiAgICBjb25zb2xlLmxvZyhgV2FybmluZzogJHttc2d9YCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykge1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cbmZ1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHtcbiAgaWYgKCFjb25kKSB7XG4gICAgdW5yZWFjaGFibGUobXNnKTtcbiAgfVxufVxuZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh1cmwpIHtcbiAgc3dpdGNoICh1cmw/LnByb3RvY29sKSB7XG4gICAgY2FzZSBcImh0dHA6XCI6XG4gICAgY2FzZSBcImh0dHBzOlwiOlxuICAgIGNhc2UgXCJmdHA6XCI6XG4gICAgY2FzZSBcIm1haWx0bzpcIjpcbiAgICBjYXNlIFwidGVsOlwiOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwpIHtcbiAgbGV0IGJhc2VVcmwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICBpZiAoIXVybCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKG9wdGlvbnMuYWRkRGVmYXVsdFByb3RvY29sICYmIHVybC5zdGFydHNXaXRoKFwid3d3LlwiKSkge1xuICAgICAgICBjb25zdCBkb3RzID0gdXJsLm1hdGNoKC9cXC4vZyk7XG4gICAgICAgIGlmIChkb3RzPy5sZW5ndGggPj0gMikge1xuICAgICAgICAgIHVybCA9IGBodHRwOi8vJHt1cmx9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMudHJ5Q29udmVydEVuY29kaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdXJsID0gc3RyaW5nVG9VVEY4U3RyaW5nKHVybCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpO1xuICAgIGlmIChfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSkge1xuICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xuICAgIH1cbiAgfSBjYXRjaCB7fVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHNoYWRvdyhvYmosIHByb3AsIHZhbHVlKSB7XG4gIGxldCBub25TZXJpYWxpemFibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG4gICAgdmFsdWUsXG4gICAgZW51bWVyYWJsZTogIW5vblNlcmlhbGl6YWJsZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBCYXNlRXhjZXB0aW9uID0gZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSwgbmFtZSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbiAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247XG4gIHJldHVybiBCYXNlRXhjZXB0aW9uO1xufSgpO1xuY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBjb2RlKSB7XG4gICAgc3VwZXIobXNnLCBcIlBhc3N3b3JkRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbmNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHtcbiAgICBzdXBlcihtc2csIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gIH1cbn1cbmNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIkludmFsaWRQREZFeGNlcHRpb25cIik7XG4gIH1cbn1cbmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIk1pc3NpbmdQREZFeGNlcHRpb25cIik7XG4gIH1cbn1cbmNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykge1xuICAgIHN1cGVyKG1zZywgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIik7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cbn1cbmNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKG1zZywgXCJGb3JtYXRFcnJvclwiKTtcbiAgfVxufVxuY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIkFib3J0RXhjZXB0aW9uXCIpO1xuICB9XG59XG5mdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgIT09IFwib2JqZWN0XCIgfHwgYnl0ZXM/Lmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdW5yZWFjaGFibGUoXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nXCIpO1xuICB9XG4gIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgY29uc3QgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5MjtcbiAgaWYgKGxlbmd0aCA8IE1BWF9BUkdVTUVOVF9DT1VOVCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzKTtcbiAgfVxuICBjb25zdCBzdHJCdWYgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgY29uc3QgY2h1bmtFbmQgPSBNYXRoLm1pbihpICsgTUFYX0FSR1VNRU5UX0NPVU5ULCBsZW5ndGgpO1xuICAgIGNvbnN0IGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpO1xuICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTtcbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgIHVucmVhY2hhYmxlKFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgfVxuICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBieXRlc1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZjtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5mdW5jdGlvbiBzdHJpbmczMih2YWx1ZSkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7XG59XG5mdW5jdGlvbiBvYmplY3RTaXplKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGg7XG59XG5mdW5jdGlvbiBvYmplY3RGcm9tTWFwKG1hcCkge1xuICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXApIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHtcbiAgY29uc3QgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICBidWZmZXI4WzBdID0gMTtcbiAgY29uc3QgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTtcbiAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTtcbn1cbmZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHtcbiAgdHJ5IHtcbiAgICBuZXcgRnVuY3Rpb24oXCJcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuY2xhc3MgRmVhdHVyZVRlc3Qge1xuICBzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0xpdHRsZUVuZGlhblwiLCBpc0xpdHRsZUVuZGlhbigpKTtcbiAgfVxuICBzdGF0aWMgZ2V0IGlzRXZhbFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNFdmFsU3VwcG9ydGVkXCIsIGlzRXZhbFN1cHBvcnRlZCgpKTtcbiAgfVxuICBzdGF0aWMgZ2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZFwiLCB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSBcInVuZGVmaW5lZFwiKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHBsYXRmb3JtKCkge1xuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBuYXZpZ2F0b3I/LnBsYXRmb3JtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuICAgICAgICBpc01hYzogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKFwiTWFjXCIpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBsYXRmb3JtXCIsIHtcbiAgICAgIGlzTWFjOiBmYWxzZVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBnZXQgaXNDU1NSb3VuZFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNDU1NSb3VuZFN1cHBvcnRlZFwiLCBnbG9iYWxUaGlzLkNTUz8uc3VwcG9ydHM/LihcIndpZHRoOiByb3VuZCgxLjVweCwgMXB4KVwiKSk7XG4gIH1cbn1cbmNvbnN0IGhleE51bWJlcnMgPSBbLi4uQXJyYXkoMjU2KS5rZXlzKCldLm1hcChuID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSk7XG5jbGFzcyBVdGlsIHtcbiAgc3RhdGljIG1ha2VIZXhDb2xvcihyLCBnLCBiKSB7XG4gICAgcmV0dXJuIGAjJHtoZXhOdW1iZXJzW3JdfSR7aGV4TnVtYmVyc1tnXX0ke2hleE51bWJlcnNbYl19YDtcbiAgfVxuICBzdGF0aWMgc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpIHtcbiAgICBsZXQgdGVtcDtcbiAgICBpZiAodHJhbnNmb3JtWzBdKSB7XG4gICAgICBpZiAodHJhbnNmb3JtWzBdIDwgMCkge1xuICAgICAgICB0ZW1wID0gbWluTWF4WzBdO1xuICAgICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMV07XG4gICAgICAgIG1pbk1heFsxXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICBtaW5NYXhbMF0gKj0gdHJhbnNmb3JtWzBdO1xuICAgICAgbWluTWF4WzFdICo9IHRyYW5zZm9ybVswXTtcbiAgICAgIGlmICh0cmFuc2Zvcm1bM10gPCAwKSB7XG4gICAgICAgIHRlbXAgPSBtaW5NYXhbMl07XG4gICAgICAgIG1pbk1heFsyXSA9IG1pbk1heFszXTtcbiAgICAgICAgbWluTWF4WzNdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIG1pbk1heFsyXSAqPSB0cmFuc2Zvcm1bM107XG4gICAgICBtaW5NYXhbM10gKj0gdHJhbnNmb3JtWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wID0gbWluTWF4WzBdO1xuICAgICAgbWluTWF4WzBdID0gbWluTWF4WzJdO1xuICAgICAgbWluTWF4WzJdID0gdGVtcDtcbiAgICAgIHRlbXAgPSBtaW5NYXhbMV07XG4gICAgICBtaW5NYXhbMV0gPSBtaW5NYXhbM107XG4gICAgICBtaW5NYXhbM10gPSB0ZW1wO1xuICAgICAgaWYgKHRyYW5zZm9ybVsxXSA8IDApIHtcbiAgICAgICAgdGVtcCA9IG1pbk1heFsyXTtcbiAgICAgICAgbWluTWF4WzJdID0gbWluTWF4WzNdO1xuICAgICAgICBtaW5NYXhbM10gPSB0ZW1wO1xuICAgICAgfVxuICAgICAgbWluTWF4WzJdICo9IHRyYW5zZm9ybVsxXTtcbiAgICAgIG1pbk1heFszXSAqPSB0cmFuc2Zvcm1bMV07XG4gICAgICBpZiAodHJhbnNmb3JtWzJdIDwgMCkge1xuICAgICAgICB0ZW1wID0gbWluTWF4WzBdO1xuICAgICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMV07XG4gICAgICAgIG1pbk1heFsxXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICBtaW5NYXhbMF0gKj0gdHJhbnNmb3JtWzJdO1xuICAgICAgbWluTWF4WzFdICo9IHRyYW5zZm9ybVsyXTtcbiAgICB9XG4gICAgbWluTWF4WzBdICs9IHRyYW5zZm9ybVs0XTtcbiAgICBtaW5NYXhbMV0gKz0gdHJhbnNmb3JtWzRdO1xuICAgIG1pbk1heFsyXSArPSB0cmFuc2Zvcm1bNV07XG4gICAgbWluTWF4WzNdICs9IHRyYW5zZm9ybVs1XTtcbiAgfVxuICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikge1xuICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dO1xuICB9XG4gIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7XG4gICAgY29uc3QgeHQgPSBwWzBdICogbVswXSArIHBbMV0gKiBtWzJdICsgbVs0XTtcbiAgICBjb25zdCB5dCA9IHBbMF0gKiBtWzFdICsgcFsxXSAqIG1bM10gKyBtWzVdO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkO1xuICAgIGNvbnN0IHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkge1xuICAgIGNvbnN0IHAxID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLCBtKTtcbiAgICBjb25zdCBwMiA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7XG4gICAgY29uc3QgcDMgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7XG4gICAgY29uc3QgcDQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7XG4gICAgcmV0dXJuIFtNYXRoLm1pbihwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSwgTWF0aC5tYXgocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1heChwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSldO1xuICB9XG4gIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICByZXR1cm4gW21bM10gLyBkLCAtbVsxXSAvIGQsIC1tWzJdIC8gZCwgbVswXSAvIGQsIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGRdO1xuICB9XG4gIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7XG4gICAgY29uc3QgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dO1xuICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107XG4gICAgY29uc3QgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdO1xuICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTtcbiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyO1xuICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICoqIDIgLSA0ICogKGEgKiBkIC0gYyAqIGIpKSAvIDI7XG4gICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxO1xuICAgIGNvbnN0IHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTtcbiAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldO1xuICB9XG4gIHN0YXRpYyBub3JtYWxpemVSZWN0KHJlY3QpIHtcbiAgICBjb25zdCByID0gcmVjdC5zbGljZSgwKTtcbiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHtcbiAgICAgIHJbMF0gPSByZWN0WzJdO1xuICAgICAgclsyXSA9IHJlY3RbMF07XG4gICAgfVxuICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkge1xuICAgICAgclsxXSA9IHJlY3RbM107XG4gICAgICByWzNdID0gcmVjdFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHtcbiAgICBjb25zdCB4TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMF0sIHJlY3QxWzJdKSwgTWF0aC5taW4ocmVjdDJbMF0sIHJlY3QyWzJdKSk7XG4gICAgY29uc3QgeEhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1heChyZWN0MlswXSwgcmVjdDJbMl0pKTtcbiAgICBpZiAoeExvdyA+IHhIaWdoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeUxvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWluKHJlY3QyWzFdLCByZWN0MlszXSkpO1xuICAgIGNvbnN0IHlIaWdoID0gTWF0aC5taW4oTWF0aC5tYXgocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5tYXgocmVjdDJbMV0sIHJlY3QyWzNdKSk7XG4gICAgaWYgKHlMb3cgPiB5SGlnaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBbeExvdywgeUxvdywgeEhpZ2gsIHlIaWdoXTtcbiAgfVxuICBzdGF0aWMgYmV6aWVyQm91bmRpbmdCb3goeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gICAgY29uc3QgdHZhbHVlcyA9IFtdLFxuICAgICAgYm91bmRzID0gW1tdLCBbXV07XG4gICAgbGV0IGEsIGIsIGMsIHQsIHQxLCB0MiwgYjJhYywgc3FydGIyYWM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGIgPSA2ICogeDAgLSAxMiAqIHgxICsgNiAqIHgyO1xuICAgICAgICBhID0gLTMgKiB4MCArIDkgKiB4MSAtIDkgKiB4MiArIDMgKiB4MztcbiAgICAgICAgYyA9IDMgKiB4MSAtIDMgKiB4MDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGIgPSA2ICogeTAgLSAxMiAqIHkxICsgNiAqIHkyO1xuICAgICAgICBhID0gLTMgKiB5MCArIDkgKiB5MSAtIDkgKiB5MiArIDMgKiB5MztcbiAgICAgICAgYyA9IDMgKiB5MSAtIDMgKiB5MDtcbiAgICAgIH1cbiAgICAgIGlmIChNYXRoLmFicyhhKSA8IDFlLTEyKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhiKSA8IDFlLTEyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdCA9IC1jIC8gYjtcbiAgICAgICAgaWYgKDAgPCB0ICYmIHQgPCAxKSB7XG4gICAgICAgICAgdHZhbHVlcy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYjJhYyA9IGIgKiBiIC0gNCAqIGMgKiBhO1xuICAgICAgc3FydGIyYWMgPSBNYXRoLnNxcnQoYjJhYyk7XG4gICAgICBpZiAoYjJhYyA8IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0MSA9ICgtYiArIHNxcnRiMmFjKSAvICgyICogYSk7XG4gICAgICBpZiAoMCA8IHQxICYmIHQxIDwgMSkge1xuICAgICAgICB0dmFsdWVzLnB1c2godDEpO1xuICAgICAgfVxuICAgICAgdDIgPSAoLWIgLSBzcXJ0YjJhYykgLyAoMiAqIGEpO1xuICAgICAgaWYgKDAgPCB0MiAmJiB0MiA8IDEpIHtcbiAgICAgICAgdHZhbHVlcy5wdXNoKHQyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGogPSB0dmFsdWVzLmxlbmd0aCxcbiAgICAgIG10O1xuICAgIGNvbnN0IGpsZW4gPSBqO1xuICAgIHdoaWxlIChqLS0pIHtcbiAgICAgIHQgPSB0dmFsdWVzW2pdO1xuICAgICAgbXQgPSAxIC0gdDtcbiAgICAgIGJvdW5kc1swXVtqXSA9IG10ICogbXQgKiBtdCAqIHgwICsgMyAqIG10ICogbXQgKiB0ICogeDEgKyAzICogbXQgKiB0ICogdCAqIHgyICsgdCAqIHQgKiB0ICogeDM7XG4gICAgICBib3VuZHNbMV1bal0gPSBtdCAqIG10ICogbXQgKiB5MCArIDMgKiBtdCAqIG10ICogdCAqIHkxICsgMyAqIG10ICogdCAqIHQgKiB5MiArIHQgKiB0ICogdCAqIHkzO1xuICAgIH1cbiAgICBib3VuZHNbMF1bamxlbl0gPSB4MDtcbiAgICBib3VuZHNbMV1bamxlbl0gPSB5MDtcbiAgICBib3VuZHNbMF1bamxlbiArIDFdID0geDM7XG4gICAgYm91bmRzWzFdW2psZW4gKyAxXSA9IHkzO1xuICAgIGJvdW5kc1swXS5sZW5ndGggPSBib3VuZHNbMV0ubGVuZ3RoID0gamxlbiArIDI7XG4gICAgcmV0dXJuIFtNYXRoLm1pbiguLi5ib3VuZHNbMF0pLCBNYXRoLm1pbiguLi5ib3VuZHNbMV0pLCBNYXRoLm1heCguLi5ib3VuZHNbMF0pLCBNYXRoLm1heCguLi5ib3VuZHNbMV0pXTtcbiAgfVxufVxuY29uc3QgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSAoLyogdW51c2VkIHB1cmUgZXhwcmVzc2lvbiBvciBzdXBlciAqLyBudWxsICYmIChbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyZDgsIDB4MmM3LCAweDJjNiwgMHgyZDksIDB4MmRkLCAweDJkYiwgMHgyZGEsIDB4MmRjLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzYSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxZSwgMHgyMDFjLCAweDIwMWQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWEsIDB4MjEyMiwgMHhmYjAxLCAweGZiMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsIDB4MTc4LCAweDE3ZCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdlLCAwLCAweDIwYWNdKSk7XG5mdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHtcbiAgaWYgKHN0clswXSA+PSBcIlxceEVGXCIpIHtcbiAgICBsZXQgZW5jb2Rpbmc7XG4gICAgaWYgKHN0clswXSA9PT0gXCJcXHhGRVwiICYmIHN0clsxXSA9PT0gXCJcXHhGRlwiKSB7XG4gICAgICBlbmNvZGluZyA9IFwidXRmLTE2YmVcIjtcbiAgICAgIGlmIChzdHIubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEZGXCIgJiYgc3RyWzFdID09PSBcIlxceEZFXCIpIHtcbiAgICAgIGVuY29kaW5nID0gXCJ1dGYtMTZsZVwiO1xuICAgICAgaWYgKHN0ci5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHJbMF0gPT09IFwiXFx4RUZcIiAmJiBzdHJbMV0gPT09IFwiXFx4QkJcIiAmJiBzdHJbMl0gPT09IFwiXFx4QkZcIikge1xuICAgICAgZW5jb2RpbmcgPSBcInV0Zi04XCI7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywge1xuICAgICAgICAgIGZhdGFsOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJpbmdUb0J5dGVzKHN0cik7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xuICAgICAgICBpZiAoIWRlY29kZWQuaW5jbHVkZXMoXCJcXHgxYlwiKSkge1xuICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvZGVkLnJlcGxhY2VBbGwoL1xceDFiW15cXHgxYl0qKD86XFx4MWJ8JCkvZywgXCJcIik7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICB3YXJuKGBzdHJpbmdUb1BERlN0cmluZzogXCIke2V4fVwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBzdHJCdWYgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjaGFyQ29kZSA9PT0gMHgxYikge1xuICAgICAgd2hpbGUgKCsraSA8IGlpICYmIHN0ci5jaGFyQ29kZUF0KGkpICE9PSAweDFiKSB7fVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtjaGFyQ29kZV07XG4gICAgc3RyQnVmLnB1c2goY29kZSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgOiBzdHIuY2hhckF0KGkpKTtcbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xufVxuZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikge1xuICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xufVxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2Py5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikge1xuICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwLCBpaSA9IGFycjEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpIHtcbiAgbGV0IGRhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGJ1ZmZlciA9IFtkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIildO1xuICByZXR1cm4gYnVmZmVyLmpvaW4oXCJcIik7XG59XG5jbGFzcyBQcm9taXNlQ2FwYWJpbGl0eSB7XG4gICNzZXR0bGVkID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZSA9IGRhdGEgPT4ge1xuICAgICAgICB0aGlzLiNzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgICAgIHRoaXMuI3NldHRsZWQgPSB0cnVlO1xuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHNldHRsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NldHRsZWQ7XG4gIH1cbn1cbmxldCBOb3JtYWxpemVSZWdleCA9IG51bGw7XG5sZXQgTm9ybWFsaXphdGlvbk1hcCA9IG51bGw7XG5mdW5jdGlvbiBub3JtYWxpemVVbmljb2RlKHN0cikge1xuICBpZiAoIU5vcm1hbGl6ZVJlZ2V4KSB7XG4gICAgTm9ybWFsaXplUmVnZXggPSAvKFtcXHUwMGEwXFx1MDBiNVxcdTAzN2VcXHUwZWIzXFx1MjAwMC1cXHUyMDBhXFx1MjAyZlxcdTIxMjZcXHVmYjAwLVxcdWZiMDRcXHVmYjA2XFx1ZmIyMC1cXHVmYjM2XFx1ZmIzOC1cXHVmYjNjXFx1ZmIzZVxcdWZiNDAtXFx1ZmI0MVxcdWZiNDMtXFx1ZmI0NFxcdWZiNDYtXFx1ZmJhMVxcdWZiYTQtXFx1ZmJhOVxcdWZiYWUtXFx1ZmJiMVxcdWZiZDMtXFx1ZmJkY1xcdWZiZGUtXFx1ZmJlN1xcdWZiZWEtXFx1ZmJmOFxcdWZiZmMtXFx1ZmJmZFxcdWZjMDAtXFx1ZmM1ZFxcdWZjNjQtXFx1ZmNmMVxcdWZjZjUtXFx1ZmQzZFxcdWZkODhcXHVmZGY0XFx1ZmRmYS1cXHVmZGZiXFx1ZmU3MVxcdWZlNzdcXHVmZTc5XFx1ZmU3YlxcdWZlN2RdKyl8KFxcdWZiMDUrKS9ndTtcbiAgICBOb3JtYWxpemF0aW9uTWFwID0gbmV3IE1hcChbW1wi76yFXCIsIFwixb90XCJdXSk7XG4gIH1cbiAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKE5vcm1hbGl6ZVJlZ2V4LCAoXywgcDEsIHAyKSA9PiB7XG4gICAgcmV0dXJuIHAxID8gcDEubm9ybWFsaXplKFwiTkZLQ1wiKSA6IE5vcm1hbGl6YXRpb25NYXAuZ2V0KHAyKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRVdWlkKCkge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY3J5cHRvPy5yYW5kb21VVUlEID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8/LmdldFJhbmRvbVZhbHVlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhidWYpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgICAgYnVmW2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTtcbn1cbmNvbnN0IEFubm90YXRpb25QcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2lkX1wiO1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFxuLyoqKioqKi8gLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbi8qKioqKiovIFx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0fTtcbi8qKioqKiovIFxuLyoqKioqKi8gXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcbi8qKioqKiovIFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gfVxuLyoqKioqKi8gXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2FzeW5jIG1vZHVsZSAqL1xuLyoqKioqKi8gKCgpID0+IHtcbi8qKioqKiovIFx0dmFyIHdlYnBhY2tRdWV1ZXMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2woXCJ3ZWJwYWNrIHF1ZXVlc1wiKSA6IFwiX193ZWJwYWNrX3F1ZXVlc19fXCI7XG4vKioqKioqLyBcdHZhciB3ZWJwYWNrRXhwb3J0cyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbChcIndlYnBhY2sgZXhwb3J0c1wiKSA6IFwiX193ZWJwYWNrX2V4cG9ydHNfX1wiO1xuLyoqKioqKi8gXHR2YXIgd2VicGFja0Vycm9yID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sKFwid2VicGFjayBlcnJvclwiKSA6IFwiX193ZWJwYWNrX2Vycm9yX19cIjtcbi8qKioqKiovIFx0dmFyIHJlc29sdmVRdWV1ZSA9IChxdWV1ZSkgPT4ge1xuLyoqKioqKi8gXHRcdGlmKHF1ZXVlICYmIHF1ZXVlLmQgPCAxKSB7XG4vKioqKioqLyBcdFx0XHRxdWV1ZS5kID0gMTtcbi8qKioqKiovIFx0XHRcdHF1ZXVlLmZvckVhY2goKGZuKSA9PiAoZm4uci0tKSk7XG4vKioqKioqLyBcdFx0XHRxdWV1ZS5mb3JFYWNoKChmbikgPT4gKGZuLnItLSA/IGZuLnIrKyA6IGZuKCkpKTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0dmFyIHdyYXBEZXBzID0gKGRlcHMpID0+IChkZXBzLm1hcCgoZGVwKSA9PiB7XG4vKioqKioqLyBcdFx0aWYoZGVwICE9PSBudWxsICYmIHR5cGVvZiBkZXAgPT09IFwib2JqZWN0XCIpIHtcbi8qKioqKiovIFx0XHRcdGlmKGRlcFt3ZWJwYWNrUXVldWVzXSkgcmV0dXJuIGRlcDtcbi8qKioqKiovIFx0XHRcdGlmKGRlcC50aGVuKSB7XG4vKioqKioqLyBcdFx0XHRcdHZhciBxdWV1ZSA9IFtdO1xuLyoqKioqKi8gXHRcdFx0XHRxdWV1ZS5kID0gMDtcbi8qKioqKiovIFx0XHRcdFx0ZGVwLnRoZW4oKHIpID0+IHtcbi8qKioqKiovIFx0XHRcdFx0XHRvYmpbd2VicGFja0V4cG9ydHNdID0gcjtcbi8qKioqKiovIFx0XHRcdFx0XHRyZXNvbHZlUXVldWUocXVldWUpO1xuLyoqKioqKi8gXHRcdFx0XHR9LCAoZSkgPT4ge1xuLyoqKioqKi8gXHRcdFx0XHRcdG9ialt3ZWJwYWNrRXJyb3JdID0gZTtcbi8qKioqKiovIFx0XHRcdFx0XHRyZXNvbHZlUXVldWUocXVldWUpO1xuLyoqKioqKi8gXHRcdFx0XHR9KTtcbi8qKioqKiovIFx0XHRcdFx0dmFyIG9iaiA9IHt9O1xuLyoqKioqKi8gXHRcdFx0XHRvYmpbd2VicGFja1F1ZXVlc10gPSAoZm4pID0+IChmbihxdWV1ZSkpO1xuLyoqKioqKi8gXHRcdFx0XHRyZXR1cm4gb2JqO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHR2YXIgcmV0ID0ge307XG4vKioqKioqLyBcdFx0cmV0W3dlYnBhY2tRdWV1ZXNdID0geCA9PiB7fTtcbi8qKioqKiovIFx0XHRyZXRbd2VicGFja0V4cG9ydHNdID0gZGVwO1xuLyoqKioqKi8gXHRcdHJldHVybiByZXQ7XG4vKioqKioqLyBcdH0pKTtcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5hID0gKG1vZHVsZSwgYm9keSwgaGFzQXdhaXQpID0+IHtcbi8qKioqKiovIFx0XHR2YXIgcXVldWU7XG4vKioqKioqLyBcdFx0aGFzQXdhaXQgJiYgKChxdWV1ZSA9IFtdKS5kID0gLTEpO1xuLyoqKioqKi8gXHRcdHZhciBkZXBRdWV1ZXMgPSBuZXcgU2V0KCk7XG4vKioqKioqLyBcdFx0dmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0XHR2YXIgY3VycmVudERlcHM7XG4vKioqKioqLyBcdFx0dmFyIG91dGVyUmVzb2x2ZTtcbi8qKioqKiovIFx0XHR2YXIgcmVqZWN0O1xuLyoqKioqKi8gXHRcdHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlaikgPT4ge1xuLyoqKioqKi8gXHRcdFx0cmVqZWN0ID0gcmVqO1xuLyoqKioqKi8gXHRcdFx0b3V0ZXJSZXNvbHZlID0gcmVzb2x2ZTtcbi8qKioqKiovIFx0XHR9KTtcbi8qKioqKiovIFx0XHRwcm9taXNlW3dlYnBhY2tFeHBvcnRzXSA9IGV4cG9ydHM7XG4vKioqKioqLyBcdFx0cHJvbWlzZVt3ZWJwYWNrUXVldWVzXSA9IChmbikgPT4gKHF1ZXVlICYmIGZuKHF1ZXVlKSwgZGVwUXVldWVzLmZvckVhY2goZm4pLCBwcm9taXNlW1wiY2F0Y2hcIl0oeCA9PiB7fSkpO1xuLyoqKioqKi8gXHRcdG1vZHVsZS5leHBvcnRzID0gcHJvbWlzZTtcbi8qKioqKiovIFx0XHRib2R5KChkZXBzKSA9PiB7XG4vKioqKioqLyBcdFx0XHRjdXJyZW50RGVwcyA9IHdyYXBEZXBzKGRlcHMpO1xuLyoqKioqKi8gXHRcdFx0dmFyIGZuO1xuLyoqKioqKi8gXHRcdFx0dmFyIGdldFJlc3VsdCA9ICgpID0+IChjdXJyZW50RGVwcy5tYXAoKGQpID0+IHtcbi8qKioqKiovIFx0XHRcdFx0aWYoZFt3ZWJwYWNrRXJyb3JdKSB0aHJvdyBkW3dlYnBhY2tFcnJvcl07XG4vKioqKioqLyBcdFx0XHRcdHJldHVybiBkW3dlYnBhY2tFeHBvcnRzXTtcbi8qKioqKiovIFx0XHRcdH0pKVxuLyoqKioqKi8gXHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuLyoqKioqKi8gXHRcdFx0XHRmbiA9ICgpID0+IChyZXNvbHZlKGdldFJlc3VsdCkpO1xuLyoqKioqKi8gXHRcdFx0XHRmbi5yID0gMDtcbi8qKioqKiovIFx0XHRcdFx0dmFyIGZuUXVldWUgPSAocSkgPT4gKHEgIT09IHF1ZXVlICYmICFkZXBRdWV1ZXMuaGFzKHEpICYmIChkZXBRdWV1ZXMuYWRkKHEpLCBxICYmICFxLmQgJiYgKGZuLnIrKywgcS5wdXNoKGZuKSkpKTtcbi8qKioqKiovIFx0XHRcdFx0Y3VycmVudERlcHMubWFwKChkZXApID0+IChkZXBbd2VicGFja1F1ZXVlc10oZm5RdWV1ZSkpKTtcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGZuLnIgPyBwcm9taXNlIDogZ2V0UmVzdWx0KCk7XG4vKioqKioqLyBcdFx0fSwgKGVycikgPT4gKChlcnIgPyByZWplY3QocHJvbWlzZVt3ZWJwYWNrRXJyb3JdID0gZXJyKSA6IG91dGVyUmVzb2x2ZShleHBvcnRzKSksIHJlc29sdmVRdWV1ZShxdWV1ZSkpKTtcbi8qKioqKiovIFx0XHRxdWV1ZSAmJiBxdWV1ZS5kIDwgMCAmJiAocXVldWUuZCA9IDApO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi8gfSkoKTtcbi8qKioqKiovIFxuLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzICovXG4vKioqKioqLyAoKCkgPT4ge1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG4vKioqKioqLyBcdFx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuLyoqKioqKi8gXHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi8gfSkoKTtcbi8qKioqKiovIFxuLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqL1xuLyoqKioqKi8gKCgpID0+IHtcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKVxuLyoqKioqKi8gfSkoKTtcbi8qKioqKiovIFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFxuLyoqKioqKi8gLy8gc3RhcnR1cFxuLyoqKioqKi8gLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyAvLyBUaGlzIGVudHJ5IG1vZHVsZSB1c2VkICdtb2R1bGUnIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTA3KTtcbi8qKioqKiovIF9fd2VicGFja19leHBvcnRzX18gPSBnbG9iYWxUaGlzLnBkZmpzTGliID0gYXdhaXQgKGdsb2JhbFRoaXMucGRmanNMaWJQcm9taXNlID0gX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fib3J0RXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5BYm9ydEV4Y2VwdGlvbjtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvckxheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXI7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclR5cGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JUeXBlO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uTGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25MYXllcjtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbk1vZGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25Nb2RlO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19DTWFwQ29tcHJlc3Npb25UeXBlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5DTWFwQ29tcHJlc3Npb25UeXBlO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19Db2xvclBpY2tlciA9IF9fd2VicGFja19leHBvcnRzX18uQ29sb3JQaWNrZXI7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX0RPTVNWR0ZhY3RvcnkgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkRPTVNWR0ZhY3Rvcnk7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX0RyYXdMYXllciA9IF9fd2VicGFja19leHBvcnRzX18uRHJhd0xheWVyO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19GZWF0dXJlVGVzdCA9IF9fd2VicGFja19leHBvcnRzX18uRmVhdHVyZVRlc3Q7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX0dsb2JhbFdvcmtlck9wdGlvbnMgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkdsb2JhbFdvcmtlck9wdGlvbnM7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX0ltYWdlS2luZCA9IF9fd2VicGFja19leHBvcnRzX18uSW1hZ2VLaW5kO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19JbnZhbGlkUERGRXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5JbnZhbGlkUERGRXhjZXB0aW9uO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19NaXNzaW5nUERGRXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5NaXNzaW5nUERGRXhjZXB0aW9uO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19PUFMgPSBfX3dlYnBhY2tfZXhwb3J0c19fLk9QUztcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fT3V0bGluZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLk91dGxpbmVyO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19QREZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBERkRhdGFSYW5nZVRyYW5zcG9ydDtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fUERGRGF0ZVN0cmluZyA9IF9fd2VicGFja19leHBvcnRzX18uUERGRGF0ZVN0cmluZztcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fUERGV29ya2VyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QREZXb3JrZXI7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX1Bhc3N3b3JkUmVzcG9uc2VzID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QYXNzd29yZFJlc3BvbnNlcztcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fUGVybWlzc2lvbkZsYWcgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBlcm1pc3Npb25GbGFnO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19QaXhlbHNQZXJJbmNoID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QaXhlbHNQZXJJbmNoO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19Qcm9taXNlQ2FwYWJpbGl0eSA9IF9fd2VicGFja19leHBvcnRzX18uUHJvbWlzZUNhcGFiaWxpdHk7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX1JlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiA9IF9fd2VicGFja19leHBvcnRzX18uUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fVXRpbCA9IF9fd2VicGFja19leHBvcnRzX18uVXRpbDtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fVmVyYm9zaXR5TGV2ZWwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlZlcmJvc2l0eUxldmVsO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19YZmFMYXllciA9IF9fd2VicGFja19leHBvcnRzX18uWGZhTGF5ZXI7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX2J1aWxkID0gX193ZWJwYWNrX2V4cG9ydHNfXy5idWlsZDtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCA9IF9fd2VicGFja19leHBvcnRzX18uY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fZmV0Y2hEYXRhID0gX193ZWJwYWNrX2V4cG9ydHNfXy5mZXRjaERhdGE7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX2dldERvY3VtZW50ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5nZXREb2N1bWVudDtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0RmlsZW5hbWVGcm9tVXJsID0gX193ZWJwYWNrX2V4cG9ydHNfXy5nZXRGaWxlbmFtZUZyb21Vcmw7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX2dldFBkZkZpbGVuYW1lRnJvbVVybCA9IF9fd2VicGFja19leHBvcnRzX18uZ2V0UGRmRmlsZW5hbWVGcm9tVXJsO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19nZXRYZmFQYWdlVmlld3BvcnQgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmdldFhmYVBhZ2VWaWV3cG9ydDtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19faXNEYXRhU2NoZW1lID0gX193ZWJwYWNrX2V4cG9ydHNfXy5pc0RhdGFTY2hlbWU7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX2lzUGRmRmlsZSA9IF9fd2VicGFja19leHBvcnRzX18uaXNQZGZGaWxlO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19ub0NvbnRleHRNZW51ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5ub0NvbnRleHRNZW51O1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19ub3JtYWxpemVVbmljb2RlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5ub3JtYWxpemVVbmljb2RlO1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX19yZW5kZXJUZXh0TGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLnJlbmRlclRleHRMYXllcjtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fc2V0TGF5ZXJEaW1lbnNpb25zID0gX193ZWJwYWNrX2V4cG9ydHNfXy5zZXRMYXllckRpbWVuc2lvbnM7XG4vKioqKioqLyB2YXIgX193ZWJwYWNrX2V4cG9ydHNfX3NoYWRvdyA9IF9fd2VicGFja19leHBvcnRzX18uc2hhZG93O1xuLyoqKioqKi8gdmFyIF9fd2VicGFja19leHBvcnRzX191cGRhdGVUZXh0TGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLnVwZGF0ZVRleHRMYXllcjtcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfZXhwb3J0c19fdmVyc2lvbiA9IF9fd2VicGFja19leHBvcnRzX18udmVyc2lvbjtcbi8qKioqKiovIGV4cG9ydCB7IF9fd2VicGFja19leHBvcnRzX19BYm9ydEV4Y2VwdGlvbiBhcyBBYm9ydEV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JMYXllciBhcyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSBhcyBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JUeXBlIGFzIEFubm90YXRpb25FZGl0b3JUeXBlLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciBhcyBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkxheWVyIGFzIEFubm90YXRpb25MYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25Nb2RlIGFzIEFubm90YXRpb25Nb2RlLCBfX3dlYnBhY2tfZXhwb3J0c19fQ01hcENvbXByZXNzaW9uVHlwZSBhcyBDTWFwQ29tcHJlc3Npb25UeXBlLCBfX3dlYnBhY2tfZXhwb3J0c19fQ29sb3JQaWNrZXIgYXMgQ29sb3JQaWNrZXIsIF9fd2VicGFja19leHBvcnRzX19ET01TVkdGYWN0b3J5IGFzIERPTVNWR0ZhY3RvcnksIF9fd2VicGFja19leHBvcnRzX19EcmF3TGF5ZXIgYXMgRHJhd0xheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fRmVhdHVyZVRlc3QgYXMgRmVhdHVyZVRlc3QsIF9fd2VicGFja19leHBvcnRzX19HbG9iYWxXb3JrZXJPcHRpb25zIGFzIEdsb2JhbFdvcmtlck9wdGlvbnMsIF9fd2VicGFja19leHBvcnRzX19JbWFnZUtpbmQgYXMgSW1hZ2VLaW5kLCBfX3dlYnBhY2tfZXhwb3J0c19fSW52YWxpZFBERkV4Y2VwdGlvbiBhcyBJbnZhbGlkUERGRXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fTWlzc2luZ1BERkV4Y2VwdGlvbiBhcyBNaXNzaW5nUERGRXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fT1BTIGFzIE9QUywgX193ZWJwYWNrX2V4cG9ydHNfX091dGxpbmVyIGFzIE91dGxpbmVyLCBfX3dlYnBhY2tfZXhwb3J0c19fUERGRGF0YVJhbmdlVHJhbnNwb3J0IGFzIFBERkRhdGFSYW5nZVRyYW5zcG9ydCwgX193ZWJwYWNrX2V4cG9ydHNfX1BERkRhdGVTdHJpbmcgYXMgUERGRGF0ZVN0cmluZywgX193ZWJwYWNrX2V4cG9ydHNfX1BERldvcmtlciBhcyBQREZXb3JrZXIsIF9fd2VicGFja19leHBvcnRzX19QYXNzd29yZFJlc3BvbnNlcyBhcyBQYXNzd29yZFJlc3BvbnNlcywgX193ZWJwYWNrX2V4cG9ydHNfX1Blcm1pc3Npb25GbGFnIGFzIFBlcm1pc3Npb25GbGFnLCBfX3dlYnBhY2tfZXhwb3J0c19fUGl4ZWxzUGVySW5jaCBhcyBQaXhlbHNQZXJJbmNoLCBfX3dlYnBhY2tfZXhwb3J0c19fUHJvbWlzZUNhcGFiaWxpdHkgYXMgUHJvbWlzZUNhcGFiaWxpdHksIF9fd2VicGFja19leHBvcnRzX19SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24gYXMgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGFzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX1V0aWwgYXMgVXRpbCwgX193ZWJwYWNrX2V4cG9ydHNfX1ZlcmJvc2l0eUxldmVsIGFzIFZlcmJvc2l0eUxldmVsLCBfX3dlYnBhY2tfZXhwb3J0c19fWGZhTGF5ZXIgYXMgWGZhTGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19idWlsZCBhcyBidWlsZCwgX193ZWJwYWNrX2V4cG9ydHNfX2NyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgYXMgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCwgX193ZWJwYWNrX2V4cG9ydHNfX2ZldGNoRGF0YSBhcyBmZXRjaERhdGEsIF9fd2VicGFja19leHBvcnRzX19nZXREb2N1bWVudCBhcyBnZXREb2N1bWVudCwgX193ZWJwYWNrX2V4cG9ydHNfX2dldEZpbGVuYW1lRnJvbVVybCBhcyBnZXRGaWxlbmFtZUZyb21VcmwsIF9fd2VicGFja19leHBvcnRzX19nZXRQZGZGaWxlbmFtZUZyb21VcmwgYXMgZ2V0UGRmRmlsZW5hbWVGcm9tVXJsLCBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0WGZhUGFnZVZpZXdwb3J0IGFzIGdldFhmYVBhZ2VWaWV3cG9ydCwgX193ZWJwYWNrX2V4cG9ydHNfX2lzRGF0YVNjaGVtZSBhcyBpc0RhdGFTY2hlbWUsIF9fd2VicGFja19leHBvcnRzX19pc1BkZkZpbGUgYXMgaXNQZGZGaWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fbm9Db250ZXh0TWVudSBhcyBub0NvbnRleHRNZW51LCBfX3dlYnBhY2tfZXhwb3J0c19fbm9ybWFsaXplVW5pY29kZSBhcyBub3JtYWxpemVVbmljb2RlLCBfX3dlYnBhY2tfZXhwb3J0c19fcmVuZGVyVGV4dExheWVyIGFzIHJlbmRlclRleHRMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX3NldExheWVyRGltZW5zaW9ucyBhcyBzZXRMYXllckRpbWVuc2lvbnMsIF9fd2VicGFja19leHBvcnRzX19zaGFkb3cgYXMgc2hhZG93LCBfX3dlYnBhY2tfZXhwb3J0c19fdXBkYXRlVGV4dExheWVyIGFzIHVwZGF0ZVRleHRMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX3ZlcnNpb24gYXMgdmVyc2lvbiB9O1xuLyoqKioqKi8gXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZi5tanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/vendor/pdfjs-4.0.379-legacy-dist/build/pdf.mjs\n"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ loaded: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/amd define */ -/******/ (() => { -/******/ __webpack_require__.amdD = function () { -/******/ throw new Error('define cannot be used indirect'); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/amd options */ -/******/ (() => { -/******/ __webpack_require__.amdO = {}; -/******/ })(); -/******/ -/******/ /* webpack/runtime/async module */ -/******/ (() => { -/******/ var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__"; -/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__"; -/******/ var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__"; -/******/ var resolveQueue = (queue) => { -/******/ if(queue && queue.d < 1) { -/******/ queue.d = 1; -/******/ queue.forEach((fn) => (fn.r--)); -/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); -/******/ } -/******/ } -/******/ var wrapDeps = (deps) => (deps.map((dep) => { -/******/ if(dep !== null && typeof dep === "object") { -/******/ if(dep[webpackQueues]) return dep; -/******/ if(dep.then) { -/******/ var queue = []; -/******/ queue.d = 0; -/******/ dep.then((r) => { -/******/ obj[webpackExports] = r; -/******/ resolveQueue(queue); -/******/ }, (e) => { -/******/ obj[webpackError] = e; -/******/ resolveQueue(queue); -/******/ }); -/******/ var obj = {}; -/******/ obj[webpackQueues] = (fn) => (fn(queue)); -/******/ return obj; -/******/ } -/******/ } -/******/ var ret = {}; -/******/ ret[webpackQueues] = x => {}; -/******/ ret[webpackExports] = dep; -/******/ return ret; -/******/ })); -/******/ __webpack_require__.a = (module, body, hasAwait) => { -/******/ var queue; -/******/ hasAwait && ((queue = []).d = -1); -/******/ var depQueues = new Set(); -/******/ var exports = module.exports; -/******/ var currentDeps; -/******/ var outerResolve; -/******/ var reject; -/******/ var promise = new Promise((resolve, rej) => { -/******/ reject = rej; -/******/ outerResolve = resolve; -/******/ }); -/******/ promise[webpackExports] = exports; -/******/ promise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise["catch"](x => {})); -/******/ module.exports = promise; -/******/ body((deps) => { -/******/ currentDeps = wrapDeps(deps); -/******/ var fn; -/******/ var getResult = () => (currentDeps.map((d) => { -/******/ if(d[webpackError]) throw d[webpackError]; -/******/ return d[webpackExports]; -/******/ })) -/******/ var promise = new Promise((resolve) => { -/******/ fn = () => (resolve(getResult)); -/******/ fn.r = 0; -/******/ var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))); -/******/ currentDeps.map((dep) => (dep[webpackQueues](fnQueue))); -/******/ }); -/******/ return fn.r ? promise : getResult(); -/******/ }, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue))); -/******/ queue && queue.d < 0 && (queue.d = 0); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/node module decorator */ -/******/ (() => { -/******/ __webpack_require__.nmd = (module) => { -/******/ module.paths = []; -/******/ if (!module.children) module.children = []; -/******/ return module; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/nonce */ -/******/ (() => { -/******/ __webpack_require__.nc = undefined; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval-source-map devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./src/assessment/index.js"); -/******/ __webpack_exports__ = await __webpack_exports__; -/******/ var __webpack_exports__LT = __webpack_exports__.LT; -/******/ export { __webpack_exports__LT as LT }; -/******/ +/*! For license information please see index.js.LICENSE.txt */ +var t,e,n,r,i={9601:(t,e,n)=>{n.d(e,{A:()=>o});var r=n(1601),i=n.n(r),s=n(6314),a=n.n(s)()(i());a.push([t.id,"@import url(https://fonts.googleapis.com/css2?family=Comic+Neue:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap);"]),a.push([t.id,'.lrn:not(.lrn_absolute_keyboard_parent),.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest,.lrn.lrn-assess.lt__theme-juniorQuest{font-family:"LearnosityMath","Comic Neue","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;font-size:30px;color:#333;background-color:#e6f2ff;padding:1em}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region .top-right-wrapper,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region .top-right-wrapper,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region .top-right-wrapper{font-size:.8em}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region .top-right-wrapper .lrn_btn,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region .top-right-wrapper .lrn_btn,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region .top-right-wrapper .lrn_btn{vertical-align:bottom}.lrn:not(.lrn_absolute_keyboard_parent) .test-title-text,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .test-title-text,.lrn.lrn-assess.lt__theme-juniorQuest .test-title-text{font-size:1.8em;font-weight:bold;color:#2b63c7}.lrn:not(.lrn_absolute_keyboard_parent) .subtitle,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .subtitle,.lrn.lrn-assess.lt__theme-juniorQuest .subtitle{font-size:1.4em;color:#2b63c7;font-weight:bold}.lrn:not(.lrn_absolute_keyboard_parent) .items .progress span,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .items .progress span,.lrn.lrn-assess.lt__theme-juniorQuest .items .progress span{background:#2b63c7}.lrn:not(.lrn_absolute_keyboard_parent) .learnosity-item,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .learnosity-item,.lrn.lrn-assess.lt__theme-juniorQuest .learnosity-item{container-name:learnosity-item;container-type:inline-size}@container learnosity-item (width < 800px){.lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,.lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12{width:100%}}@container learnosity-item (width > 800px){.lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,.lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12{width:80%;margin:0 auto}}@container learnosity-item (width > 1000px){.lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,.lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12{width:60%}}@container learnosity-item (width > 1200px){.lrn:not(.lrn_absolute_keyboard_parent) .lrn .col-xs-12,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn .col-xs-12,.lrn.lrn-assess.lt__theme-juniorQuest .lrn .col-xs-12{width:50%}}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue,.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn_blue,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue,.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue{background-color:#2b63c7;color:#fff;font-size:.8em;font-weight:bold}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:hover:not(:disabled),.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn_blue:hover:not(:disabled),.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:active,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:focus,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn_blue:disabled{background-color:#5384da}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn{font-size:.8em}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .dialogs .lrn_btn.item-prev,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn.item-prev,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .lrn_btn.item-prev,.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .dialogs .lrn_btn.item-prev{background-color:#2b63c7;color:#fff;font-size:.8em;border:1px solid #d9d9d9;font-weight:bold}.lrn:not(.lrn_absolute_keyboard_parent) .toc,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .toc,.lrn.lrn-assess.lt__theme-juniorQuest .toc{font-size:.8em}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination li,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li{margin:7px 0}.lrn:not(.lrn_absolute_keyboard_parent) .toc .lrn-pager li.pagination-active a,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .toc .lrn-pager li.pagination-active a,.lrn.lrn-assess.lt__theme-juniorQuest .toc .lrn-pager li.pagination-active a{background:#f6c70a}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active:before,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active a:before,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:before,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:before,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:before,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:before{background-color:#f6c70a}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active:after,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-active a:after,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:after,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:after,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active:after,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-active a:after{border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #f6c70a}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item a:focus,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item a:focus,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item a:focus{-webkit-box-shadow:inset 0 0 0 2px #f6c70a;box-shadow:inset 0 0 0 2px #f6c70a}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination li:first-child,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li:first-child,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination li:first-child{margin:0}.lrn:not(.lrn_absolute_keyboard_parent) .has-vertical-toc-region .lrn-right-region,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .has-vertical-toc-region .lrn-right-region,.lrn.lrn-assess.lt__theme-juniorQuest .has-vertical-toc-region .lrn-right-region{width:150px}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active) a,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active) a{background-color:#f7f7f7}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=partially_attempted]:not(.pagination-active):before,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .pagination-item.pagination-item[data-attempted=fully_attempted]:not(.pagination-active):before{height:47px}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-bottom-right-region.lrn-align-top,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-bottom-right-region.lrn-align-top,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-bottom-right-region.lrn-align-top{margin-top:0px}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-right-region .right-wrapper:not(.menu-with-scroll),.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-right-region .right-wrapper:not(.menu-with-scroll),.lrn.lrn-assess.lt__theme-juniorQuest .lrn-right-region .right-wrapper:not(.menu-with-scroll){height:auto;background-color:#eaeaea}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .lrn-pager .slides-vertical-pagination,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .lrn-pager .slides-vertical-pagination,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .lrn-pager .slides-vertical-pagination{padding-bottom:1px}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-vertical-toc .slides-vertical-pagination,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-vertical-toc .slides-vertical-pagination{height:auto}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-region:not(.lrn-items-region) .menu-buttons .lrn_btn{font-size:.55em}.lrn:not(.lrn_absolute_keyboard_parent) .lrn-horizontal-toc .pagination,.lrn:not(.lrn_absolute_keyboard_parent) .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-horizontal-toc .pagination,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-horizontal-toc .pagination,.lrn.lrn-assess.lt__theme-juniorQuest .lrn.lrn-assess .lrn-horizontal-toc .lrn-assess-pagination{font-size:1.03em}.lrn:not(.lrn_absolute_keyboard_parent) .lrn_widget.lrn_mcq .lrn_mcqgroup,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_widget.lrn_mcq .lrn_mcqgroup,.lrn.lrn-assess.lt__theme-juniorQuest .lrn_widget.lrn_mcq .lrn_mcqgroup{overflow-x:visible}.lrn:not(.lrn_absolute_keyboard_parent) input[type=radio],.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest input[type=radio],.lrn.lrn-assess.lt__theme-juniorQuest input[type=radio]{transform:scale(1.5)}.lrn:not(.lrn_absolute_keyboard_parent) .lrn_response_wrapper,.lrn:not(.lrn_absolute_keyboard_parent) .lrn_texteditor,.lrn:not(.lrn_absolute_keyboard_parent) .lrn_toolbar,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-toolbar,.lrn:not(.lrn_absolute_keyboard_parent) .lrn-toolbar-footer,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_response_wrapper,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_texteditor,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_toolbar,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-toolbar,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn-toolbar-footer,.lrn.lrn-assess.lt__theme-juniorQuest .lrn_response_wrapper,.lrn.lrn-assess.lt__theme-juniorQuest .lrn_texteditor,.lrn.lrn-assess.lt__theme-juniorQuest .lrn_toolbar,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-toolbar,.lrn.lrn-assess.lt__theme-juniorQuest .lrn-toolbar-footer{font-size:.8em}.lrn:not(.lrn_absolute_keyboard_parent) .lrn_widget .lrn_texteditor_editable,.lrn.lrn-assess.lrn-md.lt__theme-juniorQuest .lrn_widget .lrn_texteditor_editable,.lrn.lrn-assess.lt__theme-juniorQuest .lrn_widget .lrn_texteditor_editable{padding:.5em}',""]);const o=a},6314:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n="",r=void 0!==e[5];return e[4]&&(n+="@supports (".concat(e[4],") {")),e[2]&&(n+="@media ".concat(e[2]," {")),r&&(n+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),n+=t(e),r&&(n+="}"),e[2]&&(n+="}"),e[4]&&(n+="}"),n})).join("")},e.i=function(t,n,r,i,s){"string"==typeof t&&(t=[[null,t,void 0]]);var a={};if(r)for(var o=0;o0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=s),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),e.push(d))}},e}},1601:t=>{t.exports=function(t){return t[1]}},4196:(t,e,n)=>{var r;!function(){var i=function(){this.init()};i.prototype={init:function(){var t=this||s;return t._counter=1e3,t._html5AudioPool=[],t.html5PoolSize=10,t._codecs={},t._howls=[],t._muted=!1,t._volume=1,t._canPlayEvent="canplaythrough",t._navigator="undefined"!=typeof window&&window.navigator?window.navigator:null,t.masterGain=null,t.noAudio=!1,t.usingWebAudio=!0,t.autoSuspend=!0,t.ctx=null,t.autoUnlock=!0,t._setup(),t},volume:function(t){var e=this||s;if(t=parseFloat(t),e.ctx||p(),void 0!==t&&t>=0&&t<=1){if(e._volume=t,e._muted)return e;e.usingWebAudio&&e.masterGain.gain.setValueAtTime(t,s.ctx.currentTime);for(var n=0;n=0;e--)t._howls[e].unload();return t.usingWebAudio&&t.ctx&&void 0!==t.ctx.close&&(t.ctx.close(),t.ctx=null,p()),t},codecs:function(t){return(this||s)._codecs[t.replace(/^x-/,"")]},_setup:function(){var t=this||s;if(t.state=t.ctx&&t.ctx.state||"suspended",t._autoSuspend(),!t.usingWebAudio)if("undefined"!=typeof Audio)try{void 0===(new Audio).oncanplaythrough&&(t._canPlayEvent="canplay")}catch(e){t.noAudio=!0}else t.noAudio=!0;try{(new Audio).muted&&(t.noAudio=!0)}catch(t){}return t.noAudio||t._setupCodecs(),t},_setupCodecs:function(){var t=this||s,e=null;try{e="undefined"!=typeof Audio?new Audio:null}catch(e){return t}if(!e||"function"!=typeof e.canPlayType)return t;var n=e.canPlayType("audio/mpeg;").replace(/^no$/,""),r=t._navigator?t._navigator.userAgent:"",i=r.match(/OPR\/(\d+)/g),a=i&&parseInt(i[0].split("/")[1],10)<33,o=-1!==r.indexOf("Safari")&&-1===r.indexOf("Chrome"),l=r.match(/Version\/(.*?) /),c=o&&l&&parseInt(l[1],10)<15;return t._codecs={mp3:!(a||!n&&!e.canPlayType("audio/mp3;").replace(/^no$/,"")),mpeg:!!n,opus:!!e.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),oga:!!e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!(e.canPlayType('audio/wav; codecs="1"')||e.canPlayType("audio/wav")).replace(/^no$/,""),aac:!!e.canPlayType("audio/aac;").replace(/^no$/,""),caf:!!e.canPlayType("audio/x-caf;").replace(/^no$/,""),m4a:!!(e.canPlayType("audio/x-m4a;")||e.canPlayType("audio/m4a;")||e.canPlayType("audio/aac;")).replace(/^no$/,""),m4b:!!(e.canPlayType("audio/x-m4b;")||e.canPlayType("audio/m4b;")||e.canPlayType("audio/aac;")).replace(/^no$/,""),mp4:!!(e.canPlayType("audio/x-mp4;")||e.canPlayType("audio/mp4;")||e.canPlayType("audio/aac;")).replace(/^no$/,""),weba:!(c||!e.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),webm:!(c||!e.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),dolby:!!e.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,""),flac:!!(e.canPlayType("audio/x-flac;")||e.canPlayType("audio/flac;")).replace(/^no$/,"")},t},_unlockAudio:function(){var t=this||s;if(!t._audioUnlocked&&t.ctx){t._audioUnlocked=!1,t.autoUnlock=!1,t._mobileUnloaded||44100===t.ctx.sampleRate||(t._mobileUnloaded=!0,t.unload()),t._scratchBuffer=t.ctx.createBuffer(1,1,22050);var e=function(n){for(;t._html5AudioPool.length0?o._seek:n._sprite[t][0]/1e3),d=Math.max(0,(n._sprite[t][0]+n._sprite[t][1])/1e3-c),u=1e3*d/Math.abs(o._rate),h=n._sprite[t][0]/1e3,p=(n._sprite[t][0]+n._sprite[t][1])/1e3;o._sprite=t,o._ended=!1;var f=function(){o._paused=!1,o._seek=c,o._start=h,o._stop=p,o._loop=!(!o._loop&&!n._sprite[t][2])};if(!(c>=p)){var m=o._node;if(n._webAudio){var g=function(){n._playLock=!1,f(),n._refreshBuffer(o);var t=o._muted||n._muted?0:o._volume;m.gain.setValueAtTime(t,s.ctx.currentTime),o._playStart=s.ctx.currentTime,void 0===m.bufferSource.start?o._loop?m.bufferSource.noteGrainOn(0,c,86400):m.bufferSource.noteGrainOn(0,c,d):o._loop?m.bufferSource.start(0,c,86400):m.bufferSource.start(0,c,d),u!==1/0&&(n._endTimers[o._id]=setTimeout(n._ended.bind(n,o),u)),e||setTimeout((function(){n._emit("play",o._id),n._loadQueue()}),0)};"running"===s.state&&"interrupted"!==s.ctx.state?g():(n._playLock=!0,n.once("resume",g),n._clearTimer(o._id))}else{var v=function(){m.currentTime=c,m.muted=o._muted||n._muted||s._muted||m.muted,m.volume=o._volume*s.volume(),m.playbackRate=o._rate;try{var r=m.play();if(r&&"undefined"!=typeof Promise&&(r instanceof Promise||"function"==typeof r.then)?(n._playLock=!0,f(),r.then((function(){n._playLock=!1,m._unlocked=!0,e?n._loadQueue():n._emit("play",o._id)})).catch((function(){n._playLock=!1,n._emit("playerror",o._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction."),o._ended=!0,o._paused=!0}))):e||(n._playLock=!1,f(),n._emit("play",o._id)),m.playbackRate=o._rate,m.paused)return void n._emit("playerror",o._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");"__default"!==t||o._loop?n._endTimers[o._id]=setTimeout(n._ended.bind(n,o),u):(n._endTimers[o._id]=function(){n._ended(o),m.removeEventListener("ended",n._endTimers[o._id],!1)},m.addEventListener("ended",n._endTimers[o._id],!1))}catch(t){n._emit("playerror",o._id,t)}};"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"===m.src&&(m.src=n._src,m.load());var b=window&&window.ejecta||!m.readyState&&s._navigator.isCocoonJS;if(m.readyState>=3||b)v();else{n._playLock=!0,n._state="loading";var _=function(){n._state="loaded",v(),m.removeEventListener(s._canPlayEvent,_,!1)};m.addEventListener(s._canPlayEvent,_,!1),n._clearTimer(o._id)}}return o._id}n._ended(o)},pause:function(t){var e=this;if("loaded"!==e._state||e._playLock)return e._queue.push({event:"pause",action:function(){e.pause(t)}}),e;for(var n=e._getSoundIds(t),r=0;r=0?e=parseInt(i[0],10):t=parseFloat(i[0]):i.length>=2&&(t=parseFloat(i[0]),e=parseInt(i[1],10)),!(void 0!==t&&t>=0&&t<=1))return(n=e?r._soundById(e):r._sounds[0])?n._volume:0;if("loaded"!==r._state||r._playLock)return r._queue.push({event:"volume",action:function(){r.volume.apply(r,i)}}),r;void 0===e&&(r._volume=t),e=r._getSoundIds(e);for(var a=0;a0?r/c:r),u=Date.now();t._fadeTo=n,t._interval=setInterval((function(){var i=(Date.now()-u)/r;u=Date.now(),o+=l*i,o=Math.round(100*o)/100,o=l<0?Math.max(n,o):Math.min(n,o),a._webAudio?t._volume=o:a.volume(o,t._id,!0),s&&(a._volume=o),(ne&&o>=n)&&(clearInterval(t._interval),t._interval=null,t._fadeTo=null,a.volume(n,t._id),a._emit("fade",t._id))}),d)},_stopFade:function(t){var e=this,n=e._soundById(t);return n&&n._interval&&(e._webAudio&&n._node.gain.cancelScheduledValues(s.ctx.currentTime),clearInterval(n._interval),n._interval=null,e.volume(n._fadeTo,t),n._fadeTo=null,e._emit("fade",t)),e},loop:function(){var t,e,n,r=this,i=arguments;if(0===i.length)return r._loop;if(1===i.length){if("boolean"!=typeof i[0])return!!(n=r._soundById(parseInt(i[0],10)))&&n._loop;t=i[0],r._loop=t}else 2===i.length&&(t=i[0],e=parseInt(i[1],10));for(var s=r._getSoundIds(e),a=0;a=0?e=parseInt(i[0],10):t=parseFloat(i[0]):2===i.length&&(t=parseFloat(i[0]),e=parseInt(i[1],10)),"number"!=typeof t)return(n=r._soundById(e))?n._rate:r._rate;if("loaded"!==r._state||r._playLock)return r._queue.push({event:"rate",action:function(){r.rate.apply(r,i)}}),r;void 0===e&&(r._rate=t),e=r._getSoundIds(e);for(var a=0;a=0?e=parseInt(r[0],10):n._sounds.length&&(e=n._sounds[0]._id,t=parseFloat(r[0])):2===r.length&&(t=parseFloat(r[0]),e=parseInt(r[1],10)),void 0===e)return 0;if("number"==typeof t&&("loaded"!==n._state||n._playLock))return n._queue.push({event:"seek",action:function(){n.seek.apply(n,r)}}),n;var i=n._soundById(e);if(i){if(!("number"==typeof t&&t>=0)){if(n._webAudio){var a=n.playing(e)?s.ctx.currentTime-i._playStart:0,o=i._rateSeek?i._rateSeek-i._seek:0;return i._seek+(o+a*Math.abs(i._rate))}return i._node.currentTime}var l=n.playing(e);l&&n.pause(e,!0),i._seek=t,i._ended=!1,n._clearTimer(e),n._webAudio||!i._node||isNaN(i._node.duration)||(i._node.currentTime=t);var c=function(){l&&n.play(e,!0),n._emit("seek",e)};if(l&&!n._webAudio){var d=function(){n._playLock?setTimeout(d,0):c()};setTimeout(d,0)}else c()}return n},playing:function(t){var e=this;if("number"==typeof t){var n=e._soundById(t);return!!n&&!n._paused}for(var r=0;r=0&&s._howls.splice(r,1);var i=!0;for(n=0;n=0){i=!1;break}return l&&i&&delete l[t._src],s.noAudio=!1,t._state="unloaded",t._sounds=[],t=null,null},on:function(t,e,n,r){var i=this["_on"+t];return"function"==typeof e&&i.push(r?{id:n,fn:e,once:r}:{id:n,fn:e}),this},off:function(t,e,n){var r=this,i=r["_on"+t],s=0;if("number"==typeof e&&(n=e,e=null),e||n)for(s=0;s=0;s--)i[s].id&&i[s].id!==e&&"load"!==t||(setTimeout(function(t){t.call(this,e,n)}.bind(r,i[s].fn),0),i[s].once&&r.off(t,i[s].fn,i[s].id));return r._loadQueue(t),r},_loadQueue:function(t){var e=this;if(e._queue.length>0){var n=e._queue[0];n.event===t&&(e._queue.shift(),e._loadQueue()),t||n.action()}return e},_ended:function(t){var e=this,n=t._sprite;if(!e._webAudio&&t._node&&!t._node.paused&&!t._node.ended&&t._node.currentTime=0;r--){if(n<=e)return;t._sounds[r]._ended&&(t._webAudio&&t._sounds[r]._node&&t._sounds[r]._node.disconnect(0),t._sounds.splice(r,1),n--)}}},_getSoundIds:function(t){if(void 0===t){for(var e=[],n=0;n=0;if(!t.bufferSource)return this;if(s._scratchBuffer&&t.bufferSource&&(t.bufferSource.onended=null,t.bufferSource.disconnect(0),e))try{t.bufferSource.buffer=s._scratchBuffer}catch(t){}return t.bufferSource=null,this},_clearSound:function(t){/MSIE |Trident\//.test(s._navigator&&s._navigator.userAgent)||(t.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA")}};var o=function(t){this._parent=t,this.init()};o.prototype={init:function(){var t=this,e=t._parent;return t._muted=e._muted,t._loop=e._loop,t._volume=e._volume,t._rate=e._rate,t._seek=0,t._paused=!0,t._ended=!0,t._sprite="__default",t._id=++s._counter,e._sounds.push(t),t.create(),t},create:function(){var t=this,e=t._parent,n=s._muted||t._muted||t._parent._muted?0:t._volume;return e._webAudio?(t._node=void 0===s.ctx.createGain?s.ctx.createGainNode():s.ctx.createGain(),t._node.gain.setValueAtTime(n,s.ctx.currentTime),t._node.paused=!0,t._node.connect(s.masterGain)):s.noAudio||(t._node=s._obtainHtml5Audio(),t._errorFn=t._errorListener.bind(t),t._node.addEventListener("error",t._errorFn,!1),t._loadFn=t._loadListener.bind(t),t._node.addEventListener(s._canPlayEvent,t._loadFn,!1),t._endFn=t._endListener.bind(t),t._node.addEventListener("ended",t._endFn,!1),t._node.src=e._src,t._node.preload=!0===e._preload?"auto":e._preload,t._node.volume=n*s.volume(),t._node.load()),t},reset:function(){var t=this,e=t._parent;return t._muted=e._muted,t._loop=e._loop,t._volume=e._volume,t._rate=e._rate,t._seek=0,t._rateSeek=0,t._paused=!0,t._ended=!0,t._sprite="__default",t._id=++s._counter,t},_errorListener:function(){var t=this;t._parent._emit("loaderror",t._id,t._node.error?t._node.error.code:0),t._node.removeEventListener("error",t._errorFn,!1)},_loadListener:function(){var t=this,e=t._parent;e._duration=Math.ceil(10*t._node.duration)/10,0===Object.keys(e._sprite).length&&(e._sprite={__default:[0,1e3*e._duration]}),"loaded"!==e._state&&(e._state="loaded",e._emit("load"),e._loadQueue()),t._node.removeEventListener(s._canPlayEvent,t._loadFn,!1)},_endListener:function(){var t=this,e=t._parent;e._duration===1/0&&(e._duration=Math.ceil(10*t._node.duration)/10,e._sprite.__default[1]===1/0&&(e._sprite.__default[1]=1e3*e._duration),e._ended(t)),t._node.removeEventListener("ended",t._endFn,!1)}};var l={},c=function(t){var e=t._src;if(l[e])return t._duration=l[e].duration,void h(t);if(/^data:[^;]+;base64,/.test(e)){for(var n=atob(e.split(",")[1]),r=new Uint8Array(n.length),i=0;i0?(l[e._src]=t,h(e,t)):n()};"undefined"!=typeof Promise&&1===s.ctx.decodeAudioData.length?s.ctx.decodeAudioData(t).then(r).catch(n):s.ctx.decodeAudioData(t,r,n)},h=function(t,e){e&&!t._duration&&(t._duration=e.duration),0===Object.keys(t._sprite).length&&(t._sprite={__default:[0,1e3*t._duration]}),"loaded"!==t._state&&(t._state="loaded",t._emit("load"),t._loadQueue())},p=function(){if(s.usingWebAudio){try{"undefined"!=typeof AudioContext?s.ctx=new AudioContext:"undefined"!=typeof webkitAudioContext?s.ctx=new webkitAudioContext:s.usingWebAudio=!1}catch(t){s.usingWebAudio=!1}s.ctx||(s.usingWebAudio=!1);var t=/iP(hone|od|ad)/.test(s._navigator&&s._navigator.platform),e=s._navigator&&s._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),n=e?parseInt(e[1],10):null;if(t&&n&&n<9){var r=/safari/.test(s._navigator&&s._navigator.userAgent.toLowerCase());s._navigator&&!r&&(s.usingWebAudio=!1)}s.usingWebAudio&&(s.masterGain=void 0===s.ctx.createGain?s.ctx.createGainNode():s.ctx.createGain(),s.masterGain.gain.setValueAtTime(s._muted?0:s._volume,s.ctx.currentTime),s.masterGain.connect(s.ctx.destination)),s._setup()}};void 0===(r=function(){return{Howler:s,Howl:a}}.apply(e,[]))||(t.exports=r),e.Howler=s,e.Howl=a,void 0!==n.g?(n.g.HowlerGlobal=i,n.g.Howler=s,n.g.Howl=a,n.g.Sound=o):"undefined"!=typeof window&&(window.HowlerGlobal=i,window.Howler=s,window.Howl=a,window.Sound=o)}(),function(){var t;HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype.stereo=function(t){var e=this;if(!e.ctx||!e.ctx.listener)return e;for(var n=e._howls.length-1;n>=0;n--)e._howls[n].stereo(t);return e},HowlerGlobal.prototype.pos=function(t,e,n){var r=this;return r.ctx&&r.ctx.listener?(e="number"!=typeof e?r._pos[1]:e,n="number"!=typeof n?r._pos[2]:n,"number"!=typeof t?r._pos:(r._pos=[t,e,n],void 0!==r.ctx.listener.positionX?(r.ctx.listener.positionX.setTargetAtTime(r._pos[0],Howler.ctx.currentTime,.1),r.ctx.listener.positionY.setTargetAtTime(r._pos[1],Howler.ctx.currentTime,.1),r.ctx.listener.positionZ.setTargetAtTime(r._pos[2],Howler.ctx.currentTime,.1)):r.ctx.listener.setPosition(r._pos[0],r._pos[1],r._pos[2]),r)):r},HowlerGlobal.prototype.orientation=function(t,e,n,r,i,s){var a=this;if(!a.ctx||!a.ctx.listener)return a;var o=a._orientation;return e="number"!=typeof e?o[1]:e,n="number"!=typeof n?o[2]:n,r="number"!=typeof r?o[3]:r,i="number"!=typeof i?o[4]:i,s="number"!=typeof s?o[5]:s,"number"!=typeof t?o:(a._orientation=[t,e,n,r,i,s],void 0!==a.ctx.listener.forwardX?(a.ctx.listener.forwardX.setTargetAtTime(t,Howler.ctx.currentTime,.1),a.ctx.listener.forwardY.setTargetAtTime(e,Howler.ctx.currentTime,.1),a.ctx.listener.forwardZ.setTargetAtTime(n,Howler.ctx.currentTime,.1),a.ctx.listener.upX.setTargetAtTime(r,Howler.ctx.currentTime,.1),a.ctx.listener.upY.setTargetAtTime(i,Howler.ctx.currentTime,.1),a.ctx.listener.upZ.setTargetAtTime(s,Howler.ctx.currentTime,.1)):a.ctx.listener.setOrientation(t,e,n,r,i,s),a)},Howl.prototype.init=(t=Howl.prototype.init,function(e){var n=this;return n._orientation=e.orientation||[1,0,0],n._stereo=e.stereo||null,n._pos=e.pos||null,n._pannerAttr={coneInnerAngle:void 0!==e.coneInnerAngle?e.coneInnerAngle:360,coneOuterAngle:void 0!==e.coneOuterAngle?e.coneOuterAngle:360,coneOuterGain:void 0!==e.coneOuterGain?e.coneOuterGain:0,distanceModel:void 0!==e.distanceModel?e.distanceModel:"inverse",maxDistance:void 0!==e.maxDistance?e.maxDistance:1e4,panningModel:void 0!==e.panningModel?e.panningModel:"HRTF",refDistance:void 0!==e.refDistance?e.refDistance:1,rolloffFactor:void 0!==e.rolloffFactor?e.rolloffFactor:1},n._onstereo=e.onstereo?[{fn:e.onstereo}]:[],n._onpos=e.onpos?[{fn:e.onpos}]:[],n._onorientation=e.onorientation?[{fn:e.onorientation}]:[],t.call(this,e)}),Howl.prototype.stereo=function(t,n){var r=this;if(!r._webAudio)return r;if("loaded"!==r._state)return r._queue.push({event:"stereo",action:function(){r.stereo(t,n)}}),r;var i=void 0===Howler.ctx.createStereoPanner?"spatial":"stereo";if(void 0===n){if("number"!=typeof t)return r._stereo;r._stereo=t,r._pos=[t,0,0]}for(var s=r._getSoundIds(n),a=0;a{var r;!function(i,s,a){if(i){for(var o,l={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},c={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},d={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},u={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},h=1;h<20;++h)l[111+h]="f"+h;for(h=0;h<=9;++h)l[h+96]=h.toString();_.prototype.bind=function(t,e,n){var r=this;return t=t instanceof Array?t:[t],r._bindMultiple.call(r,t,e,n),r},_.prototype.unbind=function(t,e){return this.bind.call(this,t,(function(){}),e)},_.prototype.trigger=function(t,e){var n=this;return n._directMap[t+":"+e]&&n._directMap[t+":"+e]({},t),n},_.prototype.reset=function(){var t=this;return t._callbacks={},t._directMap={},t},_.prototype.stopCallback=function(t,e){if((" "+e.className+" ").indexOf(" mousetrap ")>-1)return!1;if(b(e,this.target))return!1;if("composedPath"in t&&"function"==typeof t.composedPath){var n=t.composedPath()[0];n!==t.target&&(e=n)}return"INPUT"==e.tagName||"SELECT"==e.tagName||"TEXTAREA"==e.tagName||e.isContentEditable},_.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)},_.addKeycodes=function(t){for(var e in t)t.hasOwnProperty(e)&&(l[e]=t[e]);o=null},_.init=function(){var t=_(s);for(var e in t)"_"!==e.charAt(0)&&(_[e]=function(e){return function(){return t[e].apply(t,arguments)}}(e))},_.init(),i.Mousetrap=_,t.exports&&(t.exports=_),void 0===(r=function(){return _}.call(e,n,e,t))||(t.exports=r)}function p(t,e,n){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent("on"+e,n)}function f(t){if("keypress"==t.type){var e=String.fromCharCode(t.which);return t.shiftKey||(e=e.toLowerCase()),e}return l[t.which]?l[t.which]:c[t.which]?c[t.which]:String.fromCharCode(t.which).toLowerCase()}function m(t){return"shift"==t||"ctrl"==t||"alt"==t||"meta"==t}function g(t,e,n){return n||(n=function(){if(!o)for(var t in o={},l)t>95&&t<112||l.hasOwnProperty(t)&&(o[l[t]]=t);return o}()[t]?"keydown":"keypress"),"keypress"==n&&e.length&&(n="keydown"),n}function v(t,e){var n,r,i,s=[];for(n=function(t){return"+"===t?["+"]:(t=t.replace(/\+{2}/g,"+plus")).split("+")}(t),i=0;i1?function(t,e,s,a){function c(e){return function(){o=e,++r[t],clearTimeout(n),n=setTimeout(l,1e3)}}function u(e){d(s,e,t),"keyup"!==a&&(i=f(e)),setTimeout(l,10)}r[t]=0;for(var p=0;p0,s.tv=i.includes("TV"),l=navigator.getGamepads?Array.from(navigator.getGamepads()).filter((function(t){return null!=t})).length:0,s.gamepad=l>0,t("(orientation: portrait)",(function(t){s.portrait=t,s.landscape=!t,s.orientation=t?"portrait":"landscape",o("portrait",s.portrait),o("landscape",s.landscape),o("orientation",s.orientation)})),t("(any-pointer: coarse)",(function(t){e("touch",t),e("formfactor",d())&&c()})),t("(hover: hover)",(function(t){e("mouse",t),e("input",t?"mouse":"touch"),e("formfactor",d())&&c()}))}}return s.csp=s.uwp||!1,s.nwjs?s.dev="sdk"===process.versions["nw-flavor"]:s.electron?s.dev=process.execPath.replace(/\\/g,"/").includes("node_modules/electron/"):s.uwp?s.dev=Windows.ApplicationModel.Package.current.isDevelopmentMode:s.node?s.dev=!1:s.dev=void 0,s}()},7391:(t,e,n)=>{var r=n(7180),i=n(3181),s=n(3031),a=n(9067),o=n(6833),l=n(3717),c=n(4801);c.alea=r,c.xor128=i,c.xorwow=s,c.xorshift7=a,c.xor4096=o,c.tychei=l,t.exports=c},7180:function(t,e,n){var r;!function(t,i,s){function a(t){var e,n=this,r=(e=4022871197,function(t){t=t.toString();for(var n=0;n>>0,e=(r*=e)>>>0,e+=4294967296*(r-=e)}return 2.3283064365386963e-10*(e>>>0)});n.next=function(){var t=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=t-(n.c=0|t)},n.c=1,n.s0=r(" "),n.s1=r(" "),n.s2=r(" "),n.s0-=r(t),n.s0<0&&(n.s0+=1),n.s1-=r(t),n.s1<0&&(n.s1+=1),n.s2-=r(t),n.s2<0&&(n.s2+=1),r=null}function o(t,e){return e.c=t.c,e.s0=t.s0,e.s1=t.s1,e.s2=t.s2,e}function l(t,e){var n=new a(t),r=e&&e.state,i=n.next;return i.int32=function(){return 4294967296*n.next()|0},i.double=function(){return i()+11102230246251565e-32*(2097152*i()|0)},i.quick=i,r&&("object"==typeof r&&o(r,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(r=function(){return l}.call(e,n,e,i))||(i.exports=r):this.alea=l}(0,t=n.nmd(t),n.amdD)},3717:function(t,e,n){var r;!function(t,i,s){function a(t){var e=this,n="";e.next=function(){var t=e.b,n=e.c,r=e.d,i=e.a;return t=t<<25^t>>>7^n,n=n-r|0,r=r<<24^r>>>8^i,i=i-t|0,e.b=t=t<<20^t>>>12^n,e.c=n=n-r|0,e.d=r<<16^n>>>16^i,e.a=i-t|0},e.a=0,e.b=0,e.c=-1640531527,e.d=1367130551,t===Math.floor(t)?(e.a=t/4294967296|0,e.b=0|t):n+=t;for(var r=0;r>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,r&&("object"==typeof r&&o(r,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(r=function(){return l}.call(e,n,e,i))||(i.exports=r):this.tychei=l}(0,t=n.nmd(t),n.amdD)},3181:function(t,e,n){var r;!function(t,i,s){function a(t){var e=this,n="";e.x=0,e.y=0,e.z=0,e.w=0,e.next=function(){var t=e.x^e.x<<11;return e.x=e.y,e.y=e.z,e.z=e.w,e.w^=e.w>>>19^t^t>>>8},t===(0|t)?e.x=t:n+=t;for(var r=0;r>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,r&&("object"==typeof r&&o(r,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(r=function(){return l}.call(e,n,e,i))||(i.exports=r):this.xor128=l}(0,t=n.nmd(t),n.amdD)},6833:function(t,e,n){var r;!function(t,i,s){function a(t){var e=this;e.next=function(){var t,n,r=e.w,i=e.X,s=e.i;return e.w=r=r+1640531527|0,n=i[s+34&127],t=i[s=s+1&127],n^=n<<13,t^=t<<17,n^=n>>>15,t^=t>>>12,n=i[s]=n^t,e.i=s,n+(r^r>>>16)|0},function(t,e){var n,r,i,s,a,o=[],l=128;for(e===(0|e)?(r=e,e=null):(e+="\0",r=0,l=Math.max(l,e.length)),i=0,s=-32;s>>15,r^=r<<4,r^=r>>>13,s>=0&&(a=a+1640531527|0,i=0==(n=o[127&s]^=r+a)?i+1:0);for(i>=128&&(o[127&(e&&e.length||0)]=-1),i=127,s=512;s>0;--s)r=o[i+34&127],n=o[i=i+1&127],r^=r<<13,n^=n<<17,r^=r>>>15,n^=n>>>12,o[i]=r^n;t.w=a,t.X=o,t.i=i}(e,t)}function o(t,e){return e.i=t.i,e.w=t.w,e.X=t.X.slice(),e}function l(t,e){null==t&&(t=+new Date);var n=new a(t),r=e&&e.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,r&&(r.X&&o(r,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(r=function(){return l}.call(e,n,e,i))||(i.exports=r):this.xor4096=l}(0,t=n.nmd(t),n.amdD)},9067:function(t,e,n){var r;!function(t,i,s){function a(t){var e=this;e.next=function(){var t,n,r=e.x,i=e.i;return t=r[i],n=(t^=t>>>7)^t<<24,n^=(t=r[i+1&7])^t>>>10,n^=(t=r[i+3&7])^t>>>3,n^=(t=r[i+4&7])^t<<7,t=r[i+7&7],n^=(t^=t<<13)^t<<9,r[i]=n,e.i=i+1&7,n},function(t,e){var n,r=[];if(e===(0|e))r[0]=e;else for(e=""+e,n=0;n0;--n)t.next()}(e,t)}function o(t,e){return e.x=t.x.slice(),e.i=t.i,e}function l(t,e){null==t&&(t=+new Date);var n=new a(t),r=e&&e.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,r&&(r.x&&o(r,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(r=function(){return l}.call(e,n,e,i))||(i.exports=r):this.xorshift7=l}(0,t=n.nmd(t),n.amdD)},3031:function(t,e,n){var r;!function(t,i,s){function a(t){var e=this,n="";e.next=function(){var t=e.x^e.x>>>2;return e.x=e.y,e.y=e.z,e.z=e.w,e.w=e.v,(e.d=e.d+362437|0)+(e.v=e.v^e.v<<4^t^t<<1)|0},e.x=0,e.y=0,e.z=0,e.w=0,e.v=0,t===(0|t)?e.x=t:n+=t;for(var r=0;r>>4),e.next()}function o(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e.v=t.v,e.d=t.d,e}function l(t,e){var n=new a(t),r=e&&e.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,r&&("object"==typeof r&&o(r,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(r=function(){return l}.call(e,n,e,i))||(i.exports=r):this.xorwow=l}(0,t=n.nmd(t),n.amdD)},4801:(t,e,n)=>{var r;!function(i,s){var a,o=(0,eval)("this"),l=256,c="random",d=s.pow(l,6),u=s.pow(2,52),h=2*u,p=l-1;function f(t,e,n){var r=[],p=b(v((e=1==e?{entropy:!0}:e||{}).entropy?[t,_(i)]:null==t?function(){try{var t;return a&&(t=a.randomBytes)?t=t(l):(t=new Uint8Array(l),(o.crypto||o.msCrypto).getRandomValues(t)),_(t)}catch(t){var e=o.navigator,n=e&&e.plugins;return[+new Date,o,n,o.screen,_(i)]}}():t,3),r),f=new m(r),y=function(){for(var t=f.g(6),e=d,n=0;t=h;)t/=2,e/=2,n>>>=1;return(t+n)/e};return y.int32=function(){return 0|f.g(4)},y.quick=function(){return f.g(4)/4294967296},y.double=y,b(_(f.S),i),(e.pass||n||function(t,e,n,r){return r&&(r.S&&g(r,f),t.state=function(){return g(f,{})}),n?(s[c]=t,e):t})(y,p,"global"in e?e.global:this==s,e.state)}function m(t){var e,n=t.length,r=this,i=0,s=r.i=r.j=0,a=r.S=[];for(n||(t=[n++]);i{n(7391);var r=n(2287);t.exports=r},2287:function(t){(function(){var e={};Math.seedrandom&&(seedrandom=Math.seedrandom);var n=function(t){return"[object Array]"===Object.prototype.toString.call(t)},r=function(t){return/(number|string)/i.test(Object.prototype.toString.call(t).match(/^\[object (.*)\]$/)[1])?t:isNaN(t)?Number(String(this.strSeed=t).split("").map((function(t){return t.charCodeAt(0)})).join("")):t},i=function(t,e,n){return Math.floor(t()*(n-e+1))+e};e.shuffle=function(t,e){if(!n(t))return null;e=r(e)||"none";for(var s=t.length,a=seedrandom(e),o=[],l=[],c=0;c{var e=[];function n(t){for(var n=-1,r=0;r{var e={};t.exports=function(t,n){var r=function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(t){n=null}e[t]=n}return e[t]}(t);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},540:t=>{t.exports=function(t){var e=document.createElement("style");return t.setAttributes(e,t.attributes),t.insert(e,t.options),e}},5056:(t,e,n)=>{t.exports=function(t){var e=n.nc;e&&t.setAttribute("nonce",e)}},7825:t=>{t.exports=function(t){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var e=t.insertStyleElement(t);return{update:function(n){!function(t,e,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,i&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var s=n.sourceMap;s&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),e.styleTagTransform(r,t,e.options)}(e,t,n)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},1113:t=>{t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},4648:(t,e,n)=>{n.d(e,{LT:()=>a});var r=n(2844),i=n(7738),s=n(1634);const a={...r,...n(3191),...i,...n(1570),...n(7066),...n(8511),...s,utils:{logger:n(7484).A}}},7738:(t,e,n)=>{n.r(e),n.d(e,{activity:()=>a,activityId:()=>o,activitySubTitle:()=>d,activityTags:()=>u,activityTemplateId:()=>l,activityTitle:()=>c,adaptiveType:()=>h,annotationsConfig:()=>p,autoSaveConfig:()=>f,elapsedTime:()=>m,hasActivityTemplate:()=>g,hasAnnotations:()=>v,hasAutoSave:()=>b,hasEvents:()=>y,hasItemPool:()=>A,hasResourceItems:()=>w,hasSections:()=>x,hasShuffledItems:()=>_,hasTryAgain:()=>E,isAdaptive:()=>S,isResuming:()=>T,itemBank:()=>C,itemPool:()=>k,maxTime:()=>M,region:()=>I,resourceItems:()=>R,sessionId:()=>P,state:()=>D,timeRemaining:()=>L,totalItems:()=>F,userId:()=>O});var r=n(2844),i=n(8511),s=n(7484);function a(){return r.appInstance().getActivity()}function o(){return a().activity_id}function l(){return a().activity_template_id}function c(){return a().config.title}function d(){return a().config.subtitle}function u(){return r.appInstance().getTags()}function h(){return S()&&a().adaptive.hasOwnProperty("type")?a().adaptive.type:""}function p(){return v()&&a()?.config?.annotations_api_init_options?a().config.annotations_api_init_options:{}}function f(){const t=a();return t?.config?.navigation?.auto_save?t.config.navigation.auto_save:{}}function m(){return r.appInstance().getTime()}function g(){return a().hasOwnProperty("activity_template_id")}function v(){const t=a();return Boolean(!0===t?.config?.annotations||t?.config?.annotations_api_init_options)}function b(){const t=a();return t.hasOwnProperty("config")&&t.config.hasOwnProperty("navigation")&&t.config.navigation.hasOwnProperty("auto_save")&&!1!==t.config.navigation.auto_save}function _(){return Boolean(a()?.config?.configuration?.shuffle_items)}function y(){const t=a();return t.hasOwnProperty("events")&&!1!==t.events}function A(){return a().hasOwnProperty("item_pool_id")}function w(){return Boolean(a()?.config?.navigation?.resource_items)}function x(){return a().hasOwnProperty("sections")}function E(){return a()?.dynamic_items.hasOwnProperty("try_again")}function S(){return a().hasOwnProperty("adaptive")}function T(){return a().existing_session}function C(){return a()?.organisation_id}function k(){return a()?.item_pool_id}function M(){return a()?.config?.time?.max_time?a().config.time.max_time:0}function I(){return a()?.config?.regions}function R(){return a()?.config?.navigation?.resource_items}function P(){return a()?.session_id}function D(){let t;return t=void 0===a()?.state?"initial":a().state,t}function L(){return 0===M()?null:M()-m()}function F(){if(x()){let t=0,e=i.sections();for(let n=0;n{n.r(e),n.d(e,{annotationsApp:()=>l,appInstance:()=>o,assessApp:()=>c,eventsApp:()=>d,init:()=>a,questionsApp:()=>u});var r=n(1634),i=n(7066);const s={};function a(t){s.app=t,s.app.on("all",(t=>{(0,r.handleEvent)(t)})),s.app.on("item:load",(t=>{(0,i.questionResponseIds)().forEach((t=>{s.app.question(t).on("changed",(t=>{(0,r.handleEvent)("changed")}))}))}))}function o(){return s.app}function l(){return void 0!==o().annotationsApp()?o().annotationsApp():null}function c(){return o().assessApp()}function d(){return o().eventsApp()}function u(){return o().questionsApp()}},1634:(t,e,n)=>{n.r(e),n.d(e,{diagnostics:()=>l,filterEvent:()=>c,handleEvent:()=>d,listen:()=>u});var r=n(2844),i=n(7738),s=n(7484);const a="2.13.0",o={events:{broadcast:!1,listenFor:"item"}};function l(){let t=window.LearnosityApp?LearnosityApp.versions:{};return{apps:{annotations:{app:r.annotationsApp(),config:i.annotationsConfig(),enabled:i.hasAnnotations()},assess:{app:r.assessApp()},events:{app:r.eventsApp(),enabled:i.hasEvents()},items:{app:r.appInstance(),metadata:i.activity().config.metadata},questions:{app:r.questionsApp()}},activity:{activity:i.activityId(),activityTemplate:i.activityTemplateId(),autoSave:{config:i.autoSaveConfig(),enabled:i.hasAutoSave()},itemBank:i.itemBank(),itemPool:i.itemPool(),session:i.sessionId(),state:i.state(),type:i.activity().type,user:i.userId()},LT:{version:a},versions:t}}function c(t){/^[a-zA-Z:*]*$/.test(t)?o.events.listenFor=t:s.A.warn("Invalid event type")}function d(t){if(o.events.broadcast){const e=o.events.listenFor,n=e.replaceAll("*","");1===e.length&&"*"===e||"all"===e?s.A.info(t):e.startsWith("*")&&!e.endsWith("*")?t.endsWith(n)&&s.A.info(t):e.endsWith("*")&&!e.startsWith("*")?t.startsWith(n)&&s.A.info(t):e.startsWith("*")&&e.endsWith("*")?t.includes(n)&&s.A.info(t):t.startsWith(n)&&s.A.info(t)}}function u(t=!0){o.events.broadcast=Boolean(t),Boolean(t)?s.A.info(`👂 listening for '${o.events.listenFor}'`):s.A.info("🚫👂 not listening")}},3191:(t,e,n)=>{n.r(e),n.d(e,{dynamic:()=>o,flag:()=>l,isDynamicItem:()=>c,isFirstItem:()=>d,isFlagged:()=>h,isItemFullyAttempted:()=>p,isLastItem:()=>u,isMaskingEnabled:()=>f,item:()=>m,itemAttemptStatus:()=>g,itemByResponseId:()=>v,itemElement:()=>b,itemPosition:()=>_,itemReference:()=>y,itemTags:()=>A});var r=n(2844),i=n(7738),s=n(7066),a=n(8511);function o(){const t=y();return r.assessApp().item(t).dynamic||{}}function l(){const t=y();r.assessApp().item(t).flag()}function c(){return m()?.source.hasOwnProperty("data_table_seed")}function d(){let t;return i.hasSections()?(t="object"==typeof a.sections()[0].items[0]?a.sections()[0].items[0].reference:a.sections()[0].items[0],t===m().reference):(t="object"==typeof i.activity().items[0]?i.activity().items[0].reference:i.activity().items[0],t===m().reference)}function u(){return m().is_last_item}function h(){return m().user_flagged}function p(t){let e,n,i;if(e=t?r.appInstance().getItems()[t].questions:s.questions(),Array.isArray(e)&&e.length)for(let t=0;tvoid 0===t)).length)return!1;if(i.value.filter((t=>null===t)).length)return!1}n=!0}else n=!0;return n}function f(){return Boolean(document.querySelector(".lrn-masking"))}function m(t){return t?r.appInstance().getItems()[t]:r.appInstance().getCurrentItem()}function g(){return r.appInstance().getCurrentItem().attempt_status}function v(t){const e=r.appInstance().getItems();let n;for(const r in e)if(e[r].response_ids.includes(t)){n=e[r];break}return n}function b(){return document.querySelector(`div[data-reference='${y()}']`)}function _(){return r.appInstance().assessApp().getItemPosition(y())+1}function y(){return r.appInstance().getCurrentItem().reference}function A(t){return r.appInstance().getTags()[t||y()]||[]}},1570:(t,e,n)=>{n.r(e),n.d(e,{dialog:()=>a,hideDialog:()=>o,isResponsiveMode:()=>l,isReviewScreen:()=>c,navigate:()=>d,next:()=>u,previous:()=>h,review:()=>p,submit:()=>f});var r=n(2844),i=n(3191),s=n(7484);function a(t){r.assessApp().dialogs().custom.show(t)}function o(){r.assessApp().dialogs().custom.hide()}function l(){return Boolean(document.querySelector(".has-menu-region"))}function c(){let t=!1;setTimeout((()=>(null===document.getElementsByClassName("review-screen")[0].getAttribute("aria-hidden")&&(t=!0),t)),500)}function d(t){switch(t){case"previous":r.appInstance().items().previous();break;case"next":i.isLastItem()||r.appInstance().items().next();break;case"review":null===document.getElementsByClassName("review-screen")[0].getAttribute("aria-hidden")?r.appInstance().dialogs().reviewScreen.hide():r.appInstance().dialogs().reviewScreen.show();break;case"submit":let e={show_submit_confirmation:!0,show_submit_ui:!0,success:function(t){alert("Test saved!")},error:function(t){alert("Test submit failed...check browser log"),console.log("Submission failed: ",t)}};r.appInstance().submit(e);break;default:"number"==typeof Number(t)&&Number(t)>=0?r.appInstance().items().goto(Number(t)):s.A.warn(`Invalid target (${t})`)}}function u(){d("next")}function h(){d("previous")}function p(){d("review")}function f(){d("submit")}},7066:(t,e,n)=>{n.r(e),n.d(e,{hasCheckAnswer:()=>o,isAutoScorable:()=>l,question:()=>c,questionInstance:()=>d,questionResponse:()=>h,questionResponseIds:()=>p,questionScore:()=>f,questions:()=>u});var r=n(2844),i=n(3191),s=n(7738),a=n(7484);function o(t){if(!l(t))return!1;const e=(0,s.activity)()?.config?.questions_api_init_options?.attribute_overrides&&(0,s.activity)().config.questions_api_init_options.attribute_overrides.hasOwnProperty("instant_feedback")&&"boolean"==typeof(0,s.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback,n=c(t);return e?(0,s.activity)().config.questions_api_init_options.attribute_overrides.instant_feedback:!(!n.hasOwnProperty("instant_feedback")||"boolean"!=typeof n.instant_feedback)&&n.instant_feedback}function l(t){return c(t),d(t).checkValidation().has_validation}function c(t){let e=t||p()[0];return e?r.appInstance().question(e).getQuestion():(a.A.error(`Question not found (index ${e})`),{})}function d(t){let e=t||p()[0];return e?r.appInstance().question(e):{}}function u(){return i.item().questions}function h(t){let e=t||p()[0];return e?function(t){return r.appInstance().question(t)?r.appInstance().question(t).getResponse():void a.A.error(`Response not found ${t}`)}(e):{}}function p(){return u().map((t=>t.response_id))}function f(t){let e=t||p()[0];return e&&r.appInstance().getScores()[e]||{}}},8511:(t,e,n)=>{n.r(e),n.d(e,{isFirstItemInSection:()=>s,isLastItemInSection:()=>a,section:()=>o,sectionHasShuffledItems:()=>l,sectionIndex:()=>c,sectionItemPosition:()=>d,sections:()=>u,totalItemsInSection:()=>h});var r=n(7738),i=n(3191);function s(){return 1===d()}function a(){return d()===h()}function o(){if(r.hasSections()){const t=i.itemReference(),e=u();let n=-1,r=!1;for(let i=0;i{n.r(e),n.d(e,{run:()=>s});var r=n(2844),i=n(7738);function s(){r.appInstance().on("item:load",(()=>{let t=i.totalItems(),e=Array.from(document.getElementsByClassName("item-prev")),n=Array.from(document.getElementsByClassName("item-next")),r=e.concat(n);for(let e=0;e{n.r(e),n.d(e,{run:()=>a});var r=n(2844),i=n(3191);const s={renderedCss:!1,resize:{triggered:!1}};function a(){s.renderedCss||function(){const t=document.createElement("style");t.textContent="\n/* Learnosity column resizer styles */\n.lrn-resizer {\n background-color: #e8e8e8;\n cursor: grab;\n width: 3px;\n padding: 0;\n position: relative;\n}\n.lrn-resizer span {\n position: relative;\n width: 45px;\n height: 30px;\n border: 1px solid #e4e4e4;\n left: -22px;\n border-radius: 3px;\n cursor: grab;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.5em;\n z-index: 2;\n padding-bottom: 3px;\n color: #444;\n\n -webkit-user-select: none;\n user-select: none;\n\n background: rgb(233,233,233);\n background: linear-gradient(0deg, rgba(233,233,233,1) 0%, rgba(250,250,250,1) 51%, rgba(238,238,238,1) 100%);\n}\n.row {\n display: flex;\n}\n.col-xs-6.lrn-column-left {\n display: flex;\n min-width: 5em;\n overflow: hidden;\n}\n.col-xs-6.lrn-column-right {\n display: flex;\n\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 5em;\n overflow: hidden;\n}\n.lrn-column-left .lrn_widget,\n.lrn-column-right .lrn_widget {\n padding: 1.5em;\n}\n@media (max-width: 650px) {\n .lrn-resizer {\n display: none;\n }\n}\n",document.head.append(t),s.renderedCss=!0}(),r.appInstance().on("item:load",(()=>{o()})),window.addEventListener("resize",function(t,e){let n;return s.resize.triggered||(s.resize.triggered=!0,t.apply(this)),(...e)=>{clearTimeout(n),n=setTimeout((()=>{s.resize.triggered=!1,t.apply(this,e)}),250)}}(o))}function o(){let t=i.itemElement(),e=t.querySelectorAll('[class^="col-"]'),n=Boolean(t.querySelector(".lrn-resizer")),r=Boolean(document.querySelector(".lrn-layout-single-column"));if(2===e.length){if(r||n)r&&n&&function(t,e){let n=t.querySelector(".lrn-resizer");n&&n.remove(),e[0].removeAttribute("style"),window.dispatchEvent(new Event("resize"))}(t,e);else{let t=document.createElement("div");t.setAttribute("tooltip","Click and hold to drag column width");let n=document.createElement("span");n.innerHTML="↤ ↦",t.classList.add("lrn-resizer"),e[0].classList.add("lrn-column-left"),e[1].classList.add("lrn-column-right"),t.append(n),e[0].after(t)}!function(t){let e=t.querySelector(".lrn-resizer");e&&function(t){const e=t.previousElementSibling;let n=0,r=0;const i=t=>{n=t instanceof MouseEvent?t.clientX:t.targetTouches[0].clientX;const i=e.getBoundingClientRect();r=i.width,document.addEventListener("mousemove",s),document.addEventListener("mouseup",a),document.addEventListener("touchmove",s),document.addEventListener("touchend",a)},s=i=>{let s;s=i instanceof MouseEvent?i.clientX-n:i.targetTouches[0].clientX-n;const a=100*(r+s)/t.parentNode.getBoundingClientRect().width;a>=10&&a<=90&&(e.style.width=a+"%")},a=()=>{document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",a),document.removeEventListener("touchmove",s),document.removeEventListener("touchend",a)};t.addEventListener("mousedown",i),t.addEventListener("touchstart",i)}(e)}(t)}}},1499:(t,e,n)=>{n.r(e),n.d(e,{run:()=>a});var r=n(2844),i=n(7066),s=n(3184);function a(t){let e=t||1,n="LRN Hide Alternatives:";r.appInstance().on("item:load",(()=>{let t=i.questions();Object.values(t).forEach((function(t){if("mcq"===t.type)if(function(t){return!t.multiple_responses||!1===t.multiple_responses}(t))if(function(t,e){return t.options.length-e>1}(t,e))if(function(t){return"validation"in t&&t.validation}(t))if(r=t.validation,Boolean(r.valid_response.value&&r.valid_response.value.length)){let n=[],r=function(t){return t.valid_response.value}(t.validation);Object.values(r).forEach((function(e){Object.values(t.options).forEach((function(t){e!==t.value&&n.push(t.value)}))}));let i=[];for(let r=0;r{n.r(e),n.d(e,{run:()=>c});var r=n(2844),i=n(3191),s=n(7066),a=n(6254),o=n(6411);const l={supportedPlatforms:["chromeos","macos","windows"]};function c(t={global:[{bindings:{chromeos:["ctrl+shift+v"],macos:["command+shift+v"],windows:["ctrl+shift+v"]},type:"item.flag"},{bindings:{chromeos:["ctrl+alt+0"],macos:["command+option+0"],windows:["ctrl+alt+0"]},type:"masking.enable"}],item:[{bindings:{chromeos:["ctrl+shift+1","ctrl+shift+2","ctrl+shift+3","ctrl+shift+4","ctrl+shift+5","ctrl+shift+6"],macos:["command+ctrl+1","command+ctrl+2","command+ctrl+3","command+ctrl+4","command+ctrl+5","command+ctrl+6"],windows:["ctrl+shift+1","ctrl+shift+2","ctrl+shift+3","ctrl+shift+4","ctrl+shift+5","ctrl+shift+6"]},restrictTo:["mcq"],type:"response.set"},{bindings:{chromeos:["ctrl+alt+1","ctrl+alt+2","ctrl+alt+3","ctrl+alt+4","ctrl+alt+5","ctrl+alt+6"],macos:["command+option+1","command+option+2","command+option+3","command+option+4","command+option+5","command+option+6"],windows:["ctrl+alt+1","ctrl+alt+2","ctrl+alt+3","ctrl+alt+4","ctrl+alt+5","ctrl+alt+6"]},type:"response.mask"}]}){const e=function(){let t;return l.supportedPlatforms.forEach((e=>{a[e]&&(t=e)})),t}();l.bindings=t,e&&(o.prototype.stopCallback=function(t,e,n){let r=document.activeElement;return"radio"!==r.getAttribute("type")&&"checkbox"!==r.getAttribute("type")&&!((" "+e.className+" ").indexOf(" mousetrap ")>-1)&&("INPUT"==e.tagName||"SELECT"==e.tagName||"TEXTAREA"==e.tagName||e.contentEditable&&"true"==e.contentEditable)},l.bindings.hasOwnProperty("global")&&Array.isArray(l.bindings.global)&&l.bindings.global.forEach((t=>{if(t.hasOwnProperty("type"))switch(t.type){case"item.flag":n=t.bindings[e],o.bind(n,((t,e)=>{i.flag()}));break;case"masking.enable":!function(t){s.questionInstance().isMaskable()&&o.bind(t,(t=>{r.appInstance().questionsApp().masking(!i.isMaskingEnabled())}))}(t.bindings[e])}var n})),l.bindings.hasOwnProperty("item")&&Array.isArray(l.bindings.item)&&r.appInstance().on("item:load",(()=>{l.bindings.item.forEach((t=>{if(t.hasOwnProperty("type"))switch(t.type){case"response.mask":!function(t){let e=s.questions(),n=0;e.forEach((t=>{"mcq"===t.type&&n++})),1===n&&Object.values(e).forEach((function(e){"mcq"===e.type&&o.bind(t,((t,n)=>{if(i.isMaskingEnabled()){let t=Number(n.at(-1));if(e.options?.length>=t){let e=i.itemElement().querySelectorAll(".lrn-mcq-option")[t-1].querySelector(".lrn-mask");e&&e.click()}}}))}))}(t.bindings[e]);break;case"response.set":!function(t){let e=s.questions(),n=0;e.forEach((t=>{"mcq"===t.type&&n++})),1===n&&Object.values(e).forEach((function(e){"mcq"===e.type&&o.bind(t,(t=>{e.options?.length>=t.key&&document.getElementById(`${e.response_id}`).querySelectorAll(".lrn-input")[t.key-1].click()}))}))}(t.bindings[e])}}))})))}},3835:(t,e,n)=>{n.r(e),n.d(e,{run:()=>s});var r=n(2844),i=n(3191);function s(t,e="lrn__magnifier"){t||(t={zoom:4,shape:"square",width:350,height:350});const n=document.querySelectorAll(`.${e}`),s=new a(t);n.forEach((t=>{t.addEventListener("click",(()=>{s.toggle()}))})),r.appInstance().on("item:load",function(t){let e=i.itemElement().querySelectorAll("img");e&&e.forEach((e=>{e.addEventListener("click",(e=>{t.isVisible()||t.show(e)}))}))}(s))}function a(t){const e=this;e.options=Object.assign({zoom:2,shape:"square",width:200,height:200},t),window.MutationObserver||window.WebKitMutationObserver;let n,r,i,s,a,o=!1,l={};function c(t,e,n){t.style.left=`${e}px`,t.style.top=`${n}px`}function d(t,e,n){t.style.width=`${e}px`,t.style.height=`${n}px`}function u(){switch(e.options.shape){case"square":d(n,e.options.width,e.options.height);break;case"circle":d(n,e.options.width,e.options.height),n.style.borderRadius="50%"}r.style.WebkitTransform=r.style.MozTransform=r.style.OTransform=r.style.MsTransform=r.style.transform=`scale(${e.options.zoom})`}function h(t,e){let n=e;for(;null!=n;){if(n==t)return!0;n=n.parentNode}return!1}function p(){o&&(_(),v(),A())}function f(){o&&(window.clearTimeout(s),s=window.setTimeout(p,100))}function m(){o&&f()}function g(t,n){const r=l[t];if(r)for(let t=0;t0)for(let t=0;t0&&s.length===o.length)for(let t=0;t0&&t.push(e[n]);for(let e=0;e