@zsviczian/excalidraw 0.10.0-obsidian-image-support-2 → 0.10.0-obsidian-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1377,7 +1377,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1377
1377
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1378
1378
 
1379
1379
  "use strict";
1380
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionFinalize\": () => (/* binding */ actionFinalize)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _components_ToolButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst actionFinalize = (0,_register__WEBPACK_IMPORTED_MODULE_7__.register)({\r\n name: \"finalize\",\r\n perform: (elements, appState, _, { canvas, focusContainer }) => {\r\n var _a;\r\n if (appState.editingLinearElement) {\r\n const { elementId, startBindingElement, endBindingElement, } = appState.editingLinearElement;\r\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_10__.LinearElementEditor.getElement(elementId);\r\n if (element) {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isBindingElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_12__.bindOrUnbindLinearElement)(element, startBindingElement, endBindingElement);\r\n }\r\n return {\r\n elements: element.points.length < 2 || (0,_element__WEBPACK_IMPORTED_MODULE_2__.isInvisiblySmallElement)(element)\r\n ? elements.filter((el) => el.id !== element.id)\r\n : undefined,\r\n appState: Object.assign(Object.assign({}, appState), { editingLinearElement: null }),\r\n commitToHistory: true,\r\n };\r\n }\r\n }\r\n let newElements = elements;\r\n if (appState.pendingImageElement) {\r\n newElements = newElements.filter((element) => { var _a; return element.id !== ((_a = appState.pendingImageElement) === null || _a === void 0 ? void 0 : _a.id); });\r\n }\r\n if (window.document.activeElement instanceof HTMLElement) {\r\n focusContainer();\r\n }\r\n const multiPointElement = appState.multiElement\r\n ? appState.multiElement\r\n : ((_a = appState.editingElement) === null || _a === void 0 ? void 0 : _a.type) === \"freedraw\"\r\n ? appState.editingElement\r\n : null;\r\n if (multiPointElement) {\r\n // pen and mouse have hover\r\n if (multiPointElement.type !== \"freedraw\" &&\r\n appState.lastPointerDownWith !== \"touch\") {\r\n const { points, lastCommittedPoint } = multiPointElement;\r\n if (!lastCommittedPoint ||\r\n points[points.length - 1] !== lastCommittedPoint) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_8__.mutateElement)(multiPointElement, {\r\n points: multiPointElement.points.slice(0, -1),\r\n });\r\n }\r\n }\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_2__.isInvisiblySmallElement)(multiPointElement)) {\r\n newElements = newElements.slice(0, -1);\r\n }\r\n // If the multi point line closes the loop,\r\n // set the last point to first point.\r\n // This ensures that loop remains closed at different scales.\r\n const isLoop = (0,_math__WEBPACK_IMPORTED_MODULE_9__.isPathALoop)(multiPointElement.points, appState.zoom.value);\r\n if (multiPointElement.type === \"line\" ||\r\n multiPointElement.type === \"freedraw\") {\r\n if (isLoop) {\r\n const linePoints = multiPointElement.points;\r\n const firstPoint = linePoints[0];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_8__.mutateElement)(multiPointElement, {\r\n points: linePoints.map((point, index) => index === linePoints.length - 1\r\n ? [firstPoint[0], firstPoint[1]]\r\n : point),\r\n });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isBindingElement)(multiPointElement) &&\r\n !isLoop &&\r\n multiPointElement.points.length > 1) {\r\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_10__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiPointElement, -1);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_12__.maybeBindLinearElement)(multiPointElement, appState, _scene_Scene__WEBPACK_IMPORTED_MODULE_11__.default.getScene(multiPointElement), { x, y });\r\n }\r\n if (!appState.elementLocked && appState.elementType !== \"freedraw\") {\r\n appState.selectedElementIds[multiPointElement.id] = true;\r\n }\r\n }\r\n if ((!appState.elementLocked && appState.elementType !== \"freedraw\") ||\r\n !multiPointElement) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_3__.resetCursor)(canvas);\r\n }\r\n return {\r\n elements: newElements,\r\n appState: Object.assign(Object.assign({}, appState), { elementType: (appState.elementLocked || appState.elementType === \"freedraw\") &&\r\n multiPointElement\r\n ? appState.elementType\r\n : \"selection\", draggingElement: null, multiElement: null, editingElement: null, startBoundElement: null, suggestedBindings: [], selectedElementIds: multiPointElement &&\r\n !appState.elementLocked &&\r\n appState.elementType !== \"freedraw\"\r\n ? Object.assign(Object.assign({}, appState.selectedElementIds), { [multiPointElement.id]: true }) : appState.selectedElementIds, pendingImageElement: null }),\r\n commitToHistory: appState.elementType === \"freedraw\",\r\n };\r\n },\r\n keyTest: (event, appState) => (event.key === _keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.ESCAPE &&\r\n (appState.editingLinearElement !== null ||\r\n (!appState.draggingElement && appState.multiElement === null))) ||\r\n ((event.key === _keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.ESCAPE || event.key === _keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.ENTER) &&\r\n appState.multiElement !== null),\r\n PanelComponent: ({ appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_4__.ToolButton, { type: \"button\", icon: _components_icons__WEBPACK_IMPORTED_MODULE_5__.done, title: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.done\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.done\"), onClick: updateData, visible: appState.multiElement != null }, void 0)),\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUUsUUFBUSxFQUFFLEVBQUUsQ0FDM0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLDhDQUFXO1FBQ3hCLENBQUMsUUFBUSxDQUFDLG9CQUFvQixLQUFLLElBQUk7WUFDckMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLDhDQUFXLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyw2Q0FBVSxDQUFDO1lBQ3RELFFBQVEsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDO0lBQ25DLGNBQWMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUM1Qyx1REFBQyw4REFBVSxJQUNULElBQUksRUFBQyxRQUFRLEVBQ2IsSUFBSSxFQUFFLG1EQUFJLEVBQ1YsS0FBSyxFQUFFLHdDQUFDLENBQUMsY0FBYyxDQUFDLGdCQUNaLHdDQUFDLENBQUMsY0FBYyxDQUFDLEVBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQ25CLE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWSxJQUFJLElBQUksV0FDdEMsQ0FDSDtDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL2FjdGlvbkZpbmFsaXplLnRzeD9mNDBiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgcmVzZXRDdXJzb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFRvb2xCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Ub29sQnV0dG9uXCI7XG5pbXBvcnQgeyBkb25lIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaWNvbnNcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGlzUGF0aEFMb29wIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQge1xuICBtYXliZUJpbmRMaW5lYXJFbGVtZW50LFxuICBiaW5kT3JVbmJpbmRMaW5lYXJFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBpc0JpbmRpbmdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uRmluYWxpemUgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiZmluYWxpemVcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgXywgeyBjYW52YXMsIGZvY3VzQ29udGFpbmVyIH0pID0+IHtcbiAgICBpZiAoYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZWxlbWVudElkLFxuICAgICAgICBzdGFydEJpbmRpbmdFbGVtZW50LFxuICAgICAgICBlbmRCaW5kaW5nRWxlbWVudCxcbiAgICAgIH0gPSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudDtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoZWxlbWVudElkKTtcblxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBiaW5kT3JVbmJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHN0YXJ0QmluZGluZ0VsZW1lbnQsXG4gICAgICAgICAgICBlbmRCaW5kaW5nRWxlbWVudCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZWxlbWVudHM6XG4gICAgICAgICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyIHx8IGlzSW52aXNpYmx5U21hbGxFbGVtZW50KGVsZW1lbnQpXG4gICAgICAgICAgICAgID8gZWxlbWVudHMuZmlsdGVyKChlbCkgPT4gZWwuaWQgIT09IGVsZW1lbnQuaWQpXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBuZXdFbGVtZW50cyA9IGVsZW1lbnRzO1xuXG4gICAgaWYgKGFwcFN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgIG5ld0VsZW1lbnRzID0gbmV3RWxlbWVudHMuZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5pZCAhPT0gYXBwU3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudD8uaWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBmb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGNvbnN0IG11bHRpUG9pbnRFbGVtZW50ID0gYXBwU3RhdGUubXVsdGlFbGVtZW50XG4gICAgICA/IGFwcFN0YXRlLm11bHRpRWxlbWVudFxuICAgICAgOiBhcHBTdGF0ZS5lZGl0aW5nRWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiXG4gICAgICA/IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50XG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAobXVsdGlQb2ludEVsZW1lbnQpIHtcbiAgICAgIC8vIHBlbiBhbmQgbW91c2UgaGF2ZSBob3ZlclxuICAgICAgaWYgKFxuICAgICAgICBtdWx0aVBvaW50RWxlbWVudC50eXBlICE9PSBcImZyZWVkcmF3XCIgJiZcbiAgICAgICAgYXBwU3RhdGUubGFzdFBvaW50ZXJEb3duV2l0aCAhPT0gXCJ0b3VjaFwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBwb2ludHMsIGxhc3RDb21taXR0ZWRQb2ludCB9ID0gbXVsdGlQb2ludEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhbGFzdENvbW1pdHRlZFBvaW50IHx8XG4gICAgICAgICAgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSAhPT0gbGFzdENvbW1pdHRlZFBvaW50XG4gICAgICAgICkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlQb2ludEVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogbXVsdGlQb2ludEVsZW1lbnQucG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzSW52aXNpYmx5U21hbGxFbGVtZW50KG11bHRpUG9pbnRFbGVtZW50KSkge1xuICAgICAgICBuZXdFbGVtZW50cyA9IG5ld0VsZW1lbnRzLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG11bHRpIHBvaW50IGxpbmUgY2xvc2VzIHRoZSBsb29wLFxuICAgICAgLy8gc2V0IHRoZSBsYXN0IHBvaW50IHRvIGZpcnN0IHBvaW50LlxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgbG9vcCByZW1haW5zIGNsb3NlZCBhdCBkaWZmZXJlbnQgc2NhbGVzLlxuICAgICAgY29uc3QgaXNMb29wID0gaXNQYXRoQUxvb3AobXVsdGlQb2ludEVsZW1lbnQucG9pbnRzLCBhcHBTdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQudHlwZSA9PT0gXCJsaW5lXCIgfHxcbiAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiXG4gICAgICApIHtcbiAgICAgICAgaWYgKGlzTG9vcCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVQb2ludHMgPSBtdWx0aVBvaW50RWxlbWVudC5wb2ludHM7XG4gICAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IGxpbmVQb2ludHNbMF07XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aVBvaW50RWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBsaW5lUG9pbnRzLm1hcCgocG9pbnQsIGluZGV4KSA9PlxuICAgICAgICAgICAgICBpbmRleCA9PT0gbGluZVBvaW50cy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgPyAoW2ZpcnN0UG9pbnRbMF0sIGZpcnN0UG9pbnRbMV1dIGFzIGNvbnN0KVxuICAgICAgICAgICAgICAgIDogcG9pbnQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNCaW5kaW5nRWxlbWVudChtdWx0aVBvaW50RWxlbWVudCkgJiZcbiAgICAgICAgIWlzTG9vcCAmJlxuICAgICAgICBtdWx0aVBvaW50RWxlbWVudC5wb2ludHMubGVuZ3RoID4gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQsXG4gICAgICAgICAgLTEsXG4gICAgICAgICk7XG4gICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgU2NlbmUuZ2V0U2NlbmUobXVsdGlQb2ludEVsZW1lbnQpISxcbiAgICAgICAgICB7IHgsIHkgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBTdGF0ZS5lbGVtZW50TG9ja2VkICYmIGFwcFN0YXRlLmVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgYXBwU3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW211bHRpUG9pbnRFbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKCFhcHBTdGF0ZS5lbGVtZW50TG9ja2VkICYmIGFwcFN0YXRlLmVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHx8XG4gICAgICAhbXVsdGlQb2ludEVsZW1lbnRcbiAgICApIHtcbiAgICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBuZXdFbGVtZW50cyxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICBlbGVtZW50VHlwZTpcbiAgICAgICAgICAoYXBwU3RhdGUuZWxlbWVudExvY2tlZCB8fCBhcHBTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiKSAmJlxuICAgICAgICAgIG11bHRpUG9pbnRFbGVtZW50XG4gICAgICAgICAgICA/IGFwcFN0YXRlLmVsZW1lbnRUeXBlXG4gICAgICAgICAgICA6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IG51bGwsXG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOlxuICAgICAgICAgIG11bHRpUG9pbnRFbGVtZW50ICYmXG4gICAgICAgICAgIWFwcFN0YXRlLmVsZW1lbnRMb2NrZWQgJiZcbiAgICAgICAgICBhcHBTdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAuLi5hcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW211bHRpUG9pbnRFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiBhcHBTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiLFxuICAgIH07XG4gIH0sXG4gIGtleVRlc3Q6IChldmVudCwgYXBwU3RhdGUpID0+XG4gICAgKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUgJiZcbiAgICAgIChhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gbnVsbCB8fFxuICAgICAgICAoIWFwcFN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiBhcHBTdGF0ZS5tdWx0aUVsZW1lbnQgPT09IG51bGwpKSkgfHxcbiAgICAoKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUgfHwgZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSKSAmJlxuICAgICAgYXBwU3RhdGUubXVsdGlFbGVtZW50ICE9PSBudWxsKSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8VG9vbEJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBpY29uPXtkb25lfVxuICAgICAgdGl0bGU9e3QoXCJidXR0b25zLmRvbmVcIil9XG4gICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5kb25lXCIpfVxuICAgICAgb25DbGljaz17dXBkYXRlRGF0YX1cbiAgICAgIHZpc2libGU9e2FwcFN0YXRlLm11bHRpRWxlbWVudCAhPSBudWxsfVxuICAgIC8+XG4gICksXG59KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/actionFinalize.tsx\n");
1380
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionFinalize\": () => (/* binding */ actionFinalize)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _components_ToolButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst actionFinalize = (0,_register__WEBPACK_IMPORTED_MODULE_7__.register)({\r\n name: \"finalize\",\r\n perform: (elements, appState, _, { canvas, focusContainer }) => {\r\n var _a;\r\n if (appState.editingLinearElement) {\r\n const { elementId, startBindingElement, endBindingElement, } = appState.editingLinearElement;\r\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_10__.LinearElementEditor.getElement(elementId);\r\n if (element) {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isBindingElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_12__.bindOrUnbindLinearElement)(element, startBindingElement, endBindingElement);\r\n }\r\n return {\r\n elements: element.points.length < 2 || (0,_element__WEBPACK_IMPORTED_MODULE_2__.isInvisiblySmallElement)(element)\r\n ? elements.filter((el) => el.id !== element.id)\r\n : undefined,\r\n appState: Object.assign(Object.assign({}, appState), { editingLinearElement: null }),\r\n commitToHistory: true,\r\n };\r\n }\r\n }\r\n let newElements = elements;\r\n if (appState.pendingImageElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_8__.mutateElement)(appState.pendingImageElement, { isDeleted: true }, false);\r\n }\r\n if (window.document.activeElement instanceof HTMLElement) {\r\n focusContainer();\r\n }\r\n const multiPointElement = appState.multiElement\r\n ? appState.multiElement\r\n : ((_a = appState.editingElement) === null || _a === void 0 ? void 0 : _a.type) === \"freedraw\"\r\n ? appState.editingElement\r\n : null;\r\n if (multiPointElement) {\r\n // pen and mouse have hover\r\n if (multiPointElement.type !== \"freedraw\" &&\r\n appState.lastPointerDownWith !== \"touch\") {\r\n const { points, lastCommittedPoint } = multiPointElement;\r\n if (!lastCommittedPoint ||\r\n points[points.length - 1] !== lastCommittedPoint) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_8__.mutateElement)(multiPointElement, {\r\n points: multiPointElement.points.slice(0, -1),\r\n });\r\n }\r\n }\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_2__.isInvisiblySmallElement)(multiPointElement)) {\r\n newElements = newElements.slice(0, -1);\r\n }\r\n // If the multi point line closes the loop,\r\n // set the last point to first point.\r\n // This ensures that loop remains closed at different scales.\r\n const isLoop = (0,_math__WEBPACK_IMPORTED_MODULE_9__.isPathALoop)(multiPointElement.points, appState.zoom.value);\r\n if (multiPointElement.type === \"line\" ||\r\n multiPointElement.type === \"freedraw\") {\r\n if (isLoop) {\r\n const linePoints = multiPointElement.points;\r\n const firstPoint = linePoints[0];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_8__.mutateElement)(multiPointElement, {\r\n points: linePoints.map((point, index) => index === linePoints.length - 1\r\n ? [firstPoint[0], firstPoint[1]]\r\n : point),\r\n });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isBindingElement)(multiPointElement) &&\r\n !isLoop &&\r\n multiPointElement.points.length > 1) {\r\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_10__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiPointElement, -1);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_12__.maybeBindLinearElement)(multiPointElement, appState, _scene_Scene__WEBPACK_IMPORTED_MODULE_11__.default.getScene(multiPointElement), { x, y });\r\n }\r\n if (!appState.elementLocked && appState.elementType !== \"freedraw\") {\r\n appState.selectedElementIds[multiPointElement.id] = true;\r\n }\r\n }\r\n if ((!appState.elementLocked && appState.elementType !== \"freedraw\") ||\r\n !multiPointElement) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_3__.resetCursor)(canvas);\r\n }\r\n return {\r\n elements: newElements,\r\n appState: Object.assign(Object.assign({}, appState), { elementType: (appState.elementLocked || appState.elementType === \"freedraw\") &&\r\n multiPointElement\r\n ? appState.elementType\r\n : \"selection\", draggingElement: null, multiElement: null, editingElement: null, startBoundElement: null, suggestedBindings: [], selectedElementIds: multiPointElement &&\r\n !appState.elementLocked &&\r\n appState.elementType !== \"freedraw\"\r\n ? Object.assign(Object.assign({}, appState.selectedElementIds), { [multiPointElement.id]: true }) : appState.selectedElementIds, pendingImageElement: null }),\r\n commitToHistory: appState.elementType === \"freedraw\",\r\n };\r\n },\r\n keyTest: (event, appState) => (event.key === _keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.ESCAPE &&\r\n (appState.editingLinearElement !== null ||\r\n (!appState.draggingElement && appState.multiElement === null))) ||\r\n ((event.key === _keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.ESCAPE || event.key === _keys__WEBPACK_IMPORTED_MODULE_1__.KEYS.ENTER) &&\r\n appState.multiElement !== null),\r\n PanelComponent: ({ appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_4__.ToolButton, { type: \"button\", icon: _components_icons__WEBPACK_IMPORTED_MODULE_5__.done, title: (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.done\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"buttons.done\"), onClick: updateData, visible: appState.multiElement != null }, void 0)),\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsR0FBRyxLQUFLLDhDQUFXO1FBQ3hCLENBQUMsUUFBUSxDQUFDLG9CQUFvQixLQUFLLElBQUk7WUFDckMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLDhDQUFXLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyw2Q0FBVSxDQUFDO1lBQ3RELFFBQVEsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDO0lBQ25DLGNBQWMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUM1Qyx1REFBQyw4REFBVSxJQUNULElBQUksRUFBQyxRQUFRLEVBQ2IsSUFBSSxFQUFFLG1EQUFJLEVBQ1YsS0FBSyxFQUFFLHdDQUFDLENBQUMsY0FBYyxDQUFDLGdCQUNaLHdDQUFDLENBQUMsY0FBYyxDQUFDLEVBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQ25CLE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWSxJQUFJLElBQUksV0FDdEMsQ0FDSDtDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL2FjdGlvbkZpbmFsaXplLnRzeD9mNDBiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgcmVzZXRDdXJzb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFRvb2xCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Ub29sQnV0dG9uXCI7XG5pbXBvcnQgeyBkb25lIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaWNvbnNcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGlzUGF0aEFMb29wIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQge1xuICBtYXliZUJpbmRMaW5lYXJFbGVtZW50LFxuICBiaW5kT3JVbmJpbmRMaW5lYXJFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBpc0JpbmRpbmdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uRmluYWxpemUgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiZmluYWxpemVcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgXywgeyBjYW52YXMsIGZvY3VzQ29udGFpbmVyIH0pID0+IHtcbiAgICBpZiAoYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZWxlbWVudElkLFxuICAgICAgICBzdGFydEJpbmRpbmdFbGVtZW50LFxuICAgICAgICBlbmRCaW5kaW5nRWxlbWVudCxcbiAgICAgIH0gPSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudDtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoZWxlbWVudElkKTtcblxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBiaW5kT3JVbmJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHN0YXJ0QmluZGluZ0VsZW1lbnQsXG4gICAgICAgICAgICBlbmRCaW5kaW5nRWxlbWVudCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZWxlbWVudHM6XG4gICAgICAgICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyIHx8IGlzSW52aXNpYmx5U21hbGxFbGVtZW50KGVsZW1lbnQpXG4gICAgICAgICAgICAgID8gZWxlbWVudHMuZmlsdGVyKChlbCkgPT4gZWwuaWQgIT09IGVsZW1lbnQuaWQpXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBuZXdFbGVtZW50cyA9IGVsZW1lbnRzO1xuXG4gICAgaWYgKGFwcFN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoYXBwU3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCwgeyBpc0RlbGV0ZWQ6IHRydWUgfSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBmb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGNvbnN0IG11bHRpUG9pbnRFbGVtZW50ID0gYXBwU3RhdGUubXVsdGlFbGVtZW50XG4gICAgICA/IGFwcFN0YXRlLm11bHRpRWxlbWVudFxuICAgICAgOiBhcHBTdGF0ZS5lZGl0aW5nRWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiXG4gICAgICA/IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50XG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAobXVsdGlQb2ludEVsZW1lbnQpIHtcbiAgICAgIC8vIHBlbiBhbmQgbW91c2UgaGF2ZSBob3ZlclxuICAgICAgaWYgKFxuICAgICAgICBtdWx0aVBvaW50RWxlbWVudC50eXBlICE9PSBcImZyZWVkcmF3XCIgJiZcbiAgICAgICAgYXBwU3RhdGUubGFzdFBvaW50ZXJEb3duV2l0aCAhPT0gXCJ0b3VjaFwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBwb2ludHMsIGxhc3RDb21taXR0ZWRQb2ludCB9ID0gbXVsdGlQb2ludEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhbGFzdENvbW1pdHRlZFBvaW50IHx8XG4gICAgICAgICAgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSAhPT0gbGFzdENvbW1pdHRlZFBvaW50XG4gICAgICAgICkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlQb2ludEVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogbXVsdGlQb2ludEVsZW1lbnQucG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzSW52aXNpYmx5U21hbGxFbGVtZW50KG11bHRpUG9pbnRFbGVtZW50KSkge1xuICAgICAgICBuZXdFbGVtZW50cyA9IG5ld0VsZW1lbnRzLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG11bHRpIHBvaW50IGxpbmUgY2xvc2VzIHRoZSBsb29wLFxuICAgICAgLy8gc2V0IHRoZSBsYXN0IHBvaW50IHRvIGZpcnN0IHBvaW50LlxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgbG9vcCByZW1haW5zIGNsb3NlZCBhdCBkaWZmZXJlbnQgc2NhbGVzLlxuICAgICAgY29uc3QgaXNMb29wID0gaXNQYXRoQUxvb3AobXVsdGlQb2ludEVsZW1lbnQucG9pbnRzLCBhcHBTdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQudHlwZSA9PT0gXCJsaW5lXCIgfHxcbiAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiXG4gICAgICApIHtcbiAgICAgICAgaWYgKGlzTG9vcCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVQb2ludHMgPSBtdWx0aVBvaW50RWxlbWVudC5wb2ludHM7XG4gICAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IGxpbmVQb2ludHNbMF07XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aVBvaW50RWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBsaW5lUG9pbnRzLm1hcCgocG9pbnQsIGluZGV4KSA9PlxuICAgICAgICAgICAgICBpbmRleCA9PT0gbGluZVBvaW50cy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgPyAoW2ZpcnN0UG9pbnRbMF0sIGZpcnN0UG9pbnRbMV1dIGFzIGNvbnN0KVxuICAgICAgICAgICAgICAgIDogcG9pbnQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNCaW5kaW5nRWxlbWVudChtdWx0aVBvaW50RWxlbWVudCkgJiZcbiAgICAgICAgIWlzTG9vcCAmJlxuICAgICAgICBtdWx0aVBvaW50RWxlbWVudC5wb2ludHMubGVuZ3RoID4gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQsXG4gICAgICAgICAgLTEsXG4gICAgICAgICk7XG4gICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgICAgbXVsdGlQb2ludEVsZW1lbnQsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgU2NlbmUuZ2V0U2NlbmUobXVsdGlQb2ludEVsZW1lbnQpISxcbiAgICAgICAgICB7IHgsIHkgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBTdGF0ZS5lbGVtZW50TG9ja2VkICYmIGFwcFN0YXRlLmVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgYXBwU3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW211bHRpUG9pbnRFbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKCFhcHBTdGF0ZS5lbGVtZW50TG9ja2VkICYmIGFwcFN0YXRlLmVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHx8XG4gICAgICAhbXVsdGlQb2ludEVsZW1lbnRcbiAgICApIHtcbiAgICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBuZXdFbGVtZW50cyxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICBlbGVtZW50VHlwZTpcbiAgICAgICAgICAoYXBwU3RhdGUuZWxlbWVudExvY2tlZCB8fCBhcHBTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiKSAmJlxuICAgICAgICAgIG11bHRpUG9pbnRFbGVtZW50XG4gICAgICAgICAgICA/IGFwcFN0YXRlLmVsZW1lbnRUeXBlXG4gICAgICAgICAgICA6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IG51bGwsXG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOlxuICAgICAgICAgIG11bHRpUG9pbnRFbGVtZW50ICYmXG4gICAgICAgICAgIWFwcFN0YXRlLmVsZW1lbnRMb2NrZWQgJiZcbiAgICAgICAgICBhcHBTdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAuLi5hcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW211bHRpUG9pbnRFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiBhcHBTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiLFxuICAgIH07XG4gIH0sXG4gIGtleVRlc3Q6IChldmVudCwgYXBwU3RhdGUpID0+XG4gICAgKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUgJiZcbiAgICAgIChhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gbnVsbCB8fFxuICAgICAgICAoIWFwcFN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiBhcHBTdGF0ZS5tdWx0aUVsZW1lbnQgPT09IG51bGwpKSkgfHxcbiAgICAoKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUgfHwgZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSKSAmJlxuICAgICAgYXBwU3RhdGUubXVsdGlFbGVtZW50ICE9PSBudWxsKSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8VG9vbEJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBpY29uPXtkb25lfVxuICAgICAgdGl0bGU9e3QoXCJidXR0b25zLmRvbmVcIil9XG4gICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5kb25lXCIpfVxuICAgICAgb25DbGljaz17dXBkYXRlRGF0YX1cbiAgICAgIHZpc2libGU9e2FwcFN0YXRlLm11bHRpRWxlbWVudCAhPSBudWxsfVxuICAgIC8+XG4gICksXG59KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/actionFinalize.tsx\n");
1381
1381
 
1382
1382
  /***/ }),
1383
1383
 
@@ -1652,7 +1652,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1652
1652
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1653
1653
 
1654
1654
  "use strict";
1655
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SelectedShapeActions\": () => (/* binding */ SelectedShapeActions),\n/* harmony export */ \"ShapesSwitcher\": () => (/* binding */ ShapesSwitcher),\n/* harmony export */ \"ZoomActions\": () => (/* binding */ ZoomActions)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Stack */ \"../../components/Stack.tsx\");\n/* harmony import */ var _ToolButton__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _scene_comparisons__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../scene/comparisons */ \"../../scene/comparisons.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst SelectedShapeActions = ({ appState, elements, renderAction, elementType, }) => {\r\n const targetElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getTargetElements)((0,_element__WEBPACK_IMPORTED_MODULE_2__.getNonDeletedElements)(elements), appState);\r\n const isEditing = Boolean(appState.editingElement);\r\n const isMobile = (0,_components_App__WEBPACK_IMPORTED_MODULE_4__.useIsMobile)();\r\n const isRTL = document.documentElement.getAttribute(\"dir\") === \"rtl\";\r\n const showFillIcons = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(element.type) && !(0,_utils__WEBPACK_IMPORTED_MODULE_7__.isTransparent)(element.backgroundColor));\r\n const showChangeBackgroundIcons = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(element.type));\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"panelColumn\" }, { children: [targetElements.some((element) => (0,_scene_comparisons__WEBPACK_IMPORTED_MODULE_10__.hasStrokeColor)(element.type)) &&\r\n renderAction(\"changeStrokeColor\"), showChangeBackgroundIcons && renderAction(\"changeBackgroundColor\"), showFillIcons && renderAction(\"changeFillStyle\"), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeWidth)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeWidth)(element.type))) &&\r\n renderAction(\"changeStrokeWidth\"), (elementType === \"freedraw\" ||\r\n targetElements.some((element) => element.type === \"freedraw\")) &&\r\n renderAction(\"changeStrokeShape\"), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeStyle)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeStyle)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"changeStrokeStyle\"), renderAction(\"changeSloppiness\")] }, void 0)), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.canChangeSharpness)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.canChangeSharpness)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: renderAction(\"changeSharpness\") }, void 0)), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasText)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasText)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"changeFontSize\"), renderAction(\"changeFontFamily\"), renderAction(\"changeTextAlign\")] }, void 0)), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.canHaveArrowheads)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.canHaveArrowheads)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: renderAction(\"changeArrowhead\") }, void 0)), renderAction(\"changeOpacity\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"labels.layers\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"buttonList\" }, { children: [renderAction(\"sendToBack\"), renderAction(\"sendBackward\"), renderAction(\"bringToFront\"), renderAction(\"bringForward\")] }), void 0)] }, void 0), targetElements.length > 1 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"labels.align\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"buttonList\" }, { children: [isRTL ? ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"alignRight\"), renderAction(\"alignHorizontallyCentered\"), renderAction(\"alignLeft\")] }, void 0)) : ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"alignLeft\"), renderAction(\"alignHorizontallyCentered\"), renderAction(\"alignRight\")] }, void 0)), targetElements.length > 2 &&\r\n renderAction(\"distributeHorizontally\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"iconRow\" }, { children: [renderAction(\"alignTop\"), renderAction(\"alignVerticallyCentered\"), renderAction(\"alignBottom\"), targetElements.length > 2 &&\r\n renderAction(\"distributeVertically\")] }), void 0)] }), void 0)] }, void 0)), !isMobile && !isEditing && targetElements.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"labels.actions\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"buttonList\" }, { children: [renderAction(\"duplicateSelection\"), renderAction(\"deleteSelectedElements\"), renderAction(\"group\"), renderAction(\"ungroup\")] }), void 0)] }, void 0))] }), void 0));\r\n};\r\nconst ShapesSwitcher = ({ canvas, elementType, setAppState, onImageAction, }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: _shapes__WEBPACK_IMPORTED_MODULE_6__.SHAPES.map(({ value, icon, key }, index) => {\r\n const label = (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(`toolBar.${value}`);\r\n const letter = key && (typeof key === \"string\" ? key : key[0]);\r\n const shortcut = letter\r\n ? `${(0,_utils__WEBPACK_IMPORTED_MODULE_7__.capitalizeString)(letter)} ${(0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"helpDialog.or\")} ${index + 1}`\r\n : `${index + 1}`;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_9__.ToolButton, { className: \"Shape\", type: \"radio\", icon: icon, checked: elementType === value, name: \"editor-current-shape\", title: `${(0,_utils__WEBPACK_IMPORTED_MODULE_7__.capitalizeString)(label)} — ${shortcut}`, keyBindingLabel: `${index + 1}`, \"aria-label\": (0,_utils__WEBPACK_IMPORTED_MODULE_7__.capitalizeString)(label), \"aria-keyshortcuts\": shortcut, \"data-testid\": value, onChange: ({ pointerType }) => {\r\n setAppState({\r\n elementType: value,\r\n multiElement: null,\r\n selectedElementIds: {},\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_7__.setCursorForShape)(canvas, value);\r\n if (value === \"image\") {\r\n onImageAction({ pointerType });\r\n }\r\n } }, value));\r\n }) }, void 0));\r\nconst ZoomActions = ({ renderAction, zoom, }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stack__WEBPACK_IMPORTED_MODULE_8__.default.Col, Object.assign({ gap: 1 }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Stack__WEBPACK_IMPORTED_MODULE_8__.default.Row, Object.assign({ gap: 1, align: \"center\" }, { children: [renderAction(\"zoomOut\"), renderAction(\"zoomIn\"), renderAction(\"resetZoom\")] }), void 0) }), void 0));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzlCLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFDdkIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUN0QixZQUFZLENBQUMsV0FBVyxDQUFDLGFBQ2hCLFlBQ0YsQ0FDYixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvQWN0aW9ucy50c3g/YjEyNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBBY3Rpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL2FjdGlvbnMvbWFuYWdlclwiO1xuaW1wb3J0IHsgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50LCBQb2ludGVyVHlwZSB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7IHVzZUlzTW9iaWxlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQge1xuICBjYW5DaGFuZ2VTaGFycG5lc3MsXG4gIGNhbkhhdmVBcnJvd2hlYWRzLFxuICBnZXRUYXJnZXRFbGVtZW50cyxcbiAgaGFzQmFja2dyb3VuZCxcbiAgaGFzU3Ryb2tlU3R5bGUsXG4gIGhhc1N0cm9rZVdpZHRoLFxuICBoYXNUZXh0LFxufSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IFNIQVBFUyB9IGZyb20gXCIuLi9zaGFwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBab29tIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjYXBpdGFsaXplU3RyaW5nLCBpc1RyYW5zcGFyZW50LCBzZXRDdXJzb3JGb3JTaGFwZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFN0YWNrIGZyb20gXCIuL1N0YWNrXCI7XG5pbXBvcnQgeyBUb29sQnV0dG9uIH0gZnJvbSBcIi4vVG9vbEJ1dHRvblwiO1xuaW1wb3J0IHsgaGFzU3Ryb2tlQ29sb3IgfSBmcm9tIFwiLi4vc2NlbmUvY29tcGFyaXNvbnNcIjtcblxuZXhwb3J0IGNvbnN0IFNlbGVjdGVkU2hhcGVBY3Rpb25zID0gKHtcbiAgYXBwU3RhdGUsXG4gIGVsZW1lbnRzLFxuICByZW5kZXJBY3Rpb24sXG4gIGVsZW1lbnRUeXBlLFxufToge1xuICBhcHBTdGF0ZTogQXBwU3RhdGU7XG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdO1xuICByZW5kZXJBY3Rpb246IEFjdGlvbk1hbmFnZXJbXCJyZW5kZXJBY3Rpb25cIl07XG4gIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3RWxlbWVudFtcInR5cGVcIl07XG59KSA9PiB7XG4gIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gZ2V0VGFyZ2V0RWxlbWVudHMoXG4gICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICBhcHBTdGF0ZSxcbiAgKTtcbiAgY29uc3QgaXNFZGl0aW5nID0gQm9vbGVhbihhcHBTdGF0ZS5lZGl0aW5nRWxlbWVudCk7XG4gIGNvbnN0IGlzTW9iaWxlID0gdXNlSXNNb2JpbGUoKTtcbiAgY29uc3QgaXNSVEwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGlyXCIpID09PSBcInJ0bFwiO1xuXG4gIGNvbnN0IHNob3dGaWxsSWNvbnMgPVxuICAgIGhhc0JhY2tncm91bmQoZWxlbWVudFR5cGUpIHx8XG4gICAgdGFyZ2V0RWxlbWVudHMuc29tZShcbiAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSkgJiYgIWlzVHJhbnNwYXJlbnQoZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IpLFxuICAgICk7XG4gIGNvbnN0IHNob3dDaGFuZ2VCYWNrZ3JvdW5kSWNvbnMgPVxuICAgIGhhc0JhY2tncm91bmQoZWxlbWVudFR5cGUpIHx8XG4gICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzQmFja2dyb3VuZChlbGVtZW50LnR5cGUpKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicGFuZWxDb2x1bW5cIj5cbiAgICAgIHt0YXJnZXRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNTdHJva2VDb2xvcihlbGVtZW50LnR5cGUpKSAmJlxuICAgICAgICByZW5kZXJBY3Rpb24oXCJjaGFuZ2VTdHJva2VDb2xvclwiKX1cbiAgICAgIHtzaG93Q2hhbmdlQmFja2dyb3VuZEljb25zICYmIHJlbmRlckFjdGlvbihcImNoYW5nZUJhY2tncm91bmRDb2xvclwiKX1cbiAgICAgIHtzaG93RmlsbEljb25zICYmIHJlbmRlckFjdGlvbihcImNoYW5nZUZpbGxTdHlsZVwiKX1cblxuICAgICAgeyhoYXNTdHJva2VXaWR0aChlbGVtZW50VHlwZSkgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzU3Ryb2tlV2lkdGgoZWxlbWVudC50eXBlKSkpICYmXG4gICAgICAgIHJlbmRlckFjdGlvbihcImNoYW5nZVN0cm9rZVdpZHRoXCIpfVxuXG4gICAgICB7KGVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCIgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpKSAmJlxuICAgICAgICByZW5kZXJBY3Rpb24oXCJjaGFuZ2VTdHJva2VTaGFwZVwiKX1cblxuICAgICAgeyhoYXNTdHJva2VTdHlsZShlbGVtZW50VHlwZSkgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzU3Ryb2tlU3R5bGUoZWxlbWVudC50eXBlKSkpICYmIChcbiAgICAgICAgPD5cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiY2hhbmdlU3Ryb2tlU3R5bGVcIil9XG4gICAgICAgICAge3JlbmRlckFjdGlvbihcImNoYW5nZVNsb3BwaW5lc3NcIil9XG4gICAgICAgIDwvPlxuICAgICAgKX1cblxuICAgICAgeyhjYW5DaGFuZ2VTaGFycG5lc3MoZWxlbWVudFR5cGUpIHx8XG4gICAgICAgIHRhcmdldEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGNhbkNoYW5nZVNoYXJwbmVzcyhlbGVtZW50LnR5cGUpKSkgJiYgKFxuICAgICAgICA8PntyZW5kZXJBY3Rpb24oXCJjaGFuZ2VTaGFycG5lc3NcIil9PC8+XG4gICAgICApfVxuXG4gICAgICB7KGhhc1RleHQoZWxlbWVudFR5cGUpIHx8XG4gICAgICAgIHRhcmdldEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGhhc1RleHQoZWxlbWVudC50eXBlKSkpICYmIChcbiAgICAgICAgPD5cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiY2hhbmdlRm9udFNpemVcIil9XG5cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiY2hhbmdlRm9udEZhbWlseVwiKX1cblxuICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJjaGFuZ2VUZXh0QWxpZ25cIil9XG4gICAgICAgIDwvPlxuICAgICAgKX1cblxuICAgICAgeyhjYW5IYXZlQXJyb3doZWFkcyhlbGVtZW50VHlwZSkgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gY2FuSGF2ZUFycm93aGVhZHMoZWxlbWVudC50eXBlKSkpICYmIChcbiAgICAgICAgPD57cmVuZGVyQWN0aW9uKFwiY2hhbmdlQXJyb3doZWFkXCIpfTwvPlxuICAgICAgKX1cblxuICAgICAge3JlbmRlckFjdGlvbihcImNoYW5nZU9wYWNpdHlcIil9XG5cbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5sYXllcnNcIil9PC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnV0dG9uTGlzdFwiPlxuICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJzZW5kVG9CYWNrXCIpfVxuICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJzZW5kQmFja3dhcmRcIil9XG4gICAgICAgICAge3JlbmRlckFjdGlvbihcImJyaW5nVG9Gcm9udFwiKX1cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYnJpbmdGb3J3YXJkXCIpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgIHt0YXJnZXRFbGVtZW50cy5sZW5ndGggPiAxICYmIChcbiAgICAgICAgPGZpZWxkc2V0PlxuICAgICAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuYWxpZ25cIil9PC9sZWdlbmQ+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidXR0b25MaXN0XCI+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIHN3YXAgdGhpcyBvcmRlciBmb3IgUlRMIHNvIHRoZSBidXR0b24gcG9zaXRpb25zIGFsd2F5cyBtYXRjaCB0aGVpciBhY3Rpb25cbiAgICAgICAgICAgICAgLy8gKGkuZS4gdGhlIGxlZnRtb3N0IGJ1dHRvbiBhbGlnbnMgbGVmdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtpc1JUTCA/IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25SaWdodFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25Ib3Jpem9udGFsbHlDZW50ZXJlZFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25MZWZ0XCIpfVxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImFsaWduTGVmdFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25Ib3Jpem9udGFsbHlDZW50ZXJlZFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25SaWdodFwiKX1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RhcmdldEVsZW1lbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICAgICAgICAgcmVuZGVyQWN0aW9uKFwiZGlzdHJpYnV0ZUhvcml6b250YWxseVwiKX1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaWNvblJvd1wiPlxuICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25Ub3BcIil9XG4gICAgICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJhbGlnblZlcnRpY2FsbHlDZW50ZXJlZFwiKX1cbiAgICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImFsaWduQm90dG9tXCIpfVxuICAgICAgICAgICAgICB7dGFyZ2V0RWxlbWVudHMubGVuZ3RoID4gMiAmJlxuICAgICAgICAgICAgICAgIHJlbmRlckFjdGlvbihcImRpc3RyaWJ1dGVWZXJ0aWNhbGx5XCIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICApfVxuICAgICAgeyFpc01vYmlsZSAmJiAhaXNFZGl0aW5nICYmIHRhcmdldEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5hY3Rpb25zXCIpfTwvbGVnZW5kPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnV0dG9uTGlzdFwiPlxuICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImR1cGxpY2F0ZVNlbGVjdGlvblwiKX1cbiAgICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJkZWxldGVTZWxlY3RlZEVsZW1lbnRzXCIpfVxuICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImdyb3VwXCIpfVxuICAgICAgICAgICAge3JlbmRlckFjdGlvbihcInVuZ3JvdXBcIil9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNoYXBlc1N3aXRjaGVyID0gKHtcbiAgY2FudmFzLFxuICBlbGVtZW50VHlwZSxcbiAgc2V0QXBwU3RhdGUsXG4gIG9uSW1hZ2VBY3Rpb24sXG59OiB7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdO1xuICBzZXRBcHBTdGF0ZTogUmVhY3QuQ29tcG9uZW50PGFueSwgQXBwU3RhdGU+W1wic2V0U3RhdGVcIl07XG4gIG9uSW1hZ2VBY3Rpb246IChkYXRhOiB7IHBvaW50ZXJUeXBlOiBQb2ludGVyVHlwZSB8IG51bGwgfSkgPT4gdm9pZDtcbn0pID0+IChcbiAgPD5cbiAgICB7U0hBUEVTLm1hcCgoeyB2YWx1ZSwgaWNvbiwga2V5IH0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHQoYHRvb2xCYXIuJHt2YWx1ZX1gKTtcbiAgICAgIGNvbnN0IGxldHRlciA9IGtleSAmJiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IGtleSA6IGtleVswXSk7XG4gICAgICBjb25zdCBzaG9ydGN1dCA9IGxldHRlclxuICAgICAgICA/IGAke2NhcGl0YWxpemVTdHJpbmcobGV0dGVyKX0gJHt0KFwiaGVscERpYWxvZy5vclwiKX0gJHtpbmRleCArIDF9YFxuICAgICAgICA6IGAke2luZGV4ICsgMX1gO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFRvb2xCdXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJTaGFwZVwiXG4gICAgICAgICAga2V5PXt2YWx1ZX1cbiAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgIGljb249e2ljb259XG4gICAgICAgICAgY2hlY2tlZD17ZWxlbWVudFR5cGUgPT09IHZhbHVlfVxuICAgICAgICAgIG5hbWU9XCJlZGl0b3ItY3VycmVudC1zaGFwZVwiXG4gICAgICAgICAgdGl0bGU9e2Ake2NhcGl0YWxpemVTdHJpbmcobGFiZWwpfSDigJQgJHtzaG9ydGN1dH1gfVxuICAgICAgICAgIGtleUJpbmRpbmdMYWJlbD17YCR7aW5kZXggKyAxfWB9XG4gICAgICAgICAgYXJpYS1sYWJlbD17Y2FwaXRhbGl6ZVN0cmluZyhsYWJlbCl9XG4gICAgICAgICAgYXJpYS1rZXlzaG9ydGN1dHM9e3Nob3J0Y3V0fVxuICAgICAgICAgIGRhdGEtdGVzdGlkPXt2YWx1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17KHsgcG9pbnRlclR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgc2V0QXBwU3RhdGUoe1xuICAgICAgICAgICAgICBlbGVtZW50VHlwZTogdmFsdWUsXG4gICAgICAgICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoY2FudmFzLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgICAgICAgICBvbkltYWdlQWN0aW9uKHsgcG9pbnRlclR5cGUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfSl9XG4gIDwvPlxuKTtcblxuZXhwb3J0IGNvbnN0IFpvb21BY3Rpb25zID0gKHtcbiAgcmVuZGVyQWN0aW9uLFxuICB6b29tLFxufToge1xuICByZW5kZXJBY3Rpb246IEFjdGlvbk1hbmFnZXJbXCJyZW5kZXJBY3Rpb25cIl07XG4gIHpvb206IFpvb207XG59KSA9PiAoXG4gIDxTdGFjay5Db2wgZ2FwPXsxfT5cbiAgICA8U3RhY2suUm93IGdhcD17MX0gYWxpZ249XCJjZW50ZXJcIj5cbiAgICAgIHtyZW5kZXJBY3Rpb24oXCJ6b29tT3V0XCIpfVxuICAgICAge3JlbmRlckFjdGlvbihcInpvb21JblwiKX1cbiAgICAgIHtyZW5kZXJBY3Rpb24oXCJyZXNldFpvb21cIil9XG4gICAgPC9TdGFjay5Sb3c+XG4gIDwvU3RhY2suQ29sPlxuKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../components/Actions.tsx\n");
1655
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SelectedShapeActions\": () => (/* binding */ SelectedShapeActions),\n/* harmony export */ \"ShapesSwitcher\": () => (/* binding */ ShapesSwitcher),\n/* harmony export */ \"ZoomActions\": () => (/* binding */ ZoomActions)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Stack */ \"../../components/Stack.tsx\");\n/* harmony import */ var _ToolButton__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _scene_comparisons__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../scene/comparisons */ \"../../scene/comparisons.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst SelectedShapeActions = ({ appState, elements, renderAction, elementType, }) => {\r\n var _a;\r\n const targetElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getTargetElements)((0,_element__WEBPACK_IMPORTED_MODULE_2__.getNonDeletedElements)(elements), appState);\r\n const isEditing = Boolean(appState.editingElement);\r\n const isMobile = (0,_components_App__WEBPACK_IMPORTED_MODULE_4__.useIsMobile)();\r\n const isRTL = document.documentElement.getAttribute(\"dir\") === \"rtl\";\r\n const showFillIcons = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(element.type) && !(0,_utils__WEBPACK_IMPORTED_MODULE_7__.isTransparent)(element.backgroundColor));\r\n const showChangeBackgroundIcons = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasBackground)(element.type));\r\n let commonSelectedType = ((_a = targetElements[0]) === null || _a === void 0 ? void 0 : _a.type) || null;\r\n for (const element of targetElements) {\r\n if (element.type !== commonSelectedType) {\r\n commonSelectedType = null;\r\n break;\r\n }\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"panelColumn\" }, { children: [(((0,_scene_comparisons__WEBPACK_IMPORTED_MODULE_10__.hasStrokeColor)(elementType) &&\r\n elementType !== \"image\" &&\r\n commonSelectedType !== \"image\") ||\r\n targetElements.some((element) => (0,_scene_comparisons__WEBPACK_IMPORTED_MODULE_10__.hasStrokeColor)(element.type))) &&\r\n renderAction(\"changeStrokeColor\"), showChangeBackgroundIcons && renderAction(\"changeBackgroundColor\"), showFillIcons && renderAction(\"changeFillStyle\"), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeWidth)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeWidth)(element.type))) &&\r\n renderAction(\"changeStrokeWidth\"), (elementType === \"freedraw\" ||\r\n targetElements.some((element) => element.type === \"freedraw\")) &&\r\n renderAction(\"changeStrokeShape\"), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeStyle)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasStrokeStyle)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"changeStrokeStyle\"), renderAction(\"changeSloppiness\")] }, void 0)), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.canChangeSharpness)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.canChangeSharpness)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: renderAction(\"changeSharpness\") }, void 0)), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasText)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.hasText)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"changeFontSize\"), renderAction(\"changeFontFamily\"), renderAction(\"changeTextAlign\")] }, void 0)), ((0,_scene__WEBPACK_IMPORTED_MODULE_5__.canHaveArrowheads)(elementType) ||\r\n targetElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_5__.canHaveArrowheads)(element.type))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: renderAction(\"changeArrowhead\") }, void 0)), renderAction(\"changeOpacity\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"labels.layers\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"buttonList\" }, { children: [renderAction(\"sendToBack\"), renderAction(\"sendBackward\"), renderAction(\"bringToFront\"), renderAction(\"bringForward\")] }), void 0)] }, void 0), targetElements.length > 1 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"labels.align\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"buttonList\" }, { children: [isRTL ? ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"alignRight\"), renderAction(\"alignHorizontallyCentered\"), renderAction(\"alignLeft\")] }, void 0)) : ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [renderAction(\"alignLeft\"), renderAction(\"alignHorizontallyCentered\"), renderAction(\"alignRight\")] }, void 0)), targetElements.length > 2 &&\r\n renderAction(\"distributeHorizontally\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"iconRow\" }, { children: [renderAction(\"alignTop\"), renderAction(\"alignVerticallyCentered\"), renderAction(\"alignBottom\"), targetElements.length > 2 &&\r\n renderAction(\"distributeVertically\")] }), void 0)] }), void 0)] }, void 0)), !isMobile && !isEditing && targetElements.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"fieldset\", { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"legend\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"labels.actions\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"buttonList\" }, { children: [renderAction(\"duplicateSelection\"), renderAction(\"deleteSelectedElements\"), renderAction(\"group\"), renderAction(\"ungroup\")] }), void 0)] }, void 0))] }), void 0));\r\n};\r\nconst ShapesSwitcher = ({ canvas, elementType, setAppState, onImageAction, }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: _shapes__WEBPACK_IMPORTED_MODULE_6__.SHAPES.map(({ value, icon, key }, index) => {\r\n const label = (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(`toolBar.${value}`);\r\n const letter = key && (typeof key === \"string\" ? key : key[0]);\r\n const shortcut = letter\r\n ? `${(0,_utils__WEBPACK_IMPORTED_MODULE_7__.capitalizeString)(letter)} ${(0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(\"helpDialog.or\")} ${index + 1}`\r\n : `${index + 1}`;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_9__.ToolButton, { className: \"Shape\", type: \"radio\", icon: icon, checked: elementType === value, name: \"editor-current-shape\", title: `${(0,_utils__WEBPACK_IMPORTED_MODULE_7__.capitalizeString)(label)} — ${shortcut}`, keyBindingLabel: `${index + 1}`, \"aria-label\": (0,_utils__WEBPACK_IMPORTED_MODULE_7__.capitalizeString)(label), \"aria-keyshortcuts\": shortcut, \"data-testid\": value, onChange: ({ pointerType }) => {\r\n setAppState({\r\n elementType: value,\r\n multiElement: null,\r\n selectedElementIds: {},\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_7__.setCursorForShape)(canvas, value);\r\n if (value === \"image\") {\r\n onImageAction({ pointerType });\r\n }\r\n } }, value));\r\n }) }, void 0));\r\nconst ZoomActions = ({ renderAction, zoom, }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stack__WEBPACK_IMPORTED_MODULE_8__.default.Col, Object.assign({ gap: 1 }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Stack__WEBPACK_IMPORTED_MODULE_8__.default.Row, Object.assign({ gap: 1, align: \"center\" }, { children: [renderAction(\"zoomOut\"), renderAction(\"zoomIn\"), renderAction(\"resetZoom\")] }), void 0) }), void 0));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LE9BQU8sRUFBRTtvQkFDckIsYUFBYSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztpQkFDaEM7WUFDSCxDQUFDLElBcEJJLEtBQUssQ0FxQlYsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLFdBQ0QsQ0FDSixDQUFDO0FBRUssTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUMxQixZQUFZLEVBQ1osSUFBSSxHQUlMLEVBQUUsRUFBRSxDQUFDLENBQ0osdURBQUMsK0NBQVMsa0JBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQ2Ysd0RBQUMsK0NBQVMsa0JBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUMsUUFBUSxpQkFDOUIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUN2QixZQUFZLENBQUMsUUFBUSxDQUFDLEVBQ3RCLFlBQVksQ0FBQyxXQUFXLENBQUMsYUFDaEIsWUFDRixDQUNiLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9BY3Rpb25zLnRzeD9iMTI2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBnZXROb25EZWxldGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgRXhjYWxpZHJhd0VsZW1lbnQsIFBvaW50ZXJUeXBlIH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgdXNlSXNNb2JpbGUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCB7XG4gIGNhbkNoYW5nZVNoYXJwbmVzcyxcbiAgY2FuSGF2ZUFycm93aGVhZHMsXG4gIGdldFRhcmdldEVsZW1lbnRzLFxuICBoYXNCYWNrZ3JvdW5kLFxuICBoYXNTdHJva2VTdHlsZSxcbiAgaGFzU3Ryb2tlV2lkdGgsXG4gIGhhc1RleHQsXG59IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4uL3NoYXBlc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIFpvb20gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGNhcGl0YWxpemVTdHJpbmcsIGlzVHJhbnNwYXJlbnQsIHNldEN1cnNvckZvclNoYXBlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgU3RhY2sgZnJvbSBcIi4vU3RhY2tcIjtcbmltcG9ydCB7IFRvb2xCdXR0b24gfSBmcm9tIFwiLi9Ub29sQnV0dG9uXCI7XG5pbXBvcnQgeyBoYXNTdHJva2VDb2xvciB9IGZyb20gXCIuLi9zY2VuZS9jb21wYXJpc29uc1wiO1xuXG5leHBvcnQgY29uc3QgU2VsZWN0ZWRTaGFwZUFjdGlvbnMgPSAoe1xuICBhcHBTdGF0ZSxcbiAgZWxlbWVudHMsXG4gIHJlbmRlckFjdGlvbixcbiAgZWxlbWVudFR5cGUsXG59OiB7XG4gIGFwcFN0YXRlOiBBcHBTdGF0ZTtcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W107XG4gIHJlbmRlckFjdGlvbjogQWN0aW9uTWFuYWdlcltcInJlbmRlckFjdGlvblwiXTtcbiAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdFbGVtZW50W1widHlwZVwiXTtcbn0pID0+IHtcbiAgY29uc3QgdGFyZ2V0RWxlbWVudHMgPSBnZXRUYXJnZXRFbGVtZW50cyhcbiAgICBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpLFxuICAgIGFwcFN0YXRlLFxuICApO1xuICBjb25zdCBpc0VkaXRpbmcgPSBCb29sZWFuKGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50KTtcbiAgY29uc3QgaXNNb2JpbGUgPSB1c2VJc01vYmlsZSgpO1xuICBjb25zdCBpc1JUTCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkaXJcIikgPT09IFwicnRsXCI7XG5cbiAgY29uc3Qgc2hvd0ZpbGxJY29ucyA9XG4gICAgaGFzQmFja2dyb3VuZChlbGVtZW50VHlwZSkgfHxcbiAgICB0YXJnZXRFbGVtZW50cy5zb21lKFxuICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgIGhhc0JhY2tncm91bmQoZWxlbWVudC50eXBlKSAmJiAhaXNUcmFuc3BhcmVudChlbGVtZW50LmJhY2tncm91bmRDb2xvciksXG4gICAgKTtcbiAgY29uc3Qgc2hvd0NoYW5nZUJhY2tncm91bmRJY29ucyA9XG4gICAgaGFzQmFja2dyb3VuZChlbGVtZW50VHlwZSkgfHxcbiAgICB0YXJnZXRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSkpO1xuXG4gIGxldCBjb21tb25TZWxlY3RlZFR5cGU6IHN0cmluZyB8IG51bGwgPSB0YXJnZXRFbGVtZW50c1swXT8udHlwZSB8fCBudWxsO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiB0YXJnZXRFbGVtZW50cykge1xuICAgIGlmIChlbGVtZW50LnR5cGUgIT09IGNvbW1vblNlbGVjdGVkVHlwZSkge1xuICAgICAgY29tbW9uU2VsZWN0ZWRUeXBlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJwYW5lbENvbHVtblwiPlxuICAgICAgeygoaGFzU3Ryb2tlQ29sb3IoZWxlbWVudFR5cGUpICYmXG4gICAgICAgIGVsZW1lbnRUeXBlICE9PSBcImltYWdlXCIgJiZcbiAgICAgICAgY29tbW9uU2VsZWN0ZWRUeXBlICE9PSBcImltYWdlXCIpIHx8XG4gICAgICAgIHRhcmdldEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGhhc1N0cm9rZUNvbG9yKGVsZW1lbnQudHlwZSkpKSAmJlxuICAgICAgICByZW5kZXJBY3Rpb24oXCJjaGFuZ2VTdHJva2VDb2xvclwiKX1cbiAgICAgIHtzaG93Q2hhbmdlQmFja2dyb3VuZEljb25zICYmIHJlbmRlckFjdGlvbihcImNoYW5nZUJhY2tncm91bmRDb2xvclwiKX1cbiAgICAgIHtzaG93RmlsbEljb25zICYmIHJlbmRlckFjdGlvbihcImNoYW5nZUZpbGxTdHlsZVwiKX1cblxuICAgICAgeyhoYXNTdHJva2VXaWR0aChlbGVtZW50VHlwZSkgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzU3Ryb2tlV2lkdGgoZWxlbWVudC50eXBlKSkpICYmXG4gICAgICAgIHJlbmRlckFjdGlvbihcImNoYW5nZVN0cm9rZVdpZHRoXCIpfVxuXG4gICAgICB7KGVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCIgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpKSAmJlxuICAgICAgICByZW5kZXJBY3Rpb24oXCJjaGFuZ2VTdHJva2VTaGFwZVwiKX1cblxuICAgICAgeyhoYXNTdHJva2VTdHlsZShlbGVtZW50VHlwZSkgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzU3Ryb2tlU3R5bGUoZWxlbWVudC50eXBlKSkpICYmIChcbiAgICAgICAgPD5cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiY2hhbmdlU3Ryb2tlU3R5bGVcIil9XG4gICAgICAgICAge3JlbmRlckFjdGlvbihcImNoYW5nZVNsb3BwaW5lc3NcIil9XG4gICAgICAgIDwvPlxuICAgICAgKX1cblxuICAgICAgeyhjYW5DaGFuZ2VTaGFycG5lc3MoZWxlbWVudFR5cGUpIHx8XG4gICAgICAgIHRhcmdldEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGNhbkNoYW5nZVNoYXJwbmVzcyhlbGVtZW50LnR5cGUpKSkgJiYgKFxuICAgICAgICA8PntyZW5kZXJBY3Rpb24oXCJjaGFuZ2VTaGFycG5lc3NcIil9PC8+XG4gICAgICApfVxuXG4gICAgICB7KGhhc1RleHQoZWxlbWVudFR5cGUpIHx8XG4gICAgICAgIHRhcmdldEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGhhc1RleHQoZWxlbWVudC50eXBlKSkpICYmIChcbiAgICAgICAgPD5cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiY2hhbmdlRm9udFNpemVcIil9XG5cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiY2hhbmdlRm9udEZhbWlseVwiKX1cblxuICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJjaGFuZ2VUZXh0QWxpZ25cIil9XG4gICAgICAgIDwvPlxuICAgICAgKX1cblxuICAgICAgeyhjYW5IYXZlQXJyb3doZWFkcyhlbGVtZW50VHlwZSkgfHxcbiAgICAgICAgdGFyZ2V0RWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gY2FuSGF2ZUFycm93aGVhZHMoZWxlbWVudC50eXBlKSkpICYmIChcbiAgICAgICAgPD57cmVuZGVyQWN0aW9uKFwiY2hhbmdlQXJyb3doZWFkXCIpfTwvPlxuICAgICAgKX1cblxuICAgICAge3JlbmRlckFjdGlvbihcImNoYW5nZU9wYWNpdHlcIil9XG5cbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5sYXllcnNcIil9PC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnV0dG9uTGlzdFwiPlxuICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJzZW5kVG9CYWNrXCIpfVxuICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJzZW5kQmFja3dhcmRcIil9XG4gICAgICAgICAge3JlbmRlckFjdGlvbihcImJyaW5nVG9Gcm9udFwiKX1cbiAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYnJpbmdGb3J3YXJkXCIpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgIHt0YXJnZXRFbGVtZW50cy5sZW5ndGggPiAxICYmIChcbiAgICAgICAgPGZpZWxkc2V0PlxuICAgICAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuYWxpZ25cIil9PC9sZWdlbmQ+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidXR0b25MaXN0XCI+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIHN3YXAgdGhpcyBvcmRlciBmb3IgUlRMIHNvIHRoZSBidXR0b24gcG9zaXRpb25zIGFsd2F5cyBtYXRjaCB0aGVpciBhY3Rpb25cbiAgICAgICAgICAgICAgLy8gKGkuZS4gdGhlIGxlZnRtb3N0IGJ1dHRvbiBhbGlnbnMgbGVmdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtpc1JUTCA/IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25SaWdodFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25Ib3Jpem9udGFsbHlDZW50ZXJlZFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25MZWZ0XCIpfVxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImFsaWduTGVmdFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25Ib3Jpem9udGFsbHlDZW50ZXJlZFwiKX1cbiAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25SaWdodFwiKX1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RhcmdldEVsZW1lbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICAgICAgICAgcmVuZGVyQWN0aW9uKFwiZGlzdHJpYnV0ZUhvcml6b250YWxseVwiKX1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaWNvblJvd1wiPlxuICAgICAgICAgICAgICB7cmVuZGVyQWN0aW9uKFwiYWxpZ25Ub3BcIil9XG4gICAgICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJhbGlnblZlcnRpY2FsbHlDZW50ZXJlZFwiKX1cbiAgICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImFsaWduQm90dG9tXCIpfVxuICAgICAgICAgICAgICB7dGFyZ2V0RWxlbWVudHMubGVuZ3RoID4gMiAmJlxuICAgICAgICAgICAgICAgIHJlbmRlckFjdGlvbihcImRpc3RyaWJ1dGVWZXJ0aWNhbGx5XCIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICApfVxuICAgICAgeyFpc01vYmlsZSAmJiAhaXNFZGl0aW5nICYmIHRhcmdldEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5hY3Rpb25zXCIpfTwvbGVnZW5kPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnV0dG9uTGlzdFwiPlxuICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImR1cGxpY2F0ZVNlbGVjdGlvblwiKX1cbiAgICAgICAgICAgIHtyZW5kZXJBY3Rpb24oXCJkZWxldGVTZWxlY3RlZEVsZW1lbnRzXCIpfVxuICAgICAgICAgICAge3JlbmRlckFjdGlvbihcImdyb3VwXCIpfVxuICAgICAgICAgICAge3JlbmRlckFjdGlvbihcInVuZ3JvdXBcIil9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNoYXBlc1N3aXRjaGVyID0gKHtcbiAgY2FudmFzLFxuICBlbGVtZW50VHlwZSxcbiAgc2V0QXBwU3RhdGUsXG4gIG9uSW1hZ2VBY3Rpb24sXG59OiB7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdO1xuICBzZXRBcHBTdGF0ZTogUmVhY3QuQ29tcG9uZW50PGFueSwgQXBwU3RhdGU+W1wic2V0U3RhdGVcIl07XG4gIG9uSW1hZ2VBY3Rpb246IChkYXRhOiB7IHBvaW50ZXJUeXBlOiBQb2ludGVyVHlwZSB8IG51bGwgfSkgPT4gdm9pZDtcbn0pID0+IChcbiAgPD5cbiAgICB7U0hBUEVTLm1hcCgoeyB2YWx1ZSwgaWNvbiwga2V5IH0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHQoYHRvb2xCYXIuJHt2YWx1ZX1gKTtcbiAgICAgIGNvbnN0IGxldHRlciA9IGtleSAmJiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IGtleSA6IGtleVswXSk7XG4gICAgICBjb25zdCBzaG9ydGN1dCA9IGxldHRlclxuICAgICAgICA/IGAke2NhcGl0YWxpemVTdHJpbmcobGV0dGVyKX0gJHt0KFwiaGVscERpYWxvZy5vclwiKX0gJHtpbmRleCArIDF9YFxuICAgICAgICA6IGAke2luZGV4ICsgMX1gO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFRvb2xCdXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJTaGFwZVwiXG4gICAgICAgICAga2V5PXt2YWx1ZX1cbiAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgIGljb249e2ljb259XG4gICAgICAgICAgY2hlY2tlZD17ZWxlbWVudFR5cGUgPT09IHZhbHVlfVxuICAgICAgICAgIG5hbWU9XCJlZGl0b3ItY3VycmVudC1zaGFwZVwiXG4gICAgICAgICAgdGl0bGU9e2Ake2NhcGl0YWxpemVTdHJpbmcobGFiZWwpfSDigJQgJHtzaG9ydGN1dH1gfVxuICAgICAgICAgIGtleUJpbmRpbmdMYWJlbD17YCR7aW5kZXggKyAxfWB9XG4gICAgICAgICAgYXJpYS1sYWJlbD17Y2FwaXRhbGl6ZVN0cmluZyhsYWJlbCl9XG4gICAgICAgICAgYXJpYS1rZXlzaG9ydGN1dHM9e3Nob3J0Y3V0fVxuICAgICAgICAgIGRhdGEtdGVzdGlkPXt2YWx1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17KHsgcG9pbnRlclR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgc2V0QXBwU3RhdGUoe1xuICAgICAgICAgICAgICBlbGVtZW50VHlwZTogdmFsdWUsXG4gICAgICAgICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoY2FudmFzLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgICAgICAgICBvbkltYWdlQWN0aW9uKHsgcG9pbnRlclR5cGUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfSl9XG4gIDwvPlxuKTtcblxuZXhwb3J0IGNvbnN0IFpvb21BY3Rpb25zID0gKHtcbiAgcmVuZGVyQWN0aW9uLFxuICB6b29tLFxufToge1xuICByZW5kZXJBY3Rpb246IEFjdGlvbk1hbmFnZXJbXCJyZW5kZXJBY3Rpb25cIl07XG4gIHpvb206IFpvb207XG59KSA9PiAoXG4gIDxTdGFjay5Db2wgZ2FwPXsxfT5cbiAgICA8U3RhY2suUm93IGdhcD17MX0gYWxpZ249XCJjZW50ZXJcIj5cbiAgICAgIHtyZW5kZXJBY3Rpb24oXCJ6b29tT3V0XCIpfVxuICAgICAge3JlbmRlckFjdGlvbihcInpvb21JblwiKX1cbiAgICAgIHtyZW5kZXJBY3Rpb24oXCJyZXNldFpvb21cIil9XG4gICAgPC9TdGFjay5Sb3c+XG4gIDwvU3RhY2suQ29sPlxuKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../components/Actions.tsx\n");
1656
1656
 
1657
1657
  /***/ }),
1658
1658
 
@@ -1674,7 +1674,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1674
1674
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1675
1675
 
1676
1676
  "use strict";
1677
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useIsMobile\": () => (/* binding */ useIsMobile),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.dev.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../renderer */ \"../../renderer/index.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Stats */ \"../../components/Stats.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../data/blob */ \"../../data/blob.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! lodash.throttle */ \"../../../node_modules/lodash.throttle/index.js\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_42__);\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst IsMobileContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(false);\r\nconst useIsMobile = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(IsMobileContext);\r\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\r\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\r\nlet didTapTwice = false;\r\nlet tappedTwiceTimer = 0;\r\nlet cursorX = 0;\r\nlet cursorY = 0;\r\nlet isHoldingSpace = false;\r\nlet isPanning = false;\r\nlet isDraggingScrollBar = false;\r\nlet currentScrollBars = { horizontal: null, vertical: null };\r\nlet touchTimeout = 0;\r\nlet invalidateContextMenu = false;\r\nlet lastPointerUp = null;\r\nconst gesture = {\r\n pointers: new Map(),\r\n lastCenter: null,\r\n initialDistance: null,\r\n initialScale: null,\r\n};\r\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\r\n constructor(props) {\r\n var _a;\r\n super(props);\r\n this.canvas = null;\r\n this.rc = null;\r\n this.unmounted = false;\r\n this.isMobile = false;\r\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\r\n this.files = {};\r\n this.imageCache = new Map();\r\n this.focusContainer = () => {\r\n var _a;\r\n if (this.props.autoFocus) {\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\r\n }\r\n };\r\n this.getSceneElementsIncludingDeleted = () => {\r\n return this.scene.getElementsIncludingDeleted();\r\n };\r\n this.getSceneElements = () => {\r\n return this.scene.getElements();\r\n };\r\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((actionResult) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n if (this.unmounted || actionResult === false) {\r\n return;\r\n }\r\n let editingElement = null;\r\n if (actionResult.elements) {\r\n actionResult.elements.forEach((element) => {\r\n var _a;\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\r\n this.state.editingElement !== element &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n editingElement = element;\r\n }\r\n });\r\n this.scene.replaceAllElements(actionResult.elements);\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n }\r\n if (actionResult.files) {\r\n this.files = actionResult.replaceFiles\r\n ? actionResult.files\r\n : Object.assign(Object.assign({}, this.files), actionResult.files);\r\n this.addNewImagesToImageCache();\r\n }\r\n if (actionResult.appState || editingElement) {\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\r\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\r\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\r\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_11__.THEME.LIGHT;\r\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\r\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\r\n viewModeEnabled = this.props.viewModeEnabled;\r\n }\r\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\r\n zenModeEnabled = this.props.zenModeEnabled;\r\n }\r\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\r\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null;\r\n }\r\n if (typeof this.props.theme !== \"undefined\") {\r\n theme = this.props.theme;\r\n }\r\n if (typeof this.props.name !== \"undefined\") {\r\n name = this.props.name;\r\n }\r\n this.setState((state) => {\r\n var _a;\r\n // using Object.assign instead of spread to fool TS 4.2.2+ into\r\n // regarding the resulting type as not containing undefined\r\n // (which the following expression will never contain)\r\n return Object.assign(actionResult.appState || {}, {\r\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\r\n viewModeEnabled,\r\n zenModeEnabled,\r\n gridSize,\r\n theme,\r\n name,\r\n });\r\n }, () => {\r\n if (actionResult.syncHistory) {\r\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\r\n }\r\n });\r\n }\r\n });\r\n // Lifecycle\r\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isHoldingSpace = false;\r\n this.setState({ isBindingEnabled: true });\r\n });\r\n this.onUnload = () => {\r\n this.onBlur();\r\n };\r\n this.disableEvent = (event) => {\r\n event.preventDefault();\r\n };\r\n this.onFontLoaded = () => {\r\n this.scene.getElementsIncludingDeleted().forEach((element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.onSceneUpdated();\r\n };\r\n this.importLibraryFromUrl = (url, token) => __awaiter(this, void 0, void 0, function* () {\r\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary)) {\r\n const hash = new URLSearchParams(window.location.hash.slice(1));\r\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `#${hash.toString()}`);\r\n }\r\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary)) {\r\n const query = new URLSearchParams(window.location.search);\r\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `?${query.toString()}`);\r\n }\r\n try {\r\n const request = yield fetch(decodeURIComponent(url));\r\n const blob = yield request.blob();\r\n const json = JSON.parse(yield blob.text());\r\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_13__.isValidLibrary)(json)) {\r\n throw new Error();\r\n }\r\n if (token === this.id ||\r\n window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.confirmAddLibrary\", { numShapes: json.library.length }))) {\r\n yield this.library.importLibrary(blob);\r\n // hack to rerender the library items after import\r\n if (this.state.isLibraryOpen) {\r\n this.setState({ isLibraryOpen: false });\r\n }\r\n this.setState({ isLibraryOpen: true });\r\n }\r\n }\r\n catch (error) {\r\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.errorLoadingLibrary\"));\r\n console.error(error);\r\n }\r\n finally {\r\n this.focusContainer();\r\n }\r\n });\r\n this.resetHistory = () => {\r\n this.history.clear();\r\n };\r\n /**\r\n * Resets scene & history.\r\n * ! Do not use to clear scene user action !\r\n */\r\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((opts) => {\r\n this.scene.replaceAllElements([]);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\r\n this.resetHistory();\r\n });\r\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\r\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\r\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\r\n if (!launchParams.files.length) {\r\n return;\r\n }\r\n const fileHandle = launchParams.files[0];\r\n const blob = yield fileHandle.getFile();\r\n blob.handle = fileHandle;\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(blob, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n }));\r\n }\r\n if (!this.state.isLoading) {\r\n this.setState({ isLoading: true });\r\n }\r\n let initialData = null;\r\n try {\r\n initialData = (yield this.props.initialData) || null;\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\r\n this.libraryItemsFromStorage = initialData.libraryItems;\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n initialData = {\r\n appState: {\r\n errorMessage: error.message ||\r\n \"Encountered an error during importing or restoring scene data\",\r\n },\r\n };\r\n }\r\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restore)(initialData, null, null);\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), { elementType: scene.appState.elementType === \"image\"\r\n ? \"selection\"\r\n : scene.appState.elementType, isLoading: false });\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\r\n }\r\n this.resetHistory();\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\r\n const libraryUrl = \r\n // current\r\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary) ||\r\n // legacy, kept for compat reasons\r\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n if (libraryUrl) {\r\n yield this.importLibraryFromUrl(libraryUrl);\r\n }\r\n });\r\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n this.scene\r\n .getElementsIncludingDeleted()\r\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element));\r\n this.setState({});\r\n });\r\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\r\n this.setState((state) => {\r\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\r\n return null;\r\n }\r\n return { offsetTop, offsetLeft };\r\n });\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.SCROLL_TIMEOUT);\r\n // Copy/paste\r\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.cutAll();\r\n event.preventDefault();\r\n });\r\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.copyAll();\r\n event.preventDefault();\r\n });\r\n this.cutAll = () => {\r\n this.copyAll();\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected);\r\n };\r\n this.copyAll = () => {\r\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.copyToClipboard)(this.scene.getElements(), this.state, this.files);\r\n };\r\n this.onTapStart = (event) => {\r\n if (!didTapTwice) {\r\n didTapTwice = true;\r\n clearTimeout(tappedTwiceTimer);\r\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_11__.TAP_TWICE_TIMEOUT);\r\n return;\r\n }\r\n // insert text only if we tapped twice with a single finger\r\n // event.touches.length === 1 will also prevent inserting text when user's zooming\r\n if (didTapTwice && event.touches.length === 1) {\r\n const [touch] = event.touches;\r\n // @ts-ignore\r\n this.handleCanvasDoubleClick({\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n });\r\n didTapTwice = false;\r\n clearTimeout(tappedTwiceTimer);\r\n }\r\n event.preventDefault();\r\n if (event.touches.length === 2) {\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n }\r\n };\r\n this.onTapEnd = (event) => {\r\n if (event.touches.length > 0) {\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n }\r\n };\r\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\r\n var _b, _c;\r\n // #686\r\n const target = document.activeElement;\r\n const isExcalidrawActive = (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target);\r\n if (!isExcalidrawActive) {\r\n return;\r\n }\r\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\r\n if (\r\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\r\n // thus these checks don't make sense\r\n event &&\r\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(target))) {\r\n return;\r\n }\r\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event);\r\n let file = (_c = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _c === void 0 ? void 0 : _c.files[0];\r\n if (!file && data.text) {\r\n const string = data.text.trim();\r\n if (string.startsWith(\"<svg\") && string.endsWith(\"</svg>\")) {\r\n // ignore SVG validation/normalization which will be done during image\r\n // initialization\r\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(string);\r\n }\r\n }\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n if (this.props.onPaste) {\r\n try {\r\n if ((yield this.props.onPaste(data, event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n if (data.errorMessage) {\r\n this.setState({ errorMessage: data.errorMessage });\r\n }\r\n else if (data.spreadsheet) {\r\n this.setState({\r\n pasteDialog: {\r\n data: data.spreadsheet,\r\n shown: true,\r\n },\r\n });\r\n }\r\n else if (data.elements) {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: data.elements,\r\n files: data.files || null,\r\n position: \"cursor\",\r\n });\r\n }\r\n else if (data.text) {\r\n this.addTextFromPaste(data.text);\r\n }\r\n this.selectShapeTool(\"selection\");\r\n event === null || event === void 0 ? void 0 : event.preventDefault();\r\n }));\r\n this.addElementsFromPasteOrLibrary = (opts) => {\r\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreElements)(opts.elements, null);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(elements);\r\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minX, maxX) / 2;\r\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minY, maxY) / 2;\r\n const clientX = typeof opts.position === \"object\"\r\n ? opts.position.clientX\r\n : opts.position === \"cursor\"\r\n ? cursorX\r\n : this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = typeof opts.position === \"object\"\r\n ? opts.position.clientY\r\n : opts.position === \"cursor\"\r\n ? cursorY\r\n : this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const dx = x - elementsCenterX;\r\n const dy = y - elementsCenterY;\r\n const groupIdMap = new Map();\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(dx, dy, this.state.gridSize);\r\n const oldIdToDuplicatedId = new Map();\r\n const newElements = elements.map((element) => {\r\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\r\n x: element.x + gridX - minX,\r\n y: element.y + gridY - minY,\r\n });\r\n oldIdToDuplicatedId.set(element.id, newElement.id);\r\n return newElement;\r\n });\r\n const nextElements = [\r\n ...this.scene.getElementsIncludingDeleted(),\r\n ...newElements,\r\n ];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\r\n if (opts.files) {\r\n this.files = Object.assign(Object.assign({}, this.files), opts.files);\r\n }\r\n this.scene.replaceAllElements(nextElements);\r\n this.history.resumeRecording();\r\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: false, selectedElementIds: newElements.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {}), selectedGroupIds: {} }), this.scene.getElements()), () => {\r\n if (opts.files) {\r\n this.addNewImagesToImageCache();\r\n }\r\n });\r\n this.selectShapeTool(\"selection\");\r\n };\r\n // Collaboration\r\n this.setAppState = (obj) => {\r\n this.setState(obj);\r\n };\r\n this.removePointer = (event) => {\r\n // remove touch handler for context menu on touch devices\r\n if (event.pointerType === \"touch\" && touchTimeout) {\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n invalidateContextMenu = false;\r\n }\r\n gesture.pointers.delete(event.pointerId);\r\n };\r\n this.toggleLock = () => {\r\n this.setState((prevState) => {\r\n return {\r\n elementLocked: !prevState.elementLocked,\r\n elementType: prevState.elementLocked\r\n ? \"selection\"\r\n : prevState.elementType,\r\n };\r\n });\r\n };\r\n this.toggleZenMode = () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode);\r\n };\r\n this.toggleStats = () => {\r\n if (!this.state.showStats) {\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_8__.trackEvent)(\"dialog\", \"stats\");\r\n }\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats);\r\n };\r\n this.scrollToContent = (target = this.scene.getElements()) => {\r\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\r\n };\r\n this.zoomToFit = (target = this.scene.getElements(), maxZoom = 1, //null will zoom to max based on viewport\r\n margin = 0.03) => {\r\n if (!target) {\r\n target = this.scene.getElements();\r\n }\r\n if (target.length === 0) {\r\n maxZoom = 1;\r\n }\r\n this.setState((0,_actions__WEBPACK_IMPORTED_MODULE_4__.zoomToFitElements)(target, this.state, false, maxZoom, margin).appState);\r\n };\r\n this.clearToast = () => {\r\n this.setState({ toastMessage: null });\r\n };\r\n this.setToastMessage = (toastMessage) => {\r\n this.setState({ toastMessage });\r\n };\r\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const webShareTargetCache = yield caches.open(\"web-share-target\");\r\n const file = yield webShareTargetCache.match(\"shared-file\");\r\n if (file) {\r\n const blob = yield file.blob();\r\n this.loadFileToCanvas(blob);\r\n yield webShareTargetCache.delete(\"shared-file\");\r\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, window.location.pathname);\r\n }\r\n }\r\n catch (error) {\r\n this.setState({ errorMessage: error.message });\r\n }\r\n });\r\n /** adds supplied files to existing files in the appState */\r\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((files) => {\r\n const filesMap = files.reduce((acc, fileData) => {\r\n acc.set(fileData.id, fileData);\r\n return acc;\r\n }, new Map());\r\n this.files = Object.assign(Object.assign({}, this.files), Object.fromEntries(filesMap));\r\n this.addNewImagesToImageCache();\r\n // bump versions for elements that reference added files so that\r\n // we/host apps can detect the change\r\n this.scene.getElements().forEach((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\r\n filesMap.has(element.fileId)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.bumpVersion)(element);\r\n }\r\n });\r\n this.scene.informMutation();\r\n });\r\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((sceneData) => {\r\n if (sceneData.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n if (sceneData.appState) {\r\n this.setState(sceneData.appState);\r\n }\r\n if (sceneData.elements) {\r\n this.scene.replaceAllElements(sceneData.elements);\r\n }\r\n if (sceneData.collaborators) {\r\n this.setState({ collaborators: sceneData.collaborators });\r\n }\r\n });\r\n this.onSceneUpdated = () => {\r\n this.setState({});\r\n };\r\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n cursorX = event.clientX;\r\n cursorY = event.clientY;\r\n });\r\n // Input handling\r\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // normalize `event.key` when CapsLock is pressed #2372\r\n if (\"Proxy\" in window &&\r\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\r\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\r\n event = new Proxy(event, {\r\n get(ev, prop) {\r\n const value = ev[prop];\r\n if (typeof value === \"function\") {\r\n // fix for Proxies hijacking `this`\r\n return value.bind(ev);\r\n }\r\n return prop === \"key\"\r\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\r\n // it back\r\n event.shiftKey\r\n ? ev.key.toUpperCase()\r\n : ev.key.toLowerCase()\r\n : value;\r\n },\r\n });\r\n }\r\n if (((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ESCAPE) ||\r\n // case: using arrows to move between buttons\r\n ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isInputLike)(event.target))) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.QUESTION_MARK) {\r\n this.setState({\r\n showHelpDialog: true,\r\n });\r\n }\r\n if (this.actionManager.handleKeyDown(event)) {\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: false });\r\n }\r\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.ZERO) {\r\n this.setState({ isLibraryOpen: !this.state.isLibraryOpen });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const step = (this.state.gridSize &&\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT\r\n : this.state.gridSize)) ||\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT);\r\n const selectedElements = this.scene\r\n .getElements()\r\n .filter((element) => this.state.selectedElementIds[element.id]);\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_LEFT) {\r\n offsetX = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_RIGHT) {\r\n offsetX = step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_UP) {\r\n offsetY = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_DOWN) {\r\n offsetY = step;\r\n }\r\n selectedElements.forEach((element) => {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n x: element.x + offsetX,\r\n y: element.y + offsetY,\r\n });\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element, {\r\n simultaneouslyUpdated: selectedElements,\r\n });\r\n });\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n event.preventDefault();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ENTER) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n }\r\n else if (selectedElements.length === 1 &&\r\n !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n const selectedElement = selectedElements[0];\r\n this.startTextEditing({\r\n sceneX: selectedElement.x + selectedElement.width / 2,\r\n sceneY: selectedElement.y + selectedElement.height / 2,\r\n });\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n else if (!event.ctrlKey &&\r\n !event.altKey &&\r\n !event.metaKey &&\r\n this.state.draggingElement === null) {\r\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_33__.findShapeByKey)(event.key);\r\n if (shape) {\r\n this.selectShapeTool(shape);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.Q) {\r\n this.toggleLock();\r\n }\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE && gesture.pointers.size === 0) {\r\n isHoldingSpace = true;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (this.state.elementType === \"selection\" &&\r\n !selectedElements.length) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G &&\r\n ((0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(this.state.elementType) ||\r\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(element.type)))) {\r\n this.setState({ openPopup: \"backgroundColorPicker\" });\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n this.setState({ openPopup: \"strokeColorPicker\" });\r\n }\r\n }\r\n });\r\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (this.state.elementType === \"selection\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n isHoldingSpace = false;\r\n }\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: true });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements)(selectedElements)\r\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)(selectedElements);\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n });\r\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n gesture.initialScale = this.state.zoom.value;\r\n });\r\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n // onGestureChange only has zoom factor but not the center.\r\n // If we're on iPad or iPhone, then we recognize multi-touch and will\r\n // zoom in at the right location on the touchMove handler already.\r\n // On Macbook, we don't have those events so will zoom in at the\r\n // current location instead.\r\n if (gesture.pointers.size === 2) {\r\n return;\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (initialScale) {\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * event.scale), zoom, { left: offsetLeft, top: offsetTop }, { x: cursorX, y: cursorY }),\r\n }));\r\n }\r\n });\r\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n gesture.initialScale = null;\r\n });\r\n this.startTextEditing = ({ sceneX, sceneY, insertAtParentCenter = true, }) => {\r\n const existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\r\n const parentCenterPosition = insertAtParentCenter &&\r\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n const element = existingTextElement\r\n ? existingTextElement\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x: parentCenterPosition\r\n ? parentCenterPosition.elementCenterX\r\n : sceneX,\r\n y: parentCenterPosition\r\n ? parentCenterPosition.elementCenterY\r\n : sceneY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text: \"\",\r\n rawText: \"\",\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: parentCenterPosition\r\n ? \"center\"\r\n : this.state.currentItemTextAlign,\r\n verticalAlign: parentCenterPosition\r\n ? \"middle\"\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.setState({ editingElement: element });\r\n if (existingTextElement) {\r\n // if text element is no longer centered to a container, reset\r\n // verticalAlign to default because it's currently internal-only\r\n if (!parentCenterPosition || element.textAlign !== \"center\") {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, { verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN });\r\n }\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n // case: creating new text not centered to parent elemenent → offset Y\r\n // so that the text is centered to cursor position\r\n if (!parentCenterPosition) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n y: element.y - element.baseline / 2,\r\n });\r\n }\r\n }\r\n this.setState({\r\n editingElement: element,\r\n });\r\n this.handleTextWysiwyg(element, {\r\n isExistingElement: !!existingTextElement,\r\n });\r\n };\r\n this.handleCanvasDoubleClick = (event) => {\r\n // case: double-clicking with arrow/line tool selected would both create\r\n // text and enter multiElement mode\r\n if (this.state.multiElement) {\r\n return;\r\n }\r\n // we should only be able to double click when mode is selection\r\n if (this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n return;\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIds)(this.state);\r\n if (selectedGroupIds.length > 0) {\r\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\r\n const selectedGroupId = hitElement &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\r\n if (selectedGroupId) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getElements()));\r\n return;\r\n }\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n }\r\n };\r\n this.handleCanvasPointerMove = (event) => {\r\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\r\n if (gesture.pointers.has(event.pointerId)) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (gesture.pointers.size === 2 &&\r\n gesture.lastCenter &&\r\n initialScale &&\r\n gesture.initialDistance) {\r\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n const deltaX = center.x - gesture.lastCenter.x;\r\n const deltaY = center.y - gesture.lastCenter.y;\r\n gesture.lastCenter = center;\r\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n const scaleFactor = distance / gesture.initialDistance;\r\n this.setState(({ zoom, scrollX, scrollY, offsetLeft, offsetTop }) => ({\r\n scrollX: scrollX + deltaX / zoom.value,\r\n scrollY: scrollY + deltaY / zoom.value,\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * scaleFactor), zoom, { left: offsetLeft, top: offsetTop }, center),\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n }\r\n else {\r\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\r\n }\r\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\r\n return;\r\n }\r\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\r\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\r\n if (!this.state.draggingElement && !this.state.multiElement) {\r\n if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\r\n if (this.state.editingLinearElement &&\r\n !this.state.editingLinearElement.isDragging) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({ editingLinearElement });\r\n }\r\n if (editingLinearElement.lastUncommittedPoint != null) {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n else {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElementType)(this.state.elementType)) {\r\n // Hovering with a selected tool or creating new linear element via click\r\n // and point\r\n const { draggingElement } = this.state;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", scenePointer, this.state.startBoundElement);\r\n }\r\n else {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n }\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n const { x: rx, y: ry } = multiElement;\r\n const { points, lastCommittedPoint } = multiElement;\r\n const lastPoint = points[points.length - 1];\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n if (lastPoint === lastCommittedPoint) {\r\n // if we haven't yet created a temp point and we're beyond commit-zone\r\n // threshold, add a point\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\r\n });\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n // in this branch, we're inside the commit zone, and no uncommitted\r\n // point exists. Thus do nothing (don't add/remove points).\r\n }\r\n }\r\n else if (points.length > 2 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: points.slice(0, -1),\r\n });\r\n }\r\n else {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(points, this.state.zoom.value)) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n // update last uncommitted point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [\r\n ...points.slice(0, -1),\r\n [scenePointerX - rx, scenePointerY - ry],\r\n ],\r\n });\r\n }\r\n return;\r\n }\r\n const hasDeselectedButton = Boolean(event.buttons);\r\n if (hasDeselectedButton ||\r\n (this.state.elementType !== \"selection\" &&\r\n this.state.elementType !== \"text\")) {\r\n return;\r\n }\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 &&\r\n !isOverScrollBar &&\r\n !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType &&\r\n elementWithTransformHandleType.transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)(elementWithTransformHandleType));\r\n return;\r\n }\r\n }\r\n else if (selectedElements.length > 1 && !isOverScrollBar) {\r\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType,\r\n }));\r\n return;\r\n }\r\n }\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n if (this.state.elementType === \"text\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n }\r\n else if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n else if (\r\n // if using cmd/ctrl, we're not dragging\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] &&\r\n (hitElement ||\r\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n };\r\n // set touch moving for mobile context menu\r\n this.handleTouchMove = (event) => {\r\n invalidateContextMenu = true;\r\n };\r\n this.handleCanvasPointerDown = (event) => {\r\n // remove any active selection when we start to interact with canvas\r\n // (mainly, we care about removing selection outside the component which\r\n // would prevent our copy handling otherwise)\r\n const selection = document.getSelection();\r\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\r\n selection.removeAllRanges();\r\n }\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\r\n this.maybeCleanupAfterMissingPointerUp(event);\r\n if (isPanning) {\r\n return;\r\n }\r\n this.setState({\r\n lastPointerDownWith: event.pointerType,\r\n cursorButton: \"down\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"down\");\r\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\r\n return;\r\n }\r\n // only handle left mouse button or touch\r\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN &&\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.TOUCH) {\r\n return;\r\n }\r\n this.updateGestureOnPointerDown(event);\r\n // don't select while panning\r\n if (gesture.pointers.size > 1) {\r\n return;\r\n }\r\n // State for the duration of a pointer interaction, which starts with a\r\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\r\n const pointerDownState = this.initialPointerDownState(event);\r\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\r\n return;\r\n }\r\n this.clearSelectionIfNotUsingSelection();\r\n this.updateBindingEnabledOnPointerMove(event);\r\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\r\n return;\r\n }\r\n if (this.state.elementType === \"text\") {\r\n this.handleTextOnPointerDown(event, pointerDownState);\r\n return;\r\n }\r\n else if (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\") {\r\n this.handleLinearElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType === \"image\") {\r\n // reset image preview on pointerdown\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n if (!this.state.pendingImageElement) {\r\n return;\r\n }\r\n this.setState({\r\n draggingElement: this.state.pendingImageElement,\r\n editingElement: this.state.pendingImageElement,\r\n pendingImageElement: null,\r\n multiElement: null,\r\n });\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(this.state.pendingImageElement, {\r\n x,\r\n y,\r\n });\r\n }\r\n else if (this.state.elementType === \"freedraw\") {\r\n this.handleFreeDrawElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else {\r\n this.createGenericElementOnPointerDown(this.state.elementType, pointerDownState);\r\n }\r\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\r\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\r\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\r\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\r\n lastPointerUp = onPointerUp;\r\n if (!this.state.viewModeEnabled) {\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, onKeyDown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, onKeyUp);\r\n pointerDownState.eventListeners.onMove = onPointerMove;\r\n pointerDownState.eventListeners.onUp = onPointerUp;\r\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\r\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\r\n }\r\n };\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\r\n // deal with opening context menu on touch devices\r\n if (event.pointerType === \"touch\") {\r\n invalidateContextMenu = false;\r\n if (touchTimeout) {\r\n // If there's already a touchTimeout, this means that there's another\r\n // touch down and we are doing another touch, so we shouldn't open the\r\n // context menu.\r\n invalidateContextMenu = true;\r\n }\r\n else {\r\n // open the context menu with the first touch's clientX and clientY\r\n // if the touch is not moving\r\n touchTimeout = window.setTimeout(() => {\r\n touchTimeout = 0;\r\n if (!invalidateContextMenu) {\r\n this.handleCanvasContextMenu(event);\r\n }\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.TOUCH_CTX_MENU_TIMEOUT);\r\n }\r\n }\r\n };\r\n // Returns whether the event is a panning\r\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\r\n if (!(gesture.pointers.size === 0 &&\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.WHEEL ||\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\r\n this.state.viewModeEnabled))) {\r\n return false;\r\n }\r\n isPanning = true;\r\n let nextPastePrevented = false;\r\n const isLinux = /Linux/.test(window.navigator.platform);\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n let { clientX: lastX, clientY: lastY } = event;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n const deltaX = lastX - event.clientX;\r\n const deltaY = lastY - event.clientY;\r\n lastX = event.clientX;\r\n lastY = event.clientY;\r\n /*\r\n * Prevent paste event if we move while middle clicking on Linux.\r\n * See issue #1383.\r\n */\r\n if (isLinux &&\r\n !nextPastePrevented &&\r\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\r\n nextPastePrevented = true;\r\n /* Prevent the next paste event */\r\n const preventNextPaste = (event) => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n event.stopPropagation();\r\n };\r\n /*\r\n * Reenable next paste in case of disabled middle click paste for\r\n * any reason:\r\n * - rigth click paste\r\n * - empty clipboard\r\n */\r\n const enableNextPaste = () => {\r\n setTimeout(() => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }, 100);\r\n };\r\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }\r\n this.setState({\r\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\r\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\r\n });\r\n });\r\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((lastPointerUp = () => {\r\n lastPointerUp = null;\r\n isPanning = false;\r\n if (!isHoldingSpace) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n }));\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove, {\r\n passive: true,\r\n });\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n return true;\r\n };\r\n this.clearSelectionIfNotUsingSelection = () => {\r\n if (this.state.elementType !== \"selection\") {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n };\r\n /**\r\n * @returns whether the pointer event has been completely handled\r\n */\r\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType != null) {\r\n this.setState({\r\n resizingElement: elementWithTransformHandleType.element,\r\n });\r\n pointerDownState.resize.handleType =\r\n elementWithTransformHandleType.transformHandleType;\r\n }\r\n }\r\n else if (selectedElements.length > 1) {\r\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n }\r\n if (pointerDownState.resize.handleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType: pointerDownState.resize.handleType,\r\n }));\r\n pointerDownState.resize.isResizing = true;\r\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0]) &&\r\n selectedElements[0].points.length === 2) {\r\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\r\n }\r\n }\r\n else {\r\n if (this.state.editingLinearElement) {\r\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\r\n if (ret.hitElement) {\r\n pointerDownState.hit.element = ret.hitElement;\r\n }\r\n if (ret.didAddPoint) {\r\n return true;\r\n }\r\n }\r\n // hitElement may already be set above, so check first\r\n pointerDownState.hit.element =\r\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n // For overlapped elements one position may hit\r\n // multiple elements\r\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n const hitElement = pointerDownState.hit.element;\r\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hitElement === null || !someHitElementIsSelected) &&\r\n !event.shiftKey &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.clearSelection(hitElement);\r\n }\r\n // If we click on something\r\n if (hitElement != null) {\r\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\r\n // mark as not completely handled so as to allow dragging etc.\r\n return false;\r\n }\r\n // deselect if item is selected\r\n // if shift is not clicked, this will always return true\r\n // otherwise, it will trigger selection based on current\r\n // state of the box\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n // if we are currently editing a group, exiting editing mode and deselect the group.\r\n if (this.state.editingGroupId &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n // Add hit element to selection. At this point if we're not holding\r\n // SHIFT the previously selected element(s) were deselected above\r\n // (make sure you use setState updater to use latest state)\r\n if (!someHitElementIsSelected &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.setState((prevState) => {\r\n return (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }) }), this.scene.getElements());\r\n });\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n }\r\n }\r\n this.setState({\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n }\r\n return false;\r\n };\r\n this.handleTextOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n // if we're currently still editing text, clicking outside\r\n // should only finalize it, not create another (irrespective\r\n // of state.elementLocked)\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.type) === \"text\") {\r\n return;\r\n }\r\n this.startTextEditing({\r\n sceneX: pointerDownState.origin.x,\r\n sceneY: pointerDownState.origin.y,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!this.state.elementLocked) {\r\n this.setState({\r\n elementType: \"selection\",\r\n });\r\n }\r\n };\r\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n // Begin a mark capture. This does not have to update state yet.\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\r\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.newFreeDrawElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n simulatePressure: event.pressure === 0.5,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n const pressures = element.simulatePressure\r\n ? element.pressures\r\n : [...element.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [[0, 0]],\r\n pressures,\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n };\r\n this.createImageElement = ({ sceneX, sceneY, }) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(sceneX, sceneY, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newImageElement)({\r\n type: \"image\",\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n });\r\n return element;\r\n };\r\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n // finalize if completing a loop\r\n if (multiElement.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\r\n // clicking inside commit zone → finalize arrow\r\n if (multiElement.points.length > 1 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\r\n }));\r\n // clicking outside commit zone → update reference for last committed\r\n // point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\r\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\r\n an arrow, we want it to be null for both. Otherwise, we want it to use the\r\n values from appState. */\r\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\r\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\r\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\r\n : [null, null];\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newLinearElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n startArrowhead,\r\n endArrowhead,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [...element.points, [0, 0]],\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n };\r\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n });\r\n if (element.type === \"selection\") {\r\n this.setState({\r\n selectionElement: element,\r\n draggingElement: element,\r\n });\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n multiElement: null,\r\n draggingElement: element,\r\n editingElement: element,\r\n });\r\n }\r\n };\r\n this.initializeImage = ({ imageFile, imageElement: _imageElement, showCursorImagePreview = false, }) => __awaiter(this, void 0, void 0, function* () {\r\n var _d, _e, _f, _g;\r\n // at this point this should be guaranteed image file, but we do this check\r\n // to satisfy TS down the line\r\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(imageFile)) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.unsupportedFileType\"));\r\n }\r\n const mimeType = imageFile.type;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, \"wait\");\r\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.normalizeSVG)(yield imageFile.text()), imageFile.name);\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.svgImageInsertError\"));\r\n }\r\n }\r\n // generate image id (by default the file digest) before any\r\n // resizing/compression takes place to keep it more portable\r\n const fileId = yield (((_e = (_d = this.props).generateIdForFile) === null || _e === void 0 ? void 0 : _e.call(_d, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.generateIdFromFile)(imageFile));\r\n if (!fileId) {\r\n console.warn(\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\");\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"));\r\n }\r\n const existingFileData = this.files[fileId];\r\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\r\n try {\r\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT);\r\n }\r\n catch (error) {\r\n console.error(\"error trying to resing image file on insertion\", error);\r\n }\r\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.fileTooBig\", {\r\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\r\n }));\r\n }\r\n }\r\n if (showCursorImagePreview) {\r\n const dataURL = (_f = this.files[fileId]) === null || _f === void 0 ? void 0 : _f.dataURL;\r\n // optimization so that we don't unnecessarily resize the original\r\n // full-size file for cursor preview\r\n // (it's much faster to convert the resized dataURL to File)\r\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.dataURLToFile)(dataURL);\r\n this.setImagePreviewCursor(resizedFile || imageFile);\r\n }\r\n const dataURL = ((_g = this.files[fileId]) === null || _g === void 0 ? void 0 : _g.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imageFile));\r\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(_imageElement, {\r\n fileId,\r\n }, false);\r\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\r\n var _h, _j;\r\n try {\r\n this.files = Object.assign(Object.assign({}, this.files), { [fileId]: {\r\n mimeType,\r\n id: fileId,\r\n dataURL,\r\n created: Date.now(),\r\n } });\r\n const cachedImageData = this.imageCache.get(fileId);\r\n if (!cachedImageData) {\r\n this.addNewImagesToImageCache();\r\n yield this.updateImageCache([imageElement]);\r\n }\r\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\r\n yield cachedImageData.image;\r\n }\r\n if (((_h = this.state.pendingImageElement) === null || _h === void 0 ? void 0 : _h.id) !== imageElement.id &&\r\n ((_j = this.state.draggingElement) === null || _j === void 0 ? void 0 : _j.id) !== imageElement.id) {\r\n this.initializeImageDimensions(imageElement, true);\r\n }\r\n resolve(imageElement);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\")));\r\n }\r\n finally {\r\n if (!showCursorImagePreview) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n }\r\n }));\r\n });\r\n /**\r\n * inserts image into elements array and rerenders\r\n */\r\n this.insertImageElement = (imageElement, imageFile, showCursorImagePreview) => __awaiter(this, void 0, void 0, function* () {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n imageElement,\r\n ]);\r\n try {\r\n yield this.initializeImage({\r\n imageFile,\r\n imageElement,\r\n showCursorImagePreview,\r\n });\r\n }\r\n catch (error) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n isDeleted: true,\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n this.setState({\r\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"),\r\n });\r\n }\r\n });\r\n this.setImagePreviewCursor = (imageFile) => __awaiter(this, void 0, void 0, function* () {\r\n // mustn't be larger than 128 px\r\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\r\n const cursorImageSizePx = 96;\r\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, cursorImageSizePx);\r\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imagePreview);\r\n // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\r\n // a small canvas\r\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.loadHTMLImageElement)(previewDataURL);\r\n let height = Math.min(img.height, cursorImageSizePx);\r\n let width = height * (img.width / img.height);\r\n if (width > cursorImageSizePx) {\r\n width = cursorImageSizePx;\r\n height = width * (img.height / img.width);\r\n }\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.height = height;\r\n canvas.width = width;\r\n const context = canvas.getContext(\"2d\");\r\n context.drawImage(img, 0, 0, width, height);\r\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg);\r\n }\r\n if (this.state.pendingImageElement) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, `url(${previewDataURL}) 4 4, auto`);\r\n }\r\n });\r\n this.onImageAction = ({ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }) => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const clientX = this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.fileOpen)({\r\n description: \"Image\",\r\n extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\r\n });\r\n const imageElement = this.createImageElement({\r\n sceneX: x,\r\n sceneY: y,\r\n });\r\n if (insertOnCanvasDirectly) {\r\n this.insertImageElement(imageElement, imageFile);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({\r\n selectedElementIds: { [imageElement.id]: true },\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n else {\r\n this.setState({\r\n pendingImageElement: imageElement,\r\n }, () => {\r\n this.insertImageElement(imageElement, imageFile, \r\n /* showCursorImagePreview */ true);\r\n });\r\n }\r\n }\r\n catch (error) {\r\n if (error.name !== \"AbortError\") {\r\n console.error(error);\r\n }\r\n this.setState({\r\n pendingImageElement: null,\r\n editingElement: null,\r\n elementType: \"selection\",\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n });\r\n this.initializeImageDimensions = (imageElement, forceNaturalSize = false) => {\r\n var _a;\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(imageElement) &&\r\n ((_a = this.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n if (!image || image instanceof Promise) {\r\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value) {\r\n const placeholderSize = 100 / this.state.zoom.value;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n x: imageElement.x - placeholderSize / 2,\r\n y: imageElement.y - placeholderSize / 2,\r\n width: placeholderSize,\r\n height: placeholderSize,\r\n });\r\n }\r\n return;\r\n }\r\n if (forceNaturalSize ||\r\n // if user-created bounding box is below threshold, assume the\r\n // intention was to click instead of drag, and use the image's\r\n // intrinsic size\r\n (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value)) {\r\n const minHeight = Math.max(this.state.height - 120, 160);\r\n // max 65% of canvas height, clamped to <300px, vh - 120px>\r\n const maxHeight = Math.min(minHeight, Math.floor(this.state.height * 0.5) / this.state.zoom.value);\r\n const height = Math.min(image.naturalHeight, maxHeight);\r\n const width = height * (image.naturalWidth / image.naturalHeight);\r\n // add current imageElement width/height to account for previous centering\r\n // of the placholder image\r\n const x = imageElement.x + imageElement.width / 2 - width / 2;\r\n const y = imageElement.y + imageElement.height / 2 - height / 2;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, { x, y, width, height });\r\n }\r\n };\r\n /** updates image cache, refreshing updated elements and/or setting status\r\n to error for images that fail during <img> element creation */\r\n this.updateImageCache = (elements, files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.updateImageCache)({\r\n imageCache: this.imageCache,\r\n fileIds: elements.map((element) => element.fileId),\r\n files,\r\n });\r\n if (updatedFiles.size || erroredFiles.size) {\r\n for (const element of elements) {\r\n if (updatedFiles.has(element.fileId)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n if (erroredFiles.has(element.fileId)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, { status: \"error\" }, \r\n /* informMutation */ false);\r\n }\r\n }\r\n }\r\n return { updatedFiles, erroredFiles };\r\n });\r\n /** adds new images to imageCache and re-renders if needed */\r\n this.addNewImagesToImageCache = (imageElements = (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.getInitializedImageElements)(this.scene.getElements()), files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const uncachedImageElements = imageElements.filter((element) => !element.isDeleted && !this.imageCache.has(element.fileId));\r\n if (uncachedImageElements.length) {\r\n const { updatedFiles } = yield this.updateImageCache(uncachedImageElements, files);\r\n if (updatedFiles.size) {\r\n this.scene.informMutation();\r\n }\r\n }\r\n });\r\n /** generally you should use `addNewImagesToImageCache()` directly if you need\r\n * to render new images. This is just a failsafe */\r\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default()(() => {\r\n this.addNewImagesToImageCache();\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.IMAGE_RENDER_TIMEOUT);\r\n this.updateBindingEnabledOnPointerMove = (event) => {\r\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.shouldEnableBindingForPointerEvent)(event);\r\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\r\n this.setState({ isBindingEnabled: shouldEnableBinding });\r\n }\r\n };\r\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\r\n });\r\n };\r\n this.maybeSuggestBindingForLinearElementAtCursor = (linearElement, startOrEnd, pointerCoords, \r\n // During line creation the start binding hasn't been written yet\r\n // into `linearElement`\r\n oppositeBindingBoundElement) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null &&\r\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)\r\n ? [hoveredBindableElement]\r\n : [],\r\n });\r\n };\r\n this.handleCanvasRef = (canvas) => {\r\n var _a, _b, _c;\r\n // canvas is null when unmounting\r\n if (canvas !== null) {\r\n this.canvas = canvas;\r\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__.default.canvas(this.canvas);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel, {\r\n passive: false,\r\n });\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n else {\r\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel);\r\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n };\r\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\r\n var _k, _l;\r\n try {\r\n if (this.props.onDrop) {\r\n try {\r\n if ((yield this.props.onDrop(event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n const file = event.dataTransfer.files[0];\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\r\n // first attempt to decode scene from the image if it's embedded\r\n // ---------------------------------------------------------------------\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted());\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n return;\r\n }\r\n catch (error) {\r\n if (error.name !== \"EncodingError\") {\r\n throw error;\r\n }\r\n }\r\n }\r\n // if no scene is embedded or we fail for whatever reason, fall back\r\n // to importing as regular image\r\n // ---------------------------------------------------------------------\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n return this.setState({\r\n isLoading: false,\r\n errorMessage: error.message,\r\n });\r\n }\r\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib);\r\n if (libraryShapes !== \"\") {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: JSON.parse(libraryShapes),\r\n position: event,\r\n files: null,\r\n });\r\n return;\r\n }\r\n const file = (_k = event.dataTransfer) === null || _k === void 0 ? void 0 : _k.files[0];\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib ||\r\n ((_l = file === null || file === void 0 ? void 0 : file.name) === null || _l === void 0 ? void 0 : _l.endsWith(\".excalidrawlib\"))) {\r\n this.library\r\n .importLibrary(file)\r\n .then(() => {\r\n // Close and then open to get the libraries updated\r\n this.setState({ isLibraryOpen: false });\r\n this.setState({ isLibraryOpen: true });\r\n })\r\n .catch((error) => this.setState({ isLoading: false, errorMessage: error.message }));\r\n // default: assume an Excalidraw file regardless of extension/MimeType\r\n }\r\n else {\r\n this.setState({ isLoading: true });\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n yield this.loadFileToCanvas(file);\r\n }\r\n });\r\n this.loadFileToCanvas = (file) => {\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n };\r\n this.handleCanvasContextMenu = (event) => {\r\n event.preventDefault();\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const element = this.getElementAtPosition(x, y, { preferSelected: true });\r\n const type = element ? \"element\" : \"canvas\";\r\n const container = this.excalidrawContainerRef.current;\r\n const { top: offsetTop, left: offsetLeft, } = container.getBoundingClientRect();\r\n const left = event.clientX - offsetLeft;\r\n const top = event.clientY - offsetTop;\r\n if (element && !this.state.selectedElementIds[element.id]) {\r\n this.setState({ selectedElementIds: { [element.id]: true } }, () => {\r\n this._openContextMenu({ top, left }, type);\r\n });\r\n }\r\n else {\r\n this._openContextMenu({ top, left }, type);\r\n }\r\n };\r\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\r\n var _a;\r\n const draggingElement = this.state.draggingElement;\r\n const pointerCoords = pointerDownState.lastCoords;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"selection\") {\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event));\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(draggingElement) &&\r\n ((_a = this.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n const aspectRatio = image && !(image instanceof Promise)\r\n ? image.width / image.height\r\n : null;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), aspectRatio);\r\n this.maybeSuggestBindingForAll([draggingElement]);\r\n }\r\n };\r\n this.maybeHandleResize = (pointerDownState, event) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const transformHandleType = pointerDownState.resize.handleType;\r\n this.setState({\r\n // TODO: rename this state field to \"isScaling\" to distinguish\r\n // it from the generic \"isResizing\" which includes scaling and\r\n // rotating\r\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\r\n isRotating: transformHandleType === \"rotation\",\r\n });\r\n const pointerCoords = pointerDownState.lastCoords;\r\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(selectedElements[0])\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n return true;\r\n }\r\n return false;\r\n };\r\n /** @private use this.handleCanvasContextMenu */\r\n this._openContextMenu = ({ left, top, }, type) => {\r\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const separator = \"separator\";\r\n const elements = this.scene.getElements();\r\n const options = [];\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng);\r\n }\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg);\r\n }\r\n if (type === \"canvas\") {\r\n const viewModeOptions = [\r\n ...options,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ];\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: viewModeOptions,\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: [\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && navigator.clipboard && separator,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg,\r\n ((_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) ||\r\n (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0)) &&\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSelectAll,\r\n separator,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n }\r\n else if (type === \"element\") {\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy, ...options],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: [\r\n this.isMobile && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCut,\r\n this.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy,\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && separator,\r\n ...options,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyStyles,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionPasteStyles,\r\n separator,\r\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup,\r\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup,\r\n (maybeGroupAction || maybeUngroupAction) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionAddToLibrary,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendBackward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringForward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendToBack,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringToFront,\r\n separator,\r\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal,\r\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical,\r\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDuplicateSelection,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n }\r\n };\r\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n if (isPanning) {\r\n return;\r\n }\r\n const { deltaX, deltaY } = event;\r\n const { selectedElementIds, previousSelectedElementIds } = this.state;\r\n // note that event.ctrlKey is necessary to handle pinch zooming\r\n if (event.metaKey || event.ctrlKey) {\r\n const sign = Math.sign(deltaY);\r\n const MAX_STEP = 10;\r\n let delta = Math.abs(deltaY);\r\n if (delta > MAX_STEP) {\r\n delta = MAX_STEP;\r\n }\r\n delta *= sign;\r\n if (Object.keys(previousSelectedElementIds).length !== 0) {\r\n setTimeout(() => {\r\n this.setState({\r\n selectedElementIds: previousSelectedElementIds,\r\n previousSelectedElementIds: {},\r\n });\r\n }, 1000);\r\n }\r\n let newZoom = this.state.zoom.value - delta / 100;\r\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\r\n newZoom += Math.log10(Math.max(1, this.state.zoom.value)) * -sign;\r\n // round to nearest step\r\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100);\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(newZoom), zoom, { left: offsetLeft, top: offsetTop }, {\r\n x: cursorX,\r\n y: cursorY,\r\n }),\r\n selectedElementIds: {},\r\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0\r\n ? selectedElementIds\r\n : previousSelectedElementIds,\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n return;\r\n }\r\n // scroll horizontally when shift pressed\r\n if (event.shiftKey) {\r\n this.setState(({ zoom, scrollX }) => ({\r\n // on Mac, shift+wheel tends to result in deltaX\r\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\r\n }));\r\n return;\r\n }\r\n this.setState(({ zoom, scrollX, scrollY }) => ({\r\n scrollX: scrollX - deltaX / zoom.value,\r\n scrollY: scrollY - deltaY / zoom.value,\r\n }));\r\n });\r\n this.savePointer = (x, y, button) => {\r\n var _a, _b;\r\n if (!x || !y) {\r\n return;\r\n }\r\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\r\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\r\n // sometimes the pointer goes off screen\r\n }\r\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\r\n pointer,\r\n button,\r\n pointersMap: gesture.pointers,\r\n });\r\n };\r\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n if (!this.unmounted) {\r\n this.setState({ shouldCacheIgnoreZoom: false });\r\n }\r\n }, 300);\r\n this.updateDOMRect = (cb) => {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\r\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\r\n if (width === currentWidth &&\r\n height === currentHeight &&\r\n offsetLeft === currentOffsetLeft &&\r\n offsetTop === currentOffsetTop) {\r\n if (cb) {\r\n cb();\r\n }\r\n return;\r\n }\r\n this.setState({\r\n width,\r\n height,\r\n offsetLeft,\r\n offsetTop,\r\n }, () => {\r\n cb && cb();\r\n });\r\n }\r\n };\r\n this.refresh = () => {\r\n this.setState(Object.assign({}, this.getCanvasOffsets()));\r\n };\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)();\r\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\r\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\r\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight });\r\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_44__.nanoid)();\r\n if (excalidrawRef) {\r\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resolvablePromise)();\r\n const api = {\r\n ready: true,\r\n readyPromise,\r\n updateScene: this.updateScene,\r\n addFiles: this.addFiles,\r\n resetScene: this.resetScene,\r\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\r\n history: {\r\n clear: this.resetHistory,\r\n },\r\n scrollToContent: this.scrollToContent,\r\n zoomToFit: this.zoomToFit,\r\n getSceneElements: this.getSceneElements,\r\n getAppState: () => this.state,\r\n getFiles: () => this.files,\r\n refresh: this.refresh,\r\n importLibrary: this.importLibraryFromUrl,\r\n setToastMessage: this.setToastMessage,\r\n id: this.id,\r\n };\r\n if (typeof excalidrawRef === \"function\") {\r\n excalidrawRef(api);\r\n }\r\n else {\r\n excalidrawRef.current = api;\r\n }\r\n readyPromise.resolve(api);\r\n }\r\n this.excalidrawContainerValue = {\r\n container: this.excalidrawContainerRef.current,\r\n id: this.id,\r\n };\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__.default();\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__.default(this);\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__.default();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_6__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_7__.actions);\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createUndoAction)(this.history));\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createRedoAction)(this.history));\r\n }\r\n renderCanvas() {\r\n const canvasScale = window.devicePixelRatio;\r\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\r\n const canvasWidth = canvasDOMWidth * canvasScale;\r\n const canvasHeight = canvasDOMHeight * canvasScale;\r\n if (viewModeEnabled) {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n cursor: _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n render() {\r\n var _a, _b;\r\n const { zenModeEnabled, viewModeEnabled } = this.state;\r\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__.default)(\"excalidraw excalidraw-container\", {\r\n \"excalidraw--view-mode\": viewModeEnabled,\r\n \"excalidraw--mobile\": this.isMobile,\r\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(IsMobileContext.Provider, Object.assign({ value: this.isMobile }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_36__.default, { canvas: this.canvas, appState: this.state, files: this.files, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\r\n elements,\r\n position: \"center\",\r\n files: null,\r\n }), zenModeEnabled: zenModeEnabled, toggleZenMode: this.toggleZenMode, langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.getLanguage)().code, isCollaborating: this.props.isCollaborating || false, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, viewModeEnabled: viewModeEnabled, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\r\n zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\r\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id, onImageAction: this.onImageAction }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }, void 0), this.state.showStats && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_37__.Stats, { appState: this.state, setAppState: this.setAppState, elements: this.scene.getElements(), onClose: this.toggleStats, renderCustomStats: renderCustomStats }, void 0)), this.state.toastMessage !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_38__.Toast, { message: this.state.toastMessage, clearToast: this.clearToast }, void 0)), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() }, void 0)] }), void 0) }), void 0) }), void 0));\r\n }\r\n componentDidMount() {\r\n var _a, _b;\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.excalidrawContainerValue.container = this.excalidrawContainerRef.current;\r\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n const setState = this.setState.bind(this);\r\n Object.defineProperties(window.h, {\r\n state: {\r\n configurable: true,\r\n get: () => {\r\n return this.state;\r\n },\r\n },\r\n setState: {\r\n configurable: true,\r\n value: (...args) => {\r\n return this.setState(...args);\r\n },\r\n },\r\n app: {\r\n configurable: true,\r\n value: this,\r\n },\r\n history: {\r\n configurable: true,\r\n value: this.history,\r\n },\r\n });\r\n }\r\n this.scene.addCallback(this.onSceneUpdated);\r\n this.addEventListeners();\r\n if (this.excalidrawContainerRef.current) {\r\n this.focusContainer();\r\n }\r\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // compute isMobile state\r\n // ---------------------------------------------------------------------\r\n const { width, height, } = this.excalidrawContainerRef.current.getBoundingClientRect();\r\n this.isMobile =\r\n width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT ||\r\n (height < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE);\r\n // refresh offsets\r\n // ---------------------------------------------------------------------\r\n this.updateDOMRect();\r\n });\r\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\r\n }\r\n else if (window.matchMedia) {\r\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\r\n const handler = () => (this.isMobile = mediaQuery.matches);\r\n mediaQuery.addListener(handler);\r\n this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);\r\n }\r\n const searchParams = new URLSearchParams(window.location.search.slice(1));\r\n if (searchParams.has(\"web-share-target\")) {\r\n // Obtain a file that was shared via the Web Share Target API.\r\n this.restoreFileFromShare();\r\n }\r\n else {\r\n this.updateDOMRect(this.initializeScene);\r\n }\r\n });\r\n }\r\n componentWillUnmount() {\r\n var _a;\r\n this.imageCache.clear();\r\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\r\n this.unmounted = true;\r\n this.removeEventListeners();\r\n this.scene.destroy();\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n }\r\n removeEventListeners() {\r\n var _a, _b;\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n (_b = this.detachIsMobileMqHandler) === null || _b === void 0 ? void 0 : _b.call(this);\r\n }\r\n addEventListeners() {\r\n var _a, _b;\r\n this.removeEventListeners();\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer); // #3553\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n if (this.props.handleKeyboardGlobally) {\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp, { passive: true });\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\r\n // rerender text elements on font load to fix #637 && #1553\r\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \"loadingdone\", this.onFontLoaded);\r\n // Safari-only desktop pinch zoom\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n if (this.props.detectScroll) {\r\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\r\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n }\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n }\r\n componentDidUpdate(prevProps, prevState) {\r\n var _a, _b, _c, _d;\r\n if (prevProps.langCode !== this.props.langCode) {\r\n this.updateLanguage();\r\n }\r\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\r\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\r\n }\r\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\r\n this.addEventListeners();\r\n this.deselectElements();\r\n }\r\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\r\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\r\n }\r\n if (prevProps.theme !== this.props.theme && this.props.theme) {\r\n this.setState({ theme: this.props.theme });\r\n }\r\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\r\n this.setState({\r\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null,\r\n });\r\n }\r\n if (this.props.name && prevProps.name !== this.props.name) {\r\n this.setState({\r\n name: this.props.name,\r\n });\r\n }\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\r\n if (this.state.editingLinearElement &&\r\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\r\n // defer so that the commitToHistory flag isn't reset via current update\r\n setTimeout(() => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n const { multiElement } = prevState;\r\n if (prevState.elementType !== this.state.elementType &&\r\n multiElement != null &&\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(multiElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\r\n }\r\n const cursorButton = {};\r\n const pointerViewportCoords = {};\r\n const remoteSelectedElementIds = {};\r\n const pointerUsernames = {};\r\n const pointerUserStates = {};\r\n this.state.collaborators.forEach((user, socketId) => {\r\n if (user.selectedElementIds) {\r\n for (const id of Object.keys(user.selectedElementIds)) {\r\n if (!(id in remoteSelectedElementIds)) {\r\n remoteSelectedElementIds[id] = [];\r\n }\r\n remoteSelectedElementIds[id].push(socketId);\r\n }\r\n }\r\n if (!user.pointer) {\r\n return;\r\n }\r\n if (user.username) {\r\n pointerUsernames[socketId] = user.username;\r\n }\r\n if (user.userState) {\r\n pointerUserStates[socketId] = user.userState;\r\n }\r\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: user.pointer.x,\r\n sceneY: user.pointer.y,\r\n }, this.state);\r\n cursorButton[socketId] = user.button;\r\n });\r\n const renderingElements = this.scene.getElements().filter((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(element)) {\r\n if (\r\n // not placed on canvas yet (but in elements array)\r\n this.state.pendingImageElement &&\r\n element.id === this.state.pendingImageElement.id) {\r\n return false;\r\n }\r\n }\r\n // don't render text element that's being currently edited (it's\r\n // rendered on remote only)\r\n return (!this.state.editingElement ||\r\n this.state.editingElement.type !== \"text\" ||\r\n element.id !== this.state.editingElement.id);\r\n });\r\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_28__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\r\n scrollX: this.state.scrollX,\r\n scrollY: this.state.scrollY,\r\n viewBackgroundColor: this.state.viewBackgroundColor,\r\n zoom: this.state.zoom,\r\n remotePointerViewportCoords: pointerViewportCoords,\r\n remotePointerButton: cursorButton,\r\n remoteSelectedElementIds,\r\n remotePointerUsernames: pointerUsernames,\r\n remotePointerUserStates: pointerUserStates,\r\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\r\n theme: this.state.theme,\r\n imageCache: this.imageCache,\r\n }, {\r\n renderOptimizations: true,\r\n renderScrollbars: !this.isMobile,\r\n });\r\n if (scrollBars) {\r\n currentScrollBars = scrollBars;\r\n }\r\n const scrolledOutside = \r\n // hide when editing text\r\n ((_b = this.state.editingElement) === null || _b === void 0 ? void 0 : _b.type) === \"text\"\r\n ? false\r\n : !atLeastOneVisibleElement && renderingElements.length > 0;\r\n if (this.state.scrolledOutside !== scrolledOutside) {\r\n this.setState({ scrolledOutside });\r\n }\r\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\r\n this.scheduleImageRefresh();\r\n // Do not notify consumers if we're still loading the scene. Among other\r\n // potential issues, this fixes a case where the tab isn't focused during\r\n // init, which would trigger onChange with empty elements, which would then\r\n // override whatever is in localStorage currently.\r\n if (!this.state.isLoading) {\r\n (_d = (_c = this.props).onChange) === null || _d === void 0 ? void 0 : _d.call(_c, this.scene.getElementsIncludingDeleted(), this.state, this.files);\r\n }\r\n }\r\n static resetTapTwice() {\r\n didTapTwice = false;\r\n }\r\n addTextFromPaste(text) {\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x,\r\n y,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text,\r\n rawText: text,\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: this.state.currentItemTextAlign,\r\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({ selectedElementIds: { [element.id]: true } });\r\n this.history.resumeRecording();\r\n }\r\n selectShapeTool(elementType) {\r\n if (!isHoldingSpace) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, elementType);\r\n }\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isToolIcon)(document.activeElement)) {\r\n this.focusContainer();\r\n }\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElementType)(elementType)) {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n if (elementType === \"image\") {\r\n this.onImageAction();\r\n }\r\n if (elementType !== \"selection\") {\r\n this.setState({\r\n elementType,\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n else {\r\n this.setState({ elementType });\r\n }\r\n }\r\n handleTextWysiwyg(element, { isExistingElement = false, }) {\r\n const updateElement = (text, rawText, isDeleted = false) => {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\r\n text,\r\n rawText: rawText ? rawText : text,\r\n isDeleted,\r\n });\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n };\r\n if (isExistingElement && this.props.onBeforeTextEdit) {\r\n const text = this.props.onBeforeTextEdit(element);\r\n if (text) {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\r\n element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\r\n text,\r\n isDeleted: false,\r\n });\r\n return element;\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n }\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.textWysiwyg)({\r\n id: element.id,\r\n appState: this.state,\r\n canvas: this.canvas,\r\n getViewportCoords: (x, y) => {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: x,\r\n sceneY: y,\r\n }, this.state);\r\n return [\r\n viewportX - this.state.offsetLeft,\r\n viewportY - this.state.offsetTop,\r\n ];\r\n },\r\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((text) => {\r\n updateElement(text);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element);\r\n }\r\n }),\r\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(({ text, viaKeyboard }) => {\r\n const isDeleted = !text.trim();\r\n const rawText = text;\r\n if (this.props.onBeforeTextSubmit) {\r\n const updatedText = this.props.onBeforeTextSubmit(element, text, isDeleted);\r\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\r\n }\r\n updateElement(text, rawText, isDeleted);\r\n // select the created text element only if submitting via keyboard\r\n // (when submitting via click it should act as signal to deselect)\r\n if (!isDeleted && viaKeyboard) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: true }),\r\n }));\r\n }\r\n if (isDeleted) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDeletion)(this.scene.getElements(), [element]);\r\n }\r\n if (!isDeleted || isExistingElement) {\r\n this.history.resumeRecording();\r\n }\r\n this.setState({\r\n draggingElement: null,\r\n editingElement: null,\r\n });\r\n if (this.state.elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n this.focusContainer();\r\n }),\r\n element,\r\n excalidrawContainer: this.excalidrawContainerRef.current,\r\n });\r\n // deselect all other elements when inserting text\r\n this.deselectElements();\r\n // do an initial update to re-initialize element position since we were\r\n // modifying element's x/y for sake of editor (case: syncing to remote)\r\n updateElement(element.text);\r\n }\r\n deselectElements() {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n getTextElementAtPosition(x, y) {\r\n const element = this.getElementAtPosition(x, y);\r\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && !element.isDeleted) {\r\n return element;\r\n }\r\n return null;\r\n }\r\n getElementAtPosition(x, y, opts) {\r\n const allHitElements = this.getElementsAtPosition(x, y);\r\n if (allHitElements.length > 1) {\r\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\r\n for (let index = allHitElements.length - 1; index > -1; index--) {\r\n if (this.state.selectedElementIds[allHitElements[index].id]) {\r\n return allHitElements[index];\r\n }\r\n }\r\n }\r\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\r\n // If we're hitting element with highest z-index only on its bounding box\r\n // while also hitting other element figure, the latter should be considered.\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\r\n ? allHitElements[allHitElements.length - 2]\r\n : elementWithHighestZIndex;\r\n }\r\n if (allHitElements.length === 1) {\r\n return allHitElements[0];\r\n }\r\n return null;\r\n }\r\n getElementsAtPosition(x, y) {\r\n return (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsAtPosition)(this.scene.getElements(), (element) => (0,_element__WEBPACK_IMPORTED_MODULE_16__.hitTest)(element, this.state, x, y));\r\n }\r\n maybeCleanupAfterMissingPointerUp(event) {\r\n if (lastPointerUp !== null) {\r\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\r\n // this can happen when a contextual menu or alert is triggered. In order to avoid\r\n // being in a weird state, we clean up on the next pointerdown\r\n lastPointerUp(event);\r\n }\r\n }\r\n updateGestureOnPointerDown(event) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n if (gesture.pointers.size === 2) {\r\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n gesture.initialScale = this.state.zoom.value;\r\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n }\r\n }\r\n initialPointerDownState(event) {\r\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return {\r\n origin,\r\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD],\r\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\r\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\r\n // we need to duplicate because we'll be updating this state\r\n lastCoords: Object.assign({}, origin),\r\n originalElements: this.scene.getElements().reduce((acc, element) => {\r\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.deepCopyElement)(element));\r\n return acc;\r\n }, new Map()),\r\n resize: {\r\n handleType: false,\r\n isResizing: false,\r\n offset: { x: 0, y: 0 },\r\n arrowDirection: \"origin\",\r\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\r\n },\r\n hit: {\r\n element: null,\r\n allHitElements: [],\r\n wasAddedToSelection: false,\r\n hasBeenDuplicated: false,\r\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\r\n },\r\n drag: {\r\n hasOccurred: false,\r\n offset: null,\r\n },\r\n eventListeners: {\r\n onMove: null,\r\n onUp: null,\r\n onKeyUp: null,\r\n onKeyDown: null,\r\n },\r\n };\r\n }\r\n // Returns whether the event is a dragging a scrollbar\r\n handleDraggingScrollBar(event, pointerDownState) {\r\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\r\n return false;\r\n }\r\n isDraggingScrollBar = true;\r\n pointerDownState.lastCoords.x = event.clientX;\r\n pointerDownState.lastCoords.y = event.clientY;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\r\n });\r\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isDraggingScrollBar = false;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n lastPointerUp = null;\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n });\r\n lastPointerUp = onPointerUp;\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n return true;\r\n }\r\n isASelectedElement(hitElement) {\r\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\r\n }\r\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\r\n if (selectedElements.length < 2) {\r\n return false;\r\n }\r\n // How many pixels off the shape boundary we still consider a hit\r\n const threshold = 10 / this.state.zoom.value;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return (point.x > x1 - threshold &&\r\n point.x < x2 + threshold &&\r\n point.y > y1 - threshold &&\r\n point.y < y2 + threshold);\r\n }\r\n onKeyDownFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onKeyUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // Prevents focus from escaping excalidraw tab\r\n event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ALT && event.preventDefault();\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onPointerMoveFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // We need to initialize dragOffsetXY only after we've updated\r\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\r\n // event handler should hopefully ensure we're already working with\r\n // the updated state.\r\n if (pointerDownState.drag.offset === null) {\r\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\r\n }\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\r\n return;\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n // for arrows/lines, don't start dragging until a given threshold\r\n // to ensure we don't create a 2-point arrow by mistake when\r\n // user clicks mouse in a way that it moves a tiny bit (thus\r\n // triggering pointermove)\r\n if (!pointerDownState.drag.hasOccurred &&\r\n (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\")) {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD) {\r\n return;\r\n }\r\n }\r\n if (pointerDownState.resize.isResizing) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return true;\r\n }\r\n }\r\n if (this.state.editingLinearElement) {\r\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, startOrEnd) => {\r\n this.maybeSuggestBindingForLinearElementAtCursor(element, startOrEnd, pointerCoords);\r\n });\r\n if (didDrag) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n return;\r\n }\r\n }\r\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if (hasHitASelectedElement ||\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n // Marking that click was used for dragging to check\r\n // if elements should be deselected on pointerup\r\n pointerDownState.drag.hasOccurred = true;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\r\n // it would have weird results (stuff jumping all over the screen)\r\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\r\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n const [dragDistanceX, dragDistanceY] = [\r\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\r\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\r\n ];\r\n // We only drag in one direction if shift is pressed\r\n const lockDirection = event.shiftKey;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, this.scene, lockDirection, dragDistanceX, dragDistanceY);\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n // We duplicate the selected element if alt is pressed on pointer move\r\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\r\n // Move the currently selected elements to the top of the z index stack, and\r\n // put the duplicates where the selected elements used to be.\r\n // (the origin point where the dragging started)\r\n pointerDownState.hit.hasBeenDuplicated = true;\r\n const nextElements = [];\r\n const elementsToAppend = [];\r\n const groupIdMap = new Map();\r\n const oldIdToDuplicatedId = new Map();\r\n const hitElement = pointerDownState.hit.element;\r\n for (const element of this.scene.getElementsIncludingDeleted()) {\r\n if (this.state.selectedElementIds[element.id] ||\r\n // case: the state.selectedElementIds might not have been\r\n // updated yet by the time this mousemove event is fired\r\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\r\n pointerDownState.hit.wasAddedToSelection)) {\r\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\r\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(duplicatedElement, {\r\n x: duplicatedElement.x + (originDragX - dragX),\r\n y: duplicatedElement.y + (originDragY - dragY),\r\n });\r\n nextElements.push(duplicatedElement);\r\n elementsToAppend.push(element);\r\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\r\n }\r\n else {\r\n nextElements.push(element);\r\n }\r\n }\r\n const nextSceneElements = [...nextElements, ...elementsToAppend];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\r\n this.scene.replaceAllElements(nextSceneElements);\r\n }\r\n return;\r\n }\r\n }\r\n // It is very important to read this.state within each move event,\r\n // otherwise we would read a stale one!\r\n const draggingElement = this.state.draggingElement;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"freedraw\") {\r\n const points = draggingElement.points;\r\n const dx = pointerCoords.x - draggingElement.x;\r\n const dy = pointerCoords.y - draggingElement.y;\r\n const pressures = draggingElement.simulatePressure\r\n ? draggingElement.pressures\r\n : [...draggingElement.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n pointerDownState.drag.hasOccurred = true;\r\n const points = draggingElement.points;\r\n let dx = gridX - draggingElement.x;\r\n let dy = gridY - draggingElement.y;\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\r\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getPerfectElementSize)(this.state.elementType, dx, dy));\r\n }\r\n if (points.length === 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\r\n }\r\n else if (points.length > 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points.slice(0, -1), [dx, dy]],\r\n });\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n // When creating a linear element by dragging\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", pointerCoords, this.state.startBoundElement);\r\n }\r\n }\r\n else {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n }\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n if (!event.shiftKey && (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(elements, this.state)) {\r\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\r\n [pointerDownState.hit.element.id]: true,\r\n } }), this.scene.getElements()));\r\n }\r\n else {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n }\r\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsWithinSelection)(elements, draggingElement);\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {})), (pointerDownState.hit.element\r\n ? {\r\n // if using ctrl/cmd, select the hitElement only if we\r\n // haven't box-selected anything else\r\n [pointerDownState.hit.element\r\n .id]: !elementsWithinSelection.length,\r\n }\r\n : null)) }), this.scene.getElements()));\r\n }\r\n });\r\n }\r\n // Returns whether the pointer move happened over either scrollbar\r\n handlePointerMoveOverScrollbars(event, pointerDownState) {\r\n if (pointerDownState.scrollbars.isOverHorizontal) {\r\n const x = event.clientX;\r\n const dx = x - pointerDownState.lastCoords.x;\r\n this.setState({\r\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.x = x;\r\n return true;\r\n }\r\n if (pointerDownState.scrollbars.isOverVertical) {\r\n const y = event.clientY;\r\n const dy = y - pointerDownState.lastCoords.y;\r\n this.setState({\r\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.y = y;\r\n return true;\r\n }\r\n return false;\r\n }\r\n onPointerUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((childEvent) => {\r\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating, } = this.state;\r\n this.setState({\r\n isResizing: false,\r\n isRotating: false,\r\n resizingElement: null,\r\n selectionElement: null,\r\n cursorButton: \"up\",\r\n // text elements are reset on finalize, and resetting on pointerup\r\n // may cause issues with double taps\r\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\r\n ? this.state.editingElement\r\n : null,\r\n });\r\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\r\n // Handle end of dragging a point of a linear element, might close a loop\r\n // and sets binding element\r\n if (this.state.editingLinearElement) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({\r\n editingLinearElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n }\r\n lastPointerUp = null;\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\r\n if (this.state.pendingImageElement) {\r\n this.setState({ pendingImageElement: null });\r\n }\r\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n const points = draggingElement.points;\r\n let dx = pointerCoords.x - draggingElement.x;\r\n let dy = pointerCoords.y - draggingElement.y;\r\n // Allows dots to avoid being flagged as infinitely small\r\n if (dx === points[0][0] && dy === points[0][1]) {\r\n dy += 0.0001;\r\n dx += 0.0001;\r\n }\r\n const pressures = draggingElement.simulatePressure\r\n ? []\r\n : [...draggingElement.pressures, childEvent.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n lastCommittedPoint: [dx, dy],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)) {\r\n const imageElement = draggingElement;\r\n try {\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n catch (error) {\r\n console.error(error);\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== imageElement.id));\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n }\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n if (draggingElement.points.length > 1) {\r\n this.history.resumeRecording();\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n if (!pointerDownState.drag.hasOccurred &&\r\n draggingElement &&\r\n !multiElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [\r\n ...draggingElement.points,\r\n [\r\n pointerCoords.x - draggingElement.x,\r\n pointerCoords.y - draggingElement.y,\r\n ],\r\n ],\r\n });\r\n this.setState({\r\n multiElement: draggingElement,\r\n editingElement: this.state.draggingElement,\r\n });\r\n }\r\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\r\n }\r\n this.setState({ suggestedBindings: [], startBoundElement: null });\r\n if (!elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n elementType: \"selection\",\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n else {\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n }\r\n return;\r\n }\r\n if (elementType !== \"selection\" &&\r\n draggingElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(draggingElement)) {\r\n // remove invisible element which was added in onPointerDown\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\r\n this.setState({\r\n draggingElement: null,\r\n });\r\n return;\r\n }\r\n if (draggingElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getNormalizedDimensions)(draggingElement));\r\n }\r\n if (resizingElement) {\r\n this.history.resumeRecording();\r\n }\r\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(resizingElement)) {\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== resizingElement.id));\r\n }\r\n // Code below handles selection when element(s) weren't\r\n // drag or added to selection on pointer down phase.\r\n const hitElement = pointerDownState.hit.element;\r\n if (hitElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !pointerDownState.hit.wasAddedToSelection) {\r\n if (childEvent.shiftKey) {\r\n if (this.state.selectedElementIds[hitElement.id]) {\r\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_23__.isSelectedViaGroup)(this.state, hitElement)) {\r\n // We want to unselect all groups hitElement is part of\r\n // as well as all elements that are part of the groups\r\n // hitElement is part of\r\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\r\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getElementsInGroup)(this.scene.getElements(), groupId))\r\n .map((element) => ({ [element.id]: false }))\r\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\r\n this.setState((_prevState) => ({\r\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\r\n .map((gId) => ({ [gId]: false }))\r\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\r\n }));\r\n }\r\n else {\r\n // remove element from selection while\r\n // keeping prev elements selected\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getElements()));\r\n }\r\n }\r\n else {\r\n // add element to selection while\r\n // keeping prev elements selected\r\n this.setState((_prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\r\n }));\r\n }\r\n }\r\n else {\r\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getElements()))));\r\n }\r\n }\r\n if (!this.state.editingLinearElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !this.state.isResizing &&\r\n ((hitElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\r\n (!hitElement &&\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\r\n // Deselect selected elements\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n return;\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\" && draggingElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\r\n }));\r\n }\r\n if (elementType !== \"selection\" ||\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(this.scene.getElements(), this.state)) {\r\n this.history.resumeRecording();\r\n }\r\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\r\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? _element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements\r\n : _element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state));\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n elementType: \"selection\",\r\n });\r\n }\r\n else {\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n });\r\n }\r\n });\r\n }\r\n maybeSuggestBindingForAll(selectedElements) {\r\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getEligibleElementsForBinding)(selectedElements);\r\n this.setState({ suggestedBindings });\r\n }\r\n clearSelection(hitElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n // Continue editing the same group if the user selected a different\r\n // element from it\r\n editingGroupId: prevState.editingGroupId &&\r\n hitElement != null &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, prevState.editingGroupId)\r\n ? prevState.editingGroupId\r\n : null,\r\n }));\r\n this.setState({\r\n selectedElementIds: {},\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\r\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementContainingPosition)(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)), x, y);\r\n if (elementClickedInside) {\r\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\r\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\r\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\r\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_11__.TEXT_TO_CENTER_SNAP_THRESHOLD;\r\n if (isSnappedToCenter) {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\r\n return { viewportX, viewportY, elementCenterX, elementCenterY };\r\n }\r\n }\r\n }\r\n getCanvasOffsets() {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { left, top } = excalidrawContainer.getBoundingClientRect();\r\n return {\r\n offsetLeft: left,\r\n offsetTop: top,\r\n };\r\n }\r\n return {\r\n offsetLeft: 0,\r\n offsetTop: 0,\r\n };\r\n }\r\n updateLanguage() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_25__.languages.find((lang) => lang.code === this.props.langCode) ||\r\n _i18n__WEBPACK_IMPORTED_MODULE_25__.defaultLang;\r\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.setLanguage)(currentLang);\r\n this.setAppState({});\r\n });\r\n }\r\n}\r\nApp.defaultProps = {\r\n // needed for tests to pass since we directly render App in many tests\r\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_UI_OPTIONS,\r\n};\r\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n window.h = window.h || {};\r\n Object.defineProperties(window.h, {\r\n elements: {\r\n configurable: true,\r\n get() {\r\n return this.app.scene.getElementsIncludingDeleted();\r\n },\r\n set(elements) {\r\n return this.app.scene.replaceAllElements(elements);\r\n },\r\n },\r\n });\r\n}\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVcsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztLQUFBOztBQXJzSmEsZ0JBQVksR0FBc0I7SUFDOUMsc0VBQXNFO0lBQ3RFLFNBQVMsRUFBRSwyREFBa0I7Q0FDOUIsQ0FBQztBQXF0SkosSUFDRSxhQUFvQixLQUFLLGlEQUFRO0lBQ2pDLGFBQW9CLEtBQUssd0RBQWUsRUFDeEM7SUFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUssRUFBa0IsQ0FBQztJQUUzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoQyxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHO2dCQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsR0FBRyxDQUFDLFFBQTZCO2dCQUMvQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7U0FDRjtLQUNGLENBQUMsQ0FBQztDQUNKO0FBQ0QsaUVBQWUsR0FBRyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvQXBwLnRzeD8wMDcwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb3VnaENhbnZhcyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jYW52YXNcIjtcbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCBjbHN4IGZyb20gXCJjbHN4XCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5cbmltcG9ydCB7XG4gIGFjdGlvbkFkZFRvTGlicmFyeSxcbiAgYWN0aW9uQnJpbmdGb3J3YXJkLFxuICBhY3Rpb25CcmluZ1RvRnJvbnQsXG4gIGFjdGlvbkNvcHksXG4gIGFjdGlvbkNvcHlBc1BuZyxcbiAgYWN0aW9uQ29weUFzU3ZnLFxuICBhY3Rpb25Db3B5U3R5bGVzLFxuICBhY3Rpb25DdXQsXG4gIGFjdGlvbkRlbGV0ZVNlbGVjdGVkLFxuICBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sXG4gIGFjdGlvbkZpbmFsaXplLFxuICBhY3Rpb25GbGlwSG9yaXpvbnRhbCxcbiAgYWN0aW9uRmxpcFZlcnRpY2FsLFxuICBhY3Rpb25Hcm91cCxcbiAgYWN0aW9uUGFzdGVTdHlsZXMsXG4gIGFjdGlvblNlbGVjdEFsbCxcbiAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICBhY3Rpb25TZW5kVG9CYWNrLFxuICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gIGFjdGlvblRvZ2dsZVplbk1vZGUsXG4gIGFjdGlvblVuZ3JvdXAsXG4gIHpvb21Ub0ZpdEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVkb0FjdGlvbiwgY3JlYXRlVW5kb0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkhpc3RvcnlcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhY3Rpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvcmVnaXN0ZXJcIjtcbmltcG9ydCB7IEFjdGlvblJlc3VsdCB9IGZyb20gXCIuLi9hY3Rpb25zL3R5cGVzXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQge1xuICBjb3B5VG9DbGlwYm9hcmQsXG4gIHBhcnNlQ2xpcGJvYXJkLFxuICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYixcbiAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCxcbn0gZnJvbSBcIi4uL2NsaXBib2FyZFwiO1xuaW1wb3J0IHtcbiAgQVBQX05BTUUsXG4gIENVUlNPUl9UWVBFLFxuICBERUZBVUxUX01BWF9JTUFHRV9XSURUSF9PUl9IRUlHSFQsXG4gIERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgRFJBR0dJTkdfVEhSRVNIT0xELFxuICBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQsXG4gIEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCxcbiAgRU5WLFxuICBFVkVOVCxcbiAgR1JJRF9TSVpFLFxuICBJTUFHRV9SRU5ERVJfVElNRU9VVCxcbiAgTElORV9DT05GSVJNX1RIUkVTSE9MRCxcbiAgTUFYX0FMTE9XRURfRklMRV9CWVRFUyxcbiAgTUlNRV9UWVBFUyxcbiAgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9QT1JUUkFJVCxcbiAgUE9JTlRFUl9CVVRUT04sXG4gIFNDUk9MTF9USU1FT1VULFxuICBUQVBfVFdJQ0VfVElNRU9VVCxcbiAgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQsXG4gIFRIRU1FLFxuICBUT1VDSF9DVFhfTUVOVV9USU1FT1VULFxuICBVUkxfSEFTSF9LRVlTLFxuICBVUkxfUVVFUllfS0VZUyxcbiAgWk9PTV9TVEVQLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBsb2FkRnJvbUJsb2IgfSBmcm9tIFwiLi4vZGF0YVwiO1xuaW1wb3J0IHsgaXNWYWxpZExpYnJhcnkgfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwiLi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgeyByZXN0b3JlLCByZXN0b3JlRWxlbWVudHMgfSBmcm9tIFwiLi4vZGF0YS9yZXN0b3JlXCI7XG5pbXBvcnQge1xuICBkcmFnTmV3RWxlbWVudCxcbiAgZHJhZ1NlbGVjdGVkRWxlbWVudHMsXG4gIGR1cGxpY2F0ZUVsZW1lbnQsXG4gIGdldENvbW1vbkJvdW5kcyxcbiAgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50LFxuICBnZXREcmFnT2Zmc2V0WFksXG4gIGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMsXG4gIGdldFBlcmZlY3RFbGVtZW50U2l6ZSxcbiAgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24sXG4gIGdldFJlc2l6ZU9mZnNldFhZLFxuICBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyxcbiAgaGl0VGVzdCxcbiAgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50LFxuICBpc0ludmlzaWJseVNtYWxsRWxlbWVudCxcbiAgaXNOb25EZWxldGVkRWxlbWVudCxcbiAgaXNUZXh0RWxlbWVudCxcbiAgbmV3RWxlbWVudCxcbiAgbmV3TGluZWFyRWxlbWVudCxcbiAgbmV3VGV4dEVsZW1lbnQsXG4gIG5ld0ltYWdlRWxlbWVudCxcbiAgdGV4dFd5c2l3eWcsXG4gIHRyYW5zZm9ybUVsZW1lbnRzLFxuICB1cGRhdGVUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMsXG4gIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbixcbiAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uLFxuICBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZyxcbiAgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLFxuICBpc0JpbmRpbmdFbmFibGVkLFxuICBpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQsXG4gIG1heWJlQmluZExpbmVhckVsZW1lbnQsXG4gIHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQsXG4gIHVuYmluZExpbmVhckVsZW1lbnRzLFxuICB1cGRhdGVCb3VuZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgYnVtcFZlcnNpb24sIG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBkZWVwQ29weUVsZW1lbnQsIG5ld0ZyZWVEcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L25ld0VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGlzQmluZGluZ0VsZW1lbnQsXG4gIGlzQmluZGluZ0VsZW1lbnRUeXBlLFxuICBpc0ltYWdlRWxlbWVudCxcbiAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnRUeXBlLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBOb25EZWxldGVkLFxuICBJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEZpbGVJZCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENlbnRlciwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi4vZ2VzdHVyZVwiO1xuaW1wb3J0IHtcbiAgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50LFxuICBnZXRFbGVtZW50c0luR3JvdXAsXG4gIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQsXG4gIGdldFNlbGVjdGVkR3JvdXBJZHMsXG4gIGlzRWxlbWVudEluR3JvdXAsXG4gIGlzU2VsZWN0ZWRWaWFHcm91cCxcbiAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyxcbn0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcbmltcG9ydCB7IGRlZmF1bHRMYW5nLCBnZXRMYW5ndWFnZSwgbGFuZ3VhZ2VzLCBzZXRMYW5ndWFnZSwgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQge1xuICBDT0RFUyxcbiAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcixcbiAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyxcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUsXG4gIGlzQXJyb3dLZXksXG4gIEtFWVMsXG59IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyBkaXN0YW5jZTJkLCBnZXRHcmlkUG9pbnQsIGlzUGF0aEFMb29wIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lIH0gZnJvbSBcIi4uL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50IH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZVNjcm9sbENlbnRlcixcbiAgZ2V0RWxlbWVudENvbnRhaW5pbmdQb3NpdGlvbixcbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uLFxuICBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbixcbiAgZ2V0Tm9ybWFsaXplZFpvb20sXG4gIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gIGhhc0JhY2tncm91bmQsXG4gIGlzT3ZlclNjcm9sbEJhcnMsXG4gIGlzU29tZUVsZW1lbnRTZWxlY3RlZCxcbn0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBTY2VuZVN0YXRlLCBTY3JvbGxCYXJzIH0gZnJvbSBcIi4uL3NjZW5lL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXROZXdab29tIH0gZnJvbSBcIi4uL3NjZW5lL3pvb21cIjtcbmltcG9ydCB7IGZpbmRTaGFwZUJ5S2V5IH0gZnJvbSBcIi4uL3NoYXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBwQ2xhc3NQcm9wZXJ0aWVzLFxuICBBcHBQcm9wcyxcbiAgQXBwU3RhdGUsXG4gIEJpbmFyeUZpbGVEYXRhLFxuICBEYXRhVVJMLFxuICBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSSxcbiAgQmluYXJ5RmlsZXMsXG4gIEdlc3R1cmUsXG4gIEdlc3R1cmVFdmVudCxcbiAgTGlicmFyeUl0ZW1zLFxuICBQb2ludGVyRG93blN0YXRlLFxuICBTY2VuZURhdGEsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZGVib3VuY2UsXG4gIGRpc3RhbmNlLFxuICBnZXROZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcixcbiAgaXNJbnB1dExpa2UsXG4gIGlzVG9vbEljb24sXG4gIGlzV3JpdGFibGVFbGVtZW50LFxuICByZXNldEN1cnNvcixcbiAgcmVzb2x2YWJsZVByb21pc2UsXG4gIHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyxcbiAgc2V0Q3Vyc29yLFxuICBzZXRDdXJzb3JGb3JTaGFwZSxcbiAgdHVwbGVUb0Nvb3JzLFxuICB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMsXG4gIHdpdGhCYXRjaGVkVXBkYXRlcyxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUsIHsgQ29udGV4dE1lbnVPcHRpb24gfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgU3RhdHMgfSBmcm9tIFwiLi9TdGF0c1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuaW1wb3J0IHtcbiAgZGF0YVVSTFRvRmlsZSxcbiAgZ2VuZXJhdGVJZEZyb21GaWxlLFxuICBnZXREYXRhVVJMLFxuICBpc1N1cHBvcnRlZEltYWdlRmlsZSxcbiAgcmVzaXplSW1hZ2VGaWxlLFxuICBTVkdTdHJpbmdUb0ZpbGUsXG59IGZyb20gXCIuLi9kYXRhL2Jsb2JcIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgbG9hZEhUTUxJbWFnZUVsZW1lbnQsXG4gIG5vcm1hbGl6ZVNWRyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSBhcyBfdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwibG9kYXNoLnRocm90dGxlXCI7XG5pbXBvcnQgeyBmaWxlT3BlbiwgbmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCB9IGZyb20gXCIuLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcblxuY29uc3QgSXNNb2JpbGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChmYWxzZSk7XG5leHBvcnQgY29uc3QgdXNlSXNNb2JpbGUgPSAoKSA9PiB1c2VDb250ZXh0KElzTW9iaWxlQ29udGV4dCk7XG5jb25zdCBFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8e1xuICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG59Pih7IGNvbnRhaW5lcjogbnVsbCwgaWQ6IG51bGwgfSk7XG5leHBvcnQgY29uc3QgdXNlRXhjYWxpZHJhd0NvbnRhaW5lciA9ICgpID0+XG4gIHVzZUNvbnRleHQoRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQpO1xuXG5sZXQgZGlkVGFwVHdpY2U6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCB0YXBwZWRUd2ljZVRpbWVyID0gMDtcbmxldCBjdXJzb3JYID0gMDtcbmxldCBjdXJzb3JZID0gMDtcbmxldCBpc0hvbGRpbmdTcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGlzUGFubmluZzogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGlzRHJhZ2dpbmdTY3JvbGxCYXI6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBjdXJyZW50U2Nyb2xsQmFyczogU2Nyb2xsQmFycyA9IHsgaG9yaXpvbnRhbDogbnVsbCwgdmVydGljYWw6IG51bGwgfTtcbmxldCB0b3VjaFRpbWVvdXQgPSAwO1xubGV0IGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuXG5sZXQgbGFzdFBvaW50ZXJVcDogKChldmVudDogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuY29uc3QgZ2VzdHVyZTogR2VzdHVyZSA9IHtcbiAgcG9pbnRlcnM6IG5ldyBNYXAoKSxcbiAgbGFzdENlbnRlcjogbnVsbCxcbiAgaW5pdGlhbERpc3RhbmNlOiBudWxsLFxuICBpbml0aWFsU2NhbGU6IG51bGwsXG59O1xuXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8QXBwUHJvcHMsIEFwcFN0YXRlPiB7XG4gIGNhbnZhczogQXBwQ2xhc3NQcm9wZXJ0aWVzW1wiY2FudmFzXCJdID0gbnVsbDtcbiAgcmM6IFJvdWdoQ2FudmFzIHwgbnVsbCA9IG51bGw7XG4gIHVubW91bnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBhY3Rpb25NYW5hZ2VyOiBBY3Rpb25NYW5hZ2VyO1xuICBpc01vYmlsZSA9IGZhbHNlO1xuICBkZXRhY2hJc01vYmlsZU1xSGFuZGxlcj86ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBleGNhbGlkcmF3Q29udGFpbmVyUmVmID0gUmVhY3QuY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBQYXJ0aWFsPEFwcFByb3BzPiA9IHtcbiAgICAvLyBuZWVkZWQgZm9yIHRlc3RzIHRvIHBhc3Mgc2luY2Ugd2UgZGlyZWN0bHkgcmVuZGVyIEFwcCBpbiBtYW55IHRlc3RzXG4gICAgVUlPcHRpb25zOiBERUZBVUxUX1VJX09QVElPTlMsXG4gIH07XG5cbiAgcHJpdmF0ZSBzY2VuZTogU2NlbmU7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgbGlicmFyeTogQXBwQ2xhc3NQcm9wZXJ0aWVzW1wibGlicmFyeVwiXTtcbiAgcHVibGljIGxpYnJhcnlJdGVtc0Zyb21TdG9yYWdlOiBMaWJyYXJ5SXRlbXMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBoaXN0b3J5OiBIaXN0b3J5O1xuICBwcml2YXRlIGV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZToge1xuICAgIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG5cbiAgcHVibGljIGZpbGVzOiBCaW5hcnlGaWxlcyA9IHt9O1xuICBwdWJsaWMgaW1hZ2VDYWNoZTogQXBwQ2xhc3NQcm9wZXJ0aWVzW1wiaW1hZ2VDYWNoZVwiXSA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gICAgY29uc3Qge1xuICAgICAgZXhjYWxpZHJhd1JlZixcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgemVuTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIGdyaWRNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgdGhlbWUgPSBkZWZhdWx0QXBwU3RhdGUudGhlbWUsXG4gICAgICBuYW1lID0gZGVmYXVsdEFwcFN0YXRlLm5hbWUsXG4gICAgfSA9IHByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAuLi5kZWZhdWx0QXBwU3RhdGUsXG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpLFxuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICBncmlkU2l6ZTogZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIG5hbWUsXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICB9O1xuXG4gICAgdGhpcy5pZCA9IG5hbm9pZCgpO1xuXG4gICAgaWYgKGV4Y2FsaWRyYXdSZWYpIHtcbiAgICAgIGNvbnN0IHJlYWR5UHJvbWlzZSA9XG4gICAgICAgIChcImN1cnJlbnRcIiBpbiBleGNhbGlkcmF3UmVmICYmIGV4Y2FsaWRyYXdSZWYuY3VycmVudD8ucmVhZHlQcm9taXNlKSB8fFxuICAgICAgICByZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST4oKTtcblxuICAgICAgY29uc3QgYXBpOiBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSSA9IHtcbiAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgIHJlYWR5UHJvbWlzZSxcbiAgICAgICAgdXBkYXRlU2NlbmU6IHRoaXMudXBkYXRlU2NlbmUsXG4gICAgICAgIGFkZEZpbGVzOiB0aGlzLmFkZEZpbGVzLFxuICAgICAgICByZXNldFNjZW5lOiB0aGlzLnJlc2V0U2NlbmUsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkOiB0aGlzLmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkLFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgY2xlYXI6IHRoaXMucmVzZXRIaXN0b3J5LFxuICAgICAgICB9LFxuICAgICAgICBzY3JvbGxUb0NvbnRlbnQ6IHRoaXMuc2Nyb2xsVG9Db250ZW50LFxuICAgICAgICB6b29tVG9GaXQ6IHRoaXMuem9vbVRvRml0LFxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzOiB0aGlzLmdldFNjZW5lRWxlbWVudHMsXG4gICAgICAgIGdldEFwcFN0YXRlOiAoKSA9PiB0aGlzLnN0YXRlLFxuICAgICAgICBnZXRGaWxlczogKCkgPT4gdGhpcy5maWxlcyxcbiAgICAgICAgcmVmcmVzaDogdGhpcy5yZWZyZXNoLFxuICAgICAgICBpbXBvcnRMaWJyYXJ5OiB0aGlzLmltcG9ydExpYnJhcnlGcm9tVXJsLFxuICAgICAgICBzZXRUb2FzdE1lc3NhZ2U6IHRoaXMuc2V0VG9hc3RNZXNzYWdlLFxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgICBpZiAodHlwZW9mIGV4Y2FsaWRyYXdSZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBleGNhbGlkcmF3UmVmKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGNhbGlkcmF3UmVmLmN1cnJlbnQgPSBhcGk7XG4gICAgICB9XG4gICAgICByZWFkeVByb21pc2UucmVzb2x2ZShhcGkpO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlID0ge1xuICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgIH07XG5cbiAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdGhpcy5saWJyYXJ5ID0gbmV3IExpYnJhcnkodGhpcyk7XG4gICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcihcbiAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCxcbiAgICAgICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAoKSA9PiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFsbChhY3Rpb25zKTtcblxuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVVbmRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVSZWRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDYW52YXMoKSB7XG4gICAgY29uc3QgY2FudmFzU2NhbGUgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhc0RPTVdpZHRoICogY2FudmFzU2NhbGU7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzRE9NSGVpZ2h0ICogY2FudmFzU2NhbGU7XG4gICAgaWYgKHZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGNhbnZhc1xuICAgICAgICAgIGNsYXNzTmFtZT1cImV4Y2FsaWRyYXdfX2NhbnZhc1wiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICAgICAgY3Vyc29yOiBDVVJTT1JfVFlQRS5HUkFCLFxuICAgICAgICAgIH19XG4gICAgICAgICAgd2lkdGg9e2NhbnZhc1dpZHRofVxuICAgICAgICAgIGhlaWdodD17Y2FudmFzSGVpZ2h0fVxuICAgICAgICAgIHJlZj17dGhpcy5oYW5kbGVDYW52YXNSZWZ9XG4gICAgICAgICAgb25Db250ZXh0TWVudT17dGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudX1cbiAgICAgICAgICBvblBvaW50ZXJNb3ZlPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlfVxuICAgICAgICAgIG9uUG9pbnRlclVwPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgICAgb25Qb2ludGVyQ2FuY2VsPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgICAgIG9uUG9pbnRlckRvd249e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd259XG4gICAgICAgID5cbiAgICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgICA8L2NhbnZhcz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8Y2FudmFzXG4gICAgICAgIGNsYXNzTmFtZT1cImV4Y2FsaWRyYXdfX2NhbnZhc1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICB9fVxuICAgICAgICB3aWR0aD17Y2FudmFzV2lkdGh9XG4gICAgICAgIGhlaWdodD17Y2FudmFzSGVpZ2h0fVxuICAgICAgICByZWY9e3RoaXMuaGFuZGxlQ2FudmFzUmVmfVxuICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51fVxuICAgICAgICBvblBvaW50ZXJEb3duPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3dufVxuICAgICAgICBvbkRvdWJsZUNsaWNrPXt0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrfVxuICAgICAgICBvblBvaW50ZXJNb3ZlPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlfVxuICAgICAgICBvblBvaW50ZXJVcD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICBvblBvaW50ZXJDYW5jZWw9e3RoaXMucmVtb3ZlUG9pbnRlcn1cbiAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgPlxuICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgPC9jYW52YXM+XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3QgeyB6ZW5Nb2RlRW5hYmxlZCwgdmlld01vZGVFbmFibGVkIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgY29uc3Qge1xuICAgICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICByZW5kZXJGb290ZXIsXG4gICAgICByZW5kZXJDdXN0b21TdGF0cyxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcImV4Y2FsaWRyYXcgZXhjYWxpZHJhdy1jb250YWluZXJcIiwge1xuICAgICAgICAgIFwiZXhjYWxpZHJhdy0tdmlldy1tb2RlXCI6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICBcImV4Y2FsaWRyYXctLW1vYmlsZVwiOiB0aGlzLmlzTW9iaWxlLFxuICAgICAgICB9KX1cbiAgICAgICAgcmVmPXt0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWZ9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVBcHBPbkRyb3B9XG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e1xuICAgICAgICAgIHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgdmFsdWU9e3RoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlfVxuICAgICAgICA+XG4gICAgICAgICAgPElzTW9iaWxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGhpcy5pc01vYmlsZX0+XG4gICAgICAgICAgICA8TGF5ZXJVSVxuICAgICAgICAgICAgICBjYW52YXM9e3RoaXMuY2FudmFzfVxuICAgICAgICAgICAgICBhcHBTdGF0ZT17dGhpcy5zdGF0ZX1cbiAgICAgICAgICAgICAgZmlsZXM9e3RoaXMuZmlsZXN9XG4gICAgICAgICAgICAgIHNldEFwcFN0YXRlPXt0aGlzLnNldEFwcFN0YXRlfVxuICAgICAgICAgICAgICBhY3Rpb25NYW5hZ2VyPXt0aGlzLmFjdGlvbk1hbmFnZXJ9XG4gICAgICAgICAgICAgIGVsZW1lbnRzPXt0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCl9XG4gICAgICAgICAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s9e29uQ29sbGFiQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgIG9uTG9ja1RvZ2dsZT17dGhpcy50b2dnbGVMb2NrfVxuICAgICAgICAgICAgICBvbkluc2VydEVsZW1lbnRzPXsoZWxlbWVudHMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgZmlsZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZD17emVuTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIHRvZ2dsZVplbk1vZGU9e3RoaXMudG9nZ2xlWmVuTW9kZX1cbiAgICAgICAgICAgICAgbGFuZ0NvZGU9e2dldExhbmd1YWdlKCkuY29kZX1cbiAgICAgICAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXt0aGlzLnByb3BzLmlzQ29sbGFib3JhdGluZyB8fCBmYWxzZX1cbiAgICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVST17cmVuZGVyVG9wUmlnaHRVSX1cbiAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyPXtyZW5kZXJGb290ZXJ9XG4gICAgICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZD17dmlld01vZGVFbmFibGVkfVxuICAgICAgICAgICAgICBzaG93RXhpdFplbk1vZGVCdG49e1xuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzPy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgIHplbk1vZGVFbmFibGVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2hvd1RoZW1lQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLnRoZW1lXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGlicmFyeVJldHVyblVybD17dGhpcy5wcm9wcy5saWJyYXJ5UmV0dXJuVXJsfVxuICAgICAgICAgICAgICBVSU9wdGlvbnM9e3RoaXMucHJvcHMuVUlPcHRpb25zfVxuICAgICAgICAgICAgICBmb2N1c0NvbnRhaW5lcj17dGhpcy5mb2N1c0NvbnRhaW5lcn1cbiAgICAgICAgICAgICAgbGlicmFyeT17dGhpcy5saWJyYXJ5fVxuICAgICAgICAgICAgICBpZD17dGhpcy5pZH1cbiAgICAgICAgICAgICAgb25JbWFnZUFjdGlvbj17dGhpcy5vbkltYWdlQWN0aW9ufVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhjYWxpZHJhdy1jb250ZXh0TWVudUNvbnRhaW5lclwiIC8+XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5zaG93U3RhdHMgJiYgKFxuICAgICAgICAgICAgICA8U3RhdHNcbiAgICAgICAgICAgICAgICBhcHBTdGF0ZT17dGhpcy5zdGF0ZX1cbiAgICAgICAgICAgICAgICBzZXRBcHBTdGF0ZT17dGhpcy5zZXRBcHBTdGF0ZX1cbiAgICAgICAgICAgICAgICBlbGVtZW50cz17dGhpcy5zY2VuZS5nZXRFbGVtZW50cygpfVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMudG9nZ2xlU3RhdHN9XG4gICAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tU3RhdHM9e3JlbmRlckN1c3RvbVN0YXRzfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnRvYXN0TWVzc2FnZSAhPT0gbnVsbCAmJiAoXG4gICAgICAgICAgICAgIDxUb2FzdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3RoaXMuc3RhdGUudG9hc3RNZXNzYWdlfVxuICAgICAgICAgICAgICAgIGNsZWFyVG9hc3Q9e3RoaXMuY2xlYXJUb2FzdH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8bWFpbj57dGhpcy5yZW5kZXJDYW52YXMoKX08L21haW4+XG4gICAgICAgICAgPC9Jc01vYmlsZUNvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgIDwvRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQuUHJvdmlkZXI+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcHVibGljIGZvY3VzQ29udGFpbmVyOiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJmb2N1c0NvbnRhaW5lclwiXSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gIH07XG5cbiAgcHVibGljIGdldFNjZW5lRWxlbWVudHMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgfTtcblxuICBwcml2YXRlIHN5bmNBY3Rpb25SZXN1bHQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGFjdGlvblJlc3VsdDogQWN0aW9uUmVzdWx0KSA9PiB7XG4gICAgICBpZiAodGhpcy51bm1vdW50ZWQgfHwgYWN0aW9uUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBlZGl0aW5nRWxlbWVudDogQXBwU3RhdGVbXCJlZGl0aW5nRWxlbWVudFwiXSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5lbGVtZW50cykge1xuICAgICAgICBhY3Rpb25SZXN1bHQuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQ/LmlkID09PSBlbGVtZW50LmlkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50ICYmXG4gICAgICAgICAgICBpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5maWxlcykge1xuICAgICAgICB0aGlzLmZpbGVzID0gYWN0aW9uUmVzdWx0LnJlcGxhY2VGaWxlc1xuICAgICAgICAgID8gYWN0aW9uUmVzdWx0LmZpbGVzXG4gICAgICAgICAgOiB7IC4uLnRoaXMuZmlsZXMsIC4uLmFjdGlvblJlc3VsdC5maWxlcyB9O1xuICAgICAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IGVkaXRpbmdFbGVtZW50KSB7XG4gICAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZpZXdNb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnZpZXdNb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgbGV0IHplbk1vZGVFbmFibGVkID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uemVuTW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGxldCBncmlkU2l6ZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LmdyaWRTaXplIHx8IG51bGw7XG4gICAgICAgIGxldCB0aGVtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LnRoZW1lIHx8IFRIRU1FLkxJR0hUO1xuICAgICAgICBsZXQgbmFtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lm5hbWUgPz8gdGhpcy5zdGF0ZS5uYW1lO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdmlld01vZGVFbmFibGVkID0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCA9IHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgZ3JpZFNpemUgPSB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudGhlbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0aGVtZSA9IHRoaXMucHJvcHMudGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMubmFtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIC8vIHVzaW5nIE9iamVjdC5hc3NpZ24gaW5zdGVhZCBvZiBzcHJlYWQgdG8gZm9vbCBUUyA0LjIuMisgaW50b1xuICAgICAgICAgICAgLy8gcmVnYXJkaW5nIHRoZSByZXN1bHRpbmcgdHlwZSBhcyBub3QgY29udGFpbmluZyB1bmRlZmluZWRcbiAgICAgICAgICAgIC8vICh3aGljaCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2lsbCBuZXZlciBjb250YWluKVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IHt9LCB7XG4gICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OlxuICAgICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50IHx8IGFjdGlvblJlc3VsdC5hcHBTdGF0ZT8uZWRpdGluZ0VsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgZ3JpZFNpemUsXG4gICAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LnN5bmNIaXN0b3J5KSB7XG4gICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5zZXRDdXJyZW50U3RhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICAvLyBMaWZlY3ljbGVcblxuICBwcml2YXRlIG9uQmx1ciA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgaXNIb2xkaW5nU3BhY2UgPSBmYWxzZTtcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvblVubG9hZCA9ICgpID0+IHtcbiAgICB0aGlzLm9uQmx1cigpO1xuICB9O1xuXG4gIHByaXZhdGUgZGlzYWJsZUV2ZW50OiBFdmVudEhhbmRsZXJOb25OdWxsID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBwcml2YXRlIG9uRm9udExvYWRlZCA9ICgpID0+IHtcbiAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vblNjZW5lVXBkYXRlZCgpO1xuICB9O1xuXG4gIHByaXZhdGUgaW1wb3J0TGlicmFyeUZyb21VcmwgPSBhc3luYyAodXJsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaC5pbmNsdWRlcyhVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpKSB7XG4gICAgICBjb25zdCBoYXNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSk7XG4gICAgICBoYXNoLmRlbGV0ZShVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBBUFBfTkFNRSwgYCMke2hhc2gudG9TdHJpbmcoKX1gKTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIHF1ZXJ5LmRlbGV0ZShVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5KTtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgQVBQX05BTUUsIGA/JHtxdWVyeS50b1N0cmluZygpfWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goZGVjb2RlVVJJQ29tcG9uZW50KHVybCkpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlcXVlc3QuYmxvYigpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgYmxvYi50ZXh0KCkpO1xuICAgICAgaWYgKCFpc1ZhbGlkTGlicmFyeShqc29uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdG9rZW4gPT09IHRoaXMuaWQgfHxcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgdChcImFsZXJ0cy5jb25maXJtQWRkTGlicmFyeVwiLCB7IG51bVNoYXBlczoganNvbi5saWJyYXJ5Lmxlbmd0aCB9KSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGJsb2IpO1xuICAgICAgICAvLyBoYWNrIHRvIHJlcmVuZGVyIHRoZSBsaWJyYXJ5IGl0ZW1zIGFmdGVyIGltcG9ydFxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0xpYnJhcnlPcGVuKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB3aW5kb3cuYWxlcnQodChcImFsZXJ0cy5lcnJvckxvYWRpbmdMaWJyYXJ5XCIpKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRIaXN0b3J5ID0gKCkgPT4ge1xuICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgc2NlbmUgJiBoaXN0b3J5LlxuICAgKiAhIERvIG5vdCB1c2UgdG8gY2xlYXIgc2NlbmUgdXNlciBhY3Rpb24gIVxuICAgKi9cbiAgcHJpdmF0ZSByZXNldFNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChvcHRzPzogeyByZXNldExvYWRpbmdTdGF0ZTogYm9vbGVhbiB9KSA9PiB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4gKHtcbiAgICAgICAgLi4uZ2V0RGVmYXVsdEFwcFN0YXRlKCksXG4gICAgICAgIGlzTG9hZGluZzogb3B0cz8ucmVzZXRMb2FkaW5nU3RhdGUgPyBmYWxzZSA6IHN0YXRlLmlzTG9hZGluZyxcbiAgICAgICAgdGhlbWU6IHRoaXMuc3RhdGUudGhlbWUsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLnJlc2V0SGlzdG9yeSgpO1xuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2NlbmUgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKFwibGF1bmNoUXVldWVcIiBpbiB3aW5kb3cgJiYgXCJMYXVuY2hQYXJhbXNcIiBpbiB3aW5kb3cpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5sYXVuY2hRdWV1ZS5zZXRDb25zdW1lcihcbiAgICAgICAgYXN5bmMgKGxhdW5jaFBhcmFtczogeyBmaWxlczogYW55W10gfSkgPT4ge1xuICAgICAgICAgIGlmICghbGF1bmNoUGFyYW1zLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gbGF1bmNoUGFyYW1zLmZpbGVzWzBdO1xuICAgICAgICAgIGNvbnN0IGJsb2I6IEJsb2IgPSBhd2FpdCBmaWxlSGFuZGxlLmdldEZpbGUoKTtcbiAgICAgICAgICBibG9iLmhhbmRsZSA9IGZpbGVIYW5kbGU7XG4gICAgICAgICAgbG9hZEZyb21CbG9iKFxuICAgICAgICAgICAgYmxvYixcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKChzY2VuZSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgICAgICAgIC4uLnNjZW5lLFxuICAgICAgICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAgICAgICAuLi4oc2NlbmUuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgbGV0IGluaXRpYWxEYXRhID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgaW5pdGlhbERhdGEgPSAoYXdhaXQgdGhpcy5wcm9wcy5pbml0aWFsRGF0YSkgfHwgbnVsbDtcbiAgICAgIGlmIChpbml0aWFsRGF0YT8ubGlicmFyeUl0ZW1zKSB7XG4gICAgICAgIHRoaXMubGlicmFyeUl0ZW1zRnJvbVN0b3JhZ2UgPSBpbml0aWFsRGF0YS5saWJyYXJ5SXRlbXM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICBcIkVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBpbXBvcnRpbmcgb3IgcmVzdG9yaW5nIHNjZW5lIGRhdGFcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcblxuICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICBlbGVtZW50VHlwZTpcbiAgICAgICAgc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUgPT09IFwiaW1hZ2VcIlxuICAgICAgICAgID8gXCJzZWxlY3Rpb25cIlxuICAgICAgICAgIDogc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKGluaXRpYWxEYXRhPy5zY3JvbGxUb0NvbnRlbnQpIHtcbiAgICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICAgIHNjZW5lLmVsZW1lbnRzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc3RhdGUud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc3RhdGUuaGVpZ2h0LFxuICAgICAgICAgICAgb2Zmc2V0VG9wOiB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgICAgIG9mZnNldExlZnQ6IHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgIC4uLnNjZW5lLFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbGlicmFyeVVybCA9XG4gICAgICAvLyBjdXJyZW50XG4gICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKS5nZXQoXG4gICAgICAgIFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSxcbiAgICAgICkgfHxcbiAgICAgIC8vIGxlZ2FjeSwga2VwdCBmb3IgY29tcGF0IHJlYXNvbnNcbiAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KFxuICAgICAgICBVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5LFxuICAgICAgKTtcblxuICAgIGlmIChsaWJyYXJ5VXJsKSB7XG4gICAgICBhd2FpdCB0aGlzLmltcG9ydExpYnJhcnlGcm9tVXJsKGxpYnJhcnlVcmwpO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUuY29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbiAgICApIHtcbiAgICAgIGNvbnN0IHNldFN0YXRlID0gdGhpcy5zZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZXRTdGF0ZToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHNldFN0YXRlPikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoLi4uYXJncyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLFxuICAgICAgICB9LFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNjZW5lLmFkZENhbGxiYWNrKHRoaXMub25TY2VuZVVwZGF0ZWQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGlmIChcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93ICYmIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIC8vIGNvbXB1dGUgaXNNb2JpbGUgc3RhdGVcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgIH0gPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuaXNNb2JpbGUgPVxuICAgICAgICAgIHdpZHRoIDwgTVFfTUFYX1dJRFRIX1BPUlRSQUlUIHx8XG4gICAgICAgICAgKGhlaWdodCA8IE1RX01BWF9IRUlHSFRfTEFORFNDQVBFICYmIHdpZHRoIDwgTVFfTUFYX1dJRFRIX0xBTkRTQ0FQRSk7XG4gICAgICAgIC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy51cGRhdGVET01SZWN0KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX1BPUlRSQUlUfXB4KSwgKG1heC1oZWlnaHQ6ICR7TVFfTUFYX0hFSUdIVF9MQU5EU0NBUEV9cHgpIGFuZCAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9MQU5EU0NBUEV9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4gKHRoaXMuaXNNb2JpbGUgPSBtZWRpYVF1ZXJ5Lm1hdGNoZXMpO1xuICAgICAgbWVkaWFRdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgIHRoaXMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSAoKSA9PiBtZWRpYVF1ZXJ5LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhcIndlYi1zaGFyZS10YXJnZXRcIikpIHtcbiAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICB0aGlzLnJlc3RvcmVGaWxlRnJvbVNoYXJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRE9NUmVjdCh0aGlzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuaW1hZ2VDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuc2NlbmUuZGVzdHJveSgpO1xuICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgIHRvdWNoVGltZW91dCA9IDA7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKCgpID0+IHtcbiAgICB0aGlzLnNjZW5lXG4gICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpKTtcbiAgICB0aGlzLnNldFN0YXRlKHt9KTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ1VULCB0aGlzLm9uQ3V0KTtcbiAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuU0NST0xMLFxuICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuTU9VU0VfTU9WRSxcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXApO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9TVEFSVCxcbiAgICAgIHRoaXMub25HZXN0dXJlU3RhcnQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9DSEFOR0UsXG4gICAgICB0aGlzLm9uR2VzdHVyZUNoYW5nZSBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0VORCxcbiAgICAgIHRoaXMub25HZXN0dXJlRW5kIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTsgLy8gIzM1NTNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5NT1VTRV9NT1ZFLFxuICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sXG4gICAgKTtcbiAgICAvLyByZXJlbmRlciB0ZXh0IGVsZW1lbnRzIG9uIGZvbnQgbG9hZCB0byBmaXggIzYzNyAmJiAjMTU1M1xuICAgIGRvY3VtZW50LmZvbnRzPy5hZGRFdmVudExpc3RlbmVyPy4oXCJsb2FkaW5nZG9uZVwiLCB0aGlzLm9uRm9udExvYWRlZCk7XG4gICAgLy8gU2FmYXJpLW9ubHkgZGVza3RvcCBwaW5jaCB6b29tXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZGV0ZWN0U2Nyb2xsKSB7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIoXG4gICAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICAgICk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBBcHBQcm9wcywgcHJldlN0YXRlOiBBcHBTdGF0ZSkge1xuICAgIGlmIChwcmV2UHJvcHMubGFuZ0NvZGUgIT09IHRoaXMucHJvcHMubGFuZ0NvZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aWV3TW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZTdGF0ZS52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnplbk1vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgemVuTW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnRoZW1lICE9PSB0aGlzLnByb3BzLnRoZW1lICYmIHRoaXMucHJvcHMudGhlbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB0aGVtZTogdGhpcy5wcm9wcy50aGVtZSB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBncmlkU2l6ZTogdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMubmFtZSAmJiBwcmV2UHJvcHMubmFtZSAhPT0gdGhpcy5wcm9wcy5uYW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbmFtZTogdGhpcy5wcm9wcy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICBcInRoZW1lLS1kYXJrXCIsXG4gICAgICB0aGlzLnN0YXRlLnRoZW1lID09PSBcImRhcmtcIixcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkXVxuICAgICkge1xuICAgICAgLy8gZGVmZXIgc28gdGhhdCB0aGUgY29tbWl0VG9IaXN0b3J5IGZsYWcgaXNuJ3QgcmVzZXQgdmlhIGN1cnJlbnQgdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgbXVsdGlFbGVtZW50IH0gPSBwcmV2U3RhdGU7XG4gICAgaWYgKFxuICAgICAgcHJldlN0YXRlLmVsZW1lbnRUeXBlICE9PSB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICYmXG4gICAgICBtdWx0aUVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJlxuICAgICAgaXNCaW5kaW5nRWxlbWVudChtdWx0aUVsZW1lbnQpXG4gICAgKSB7XG4gICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgIHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50QXRJbmRleEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yQnV0dG9uOiB7XG4gICAgICBbaWQ6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclZpZXdwb3J0Q29vcmRzOiBTY2VuZVN0YXRlW1wicmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzXCJdID0ge307XG4gICAgY29uc3QgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiBTY2VuZVN0YXRlW1wicmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzXCJdID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJuYW1lczogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJTdGF0ZXM6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKCh1c2VyLCBzb2NrZXRJZCkgPT4ge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdLnB1c2goc29ja2V0SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXIucG9pbnRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VyU3RhdGUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJTdGF0ZXNbc29ja2V0SWRdID0gdXNlci51c2VyU3RhdGU7XG4gICAgICB9XG4gICAgICBwb2ludGVyVmlld3BvcnRDb29yZHNbc29ja2V0SWRdID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICB7XG4gICAgICAgICAgc2NlbmVYOiB1c2VyLnBvaW50ZXIueCxcbiAgICAgICAgICBzY2VuZVk6IHVzZXIucG9pbnRlci55LFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGN1cnNvckJ1dHRvbltzb2NrZXRJZF0gPSB1c2VyLmJ1dHRvbjtcbiAgICB9KTtcbiAgICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5maWx0ZXIoKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8gbm90IHBsYWNlZCBvbiBjYW52YXMgeWV0IChidXQgaW4gZWxlbWVudHMgYXJyYXkpXG4gICAgICAgICAgdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50ICYmXG4gICAgICAgICAgZWxlbWVudC5pZCA9PT0gdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LmlkXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZG9uJ3QgcmVuZGVyIHRleHQgZWxlbWVudCB0aGF0J3MgYmVpbmcgY3VycmVudGx5IGVkaXRlZCAoaXQnc1xuICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCB8fFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8XG4gICAgICAgIGVsZW1lbnQuaWQgIT09IHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQuaWRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgeyBhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQsIHNjcm9sbEJhcnMgfSA9IHJlbmRlclNjZW5lKFxuICAgICAgcmVuZGVyaW5nRWxlbWVudHMsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb25FbGVtZW50LFxuICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICB0aGlzLnJjISxcbiAgICAgIHRoaXMuY2FudmFzISxcbiAgICAgIHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYLFxuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFksXG4gICAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUudmlld0JhY2tncm91bmRDb2xvcixcbiAgICAgICAgem9vbTogdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHBvaW50ZXJWaWV3cG9ydENvb3JkcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlckJ1dHRvbjogY3Vyc29yQnV0dG9uLFxuICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHBvaW50ZXJVc2VybmFtZXMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiBwb2ludGVyVXNlclN0YXRlcyxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0aGlzLnN0YXRlLnNob3VsZENhY2hlSWdub3JlWm9vbSxcbiAgICAgICAgdGhlbWU6IHRoaXMuc3RhdGUudGhlbWUsXG4gICAgICAgIGltYWdlQ2FjaGU6IHRoaXMuaW1hZ2VDYWNoZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlbmRlck9wdGltaXphdGlvbnM6IHRydWUsXG4gICAgICAgIHJlbmRlclNjcm9sbGJhcnM6ICF0aGlzLmlzTW9iaWxlLFxuICAgICAgfSxcbiAgICApO1xuICAgIGlmIChzY3JvbGxCYXJzKSB7XG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyA9IHNjcm9sbEJhcnM7XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbGVkT3V0c2lkZSA9XG4gICAgICAvLyBoaWRlIHdoZW4gZWRpdGluZyB0ZXh0XG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py50eXBlID09PSBcInRleHRcIlxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2Nyb2xsZWRPdXRzaWRlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG5cbiAgICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7XG5cbiAgICAvLyBEbyBub3Qgbm90aWZ5IGNvbnN1bWVycyBpZiB3ZSdyZSBzdGlsbCBsb2FkaW5nIHRoZSBzY2VuZS4gQW1vbmcgb3RoZXJcbiAgICAvLyBwb3RlbnRpYWwgaXNzdWVzLCB0aGlzIGZpeGVzIGEgY2FzZSB3aGVyZSB0aGUgdGFiIGlzbid0IGZvY3VzZWQgZHVyaW5nXG4gICAgLy8gaW5pdCwgd2hpY2ggd291bGQgdHJpZ2dlciBvbkNoYW5nZSB3aXRoIGVtcHR5IGVsZW1lbnRzLCB3aGljaCB3b3VsZCB0aGVuXG4gICAgLy8gb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gbG9jYWxTdG9yYWdlIGN1cnJlbnRseS5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlPy4oXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuZmlsZXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TY3JvbGwgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgY29uc3QgeyBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpO1xuICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiB7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0TGVmdCA9PT0gb2Zmc2V0TGVmdCAmJiBzdGF0ZS5vZmZzZXRUb3AgPT09IG9mZnNldFRvcCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9O1xuICAgIH0pO1xuICB9LCBTQ1JPTExfVElNRU9VVCk7XG5cbiAgLy8gQ29weS9wYXN0ZVxuXG4gIHByaXZhdGUgb25DdXQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3V0QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvbkNvcHkgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHByaXZhdGUgY3V0QWxsID0gKCkgPT4ge1xuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlbGV0ZVNlbGVjdGVkKTtcbiAgfTtcblxuICBwcml2YXRlIGNvcHlBbGwgPSAoKSA9PiB7XG4gICAgY29weVRvQ2xpcGJvYXJkKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSwgdGhpcy5maWxlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzZXRUYXBUd2ljZSgpIHtcbiAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblRhcFN0YXJ0ID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgaWYgKCFkaWRUYXBUd2ljZSkge1xuICAgICAgZGlkVGFwVHdpY2UgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgICAgdGFwcGVkVHdpY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICBBcHAucmVzZXRUYXBUd2ljZSxcbiAgICAgICAgVEFQX1RXSUNFX1RJTUVPVVQsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpbnNlcnQgdGV4dCBvbmx5IGlmIHdlIHRhcHBlZCB0d2ljZSB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIC8vIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxIHdpbGwgYWxzbyBwcmV2ZW50IGluc2VydGluZyB0ZXh0IHdoZW4gdXNlcidzIHpvb21pbmdcbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayh7XG4gICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICB9KTtcbiAgICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uVGFwRW5kID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcGFzdGVGcm9tQ2xpcGJvYXJkID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIGFzeW5jIChldmVudDogQ2xpcGJvYXJkRXZlbnQgfCBudWxsKSA9PiB7XG4gICAgICAvLyAjNjg2XG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgICB0YXJnZXQsXG4gICAgICApO1xuICAgICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50VW5kZXJDdXJzb3IgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGN1cnNvclgsIGN1cnNvclkpO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAgIC8vIHRodXMgdGhlc2UgY2hlY2tzIGRvbid0IG1ha2Ugc2Vuc2VcbiAgICAgICAgZXZlbnQgJiZcbiAgICAgICAgKCEoZWxlbWVudFVuZGVyQ3Vyc29yIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHx8XG4gICAgICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGxldCBmaWxlID0gZXZlbnQ/LmNsaXBib2FyZERhdGE/LmZpbGVzWzBdO1xuXG4gICAgICBpZiAoIWZpbGUgJiYgZGF0YS50ZXh0KSB7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IGRhdGEudGV4dC50cmltKCk7XG4gICAgICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aChcIjxzdmdcIikgJiYgc3RyaW5nLmVuZHNXaXRoKFwiPC9zdmc+XCIpKSB7XG4gICAgICAgICAgLy8gaWdub3JlIFNWRyB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24gd2hpY2ggd2lsbCBiZSBkb25lIGR1cmluZyBpbWFnZVxuICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgICAgICAgZmlsZSA9IFNWR1N0cmluZ1RvRmlsZShzdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICBjb25zdCB7IHg6IHNjZW5lWCwgeTogc2NlbmVZIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgeyBjbGllbnRYOiBjdXJzb3JYLCBjbGllbnRZOiBjdXJzb3JZIH0sXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCh7IHNjZW5lWCwgc2NlbmVZIH0pO1xuICAgICAgICB0aGlzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoYXdhaXQgdGhpcy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgZWxlbWVudHM6IGRhdGEuZWxlbWVudHMsXG4gICAgICAgICAgZmlsZXM6IGRhdGEuZmlsZXMgfHwgbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogXCJjdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICB0aGlzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKFwic2VsZWN0aW9uXCIpO1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5ID0gKG9wdHM6IHtcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsO1xuICAgIHBvc2l0aW9uOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBcImN1cnNvclwiIHwgXCJjZW50ZXJcIjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKG9wdHMuZWxlbWVudHMsIG51bGwpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG5cbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuXG4gICAgY29uc3QgY2xpZW50WCA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WFxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JYXG4gICAgICAgIDogdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WVxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JZXG4gICAgICAgIDogdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WCwgY2xpZW50WSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZHggPSB4IC0gZWxlbWVudHNDZW50ZXJYO1xuICAgIGNvbnN0IGR5ID0geSAtIGVsZW1lbnRzQ2VudGVyWTtcbiAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgbmV3RWxlbWVudHMgPSBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICBncm91cElkTWFwLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB7XG4gICAgICAgICAgeDogZWxlbWVudC54ICsgZ3JpZFggLSBtaW5YLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIGdyaWRZIC0gbWluWSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBvbGRJZFRvRHVwbGljYXRlZElkLnNldChlbGVtZW50LmlkLCBuZXdFbGVtZW50LmlkKTtcbiAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgIH0pO1xuICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFtcbiAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAuLi5uZXdFbGVtZW50cyxcbiAgICBdO1xuICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihuZXh0RWxlbWVudHMsIGVsZW1lbnRzLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcblxuICAgIGlmIChvcHRzLmZpbGVzKSB7XG4gICAgICB0aGlzLmZpbGVzID0geyAuLi50aGlzLmZpbGVzLCAuLi5vcHRzLmZpbGVzIH07XG4gICAgfVxuXG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMobmV4dEVsZW1lbnRzKTtcbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgIGlzTGlicmFyeU9wZW46IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKChtYXAsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIG1hcFtlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgIH0sIHt9IGFzIGFueSksXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICksXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmIChvcHRzLmZpbGVzKSB7XG4gICAgICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKFwic2VsZWN0aW9uXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgYWRkVGV4dEZyb21QYXN0ZSh0ZXh0OiBhbnkpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WDogY3Vyc29yWCwgY2xpZW50WTogY3Vyc29yWSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0LFxuICAgICAgcmF3VGV4dDogdGV4dCxcbiAgICAgIGZvbnRTaXplOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtlbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgfVxuXG4gIC8vIENvbGxhYm9yYXRpb25cblxuICBzZXRBcHBTdGF0ZSA9IChvYmo6IGFueSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICByZW1vdmVQb2ludGVyID0gKGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTEVsZW1lbnQ+IHwgUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgLy8gcmVtb3ZlIHRvdWNoIGhhbmRsZXIgZm9yIGNvbnRleHQgbWVudSBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIgJiYgdG91Y2hUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICAgIHRvdWNoVGltZW91dCA9IDA7XG4gICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXN0dXJlLnBvaW50ZXJzLmRlbGV0ZShldmVudC5wb2ludGVySWQpO1xuICB9O1xuXG4gIHRvZ2dsZUxvY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50TG9ja2VkOiAhcHJldlN0YXRlLmVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBwcmV2U3RhdGUuZWxlbWVudExvY2tlZFxuICAgICAgICAgID8gXCJzZWxlY3Rpb25cIlxuICAgICAgICAgIDogcHJldlN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB0b2dnbGVaZW5Nb2RlID0gKCkgPT4ge1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblRvZ2dsZVplbk1vZGUpO1xuICB9O1xuXG4gIHRvZ2dsZVN0YXRzID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5zdGF0ZS5zaG93U3RhdHMpIHtcbiAgICAgIHRyYWNrRXZlbnQoXCJkaWFsb2dcIiwgXCJzdGF0c1wiKTtcbiAgICB9XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uVG9nZ2xlU3RhdHMpO1xuICB9O1xuXG4gIHNjcm9sbFRvQ29udGVudCA9IChcbiAgICB0YXJnZXQ6XG4gICAgICB8IEV4Y2FsaWRyYXdFbGVtZW50XG4gICAgICB8IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbdGFyZ2V0XSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICApLFxuICAgIH0pO1xuICB9O1xuXG4gIHpvb21Ub0ZpdCA9IChcbiAgICB0YXJnZXQ6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgbWF4Wm9vbTogbnVtYmVyID0gMSwgLy9udWxsIHdpbGwgem9vbSB0byBtYXggYmFzZWQgb24gdmlld3BvcnRcbiAgICBtYXJnaW46IG51bWJlciA9IDAuMDMsIC8vcGVyY2VudGFnZSBvZiB2aWV3cG9ydCB3aWR0aCZoZWlnaHRcbiAgKSA9PiB7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRhcmdldCA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDApIHtcbiAgICAgIG1heFpvb20gPSAxO1xuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgem9vbVRvRml0RWxlbWVudHModGFyZ2V0LCB0aGlzLnN0YXRlLCBmYWxzZSwgbWF4Wm9vbSwgbWFyZ2luKS5hcHBTdGF0ZSxcbiAgICApO1xuICB9O1xuXG4gIGNsZWFyVG9hc3QgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRvYXN0TWVzc2FnZTogbnVsbCB9KTtcbiAgfTtcblxuICBzZXRUb2FzdE1lc3NhZ2UgPSAodG9hc3RNZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgdG9hc3RNZXNzYWdlIH0pO1xuICB9O1xuXG4gIHJlc3RvcmVGaWxlRnJvbVNoYXJlID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuXG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgd2ViU2hhcmVUYXJnZXRDYWNoZS5tYXRjaChcInNoYXJlZC1maWxlXCIpO1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IGZpbGUuYmxvYigpO1xuICAgICAgICB0aGlzLmxvYWRGaWxlVG9DYW52YXMoYmxvYik7XG4gICAgICAgIGF3YWl0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUuZGVsZXRlKFwic2hhcmVkLWZpbGVcIik7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBBUFBfTkFNRSwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKiogYWRkcyBzdXBwbGllZCBmaWxlcyB0byBleGlzdGluZyBmaWxlcyBpbiB0aGUgYXBwU3RhdGUgKi9cbiAgcHVibGljIGFkZEZpbGVzOiBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSVtcImFkZEZpbGVzXCJdID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChmaWxlcykgPT4ge1xuICAgICAgY29uc3QgZmlsZXNNYXAgPSBmaWxlcy5yZWR1Y2UoKGFjYywgZmlsZURhdGEpID0+IHtcbiAgICAgICAgYWNjLnNldChmaWxlRGF0YS5pZCwgZmlsZURhdGEpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcDxGaWxlSWQsIEJpbmFyeUZpbGVEYXRhPigpKTtcblxuICAgICAgdGhpcy5maWxlcyA9IHsgLi4udGhpcy5maWxlcywgLi4uT2JqZWN0LmZyb21FbnRyaWVzKGZpbGVzTWFwKSB9O1xuICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcblxuICAgICAgLy8gYnVtcCB2ZXJzaW9ucyBmb3IgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgYWRkZWQgZmlsZXMgc28gdGhhdFxuICAgICAgLy8gd2UvaG9zdCBhcHBzIGNhbiBkZXRlY3QgdGhlIGNoYW5nZVxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgICAgICBmaWxlc01hcC5oYXMoZWxlbWVudC5maWxlSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIGJ1bXBWZXJzaW9uKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcbiAgICB9LFxuICApO1xuXG4gIHB1YmxpYyB1cGRhdGVTY2VuZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICA8SyBleHRlbmRzIGtleW9mIEFwcFN0YXRlPihzY2VuZURhdGE6IHtcbiAgICAgIGVsZW1lbnRzPzogU2NlbmVEYXRhW1wiZWxlbWVudHNcIl07XG4gICAgICBhcHBTdGF0ZT86IFBpY2s8QXBwU3RhdGUsIEs+IHwgbnVsbDtcbiAgICAgIGNvbGxhYm9yYXRvcnM/OiBTY2VuZURhdGFbXCJjb2xsYWJvcmF0b3JzXCJdO1xuICAgICAgY29tbWl0VG9IaXN0b3J5PzogU2NlbmVEYXRhW1wiY29tbWl0VG9IaXN0b3J5XCJdO1xuICAgIH0pID0+IHtcbiAgICAgIGlmIChzY2VuZURhdGEuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjZW5lRGF0YS5hcHBTdGF0ZSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHNjZW5lRGF0YS5hcHBTdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoc2NlbmVEYXRhLmVsZW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjb2xsYWJvcmF0b3JzOiBzY2VuZURhdGEuY29sbGFib3JhdG9ycyB9KTtcbiAgICAgIH1cbiAgICB9LFxuICApO1xuXG4gIHByaXZhdGUgb25TY2VuZVVwZGF0ZWQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7fSk7XG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjdXJzb3JYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGN1cnNvclkgPSBldmVudC5jbGllbnRZO1xuICAgIH0sXG4gICk7XG5cbiAgLy8gSW5wdXQgaGFuZGxpbmdcblxuICBwcml2YXRlIG9uS2V5RG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAoZXZlbnQ6IFJlYWN0LktleWJvYXJkRXZlbnQgfCBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBub3JtYWxpemUgYGV2ZW50LmtleWAgd2hlbiBDYXBzTG9jayBpcyBwcmVzc2VkICMyMzcyXG4gICAgICBpZiAoXG4gICAgICAgIFwiUHJveHlcIiBpbiB3aW5kb3cgJiZcbiAgICAgICAgKCghZXZlbnQuc2hpZnRLZXkgJiYgL15bQS1aXSQvLnRlc3QoZXZlbnQua2V5KSkgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXkgJiYgL15bYS16XSQvLnRlc3QoZXZlbnQua2V5KSkpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnQgPSBuZXcgUHJveHkoZXZlbnQsIHtcbiAgICAgICAgICBnZXQoZXY6IGFueSwgcHJvcCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBldltwcm9wXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAvLyBmaXggZm9yIFByb3hpZXMgaGlqYWNraW5nIGB0aGlzYFxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcCA9PT0gXCJrZXlcIlxuICAgICAgICAgICAgICA/IC8vIENhcHNMb2NrIGludmVydHMgY2FwaXRhbGl6YXRpb24gYmFzZWQgb24gU2hpZnRLZXksIHNvIGludmVydFxuICAgICAgICAgICAgICAgIC8vIGl0IGJhY2tcbiAgICAgICAgICAgICAgICBldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgICAgID8gZXYua2V5LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICA6IGV2LmtleS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgKGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkgJiYgZXZlbnQua2V5ICE9PSBLRVlTLkVTQ0FQRSkgfHxcbiAgICAgICAgLy8gY2FzZTogdXNpbmcgYXJyb3dzIHRvIG1vdmUgYmV0d2VlbiBidXR0b25zXG4gICAgICAgIChpc0Fycm93S2V5KGV2ZW50LmtleSkgJiYgaXNJbnB1dExpa2UoZXZlbnQudGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUVVFU1RJT05fTUFSSykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93SGVscERpYWxvZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFjdGlvbk1hbmFnZXIuaGFuZGxlS2V5RG93bihldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgdGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLlpFUk8pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46ICF0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4gfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9XG4gICAgICAgICAgKHRoaXMuc3RhdGUuZ3JpZFNpemUgJiZcbiAgICAgICAgICAgIChldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgICA/IEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVFxuICAgICAgICAgICAgICA6IHRoaXMuc3RhdGUuZ3JpZFNpemUpKSB8fFxuICAgICAgICAgIChldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgPyBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlRcbiAgICAgICAgICAgIDogRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5zY2VuZVxuICAgICAgICAgIC5nZXRFbGVtZW50cygpXG4gICAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pO1xuXG4gICAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICAgIG9mZnNldFggPSAtc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfUklHSFQpIHtcbiAgICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfVVApIHtcbiAgICAgICAgICBvZmZzZXRZID0gLXN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgICBvZmZzZXRZID0gc3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgICAgeDogZWxlbWVudC54ICsgb2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUikge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICFpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgICAgICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICAgICAgc2NlbmVYOiBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQgPT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG4gICAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKHNoYXBlKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuUSkge1xuICAgICAgICAgIHRoaXMudG9nZ2xlTG9jaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlNQQUNFICYmIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBpc0hvbGRpbmdTcGFjZSA9IHRydWU7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkcgfHwgZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgICAgIXNlbGVjdGVkRWxlbWVudHMubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudC5rZXkgPT09IEtFWVMuRyAmJlxuICAgICAgICAgIChoYXNCYWNrZ3JvdW5kKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpIHx8XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGhhc0JhY2tncm91bmQoZWxlbWVudC50eXBlKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuUG9wdXA6IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5Qb3B1cDogXCJzdHJva2VDb2xvclBpY2tlclwiIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uS2V5VXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIXRoaXMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzQmluZGluZ0VuYWJsZWQ6IHRydWUgfSk7XG4gICAgfVxuICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKVxuICAgICAgICA/IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cylcbiAgICAgICAgOiB1bmJpbmRMaW5lYXJFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10gfSk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIHNlbGVjdFNoYXBlVG9vbChlbGVtZW50VHlwZTogQXBwU3RhdGVbXCJlbGVtZW50VHlwZVwiXSkge1xuICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCBlbGVtZW50VHlwZSk7XG4gICAgfVxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10gfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICB0aGlzLm9uSW1hZ2VBY3Rpb24oKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZWxlbWVudFR5cGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkdlc3R1cmVTdGFydCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgIH0pO1xuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICB9KTtcblxuICBwcml2YXRlIG9uR2VzdHVyZUNoYW5nZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBvbkdlc3R1cmVDaGFuZ2Ugb25seSBoYXMgem9vbSBmYWN0b3IgYnV0IG5vdCB0aGUgY2VudGVyLlxuICAgIC8vIElmIHdlJ3JlIG9uIGlQYWQgb3IgaVBob25lLCB0aGVuIHdlIHJlY29nbml6ZSBtdWx0aS10b3VjaCBhbmQgd2lsbFxuICAgIC8vIHpvb20gaW4gYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIG9uIHRoZSB0b3VjaE1vdmUgaGFuZGxlciBhbHJlYWR5LlxuICAgIC8vIE9uIE1hY2Jvb2ssIHdlIGRvbid0IGhhdmUgdGhvc2UgZXZlbnRzIHNvIHdpbGwgem9vbSBpbiBhdCB0aGVcbiAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluc3RlYWQuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuICAgIGlmIChpbml0aWFsU2NhbGUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHsgem9vbSwgb2Zmc2V0TGVmdCwgb2Zmc2V0VG9wIH0pID0+ICh7XG4gICAgICAgIHpvb206IGdldE5ld1pvb20oXG4gICAgICAgICAgZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogZXZlbnQuc2NhbGUpLFxuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgeyBsZWZ0OiBvZmZzZXRMZWZ0LCB0b3A6IG9mZnNldFRvcCB9LFxuICAgICAgICAgIHsgeDogY3Vyc29yWCwgeTogY3Vyc29yWSB9LFxuICAgICAgICApLFxuICAgICAgfSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJpdmF0ZSBvbkdlc3R1cmVFbmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBHZXN0dXJlRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgIH0pO1xuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXh0V3lzaXd5ZyhcbiAgICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IChcbiAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgIHJhd1RleHQ/OiBzdHJpbmcsXG4gICAgICBpc0RlbGV0ZWQgPSBmYWxzZSxcbiAgICApID0+IHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoKF9lbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVGV4dEVsZW1lbnQoX2VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgcmF3VGV4dDogcmF3VGV4dCA/IHJhd1RleHQgOiB0ZXh0LFxuICAgICAgICAgICAgICBpc0RlbGV0ZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgIH07XG5cbiAgICBpZiAoaXNFeGlzdGluZ0VsZW1lbnQgJiYgdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KGVsZW1lbnQpO1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKChfZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQgPSB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgaXNEZWxldGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0ZXh0V3lzaXd5Zyh7XG4gICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgY2FudmFzOiB0aGlzLmNhbnZhcyxcbiAgICAgIGdldFZpZXdwb3J0Q29vcmRzOiAoeCwgeSkgPT4ge1xuICAgICAgICBjb25zdCB7IHg6IHZpZXdwb3J0WCwgeTogdmlld3BvcnRZIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICAgICAgc2NlbmVZOiB5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB2aWV3cG9ydFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgICAgdmlld3BvcnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6IHdpdGhCYXRjaGVkVXBkYXRlcygodGV4dCkgPT4ge1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQpO1xuICAgICAgICBpZiAoaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgb25TdWJtaXQ6IHdpdGhCYXRjaGVkVXBkYXRlcygoeyB0ZXh0LCB2aWFLZXlib2FyZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRGVsZXRlZCA9ICF0ZXh0LnRyaW0oKTtcbiAgICAgICAgY29uc3QgcmF3VGV4dCA9IHRleHQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdCkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRUZXh0ID0gdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRTdWJtaXQoXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGlzRGVsZXRlZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRleHQgPSB1cGRhdGVkVGV4dCA/PyB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgcmF3VGV4dCwgaXNEZWxldGVkKTtcbiAgICAgICAgLy8gc2VsZWN0IHRoZSBjcmVhdGVkIHRleHQgZWxlbWVudCBvbmx5IGlmIHN1Ym1pdHRpbmcgdmlhIGtleWJvYXJkXG4gICAgICAgIC8vICh3aGVuIHN1Ym1pdHRpbmcgdmlhIGNsaWNrIGl0IHNob3VsZCBhY3QgYXMgc2lnbmFsIHRvIGRlc2VsZWN0KVxuICAgICAgICBpZiAoIWlzRGVsZXRlZCAmJiB2aWFLZXlib2FyZCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICBbZWxlbWVudC5pZF06IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZWxldGVkKSB7XG4gICAgICAgICAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgW2VsZW1lbnRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRGVsZXRlZCB8fCBpc0V4aXN0aW5nRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9KSxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBleGNhbGlkcmF3Q29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICB9KTtcbiAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgZWxlbWVudHMgd2hlbiBpbnNlcnRpbmcgdGV4dFxuICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpO1xuXG4gICAgLy8gZG8gYW4gaW5pdGlhbCB1cGRhdGUgdG8gcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHBvc2l0aW9uIHNpbmNlIHdlIHdlcmVcbiAgICAvLyBtb2RpZnlpbmcgZWxlbWVudCdzIHgveSBmb3Igc2FrZSBvZiBlZGl0b3IgKGNhc2U6IHN5bmNpbmcgdG8gcmVtb3RlKVxuICAgIHVwZGF0ZUVsZW1lbnQoZWxlbWVudC50ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzZWxlY3RFbGVtZW50cygpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+IHwgbnVsbCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oeCwgeSk7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmICFlbGVtZW50LmlzRGVsZXRlZCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIG9wdHM/OiB7XG4gICAgICAvKiogaWYgdHJ1ZSwgcmV0dXJucyB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudCAod2l0aCBoaWdoZXN0IHotaW5kZXgpXG4gICAgICAgIG9mIGFsbCBoaXQgZWxlbWVudHMgKi9cbiAgICAgIHByZWZlclNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICB9LFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PiB8IG51bGwge1xuICAgIGNvbnN0IGFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oeCwgeSk7XG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChvcHRzPy5wcmVmZXJTZWxlY3RlZCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IGFsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID4gLTE7IGluZGV4LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbYWxsSGl0RWxlbWVudHNbaW5kZXhdLmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRXaXRoSGlnaGVzdFpJbmRleCA9XG4gICAgICAgIGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gSWYgd2UncmUgaGl0dGluZyBlbGVtZW50IHdpdGggaGlnaGVzdCB6LWluZGV4IG9ubHkgb24gaXRzIGJvdW5kaW5nIGJveFxuICAgICAgLy8gd2hpbGUgYWxzbyBoaXR0aW5nIG90aGVyIGVsZW1lbnQgZmlndXJlLCB0aGUgbGF0dGVyIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChcbiAgICAgICAgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgKVxuICAgICAgICA/IGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDJdXG4gICAgICAgIDogZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4O1xuICAgIH1cbiAgICBpZiAoYWxsSGl0RWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gYWxsSGl0RWxlbWVudHNbMF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXSB7XG4gICAgcmV0dXJuIGdldEVsZW1lbnRzQXRQb3NpdGlvbih0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIChlbGVtZW50KSA9PlxuICAgICAgaGl0VGVzdChlbGVtZW50LCB0aGlzLnN0YXRlLCB4LCB5KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFRleHRFZGl0aW5nID0gKHtcbiAgICBzY2VuZVgsXG4gICAgc2NlbmVZLFxuICAgIGluc2VydEF0UGFyZW50Q2VudGVyID0gdHJ1ZSxcbiAgfToge1xuICAgIC8qKiBYIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0IGF0ICovXG4gICAgc2NlbmVYOiBudW1iZXI7XG4gICAgLyoqIFkgcG9zaXRpb24gdG8gaW5zZXJ0IHRleHQgYXQgKi9cbiAgICBzY2VuZVk6IG51bWJlcjtcbiAgICAvKiogd2hldGhlciB0byBhdHRlbXB0IHRvIGluc2VydCBhdCBlbGVtZW50IGNlbnRlciBpZiBhcHBsaWNhYmxlICovXG4gICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI/OiBib29sZWFuO1xuICB9KSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdUZXh0RWxlbWVudCA9IHRoaXMuZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZKTtcblxuICAgIGNvbnN0IHBhcmVudENlbnRlclBvc2l0aW9uID1cbiAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyICYmXG4gICAgICB0aGlzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICAgID8gZXhpc3RpbmdUZXh0RWxlbWVudFxuICAgICAgOiBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgICAgeDogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclhcbiAgICAgICAgICAgIDogc2NlbmVYLFxuICAgICAgICAgIHk6IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJZXG4gICAgICAgICAgICA6IHNjZW5lWSxcbiAgICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICByYXdUZXh0OiBcIlwiLFxuICAgICAgICAgIGZvbnRTaXplOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICAgICAgZm9udEZhbWlseTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICAgICAgdGV4dEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBcImNlbnRlclwiXG4gICAgICAgICAgICA6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gXCJtaWRkbGVcIlxuICAgICAgICAgICAgOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgICB9KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBlZGl0aW5nRWxlbWVudDogZWxlbWVudCB9KTtcblxuICAgIGlmIChleGlzdGluZ1RleHRFbGVtZW50KSB7XG4gICAgICAvLyBpZiB0ZXh0IGVsZW1lbnQgaXMgbm8gbG9uZ2VyIGNlbnRlcmVkIHRvIGEgY29udGFpbmVyLCByZXNldFxuICAgICAgLy8gdmVydGljYWxBbGlnbiB0byBkZWZhdWx0IGJlY2F1c2UgaXQncyBjdXJyZW50bHkgaW50ZXJuYWwtb25seVxuICAgICAgaWYgKCFwYXJlbnRDZW50ZXJQb3NpdGlvbiB8fCBlbGVtZW50LnRleHRBbGlnbiAhPT0gXCJjZW50ZXJcIikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHsgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTiB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG5cbiAgICAgIC8vIGNhc2U6IGNyZWF0aW5nIG5ldyB0ZXh0IG5vdCBjZW50ZXJlZCB0byBwYXJlbnQgZWxlbWVuZW50IOKGkiBvZmZzZXQgWVxuICAgICAgLy8gc28gdGhhdCB0aGUgdGV4dCBpcyBjZW50ZXJlZCB0byBjdXJzb3IgcG9zaXRpb25cbiAgICAgIGlmICghcGFyZW50Q2VudGVyUG9zaXRpb24pIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgeTogZWxlbWVudC55IC0gZWxlbWVudC5iYXNlbGluZSAvIDIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmhhbmRsZVRleHRXeXNpd3lnKGVsZW1lbnQsIHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50OiAhIWV4aXN0aW5nVGV4dEVsZW1lbnQsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNEb3VibGVDbGljayA9IChcbiAgICBldmVudDogUmVhY3QuTW91c2VFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIC8vIGNhc2U6IGRvdWJsZS1jbGlja2luZyB3aXRoIGFycm93L2xpbmUgdG9vbCBzZWxlY3RlZCB3b3VsZCBib3RoIGNyZWF0ZVxuICAgIC8vIHRleHQgYW5kIGVudGVyIG11bHRpRWxlbWVudCBtb2RlXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHdlIHNob3VsZCBvbmx5IGJlIGFibGUgdG8gZG91YmxlIGNsaWNrIHdoZW4gbW9kZSBpcyBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuXG4gICAgY29uc3QgeyB4OiBzY2VuZVgsIHk6IHNjZW5lWSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgZXZlbnQsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwSWRzID0gZ2V0U2VsZWN0ZWRHcm91cElkcyh0aGlzLnN0YXRlKTtcblxuICAgIGlmIChzZWxlY3RlZEdyb3VwSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkID1cbiAgICAgICAgaGl0RWxlbWVudCAmJlxuICAgICAgICBnZXRTZWxlY3RlZEdyb3VwSWRGb3JFbGVtZW50KGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuc2VsZWN0ZWRHcm91cElkcyk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEdyb3VwSWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IHNlbGVjdGVkR3JvdXBJZCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtoaXRFbGVtZW50IS5pZF06IHRydWUgfSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgaWYgKCFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAhdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIHRoaXMuc3RhdGUuY3Vyc29yQnV0dG9uKTtcblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuICAgIGlmIChcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMiAmJlxuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyICYmXG4gICAgICBpbml0aWFsU2NhbGUgJiZcbiAgICAgIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlXG4gICAgKSB7XG4gICAgICBjb25zdCBjZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBjb25zdCBkZWx0YVggPSBjZW50ZXIueCAtIGdlc3R1cmUubGFzdENlbnRlci54O1xuICAgICAgY29uc3QgZGVsdGFZID0gY2VudGVyLnkgLSBnZXN0dXJlLmxhc3RDZW50ZXIueTtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGNlbnRlcjtcblxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBnZXREaXN0YW5jZShBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpKTtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gZGlzdGFuY2UgLyBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBzY3JvbGxYLCBzY3JvbGxZLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSkgPT4gKHtcbiAgICAgICAgc2Nyb2xsWDogc2Nyb2xsWCArIGRlbHRhWCAvIHpvb20udmFsdWUsXG4gICAgICAgIHNjcm9sbFk6IHNjcm9sbFkgKyBkZWx0YVkgLyB6b29tLnZhbHVlLFxuICAgICAgICB6b29tOiBnZXROZXdab29tKFxuICAgICAgICAgIGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIHNjYWxlRmFjdG9yKSxcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIHsgbGVmdDogb2Zmc2V0TGVmdCwgdG9wOiBvZmZzZXRUb3AgfSxcbiAgICAgICAgICBjZW50ZXIsXG4gICAgICAgICksXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UgPSBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGlzSG9sZGluZ1NwYWNlIHx8IGlzUGFubmluZyB8fCBpc0RyYWdnaW5nU2Nyb2xsQmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXNQb2ludGVyT3ZlclNjcm9sbEJhcnMgPSBpc092ZXJTY3JvbGxCYXJzKFxuICAgICAgY3VycmVudFNjcm9sbEJhcnMsXG4gICAgICBldmVudC5jbGllbnRYIC0gdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0LFxuICAgICAgZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICk7XG4gICAgY29uc3QgaXNPdmVyU2Nyb2xsQmFyID0gaXNQb2ludGVyT3ZlclNjcm9sbEJhcnMuaXNPdmVyRWl0aGVyO1xuICAgIGlmICghdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQgJiYgIXRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBpZiAoaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzY2VuZVBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHsgeDogc2NlbmVQb2ludGVyWCwgeTogc2NlbmVQb2ludGVyWSB9ID0gc2NlbmVQb2ludGVyO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuaXNEcmFnZ2luZ1xuICAgICkge1xuICAgICAgY29uc3QgZWRpdGluZ0xpbmVhckVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJNb3ZlKFxuICAgICAgICBldmVudCxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmdMaW5lYXJFbGVtZW50IH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50Lmxhc3RVbmNvbW1pdHRlZFBvaW50ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3Ioc2NlbmVQb2ludGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10gfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQmluZGluZ0VsZW1lbnRUeXBlKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpKSB7XG4gICAgICAvLyBIb3ZlcmluZyB3aXRoIGEgc2VsZWN0ZWQgdG9vbCBvciBjcmVhdGluZyBuZXcgbGluZWFyIGVsZW1lbnQgdmlhIGNsaWNrXG4gICAgICAvLyBhbmQgcG9pbnRcbiAgICAgIGNvbnN0IHsgZHJhZ2dpbmdFbGVtZW50IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IoXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgIFwiZW5kXCIsXG4gICAgICAgICAgc2NlbmVQb2ludGVyLFxuICAgICAgICAgIHRoaXMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSB9ID0gbXVsdGlFbGVtZW50O1xuXG4gICAgICBjb25zdCB7IHBvaW50cywgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG4gICAgICBjb25zdCBsYXN0UG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSk7XG5cbiAgICAgIGlmIChsYXN0UG9pbnQgPT09IGxhc3RDb21taXR0ZWRQb2ludCkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IHlldCBjcmVhdGVkIGEgdGVtcCBwb2ludCBhbmQgd2UncmUgYmV5b25kIGNvbW1pdC16b25lXG4gICAgICAgIC8vIHRocmVzaG9sZCwgYWRkIGEgcG9pbnRcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXJYIC0gcngsXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gcnksXG4gICAgICAgICAgICBsYXN0UG9pbnRbMF0sXG4gICAgICAgICAgICBsYXN0UG9pbnRbMV0sXG4gICAgICAgICAgKSA+PSBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEXG4gICAgICAgICkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgICAgLy8gaW4gdGhpcyBicmFuY2gsIHdlJ3JlIGluc2lkZSB0aGUgY29tbWl0IHpvbmUsIGFuZCBubyB1bmNvbW1pdHRlZFxuICAgICAgICAgIC8vIHBvaW50IGV4aXN0cy4gVGh1cyBkbyBub3RoaW5nIChkb24ndCBhZGQvcmVtb3ZlIHBvaW50cykuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHBvaW50cy5sZW5ndGggPiAyICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogcG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNQYXRoQUxvb3AocG9pbnRzLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgbGFzdCB1bmNvbW1pdHRlZCBwb2ludFxuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICAgIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZXNlbGVjdGVkQnV0dG9uID0gQm9vbGVhbihldmVudC5idXR0b25zKTtcbiAgICBpZiAoXG4gICAgICBoYXNEZXNlbGVjdGVkQnV0dG9uIHx8XG4gICAgICAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInRleHRcIilcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLnN0YXRlKTtcbiAgICBpZiAoXG4gICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgIWlzT3ZlclNjcm9sbEJhciAmJlxuICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnRcbiAgICApIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSA9IGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZShcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHNjZW5lUG9pbnRlclgsXG4gICAgICAgIHNjZW5lUG9pbnRlclksXG4gICAgICAgIHRoaXMuc3RhdGUuem9vbSxcbiAgICAgICAgZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgJiZcbiAgICAgICAgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLnRyYW5zZm9ybUhhbmRsZVR5cGVcbiAgICAgICkge1xuICAgICAgICBzZXRDdXJzb3IoXG4gICAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgICAgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50KGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSAmJiAhaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMoXG4gICAgICAgIGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoXG4gICAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgICAgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50KHtcbiAgICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihcbiAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgc2NlbmVQb2ludGVyLnksXG4gICAgKTtcbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHNldEN1cnNvcihcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgIGlzVGV4dEVsZW1lbnQoaGl0RWxlbWVudCkgPyBDVVJTT1JfVFlQRS5URVhUIDogQ1VSU09SX1RZUEUuQ1JPU1NIQUlSLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgIH0gZWxzZSBpZiAoaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBpZiB1c2luZyBjbWQvY3RybCwgd2UncmUgbm90IGRyYWdnaW5nXG4gICAgICAhZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgIChoaXRFbGVtZW50IHx8XG4gICAgICAgIHRoaXMuaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgc2NlbmVQb2ludGVyLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICkpXG4gICAgKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLk1PVkUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgIH1cbiAgfTtcblxuICAvLyBzZXQgdG91Y2ggbW92aW5nIGZvciBtb2JpbGUgY29udGV4dCBtZW51XG4gIHByaXZhdGUgaGFuZGxlVG91Y2hNb3ZlID0gKGV2ZW50OiBSZWFjdC5Ub3VjaEV2ZW50PEhUTUxDYW52YXNFbGVtZW50PikgPT4ge1xuICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IHRydWU7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNQb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgLy8gcmVtb3ZlIGFueSBhY3RpdmUgc2VsZWN0aW9uIHdoZW4gd2Ugc3RhcnQgdG8gaW50ZXJhY3Qgd2l0aCBjYW52YXNcbiAgICAvLyAobWFpbmx5LCB3ZSBjYXJlIGFib3V0IHJlbW92aW5nIHNlbGVjdGlvbiBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2hpY2hcbiAgICAvLyAgd291bGQgcHJldmVudCBvdXIgY29weSBoYW5kbGluZyBvdGhlcndpc2UpXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbGVjdGlvbj8uYW5jaG9yTm9kZSkge1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cblxuICAgIHRoaXMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMoZXZlbnQpO1xuICAgIHRoaXMubWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKGV2ZW50KTtcblxuICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGxhc3RQb2ludGVyRG93bldpdGg6IGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgY3Vyc29yQnV0dG9uOiBcImRvd25cIixcbiAgICB9KTtcbiAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwiZG93blwiKTtcblxuICAgIGlmICh0aGlzLmhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBvbmx5IGhhbmRsZSBsZWZ0IG1vdXNlIGJ1dHRvbiBvciB0b3VjaFxuICAgIGlmIChcbiAgICAgIGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJlxuICAgICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5UT1VDSFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlR2VzdHVyZU9uUG9pbnRlckRvd24oZXZlbnQpO1xuXG4gICAgLy8gZG9uJ3Qgc2VsZWN0IHdoaWxlIHBhbm5pbmdcbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID4gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIGZvciB0aGUgZHVyYXRpb24gb2YgYSBwb2ludGVyIGludGVyYWN0aW9uLCB3aGljaCBzdGFydHMgd2l0aCBhXG4gICAgLy8gcG9pbnRlckRvd24gZXZlbnQsIGVuZHMgd2l0aCBhIHBvaW50ZXJVcCBldmVudCAob3IgYW5vdGhlciBwb2ludGVyRG93bilcbiAgICBjb25zdCBwb2ludGVyRG93blN0YXRlID0gdGhpcy5pbml0aWFsUG9pbnRlckRvd25TdGF0ZShldmVudCk7XG5cbiAgICBpZiAodGhpcy5oYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uSWZOb3RVc2luZ1NlbGVjdGlvbigpO1xuICAgIHRoaXMudXBkYXRlQmluZGluZ0VuYWJsZWRPblBvaW50ZXJNb3ZlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZVNlbGVjdGlvbk9uUG9pbnRlckRvd24oZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICB0aGlzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8XG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIlxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAvLyByZXNldCBpbWFnZSBwcmV2aWV3IG9uIHBvaW50ZXJkb3duXG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkNST1NTSEFJUik7XG5cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsLFxuICAgICAgICBtdWx0aUVsZW1lbnQ6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgICAgbXV0YXRlRWxlbWVudCh0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICB0aGlzLmhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24oXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24oXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB0aGlzLm9uUG9pbnRlck1vdmVGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB0aGlzLm9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IG9uS2V5RG93biA9IHRoaXMub25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcbiAgICBjb25zdCBvbktleVVwID0gdGhpcy5vbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIGlmICghdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBvbktleURvd24pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIG9uS2V5VXApO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUgPSBvblBvaW50ZXJNb3ZlO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwID0gb25Qb2ludGVyVXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAgPSBvbktleVVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24gPSBvbktleURvd247XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGRlYWwgd2l0aCBvcGVuaW5nIGNvbnRleHQgbWVudSBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuXG4gICAgICBpZiAodG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhIHRvdWNoVGltZW91dCwgdGhpcyBtZWFucyB0aGF0IHRoZXJlJ3MgYW5vdGhlclxuICAgICAgICAvLyB0b3VjaCBkb3duIGFuZCB3ZSBhcmUgZG9pbmcgYW5vdGhlciB0b3VjaCwgc28gd2Ugc2hvdWxkbid0IG9wZW4gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudS5cbiAgICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9wZW4gdGhlIGNvbnRleHQgbWVudSB3aXRoIHRoZSBmaXJzdCB0b3VjaCdzIGNsaWVudFggYW5kIGNsaWVudFlcbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGlzIG5vdCBtb3ZpbmdcbiAgICAgICAgdG91Y2hUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRvdWNoVGltZW91dCA9IDA7XG4gICAgICAgICAgaWYgKCFpbnZhbGlkYXRlQ29udGV4dE1lbnUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBpZiAobGFzdFBvaW50ZXJVcCAhPT0gbnVsbCkge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZXRpbWVzIHdlIGRvbid0IGdldCBhIHBvaW50ZXJ1cCBhZnRlciBhIHBvaW50ZXJkb3duLFxuICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb250ZXh0dWFsIG1lbnUgb3IgYWxlcnQgaXMgdHJpZ2dlcmVkLiBJbiBvcmRlciB0byBhdm9pZFxuICAgICAgLy8gYmVpbmcgaW4gYSB3ZWlyZCBzdGF0ZSwgd2UgY2xlYW4gdXAgb24gdGhlIG5leHQgcG9pbnRlcmRvd25cbiAgICAgIGxhc3RQb2ludGVyVXAoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgd2hldGhlciB0aGUgZXZlbnQgaXMgYSBwYW5uaW5nXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDAgJiZcbiAgICAgICAgKGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uV0hFRUwgfHxcbiAgICAgICAgICAoZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmIGlzSG9sZGluZ1NwYWNlKSB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuXG4gICAgbGV0IG5leHRQYXN0ZVByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzTGludXggPSAvTGludXgvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG5cbiAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICBsZXQgeyBjbGllbnRYOiBsYXN0WCwgY2xpZW50WTogbGFzdFkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGxhc3RYIC0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGxhc3RZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGxhc3RYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGxhc3RZID0gZXZlbnQuY2xpZW50WTtcblxuICAgICAgLypcbiAgICAgICAqIFByZXZlbnQgcGFzdGUgZXZlbnQgaWYgd2UgbW92ZSB3aGlsZSBtaWRkbGUgY2xpY2tpbmcgb24gTGludXguXG4gICAgICAgKiBTZWUgaXNzdWUgIzEzODMuXG4gICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgaXNMaW51eCAmJlxuICAgICAgICAhbmV4dFBhc3RlUHJldmVudGVkICYmXG4gICAgICAgIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSlcbiAgICAgICkge1xuICAgICAgICBuZXh0UGFzdGVQcmV2ZW50ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8qIFByZXZlbnQgdGhlIG5leHQgcGFzdGUgZXZlbnQgKi9cbiAgICAgICAgY29uc3QgcHJldmVudE5leHRQYXN0ZSA9IChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFJlZW5hYmxlIG5leHQgcGFzdGUgaW4gY2FzZSBvZiBkaXNhYmxlZCBtaWRkbGUgY2xpY2sgcGFzdGUgZm9yXG4gICAgICAgICAqIGFueSByZWFzb246XG4gICAgICAgICAqIC0gcmlndGggY2xpY2sgcGFzdGVcbiAgICAgICAgICogLSBlbXB0eSBjbGlwYm9hcmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGVuYWJsZU5leHRQYXN0ZSA9ICgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGRlbHRhWCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZGVsdGFZIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGVhcmRvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgICAobGFzdFBvaW50ZXJVcCA9ICgpID0+IHtcbiAgICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGVhcmRvd24pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCB7XG4gICAgZ2VzdHVyZS5wb2ludGVycy5zZXQoZXZlbnQucG9pbnRlcklkLCB7XG4gICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICB9KTtcblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDIpIHtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGdldENlbnRlcihnZXN0dXJlLnBvaW50ZXJzKTtcbiAgICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UgPSBnZXREaXN0YW5jZShcbiAgICAgICAgQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsUG9pbnRlckRvd25TdGF0ZShcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogUG9pbnRlckRvd25TdGF0ZSB7XG4gICAgY29uc3Qgb3JpZ2luID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3JpZ2luLFxuICAgICAgd2l0aENtZE9yQ3RybDogZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0sXG4gICAgICBvcmlnaW5JbkdyaWQ6IHR1cGxlVG9Db29ycyhcbiAgICAgICAgZ2V0R3JpZFBvaW50KG9yaWdpbi54LCBvcmlnaW4ueSwgdGhpcy5zdGF0ZS5ncmlkU2l6ZSksXG4gICAgICApLFxuICAgICAgc2Nyb2xsYmFyczogaXNPdmVyU2Nyb2xsQmFycyhcbiAgICAgICAgY3VycmVudFNjcm9sbEJhcnMsXG4gICAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICksXG4gICAgICAvLyB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSBiZWNhdXNlIHdlJ2xsIGJlIHVwZGF0aW5nIHRoaXMgc3RhdGVcbiAgICAgIGxhc3RDb29yZHM6IHsgLi4ub3JpZ2luIH0sXG4gICAgICBvcmlnaW5hbEVsZW1lbnRzOiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgYWNjLnNldChlbGVtZW50LmlkLCBkZWVwQ29weUVsZW1lbnQoZWxlbWVudCkpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcCgpIGFzIFBvaW50ZXJEb3duU3RhdGVbXCJvcmlnaW5hbEVsZW1lbnRzXCJdKSxcbiAgICAgIHJlc2l6ZToge1xuICAgICAgICBoYW5kbGVUeXBlOiBmYWxzZSxcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgIGFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiLFxuICAgICAgICBjZW50ZXI6IHsgeDogKG1heFggKyBtaW5YKSAvIDIsIHk6IChtYXhZICsgbWluWSkgLyAyIH0sXG4gICAgICB9LFxuICAgICAgaGl0OiB7XG4gICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGFsbEhpdEVsZW1lbnRzOiBbXSxcbiAgICAgICAgd2FzQWRkZWRUb1NlbGVjdGlvbjogZmFsc2UsXG4gICAgICAgIGhhc0JlZW5EdXBsaWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHM6IHRoaXMuaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgZHJhZzoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBldmVudExpc3RlbmVyczoge1xuICAgICAgICBvbk1vdmU6IG51bGwsXG4gICAgICAgIG9uVXA6IG51bGwsXG4gICAgICAgIG9uS2V5VXA6IG51bGwsXG4gICAgICAgIG9uS2V5RG93bjogbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJldHVybnMgd2hldGhlciB0aGUgZXZlbnQgaXMgYSBkcmFnZ2luZyBhIHNjcm9sbGJhclxuICBwcml2YXRlIGhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICEocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlckVpdGhlciAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzRHJhZ2dpbmdTY3JvbGxCYXIgPSB0cnVlO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gZXZlbnQuY2xpZW50WDtcbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG9uUG9pbnRlclVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKCgpID0+IHtcbiAgICAgIGlzRHJhZ2dpbmdTY3JvbGxCYXIgPSBmYWxzZTtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwidXBcIik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgIH0pO1xuXG4gICAgbGFzdFBvaW50ZXJVcCA9IG9uUG9pbnRlclVwO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2VsZWN0aW9uSWZOb3RVc2luZ1NlbGVjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgcG9pbnRlciBldmVudCBoYXMgYmVlbiBjb21wbGV0ZWx5IGhhbmRsZWRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgdGhpcy5zdGF0ZSk7XG4gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgIHRoaXMuc3RhdGUuem9vbSxcbiAgICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZ0VsZW1lbnQ6IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS5lbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPVxuICAgICAgICAgICAgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLnRyYW5zZm9ybUhhbmRsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgICBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgIHRoaXMuc3RhdGUuem9vbSxcbiAgICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZTogcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZyA9IHRydWU7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldCA9IHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBnZXRSZXNpemVPZmZzZXRYWShcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXS5wb2ludHMubGVuZ3RoID09PSAyXG4gICAgICAgICkge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uID0gZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24oXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHJldCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlckRvd24oXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAoYXBwU3RhdGUpID0+IHRoaXMuc2V0U3RhdGUoYXBwU3RhdGUpLFxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmV0LmhpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSByZXQuaGl0RWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldC5kaWRBZGRQb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGl0RWxlbWVudCBtYXkgYWxyZWFkeSBiZSBzZXQgYWJvdmUsIHNvIGNoZWNrIGZpcnN0XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPVxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPz9cbiAgICAgICAgICB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKTtcblxuICAgICAgICAvLyBGb3Igb3ZlcmxhcHBlZCBlbGVtZW50cyBvbmUgcG9zaXRpb24gbWF5IGhpdFxuICAgICAgICAvLyBtdWx0aXBsZSBlbGVtZW50c1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgY29uc3Qgc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMuc29tZShcbiAgICAgICAgICAoZWxlbWVudCkgPT4gdGhpcy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoaGl0RWxlbWVudCA9PT0gbnVsbCB8fCAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkKSAmJlxuICAgICAgICAgICFldmVudC5zaGlmdEtleSAmJlxuICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKGhpdEVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgY2xpY2sgb24gc29tZXRoaW5nXG4gICAgICAgIGlmIChoaXRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBvbiBDTUQvQ1RSTCwgZHJpbGwgZG93biB0byBoaXQgZWxlbWVudCByZWdhcmRsZXNzIG9mIGdyb3VwcyBldGMuXG4gICAgICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICAuLi5lZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQocHJldlN0YXRlLCBoaXRFbGVtZW50KSxcbiAgICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgLy8gbWFyayBhcyBub3QgY29tcGxldGVseSBoYW5kbGVkIHNvIGFzIHRvIGFsbG93IGRyYWdnaW5nIGV0Yy5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkZXNlbGVjdCBpZiBpdGVtIGlzIHNlbGVjdGVkXG4gICAgICAgICAgLy8gaWYgc2hpZnQgaXMgbm90IGNsaWNrZWQsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWVcbiAgICAgICAgICAvLyBvdGhlcndpc2UsIGl0IHdpbGwgdHJpZ2dlciBzZWxlY3Rpb24gYmFzZWQgb24gY3VycmVudFxuICAgICAgICAgIC8vIHN0YXRlIG9mIHRoZSBib3hcbiAgICAgICAgICBpZiAoIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcgYSBncm91cCwgZXhpdGluZyBlZGl0aW5nIG1vZGUgYW5kIGRlc2VsZWN0IHRoZSBncm91cC5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nR3JvdXBJZCAmJlxuICAgICAgICAgICAgICAhaXNFbGVtZW50SW5Hcm91cChoaXRFbGVtZW50LCB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgaGl0IGVsZW1lbnQgdG8gc2VsZWN0aW9uLiBBdCB0aGlzIHBvaW50IGlmIHdlJ3JlIG5vdCBob2xkaW5nXG4gICAgICAgICAgICAvLyBTSElGVCB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBlbGVtZW50KHMpIHdlcmUgZGVzZWxlY3RlZCBhYm92ZVxuICAgICAgICAgICAgLy8gKG1ha2Ugc3VyZSB5b3UgdXNlIHNldFN0YXRlIHVwZGF0ZXIgdG8gdXNlIGxhdGVzdCBzdGF0ZSlcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIXNvbWVIaXRFbGVtZW50SXNTZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBwcml2YXRlIGlzQVNlbGVjdGVkRWxlbWVudChoaXRFbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGl0RWxlbWVudCAhPSBudWxsICYmIHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICBwb2ludDogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PixcbiAgICBzZWxlY3RlZEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSG93IG1hbnkgcGl4ZWxzIG9mZiB0aGUgc2hhcGUgYm91bmRhcnkgd2Ugc3RpbGwgY29uc2lkZXIgYSBoaXRcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHJldHVybiAoXG4gICAgICBwb2ludC54ID4geDEgLSB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnggPCB4MiArIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueSA+IHkxIC0gdGhyZXNob2xkICYmXG4gICAgICBwb2ludC55IDwgeTIgKyB0aHJlc2hvbGRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXh0T25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiB2b2lkID0+IHtcbiAgICAvLyBpZiB3ZSdyZSBjdXJyZW50bHkgc3RpbGwgZWRpdGluZyB0ZXh0LCBjbGlja2luZyBvdXRzaWRlXG4gICAgLy8gc2hvdWxkIG9ubHkgZmluYWxpemUgaXQsIG5vdCBjcmVhdGUgYW5vdGhlciAoaXJyZXNwZWN0aXZlXG4gICAgLy8gb2Ygc3RhdGUuZWxlbWVudExvY2tlZClcbiAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudD8udHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgc2NlbmVYOiBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgc2NlbmVZOiBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI6ICFldmVudC5hbHRLZXksXG4gICAgfSk7XG5cbiAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkgPT4ge1xuICAgIC8vIEJlZ2luIGEgbWFyayBjYXB0dXJlLiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gdXBkYXRlIHN0YXRlIHlldC5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgbnVsbCxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHJlc3N1cmVzID0gZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgICA/IGVsZW1lbnQucHJlc3N1cmVzXG4gICAgICA6IFsuLi5lbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuXG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBwb2ludHM6IFtbMCwgMF1dLFxuICAgICAgcHJlc3N1cmVzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICB0aGlzLnNjZW5lLFxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIGVsZW1lbnQsXG4gICAgXSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUVsZW1lbnQgPSAoe1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVksXG4gIH06IHtcbiAgICBzY2VuZVg6IG51bWJlcjtcbiAgICBzY2VuZVk6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHNjZW5lWCwgc2NlbmVZLCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdJbWFnZUVsZW1lbnQoe1xuICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3QgeyBtdWx0aUVsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIC8vIGZpbmFsaXplIGlmIGNvbXBsZXRpbmcgYSBsb29wXG4gICAgICBpZiAoXG4gICAgICAgIG11bHRpRWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICBpc1BhdGhBTG9vcChtdWx0aUVsZW1lbnQucG9pbnRzLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB4OiByeCwgeTogcnksIGxhc3RDb21taXR0ZWRQb2ludCB9ID0gbXVsdGlFbGVtZW50O1xuXG4gICAgICAvLyBjbGlja2luZyBpbnNpZGUgY29tbWl0IHpvbmUg4oaSIGZpbmFsaXplIGFycm93XG4gICAgICBpZiAoXG4gICAgICAgIG11bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoID4gMSAmJlxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQgJiZcbiAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHJ5LFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFswXSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMV0sXG4gICAgICAgICkgPCBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICBbbXVsdGlFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIC8vIGNsaWNraW5nIG91dHNpZGUgY29tbWl0IHpvbmUg4oaSIHVwZGF0ZSByZWZlcmVuY2UgZm9yIGxhc3QgY29tbWl0dGVkXG4gICAgICAvLyBwb2ludFxuICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBtdWx0aUVsZW1lbnQucG9pbnRzW211bHRpRWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICB9KTtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcblxuICAgICAgLyogSWYgYXJyb3cgaXMgcHJlLWFycm93aGVhZHMsIGl0IHdpbGwgaGF2ZSB1bmRlZmluZWQgZm9yIGJvdGggc3RhcnQgYW5kIGVuZCBhcnJvd2hlYWRzLlxuICAgICAgSWYgc28sIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3Igc3RhcnQgYW5kIFwiYXJyb3dcIiBmb3IgZW5kLiBJZiB0aGUgbGluZWFyIGl0ZW0gaXMgbm90XG4gICAgICBhbiBhcnJvdywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBib3RoLiBPdGhlcndpc2UsIHdlIHdhbnQgaXQgdG8gdXNlIHRoZVxuICAgICAgdmFsdWVzIGZyb20gYXBwU3RhdGUuICovXG5cbiAgICAgIGNvbnN0IHsgY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBbc3RhcnRBcnJvd2hlYWQsIGVuZEFycm93aGVhZF0gPVxuICAgICAgICBlbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiXG4gICAgICAgICAgPyBbY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCwgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRdXG4gICAgICAgICAgOiBbbnVsbCwgbnVsbF07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdMaW5lYXJFbGVtZW50KHtcbiAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHg6IGdyaWRYLFxuICAgICAgICB5OiBncmlkWSxcbiAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBbLi4uZWxlbWVudC5wb2ludHMsIFswLCAwXV0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICApO1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0VsZW1lbnQoe1xuICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgfSk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBQcmV2ZW50cyBmb2N1cyBmcm9tIGVzY2FwaW5nIGV4Y2FsaWRyYXcgdGFiXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuQUxUICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlck1vdmVGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGluaXRpYWxpemUgZHJhZ09mZnNldFhZIG9ubHkgYWZ0ZXIgd2UndmUgdXBkYXRlZFxuICAgICAgLy8gYHN0YXRlLnNlbGVjdGVkRWxlbWVudElkc2Agb24gcG9pbnRlckRvd24uIERvaW5nIGl0IGhlcmUgaW4gcG9pbnRlck1vdmVcbiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgc2hvdWxkIGhvcGVmdWxseSBlbnN1cmUgd2UncmUgYWxyZWFkeSB3b3JraW5nIHdpdGhcbiAgICAgIC8vIHRoZSB1cGRhdGVkIHN0YXRlLlxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQgPT09IG51bGwpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9IHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBnZXREcmFnT2Zmc2V0WFkoXG4gICAgICAgICAgICBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcblxuICAgICAgLy8gZm9yIGFycm93cy9saW5lcywgZG9uJ3Qgc3RhcnQgZHJhZ2dpbmcgdW50aWwgYSBnaXZlbiB0aHJlc2hvbGRcbiAgICAgIC8vIHRvIGVuc3VyZSB3ZSBkb24ndCBjcmVhdGUgYSAyLXBvaW50IGFycm93IGJ5IG1pc3Rha2Ugd2hlblxuICAgICAgLy8gdXNlciBjbGlja3MgbW91c2UgaW4gYSB3YXkgdGhhdCBpdCBtb3ZlcyBhIHRpbnkgYml0ICh0aHVzXG4gICAgICAvLyB0cmlnZ2VyaW5nIHBvaW50ZXJtb3ZlKVxuICAgICAgaWYgKFxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImFycm93XCIgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIilcbiAgICAgICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICkgPCBEUkFHR0lOR19USFJFU0hPTERcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcbiAgICAgICAgaWYgKHRoaXMubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZGlkRHJhZyA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnREcmFnZ2luZyhcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgIChhcHBTdGF0ZSkgPT4gdGhpcy5zZXRTdGF0ZShhcHBTdGF0ZSksXG4gICAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgICAoZWxlbWVudCwgc3RhcnRPckVuZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yTGluZWFyRWxlbWVudEF0Q3Vyc29yKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBzdGFydE9yRW5kLFxuICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkaWREcmFnKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKFxuICAgICAgICAoZWxlbWVudCkgPT4gdGhpcy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCksXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgfHxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHNcbiAgICAgICkge1xuICAgICAgICAvLyBNYXJraW5nIHRoYXQgY2xpY2sgd2FzIHVzZWQgZm9yIGRyYWdnaW5nIHRvIGNoZWNrXG4gICAgICAgIC8vIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBkZXNlbGVjdGVkIG9uIHBvaW50ZXJ1cFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gcHJldmVudCBkcmFnZ2luZyBldmVuIGlmIHdlJ3JlIG5vIGxvbmdlciBob2xkaW5nIGNtZC9jdHJsIG90aGVyd2lzZVxuICAgICAgICAvLyBpdCB3b3VsZCBoYXZlIHdlaXJkIHJlc3VsdHMgKHN0dWZmIGp1bXBpbmcgYWxsIG92ZXIgdGhlIHNjcmVlbilcbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCAmJiAhcG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsKSB7XG4gICAgICAgICAgY29uc3QgW2RyYWdYLCBkcmFnWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LnksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbXG4gICAgICAgICAgICBNYXRoLmFicyhwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54KSxcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBXZSBvbmx5IGRyYWcgaW4gb25lIGRpcmVjdGlvbiBpZiBzaGlmdCBpcyBwcmVzc2VkXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgICAgICAgZHJhZ1NlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICAgIGRyYWdYLFxuICAgICAgICAgICAgZHJhZ1ksXG4gICAgICAgICAgICB0aGlzLnNjZW5lLFxuICAgICAgICAgICAgbG9ja0RpcmVjdGlvbixcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVgsXG4gICAgICAgICAgICBkcmFnRGlzdGFuY2VZLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgICAgLy8gV2UgZHVwbGljYXRlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlmIGFsdCBpcyBwcmVzc2VkIG9uIHBvaW50ZXIgbW92ZVxuICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlIHRvcCBvZiB0aGUgeiBpbmRleCBzdGFjaywgYW5kXG4gICAgICAgICAgICAvLyBwdXQgdGhlIGR1cGxpY2F0ZXMgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHVzZWQgdG8gYmUuXG4gICAgICAgICAgICAvLyAodGhlIG9yaWdpbiBwb2ludCB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRlZClcblxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9BcHBlbmQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0gfHxcbiAgICAgICAgICAgICAgICAvLyBjYXNlOiB0aGUgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzIG1pZ2h0IG5vdCBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIHlldCBieSB0aGUgdGltZSB0aGlzIG1vdXNlbW92ZSBldmVudCBpcyBmaXJlZFxuICAgICAgICAgICAgICAgIChlbGVtZW50LmlkID09PSBoaXRFbGVtZW50Py5pZCAmJlxuICAgICAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbilcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlZEVsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nR3JvdXBJZCxcbiAgICAgICAgICAgICAgICAgIGdyb3VwSWRNYXAsXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbkRyYWdYLCBvcmlnaW5EcmFnWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC54LFxuICAgICAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBtdXRhdGVFbGVtZW50KGR1cGxpY2F0ZWRFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICB4OiBkdXBsaWNhdGVkRWxlbWVudC54ICsgKG9yaWdpbkRyYWdYIC0gZHJhZ1gpLFxuICAgICAgICAgICAgICAgICAgeTogZHVwbGljYXRlZEVsZW1lbnQueSArIChvcmlnaW5EcmFnWSAtIGRyYWdZKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudHMucHVzaChkdXBsaWNhdGVkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudHNUb0FwcGVuZC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIGR1cGxpY2F0ZWRFbGVtZW50LmlkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dFNjZW5lRWxlbWVudHMgPSBbLi4ubmV4dEVsZW1lbnRzLCAuLi5lbGVtZW50c1RvQXBwZW5kXTtcbiAgICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dFNjZW5lRWxlbWVudHMsXG4gICAgICAgICAgICAgIGVsZW1lbnRzVG9BcHBlbmQsXG4gICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQsXG4gICAgICAgICAgICAgIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0U2NlbmVFbGVtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byByZWFkIHRoaXMuc3RhdGUgd2l0aGluIGVhY2ggbW92ZSBldmVudCxcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCByZWFkIGEgc3RhbGUgb25lIVxuICAgICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG4gICAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGNvbnN0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgICAgICA/IGRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXNcbiAgICAgICAgICA6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzLCBldmVudC5wcmVzc3VyZV07XG5cbiAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXSxcbiAgICAgICAgICBwcmVzc3VyZXMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc0xpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBsZXQgZHggPSBncmlkWCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBsZXQgZHkgPSBncmlkWSAtIGRyYWdnaW5nRWxlbWVudC55O1xuXG4gICAgICAgIGlmIChzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZShldmVudCkgJiYgcG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICh7IHdpZHRoOiBkeCwgaGVpZ2h0OiBkeSB9ID0gZ2V0UGVyZmVjdEVsZW1lbnRTaXplKFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgICAgIGR4LFxuICAgICAgICAgICAgZHksXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7IHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtkeCwgZHldXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBXaGVuIGNyZWF0aW5nIGEgbGluZWFyIGVsZW1lbnQgYnkgZHJhZ2dpbmdcbiAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IoXG4gICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBcImVuZFwiLFxuICAgICAgICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICB0aGlzLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgaXNTb21lRWxlbWVudFNlbGVjdGVkKGVsZW1lbnRzLCB0aGlzLnN0YXRlKSkge1xuICAgICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24gPSBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgLi4uZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ucmVkdWNlKChtYXAsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIG1hcFtlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICAgIH0sIHt9IGFzIGFueSksXG4gICAgICAgICAgICAgICAgLi4uKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzaW5nIGN0cmwvY21kLCBzZWxlY3QgdGhlIGhpdEVsZW1lbnQgb25seSBpZiB3ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmVuJ3QgYm94LXNlbGVjdGVkIGFueXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLmlkXTogIWVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJldHVybnMgd2hldGhlciB0aGUgcG9pbnRlciBtb3ZlIGhhcHBlbmVkIG92ZXIgZWl0aGVyIHNjcm9sbGJhclxuICBwcml2YXRlIGhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3Zlckhvcml6b250YWwpIHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgZHggPSB4IC0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLng7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYIC0gZHggLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICB9KTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0geDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyVmVydGljYWwpIHtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xuICAgICAgY29uc3QgZHkgPSB5IC0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZHkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICB9KTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0geTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcygoY2hpbGRFdmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50LFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBlbGVtZW50TG9ja2VkLFxuICAgICAgICBpc1Jlc2l6aW5nLFxuICAgICAgICBpc1JvdGF0aW5nLFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgaXNSb3RhdGluZzogZmFsc2UsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogbnVsbCxcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIC8vIHRleHQgZWxlbWVudHMgYXJlIHJlc2V0IG9uIGZpbmFsaXplLCBhbmQgcmVzZXR0aW5nIG9uIHBvaW50ZXJ1cFxuICAgICAgICAvLyBtYXkgY2F1c2UgaXNzdWVzIHdpdGggZG91YmxlIHRhcHNcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6XG4gICAgICAgICAgbXVsdGlFbGVtZW50IHx8IGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICAgICAgICAgID8gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudFxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoY2hpbGRFdmVudC5jbGllbnRYLCBjaGlsZEV2ZW50LmNsaWVudFksIFwidXBcIik7XG5cbiAgICAgIC8vIEhhbmRsZSBlbmQgb2YgZHJhZ2dpbmcgYSBwb2ludCBvZiBhIGxpbmVhciBlbGVtZW50LCBtaWdodCBjbG9zZSBhIGxvb3BcbiAgICAgIC8vIGFuZCBzZXRzIGJpbmRpbmcgZWxlbWVudFxuICAgICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWRpdGluZ0xpbmVhckVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJVcChcbiAgICAgICAgICBjaGlsZEV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlBPSU5URVJfTU9WRSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUhLFxuICAgICAgKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5QT0lOVEVSX1VQLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uVXAhLFxuICAgICAgKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5LRVlET1dOLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5RG93biEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULktFWVVQLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAhLFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgcGVuZGluZ0ltYWdlRWxlbWVudDogbnVsbCB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBsZXQgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICAvLyBBbGxvd3MgZG90cyB0byBhdm9pZCBiZWluZyBmbGFnZ2VkIGFzIGluZmluaXRlbHkgc21hbGxcbiAgICAgICAgaWYgKGR4ID09PSBwb2ludHNbMF1bMF0gJiYgZHkgPT09IHBvaW50c1swXVsxXSkge1xuICAgICAgICAgIGR5ICs9IDAuMDAwMTtcbiAgICAgICAgICBkeCArPSAwLjAwMDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzLCBjaGlsZEV2ZW50LnByZXNzdXJlXTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IFtkeCwgZHldLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gZHJhZ2dpbmdFbGVtZW50O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICB7IHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICAgIHRoaXMuc2NlbmVcbiAgICAgICAgICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbC5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50IS5wb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCAmJlxuICAgICAgICAgICFtdWx0aUVsZW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgICAuLi5kcmFnZ2luZ0VsZW1lbnQucG9pbnRzLFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50LngsXG4gICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50LnksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbXVsdGlFbGVtZW50OiBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudDogdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFtdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmXG4gICAgICAgICAgICBpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10sIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsIH0pO1xuICAgICAgICAgIGlmICghZWxlbWVudExvY2tlZCkge1xuICAgICAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCAmJlxuICAgICAgICBpc0ludmlzaWJseVNtYWxsRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVtb3ZlIGludmlzaWJsZSBlbGVtZW50IHdoaWNoIHdhcyBhZGRlZCBpbiBvblBvaW50ZXJEb3duXG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuc2xpY2UoMCwgLTEpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoZHJhZ2dpbmdFbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQgJiYgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQocmVzaXppbmdFbGVtZW50KSkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbC5pZCAhPT0gcmVzaXppbmdFbGVtZW50LmlkKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29kZSBiZWxvdyBoYW5kbGVzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnQocykgd2VyZW4ndFxuICAgICAgLy8gZHJhZyBvciBhZGRlZCB0byBzZWxlY3Rpb24gb24gcG9pbnRlciBkb3duIHBoYXNlLlxuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIGhpdEVsZW1lbnQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvblxuICAgICAgKSB7XG4gICAgICAgIGlmIChjaGlsZEV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZFZpYUdyb3VwKHRoaXMuc3RhdGUsIGhpdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdW5zZWxlY3QgYWxsIGdyb3VwcyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgZ3JvdXBzXG4gICAgICAgICAgICAgIC8vIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICBjb25zdCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMgPSBoaXRFbGVtZW50Lmdyb3VwSWRzXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoKGdyb3VwSWQpID0+XG4gICAgICAgICAgICAgICAgICBnZXRFbGVtZW50c0luR3JvdXAodGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCBncm91cElkKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLm1hcCgoZWxlbWVudCkgPT4gKHsgW2VsZW1lbnQuaWRdOiBmYWxzZSB9KSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChwcmV2SWQsIGFjYykgPT4gKHsgLi4ucHJldklkLCAuLi5hY2MgfSksIHt9KTtcblxuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKChfcHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLl9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgLi4uaGl0RWxlbWVudC5ncm91cElkc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChnSWQpID0+ICh7IFtnSWRdOiBmYWxzZSB9KSlcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgYWNjKSA9PiAoeyAuLi5wcmV2LCAuLi5hY2MgfSksIHt9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAuLi5pZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVsZW1lbnQgZnJvbSBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQhLmlkXTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChfcHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbaGl0RWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAuLi5zZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbaGl0RWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICF0aGlzLnN0YXRlLmlzUmVzaXppbmcgJiZcbiAgICAgICAgKChoaXRFbGVtZW50ICYmXG4gICAgICAgICAgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICAgICAgaGl0RWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgICghaGl0RWxlbWVudCAmJlxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIERlc2VsZWN0IHNlbGVjdGVkIGVsZW1lbnRzXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50TG9ja2VkICYmIGVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIgJiYgZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBbZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIgfHxcbiAgICAgICAgaXNTb21lRWxlbWVudFNlbGVjdGVkKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgfHwgaXNSZXNpemluZyB8fCBpc1JvdGF0aW5nKSB7XG4gICAgICAgIChpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpXG4gICAgICAgICAgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICAgOiB1bmJpbmRMaW5lYXJFbGVtZW50cykoXG4gICAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnRMb2NrZWQgJiYgZWxlbWVudFR5cGUgIT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVJbWFnZSA9IGFzeW5jICh7XG4gICAgaW1hZ2VGaWxlLFxuICAgIGltYWdlRWxlbWVudDogX2ltYWdlRWxlbWVudCxcbiAgICBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ID0gZmFsc2UsXG4gIH06IHtcbiAgICBpbWFnZUZpbGU6IEZpbGU7XG4gICAgaW1hZ2VFbGVtZW50OiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50O1xuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXc/OiBib29sZWFuO1xuICB9KSA9PiB7XG4gICAgLy8gYXQgdGhpcyBwb2ludCB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGltYWdlIGZpbGUsIGJ1dCB3ZSBkbyB0aGlzIGNoZWNrXG4gICAgLy8gdG8gc2F0aXNmeSBUUyBkb3duIHRoZSBsaW5lXG4gICAgaWYgKCFpc1N1cHBvcnRlZEltYWdlRmlsZShpbWFnZUZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy51bnN1cHBvcnRlZEZpbGVUeXBlXCIpKTtcbiAgICB9XG4gICAgY29uc3QgbWltZVR5cGUgPSBpbWFnZUZpbGUudHlwZTtcblxuICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgXCJ3YWl0XCIpO1xuXG4gICAgaWYgKG1pbWVUeXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW1hZ2VGaWxlID0gU1ZHU3RyaW5nVG9GaWxlKFxuICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVNWRyhhd2FpdCBpbWFnZUZpbGUudGV4dCgpKSxcbiAgICAgICAgICBpbWFnZUZpbGUubmFtZSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLnN2Z0ltYWdlSW5zZXJ0RXJyb3JcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdlbmVyYXRlIGltYWdlIGlkIChieSBkZWZhdWx0IHRoZSBmaWxlIGRpZ2VzdCkgYmVmb3JlIGFueVxuICAgIC8vIHJlc2l6aW5nL2NvbXByZXNzaW9uIHRha2VzIHBsYWNlIHRvIGtlZXAgaXQgbW9yZSBwb3J0YWJsZVxuICAgIGNvbnN0IGZpbGVJZCA9IGF3YWl0ICgodGhpcy5wcm9wcy5nZW5lcmF0ZUlkRm9yRmlsZT8uKFxuICAgICAgaW1hZ2VGaWxlLFxuICAgICkgYXMgUHJvbWlzZTxGaWxlSWQ+KSB8fCBnZW5lcmF0ZUlkRnJvbUZpbGUoaW1hZ2VGaWxlKSk7XG5cbiAgICBpZiAoIWZpbGVJZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNvdWxkbid0IGdlbmVyYXRlIGZpbGUgaWQgb3IgdGhlIHN1cHBsaWVkIGBnZW5lcmF0ZUlkRm9yRmlsZWAgZGlkbid0IHJlc29sdmUgdG8gb25lLlwiLFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLmltYWdlSW5zZXJ0RXJyb3JcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nRmlsZURhdGEgPSB0aGlzLmZpbGVzW2ZpbGVJZF07XG4gICAgaWYgKCFleGlzdGluZ0ZpbGVEYXRhPy5kYXRhVVJMKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWFnZUZpbGUgPSBhd2FpdCByZXNpemVJbWFnZUZpbGUoXG4gICAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICAgIERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciB0cnlpbmcgdG8gcmVzaW5nIGltYWdlIGZpbGUgb24gaW5zZXJ0aW9uXCIsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgdChcImVycm9ycy5maWxlVG9vQmlnXCIsIHtcbiAgICAgICAgICAgIG1heFNpemU6IGAke01hdGgudHJ1bmMoTUFYX0FMTE9XRURfRklMRV9CWVRFUyAvIDEwMjQgLyAxMDI0KX1NQmAsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkw7XG4gICAgICAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIGZ1bGwtc2l6ZSBmaWxlIGZvciBjdXJzb3IgcHJldmlld1xuICAgICAgLy8gKGl0J3MgbXVjaCBmYXN0ZXIgdG8gY29udmVydCB0aGUgcmVzaXplZCBkYXRhVVJMIHRvIEZpbGUpXG4gICAgICBjb25zdCByZXNpemVkRmlsZSA9IGRhdGFVUkwgJiYgZGF0YVVSTFRvRmlsZShkYXRhVVJMKTtcblxuICAgICAgdGhpcy5zZXRJbWFnZVByZXZpZXdDdXJzb3IocmVzaXplZEZpbGUgfHwgaW1hZ2VGaWxlKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVVJMID1cbiAgICAgIHRoaXMuZmlsZXNbZmlsZUlkXT8uZGF0YVVSTCB8fCAoYXdhaXQgZ2V0RGF0YVVSTChpbWFnZUZpbGUpKTtcblxuICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IG11dGF0ZUVsZW1lbnQoXG4gICAgICBfaW1hZ2VFbGVtZW50LFxuICAgICAge1xuICAgICAgICBmaWxlSWQsXG4gICAgICB9LFxuICAgICAgZmFsc2UsXG4gICAgKSBhcyBOb25EZWxldGVkPEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudD47XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Tm9uRGVsZXRlZDxJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+PihcbiAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbGVzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5maWxlcyxcbiAgICAgICAgICAgIFtmaWxlSWRdOiB7XG4gICAgICAgICAgICAgIG1pbWVUeXBlLFxuICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgICAgICBjcmVhdGVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNhY2hlZEltYWdlRGF0YSA9IHRoaXMuaW1hZ2VDYWNoZS5nZXQoZmlsZUlkKTtcbiAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgY2FjaGVkSW1hZ2VEYXRhLmltYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50Py5pZCAhPT0gaW1hZ2VFbGVtZW50LmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShpbWFnZUVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKCFzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydHMgaW1hZ2UgaW50byBlbGVtZW50cyBhcnJheSBhbmQgcmVyZW5kZXJzXG4gICAqL1xuICBwcml2YXRlIGluc2VydEltYWdlRWxlbWVudCA9IGFzeW5jIChcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gICAgaW1hZ2VGaWxlOiBGaWxlLFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXc/OiBib29sZWFuLFxuICApID0+IHtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgaW1hZ2VFbGVtZW50LFxuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUltYWdlKHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgaXNEZWxldGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNldEltYWdlUHJldmlld0N1cnNvciA9IGFzeW5jIChpbWFnZUZpbGU6IEZpbGUpID0+IHtcbiAgICAvLyBtdXN0bid0IGJlIGxhcmdlciB0aGFuIDEyOCBweFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfQmFzaWNfVXNlcl9JbnRlcmZhY2UvVXNpbmdfVVJMX3ZhbHVlc19mb3JfdGhlX2N1cnNvcl9wcm9wZXJ0eVxuICAgIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gOTY7XG5cbiAgICBjb25zdCBpbWFnZVByZXZpZXcgPSBhd2FpdCByZXNpemVJbWFnZUZpbGUoaW1hZ2VGaWxlLCBjdXJzb3JJbWFnZVNpemVQeCk7XG5cbiAgICBsZXQgcHJldmlld0RhdGFVUkwgPSBhd2FpdCBnZXREYXRhVVJMKGltYWdlUHJldmlldyk7XG5cbiAgICAvLyBTVkcgY2Fubm90IGJlIHJlc2l6ZWQgdmlhIGByZXNpemVJbWFnZUZpbGVgIHNvIHdlIHJlc2l6ZSBieSByZW5kZXJpbmcgdG9cbiAgICAvLyBhIHNtYWxsIGNhbnZhc1xuICAgIGlmIChpbWFnZUZpbGUudHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgIGNvbnN0IGltZyA9IGF3YWl0IGxvYWRIVE1MSW1hZ2VFbGVtZW50KHByZXZpZXdEYXRhVVJMKTtcblxuICAgICAgbGV0IGhlaWdodCA9IE1hdGgubWluKGltZy5oZWlnaHQsIGN1cnNvckltYWdlU2l6ZVB4KTtcbiAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIChpbWcud2lkdGggLyBpbWcuaGVpZ2h0KTtcblxuICAgICAgaWYgKHdpZHRoID4gY3Vyc29ySW1hZ2VTaXplUHgpIHtcbiAgICAgICAgd2lkdGggPSBjdXJzb3JJbWFnZVNpemVQeDtcbiAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiAoaW1nLmhlaWdodCAvIGltZy53aWR0aCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG5cbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgIHByZXZpZXdEYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pIDQgNCwgYXV0b2ApO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uSW1hZ2VBY3Rpb24gPSBhc3luYyAoXG4gICAgeyBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5IH0gPSB7IGluc2VydE9uQ2FudmFzRGlyZWN0bHk6IGZhbHNlIH0sXG4gICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGllbnRYID0gdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgICBjb25zdCBjbGllbnRZID0gdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICB7IGNsaWVudFgsIGNsaWVudFkgfSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltYWdlRmlsZSA9IGF3YWl0IGZpbGVPcGVuKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VcIixcbiAgICAgICAgZXh0ZW5zaW9uczogW1wianBnXCIsIFwicG5nXCIsIFwic3ZnXCIsIFwiZ2lmXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICBzY2VuZVk6IHksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluc2VydEltYWdlRWxlbWVudChcbiAgICAgICAgICAgICAgaW1hZ2VFbGVtZW50LFxuICAgICAgICAgICAgICBpbWFnZUZpbGUsXG4gICAgICAgICAgICAgIC8qIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgKi8gdHJ1ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMgPSAoXG4gICAgaW1hZ2VFbGVtZW50OiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICAgIGZvcmNlTmF0dXJhbFNpemUgPSBmYWxzZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgaW1hZ2UgPVxuICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQpICYmXG4gICAgICB0aGlzLmltYWdlQ2FjaGUuZ2V0KGltYWdlRWxlbWVudC5maWxlSWQpPy5pbWFnZTtcblxuICAgIGlmICghaW1hZ2UgfHwgaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGltYWdlRWxlbWVudC53aWR0aCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSAmJlxuICAgICAgICBpbWFnZUVsZW1lbnQuaGVpZ2h0IDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJTaXplID0gMTAwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICAgIHg6IGltYWdlRWxlbWVudC54IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB5OiBpbWFnZUVsZW1lbnQueSAtIHBsYWNlaG9sZGVyU2l6ZSAvIDIsXG4gICAgICAgICAgd2lkdGg6IHBsYWNlaG9sZGVyU2l6ZSxcbiAgICAgICAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyU2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmb3JjZU5hdHVyYWxTaXplIHx8XG4gICAgICAvLyBpZiB1c2VyLWNyZWF0ZWQgYm91bmRpbmcgYm94IGlzIGJlbG93IHRocmVzaG9sZCwgYXNzdW1lIHRoZVxuICAgICAgLy8gaW50ZW50aW9uIHdhcyB0byBjbGljayBpbnN0ZWFkIG9mIGRyYWcsIGFuZCB1c2UgdGhlIGltYWdlJ3NcbiAgICAgIC8vIGludHJpbnNpYyBzaXplXG4gICAgICAoaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlICYmXG4gICAgICAgIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUpXG4gICAgKSB7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBNYXRoLm1heCh0aGlzLnN0YXRlLmhlaWdodCAtIDEyMCwgMTYwKTtcbiAgICAgIC8vIG1heCA2NSUgb2YgY2FudmFzIGhlaWdodCwgY2xhbXBlZCB0byA8MzAwcHgsIHZoIC0gMTIwcHg+XG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1pbihcbiAgICAgICAgbWluSGVpZ2h0LFxuICAgICAgICBNYXRoLmZsb29yKHRoaXMuc3RhdGUuaGVpZ2h0ICogMC41KSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKGltYWdlLm5hdHVyYWxIZWlnaHQsIG1heEhlaWdodCk7XG4gICAgICBjb25zdCB3aWR0aCA9IGhlaWdodCAqIChpbWFnZS5uYXR1cmFsV2lkdGggLyBpbWFnZS5uYXR1cmFsSGVpZ2h0KTtcblxuICAgICAgLy8gYWRkIGN1cnJlbnQgaW1hZ2VFbGVtZW50IHdpZHRoL2hlaWdodCB0byBhY2NvdW50IGZvciBwcmV2aW91cyBjZW50ZXJpbmdcbiAgICAgIC8vIG9mIHRoZSBwbGFjaG9sZGVyIGltYWdlXG4gICAgICBjb25zdCB4ID0gaW1hZ2VFbGVtZW50LnggKyBpbWFnZUVsZW1lbnQud2lkdGggLyAyIC0gd2lkdGggLyAyO1xuICAgICAgY29uc3QgeSA9IGltYWdlRWxlbWVudC55ICsgaW1hZ2VFbGVtZW50LmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyO1xuXG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cbiAgfTtcblxuICAvKiogdXBkYXRlcyBpbWFnZSBjYWNoZSwgcmVmcmVzaGluZyB1cGRhdGVkIGVsZW1lbnRzIGFuZC9vciBzZXR0aW5nIHN0YXR1c1xuICAgICAgdG8gZXJyb3IgZm9yIGltYWdlcyB0aGF0IGZhaWwgZHVyaW5nIDxpbWc+IGVsZW1lbnQgY3JlYXRpb24gKi9cbiAgcHJpdmF0ZSB1cGRhdGVJbWFnZUNhY2hlID0gYXN5bmMgKFxuICAgIGVsZW1lbnRzOiByZWFkb25seSBJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXSxcbiAgICBmaWxlcyA9IHRoaXMuZmlsZXMsXG4gICkgPT4ge1xuICAgIGNvbnN0IHsgdXBkYXRlZEZpbGVzLCBlcnJvcmVkRmlsZXMgfSA9IGF3YWl0IF91cGRhdGVJbWFnZUNhY2hlKHtcbiAgICAgIGltYWdlQ2FjaGU6IHRoaXMuaW1hZ2VDYWNoZSxcbiAgICAgIGZpbGVJZHM6IGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5maWxlSWQpLFxuICAgICAgZmlsZXMsXG4gICAgfSk7XG4gICAgaWYgKHVwZGF0ZWRGaWxlcy5zaXplIHx8IGVycm9yZWRGaWxlcy5zaXplKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKHVwZGF0ZWRGaWxlcy5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvcmVkRmlsZXMuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgeyBzdGF0dXM6IFwiZXJyb3JcIiB9LFxuICAgICAgICAgICAgLyogaW5mb3JtTXV0YXRpb24gKi8gZmFsc2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB1cGRhdGVkRmlsZXMsIGVycm9yZWRGaWxlcyB9O1xuICB9O1xuXG4gIC8qKiBhZGRzIG5ldyBpbWFnZXMgdG8gaW1hZ2VDYWNoZSBhbmQgcmUtcmVuZGVycyBpZiBuZWVkZWQgKi9cbiAgcHJpdmF0ZSBhZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUgPSBhc3luYyAoXG4gICAgaW1hZ2VFbGVtZW50czogSW5pdGlhbGl6ZWRFeGNhbGlkcmF3SW1hZ2VFbGVtZW50W10gPSBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgKSxcbiAgICBmaWxlczogQmluYXJ5RmlsZXMgPSB0aGlzLmZpbGVzLFxuICApID0+IHtcbiAgICBjb25zdCB1bmNhY2hlZEltYWdlRWxlbWVudHMgPSBpbWFnZUVsZW1lbnRzLmZpbHRlcihcbiAgICAgIChlbGVtZW50KSA9PiAhZWxlbWVudC5pc0RlbGV0ZWQgJiYgIXRoaXMuaW1hZ2VDYWNoZS5oYXMoZWxlbWVudC5maWxlSWQpLFxuICAgICk7XG5cbiAgICBpZiAodW5jYWNoZWRJbWFnZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyB1cGRhdGVkRmlsZXMgfSA9IGF3YWl0IHRoaXMudXBkYXRlSW1hZ2VDYWNoZShcbiAgICAgICAgdW5jYWNoZWRJbWFnZUVsZW1lbnRzLFxuICAgICAgICBmaWxlcyxcbiAgICAgICk7XG4gICAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5pbmZvcm1NdXRhdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiogZ2VuZXJhbGx5IHlvdSBzaG91bGQgdXNlIGBhZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKWAgZGlyZWN0bHkgaWYgeW91IG5lZWRcbiAgICogIHRvIHJlbmRlciBuZXcgaW1hZ2VzLiBUaGlzIGlzIGp1c3QgYSBmYWlsc2FmZSAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZUltYWdlUmVmcmVzaCA9IHRocm90dGxlKCgpID0+IHtcbiAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICB9LCBJTUFHRV9SRU5ERVJfVElNRU9VVCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IHNob3VsZEVuYWJsZUJpbmRpbmcgPSBzaG91bGRFbmFibGVCaW5kaW5nRm9yUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkICE9PSBzaG91bGRFbmFibGVCaW5kaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogc2hvdWxkRW5hYmxlQmluZGluZyB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3IgPSAocG9pbnRlckNvb3Jkczoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0pOiB2b2lkID0+IHtcbiAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgIHRoaXMuc2NlbmUsXG4gICAgKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOlxuICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF0gOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IgPSAoXG4gICAgbGluZWFyRWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgc3RhcnRPckVuZDogXCJzdGFydFwiIHwgXCJlbmRcIixcbiAgICBwb2ludGVyQ29vcmRzOiB7XG4gICAgICB4OiBudW1iZXI7XG4gICAgICB5OiBudW1iZXI7XG4gICAgfSxcbiAgICAvLyBEdXJpbmcgbGluZSBjcmVhdGlvbiB0aGUgc3RhcnQgYmluZGluZyBoYXNuJ3QgYmVlbiB3cml0dGVuIHlldFxuICAgIC8vIGludG8gYGxpbmVhckVsZW1lbnRgXG4gICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50PzogRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCB8IG51bGwsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6XG4gICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICAhaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kKFxuICAgICAgICAgIGxpbmVhckVsZW1lbnQsXG4gICAgICAgICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50Py5pZCxcbiAgICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50LFxuICAgICAgICApXG4gICAgICAgICAgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF1cbiAgICAgICAgICA6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChcbiAgICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5ncyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgLy8gQ29udGludWUgZWRpdGluZyB0aGUgc2FtZSBncm91cCBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpZmZlcmVudFxuICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICBlZGl0aW5nR3JvdXBJZDpcbiAgICAgICAgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgIGhpdEVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICBpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZClcbiAgICAgICAgICA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZFxuICAgICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNSZWYgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4ge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgICAgdGhpcy5yYyA9IHJvdWdoLmNhbnZhcyh0aGlzLmNhbnZhcyk7XG5cbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIHRoaXMub25UYXBTdGFydCk7XG4gICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgdGhpcy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCB0aGlzLmhhbmRsZVdoZWVsKTtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCB0aGlzLm9uVGFwU3RhcnQpO1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCB0aGlzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcHBPbkRyb3AgPSBhc3luYyAoZXZlbnQ6IFJlYWN0LkRyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucHJvcHMub25Ecm9wKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKChhd2FpdCB0aGlzLnByb3BzLm9uRHJvcChldmVudCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF07XG5cbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGRlY29kZSBzY2VuZSBmcm9tIHRoZSBpbWFnZSBpZiBpdCdzIGVtYmVkZGVkXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIGlmIChmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnBuZyB8fCBmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgb24gb2xkZXIgcmVsZWFzZXMuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtc1swXTtcbiAgICAgICAgICAgICAgICAoZmlsZSBhcyBhbnkpLmhhbmRsZSA9IGF3YWl0IChpdGVtIGFzIGFueSkuZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2NlbmUgPSBhd2FpdCBsb2FkRnJvbUJsb2IoXG4gICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgICAgICAgICAgLi4uc2NlbmUsXG4gICAgICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAgICAgLi4uKHNjZW5lLmFwcFN0YXRlIHx8IHRoaXMuc3RhdGUpLFxuICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlcGxhY2VGaWxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiRW5jb2RpbmdFcnJvclwiKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5vIHNjZW5lIGlzIGVtYmVkZGVkIG9yIHdlIGZhaWwgZm9yIHdoYXRldmVyIHJlYXNvbiwgZmFsbCBiYWNrXG4gICAgICAgIC8vIHRvIGltcG9ydGluZyBhcyByZWd1bGFyIGltYWdlXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIGNvbnN0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHsgc2NlbmVYLCBzY2VuZVkgfSk7XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlIH0gfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGlicmFyeVNoYXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG4gICAgaWYgKGxpYnJhcnlTaGFwZXMgIT09IFwiXCIpIHtcbiAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICBlbGVtZW50czogSlNPTi5wYXJzZShsaWJyYXJ5U2hhcGVzKSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LFxuICAgICAgICBmaWxlczogbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzWzBdO1xuICAgIGlmIChcbiAgICAgIGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYiB8fFxuICAgICAgZmlsZT8ubmFtZT8uZW5kc1dpdGgoXCIuZXhjYWxpZHJhd2xpYlwiKVxuICAgICkge1xuICAgICAgdGhpcy5saWJyYXJ5XG4gICAgICAgIC5pbXBvcnRMaWJyYXJ5KGZpbGUpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBDbG9zZSBhbmQgdGhlbiBvcGVuIHRvIGdldCB0aGUgbGlicmFyaWVzIHVwZGF0ZWRcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogZmFsc2UgfSk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IHRydWUgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogZmFsc2UsIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KSxcbiAgICAgICAgKTtcbiAgICAgIC8vIGRlZmF1bHQ6IGFzc3VtZSBhbiBFeGNhbGlkcmF3IGZpbGUgcmVnYXJkbGVzcyBvZiBleHRlbnNpb24vTWltZVR5cGVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogdHJ1ZSB9KTtcbiAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgd29yayBhcyBvZiBDaHJvbWUgODYsXG4gICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgICAgIChmaWxlIGFzIGFueSkuaGFuZGxlID0gYXdhaXQgKGl0ZW0gYXMgYW55KS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZVRvQ2FudmFzKGZpbGUpO1xuICAgIH1cbiAgfTtcblxuICBsb2FkRmlsZVRvQ2FudmFzID0gKGZpbGU6IEJsb2IpID0+IHtcbiAgICBsb2FkRnJvbUJsb2IoZmlsZSwgdGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSlcbiAgICAgIC50aGVuKChzY2VuZSkgPT4ge1xuICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgIC4uLnNjZW5lLFxuICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAuLi4oc2NlbmUuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiBmYWxzZSwgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNDb250ZXh0TWVudSA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7IHByZWZlclNlbGVjdGVkOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IGVsZW1lbnQgPyBcImVsZW1lbnRcIiA6IFwiY2FudmFzXCI7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCE7XG4gICAgY29uc3Qge1xuICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgIH0gPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IGV2ZW50LmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgIGNvbnN0IHRvcCA9IGV2ZW50LmNsaWVudFkgLSBvZmZzZXRUb3A7XG5cbiAgICBpZiAoZWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2VsZW1lbnQuaWRdOiB0cnVlIH0gfSwgKCkgPT4ge1xuICAgICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb3BlbkNvbnRleHRNZW51KHsgdG9wLCBsZWZ0IH0sIHR5cGUpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50ID0gKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LFxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcbiAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzO1xuICAgIGlmICghZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgZHJhZ05ld0VsZW1lbnQoXG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJDb29yZHMueCksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIHBvaW50ZXJDb29yZHMueSksXG4gICAgICAgIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltYWdlID1cbiAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpICYmXG4gICAgICAgIHRoaXMuaW1hZ2VDYWNoZS5nZXQoZHJhZ2dpbmdFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPVxuICAgICAgICBpbWFnZSAmJiAhKGltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICA/IGltYWdlLndpZHRoIC8gaW1hZ2UuaGVpZ2h0XG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC55LFxuICAgICAgICBncmlkWCxcbiAgICAgICAgZ3JpZFksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLngsIGdyaWRYKSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSwgZ3JpZFkpLFxuICAgICAgICBpc0ltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpXG4gICAgICAgICAgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudClcbiAgICAgICAgICA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSxcbiAgICAgICAgYXNwZWN0UmF0aW8sXG4gICAgICApO1xuXG4gICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoW2RyYWdnaW5nRWxlbWVudF0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1heWJlSGFuZGxlUmVzaXplID0gKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LFxuICApOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVUeXBlID0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIC8vIFRPRE86IHJlbmFtZSB0aGlzIHN0YXRlIGZpZWxkIHRvIFwiaXNTY2FsaW5nXCIgdG8gZGlzdGluZ3Vpc2hcbiAgICAgIC8vIGl0IGZyb20gdGhlIGdlbmVyaWMgXCJpc1Jlc2l6aW5nXCIgd2hpY2ggaW5jbHVkZXMgc2NhbGluZyBhbmRcbiAgICAgIC8vIHJvdGF0aW5nXG4gICAgICBpc1Jlc2l6aW5nOiB0cmFuc2Zvcm1IYW5kbGVUeXBlICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwicm90YXRpb25cIixcbiAgICAgIGlzUm90YXRpbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIixcbiAgICB9KTtcbiAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzO1xuICAgIGNvbnN0IFtyZXNpemVYLCByZXNpemVZXSA9IGdldEdyaWRQb2ludChcbiAgICAgIHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldC54LFxuICAgICAgcG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LnksXG4gICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgdHJhbnNmb3JtRWxlbWVudHMoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZShldmVudCksXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0ltYWdlRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKVxuICAgICAgICAgID8gIXNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpXG4gICAgICAgICAgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSxcbiAgICAgICAgcmVzaXplWCxcbiAgICAgICAgcmVzaXplWSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmNlbnRlci55LFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKiogQHByaXZhdGUgdXNlIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgKi9cbiAgcHJpdmF0ZSBfb3BlbkNvbnRleHRNZW51ID0gKFxuICAgIHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3AsXG4gICAgfToge1xuICAgICAgbGVmdDogbnVtYmVyO1xuICAgICAgdG9wOiBudW1iZXI7XG4gICAgfSxcbiAgICB0eXBlOiBcImNhbnZhc1wiIHwgXCJlbGVtZW50XCIsXG4gICkgPT4ge1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVGbGlwSG9yaXpvbnRhbCA9IGFjdGlvbkZsaXBIb3Jpem9udGFsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VwYXJhdG9yID0gXCJzZXBhcmF0b3JcIjtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQ29udGV4dE1lbnVPcHRpb25bXSA9IFtdO1xuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzUG5nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzU3ZnKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiY2FudmFzXCIpIHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlT3B0aW9ucyA9IFtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVplbk1vZGUsXG4gICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgICAgIF07XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiB2aWV3TW9kZU9wdGlvbnMsXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQhLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgJiZcbiAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJlxuICAgICAgICAgICAgICBlbGVtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGFjdGlvbkNvcHlBc1BuZyxcbiAgICAgICAgICAgIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiZcbiAgICAgICAgICAgICAgZWxlbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICBhY3Rpb25Db3B5QXNTdmcsXG4gICAgICAgICAgICAoKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApKSAmJlxuICAgICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25TZWxlY3RBbGwsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICAgICAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCAuLi5vcHRpb25zXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5pc01vYmlsZSAmJiBhY3Rpb25DdXQsXG4gICAgICAgICAgICB0aGlzLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgYWN0aW9uQ29weSxcbiAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgJiZcbiAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIGFjdGlvbkNvcHlTdHlsZXMsXG4gICAgICAgICAgICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIG1heWJlR3JvdXBBY3Rpb24gJiYgYWN0aW9uR3JvdXAsXG4gICAgICAgICAgICBtYXliZVVuZ3JvdXBBY3Rpb24gJiYgYWN0aW9uVW5ncm91cCxcbiAgICAgICAgICAgIChtYXliZUdyb3VwQWN0aW9uIHx8IG1heWJlVW5ncm91cEFjdGlvbikgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uQWRkVG9MaWJyYXJ5LFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICAgICAgICAgICAgYWN0aW9uQnJpbmdGb3J3YXJkLFxuICAgICAgICAgICAgYWN0aW9uU2VuZFRvQmFjayxcbiAgICAgICAgICAgIGFjdGlvbkJyaW5nVG9Gcm9udCxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIG1heWJlRmxpcEhvcml6b250YWwgJiYgYWN0aW9uRmxpcEhvcml6b250YWwsXG4gICAgICAgICAgICBtYXliZUZsaXBWZXJ0aWNhbCAmJiBhY3Rpb25GbGlwVmVydGljYWwsXG4gICAgICAgICAgICAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uLFxuICAgICAgICAgICAgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZVdoZWVsID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZXZlbnQ7XG4gICAgY29uc3QgeyBzZWxlY3RlZEVsZW1lbnRJZHMsIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzIH0gPSB0aGlzLnN0YXRlO1xuICAgIC8vIG5vdGUgdGhhdCBldmVudC5jdHJsS2V5IGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgcGluY2ggem9vbWluZ1xuICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oZGVsdGFZKTtcbiAgICAgIGNvbnN0IE1BWF9TVEVQID0gMTA7XG4gICAgICBsZXQgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpO1xuICAgICAgaWYgKGRlbHRhID4gTUFYX1NURVApIHtcbiAgICAgICAgZGVsdGEgPSBNQVhfU1RFUDtcbiAgICAgIH1cbiAgICAgIGRlbHRhICo9IHNpZ247XG4gICAgICBpZiAoT2JqZWN0LmtleXMocHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Wm9vbSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZSAtIGRlbHRhIC8gMTAwO1xuICAgICAgLy8gaW5jcmVhc2Ugem9vbSBzdGVwcyB0aGUgbW9yZSB6b29tZWQtaW4gd2UgYXJlIChhcHBsaWVzIHRvID4xMDAlIG9ubHkpXG4gICAgICBuZXdab29tICs9IE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgdGhpcy5zdGF0ZS56b29tLnZhbHVlKSkgKiAtc2lnbjtcbiAgICAgIC8vIHJvdW5kIHRvIG5lYXJlc3Qgc3RlcFxuICAgICAgbmV3Wm9vbSA9IE1hdGgucm91bmQobmV3Wm9vbSAqIFpPT01fU1RFUCAqIDEwMCkgLyAoWk9PTV9TVEVQICogMTAwKTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSkgPT4gKHtcbiAgICAgICAgem9vbTogZ2V0TmV3Wm9vbShcbiAgICAgICAgICBnZXROb3JtYWxpemVkWm9vbShuZXdab29tKSxcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIHsgbGVmdDogb2Zmc2V0TGVmdCwgdG9wOiBvZmZzZXRUb3AgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4OiBjdXJzb3JYLFxuICAgICAgICAgICAgeTogY3Vyc29yWSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczpcbiAgICAgICAgICBPYmplY3Qua2V5cyhzZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgPyBzZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgICAgICAgIDogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBzY3JvbGxYIH0pID0+ICh7XG4gICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gKGRlbHRhWSB8fCBkZWx0YVgpIC8gem9vbS52YWx1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFkgfSkgPT4gKHtcbiAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgc2Nyb2xsWTogc2Nyb2xsWSAtIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgfSkpO1xuICB9KTtcblxuICBwcml2YXRlIGdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICAgc2NhbGU6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRFbGVtZW50Q29udGFpbmluZ1Bvc2l0aW9uKFxuICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCkpLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudENsaWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJYID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueCArIGVsZW1lbnRDbGlja2VkSW5zaWRlLndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueSArIGVsZW1lbnRDbGlja2VkSW5zaWRlLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvQ2VudGVyID0gTWF0aC5oeXBvdChcbiAgICAgICAgeCAtIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICB5IC0gZWxlbWVudENlbnRlclksXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPVxuICAgICAgICBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3QgeyB4OiB2aWV3cG9ydFgsIHk6IHZpZXdwb3J0WSB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICAgIHsgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCwgc2NlbmVZOiBlbGVtZW50Q2VudGVyWSB9LFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB2aWV3cG9ydFgsIHZpZXdwb3J0WSwgZWxlbWVudENlbnRlclgsIGVsZW1lbnRDZW50ZXJZIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUG9pbnRlciA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgYnV0dG9uOiBcInVwXCIgfCBcImRvd25cIikgPT4ge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7XG4gICAgICAvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBpZiAoIXRoaXMudW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVET01SZWN0ID0gKGNiPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgICBvZmZzZXRUb3A6IGN1cnJlbnRPZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGN1cnJlbnRPZmZzZXRMZWZ0LFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgd2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJlxuICAgICAgICBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiZcbiAgICAgICAgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiZcbiAgICAgICAgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3AsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0Q2FudmFzT2Zmc2V0cygpOiBQaWNrPEFwcFN0YXRlLCBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCI+IHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldExlZnQ6IDAsXG4gICAgICBvZmZzZXRUb3A6IDAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTGFuZ3VhZ2UoKSB7XG4gICAgY29uc3QgY3VycmVudExhbmcgPVxuICAgICAgbGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuY29kZSA9PT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkgfHxcbiAgICAgIGRlZmF1bHRMYW5nO1xuICAgIGF3YWl0IHNldExhbmd1YWdlKGN1cnJlbnRMYW5nKTtcbiAgICB0aGlzLnNldEFwcFN0YXRlKHt9KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBoOiB7XG4gICAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICAgIHN0YXRlOiBBcHBTdGF0ZTtcbiAgICAgIHNldFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXTtcbiAgICAgIGFwcDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+O1xuICAgICAgaGlzdG9yeTogSGlzdG9yeTtcbiAgICB9O1xuICB9XG59XG5cbmlmIChcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbikge1xuICB3aW5kb3cuaCA9IHdpbmRvdy5oIHx8ICh7fSBhcyBXaW5kb3dbXCJoXCJdKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgICAgIH0sXG4gICAgICBzZXQoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
1677
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useIsMobile\": () => (/* binding */ useIsMobile),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.dev.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../renderer */ \"../../renderer/index.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Stats */ \"../../components/Stats.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../data/blob */ \"../../data/blob.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! lodash.throttle */ \"../../../node_modules/lodash.throttle/index.js\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_42__);\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst IsMobileContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(false);\r\nconst useIsMobile = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(IsMobileContext);\r\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\r\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\r\nlet didTapTwice = false;\r\nlet tappedTwiceTimer = 0;\r\nlet cursorX = 0;\r\nlet cursorY = 0;\r\nlet isHoldingSpace = false;\r\nlet isPanning = false;\r\nlet isDraggingScrollBar = false;\r\nlet currentScrollBars = { horizontal: null, vertical: null };\r\nlet touchTimeout = 0;\r\nlet invalidateContextMenu = false;\r\nlet lastPointerUp = null;\r\nconst gesture = {\r\n pointers: new Map(),\r\n lastCenter: null,\r\n initialDistance: null,\r\n initialScale: null,\r\n};\r\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\r\n constructor(props) {\r\n var _a;\r\n super(props);\r\n this.canvas = null;\r\n this.rc = null;\r\n this.unmounted = false;\r\n this.isMobile = false;\r\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\r\n this.files = {};\r\n this.imageCache = new Map();\r\n this.focusContainer = () => {\r\n var _a;\r\n if (this.props.autoFocus) {\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\r\n }\r\n };\r\n this.getSceneElementsIncludingDeleted = () => {\r\n return this.scene.getElementsIncludingDeleted();\r\n };\r\n this.getSceneElements = () => {\r\n return this.scene.getElements();\r\n };\r\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((actionResult) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n if (this.unmounted || actionResult === false) {\r\n return;\r\n }\r\n let editingElement = null;\r\n if (actionResult.elements) {\r\n actionResult.elements.forEach((element) => {\r\n var _a;\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\r\n this.state.editingElement !== element &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n editingElement = element;\r\n }\r\n });\r\n this.scene.replaceAllElements(actionResult.elements);\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n }\r\n if (actionResult.files) {\r\n this.files = actionResult.replaceFiles\r\n ? actionResult.files\r\n : Object.assign(Object.assign({}, this.files), actionResult.files);\r\n this.addNewImagesToImageCache();\r\n }\r\n if (actionResult.appState || editingElement) {\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\r\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\r\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\r\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_11__.THEME.LIGHT;\r\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\r\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\r\n viewModeEnabled = this.props.viewModeEnabled;\r\n }\r\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\r\n zenModeEnabled = this.props.zenModeEnabled;\r\n }\r\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\r\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null;\r\n }\r\n if (typeof this.props.theme !== \"undefined\") {\r\n theme = this.props.theme;\r\n }\r\n if (typeof this.props.name !== \"undefined\") {\r\n name = this.props.name;\r\n }\r\n this.setState((state) => {\r\n var _a;\r\n // using Object.assign instead of spread to fool TS 4.2.2+ into\r\n // regarding the resulting type as not containing undefined\r\n // (which the following expression will never contain)\r\n return Object.assign(actionResult.appState || {}, {\r\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\r\n viewModeEnabled,\r\n zenModeEnabled,\r\n gridSize,\r\n theme,\r\n name,\r\n });\r\n }, () => {\r\n if (actionResult.syncHistory) {\r\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\r\n }\r\n });\r\n }\r\n });\r\n // Lifecycle\r\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isHoldingSpace = false;\r\n this.setState({ isBindingEnabled: true });\r\n });\r\n this.onUnload = () => {\r\n this.onBlur();\r\n };\r\n this.disableEvent = (event) => {\r\n event.preventDefault();\r\n };\r\n this.onFontLoaded = () => {\r\n this.scene.getElementsIncludingDeleted().forEach((element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.onSceneUpdated();\r\n };\r\n this.importLibraryFromUrl = (url, token) => __awaiter(this, void 0, void 0, function* () {\r\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary)) {\r\n const hash = new URLSearchParams(window.location.hash.slice(1));\r\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `#${hash.toString()}`);\r\n }\r\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary)) {\r\n const query = new URLSearchParams(window.location.search);\r\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, `?${query.toString()}`);\r\n }\r\n try {\r\n const request = yield fetch(decodeURIComponent(url));\r\n const blob = yield request.blob();\r\n const json = JSON.parse(yield blob.text());\r\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_13__.isValidLibrary)(json)) {\r\n throw new Error();\r\n }\r\n if (token === this.id ||\r\n window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.confirmAddLibrary\", { numShapes: json.library.length }))) {\r\n yield this.library.importLibrary(blob);\r\n // hack to rerender the library items after import\r\n if (this.state.isLibraryOpen) {\r\n this.setState({ isLibraryOpen: false });\r\n }\r\n this.setState({ isLibraryOpen: true });\r\n }\r\n }\r\n catch (error) {\r\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"alerts.errorLoadingLibrary\"));\r\n console.error(error);\r\n }\r\n finally {\r\n this.focusContainer();\r\n }\r\n });\r\n this.resetHistory = () => {\r\n this.history.clear();\r\n };\r\n /**\r\n * Resets scene & history.\r\n * ! Do not use to clear scene user action !\r\n */\r\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((opts) => {\r\n this.scene.replaceAllElements([]);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\r\n this.resetHistory();\r\n });\r\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\r\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\r\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\r\n if (!launchParams.files.length) {\r\n return;\r\n }\r\n const fileHandle = launchParams.files[0];\r\n const blob = yield fileHandle.getFile();\r\n blob.handle = fileHandle;\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(blob, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n }));\r\n }\r\n if (!this.state.isLoading) {\r\n this.setState({ isLoading: true });\r\n }\r\n let initialData = null;\r\n try {\r\n initialData = (yield this.props.initialData) || null;\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\r\n this.libraryItemsFromStorage = initialData.libraryItems;\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n initialData = {\r\n appState: {\r\n errorMessage: error.message ||\r\n \"Encountered an error during importing or restoring scene data\",\r\n },\r\n };\r\n }\r\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restore)(initialData, null, null);\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), { elementType: scene.appState.elementType === \"image\"\r\n ? \"selection\"\r\n : scene.appState.elementType, isLoading: false });\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\r\n }\r\n this.resetHistory();\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\r\n const libraryUrl = \r\n // current\r\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_HASH_KEYS.addLibrary) ||\r\n // legacy, kept for compat reasons\r\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_11__.URL_QUERY_KEYS.addLibrary);\r\n if (libraryUrl) {\r\n yield this.importLibraryFromUrl(libraryUrl);\r\n }\r\n });\r\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n this.scene\r\n .getElementsIncludingDeleted()\r\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element));\r\n this.setState({});\r\n });\r\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\r\n this.setState((state) => {\r\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\r\n return null;\r\n }\r\n return { offsetTop, offsetLeft };\r\n });\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.SCROLL_TIMEOUT);\r\n // Copy/paste\r\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.cutAll();\r\n event.preventDefault();\r\n });\r\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.copyAll();\r\n event.preventDefault();\r\n });\r\n this.cutAll = () => {\r\n this.copyAll();\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected);\r\n };\r\n this.copyAll = () => {\r\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.copyToClipboard)(this.scene.getElements(), this.state, this.files);\r\n };\r\n this.onTapStart = (event) => {\r\n if (!didTapTwice) {\r\n didTapTwice = true;\r\n clearTimeout(tappedTwiceTimer);\r\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_11__.TAP_TWICE_TIMEOUT);\r\n return;\r\n }\r\n // insert text only if we tapped twice with a single finger\r\n // event.touches.length === 1 will also prevent inserting text when user's zooming\r\n if (didTapTwice && event.touches.length === 1) {\r\n const [touch] = event.touches;\r\n // @ts-ignore\r\n this.handleCanvasDoubleClick({\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n });\r\n didTapTwice = false;\r\n clearTimeout(tappedTwiceTimer);\r\n }\r\n event.preventDefault();\r\n if (event.touches.length === 2) {\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n }\r\n };\r\n this.onTapEnd = (event) => {\r\n if (event.touches.length > 0) {\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n }\r\n };\r\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\r\n var _b, _c;\r\n // #686\r\n const target = document.activeElement;\r\n const isExcalidrawActive = (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target);\r\n if (!isExcalidrawActive) {\r\n return;\r\n }\r\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\r\n if (\r\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\r\n // thus these checks don't make sense\r\n event &&\r\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(target))) {\r\n return;\r\n }\r\n // must be called in the same frame (thus before any awaits) as the paste\r\n // event else some browsers (FF...) will clear the clipboardData\r\n // (something something security)\r\n let file = (_c = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _c === void 0 ? void 0 : _c.files[0];\r\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event);\r\n if (!file && data.text) {\r\n const string = data.text.trim();\r\n if (string.startsWith(\"<svg\") && string.endsWith(\"</svg>\")) {\r\n // ignore SVG validation/normalization which will be done during image\r\n // initialization\r\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(string);\r\n }\r\n }\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n if (this.props.onPaste) {\r\n try {\r\n if ((yield this.props.onPaste(data, event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n if (data.errorMessage) {\r\n this.setState({ errorMessage: data.errorMessage });\r\n }\r\n else if (data.spreadsheet) {\r\n this.setState({\r\n pasteDialog: {\r\n data: data.spreadsheet,\r\n shown: true,\r\n },\r\n });\r\n }\r\n else if (data.elements) {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: data.elements,\r\n files: data.files || null,\r\n position: \"cursor\",\r\n });\r\n }\r\n else if (data.text) {\r\n this.addTextFromPaste(data.text);\r\n }\r\n this.selectShapeTool(\"selection\");\r\n event === null || event === void 0 ? void 0 : event.preventDefault();\r\n }));\r\n this.addElementsFromPasteOrLibrary = (opts) => {\r\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreElements)(opts.elements, null);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(elements);\r\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minX, maxX) / 2;\r\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minY, maxY) / 2;\r\n const clientX = typeof opts.position === \"object\"\r\n ? opts.position.clientX\r\n : opts.position === \"cursor\"\r\n ? cursorX\r\n : this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = typeof opts.position === \"object\"\r\n ? opts.position.clientY\r\n : opts.position === \"cursor\"\r\n ? cursorY\r\n : this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const dx = x - elementsCenterX;\r\n const dy = y - elementsCenterY;\r\n const groupIdMap = new Map();\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(dx, dy, this.state.gridSize);\r\n const oldIdToDuplicatedId = new Map();\r\n const newElements = elements.map((element) => {\r\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\r\n x: element.x + gridX - minX,\r\n y: element.y + gridY - minY,\r\n });\r\n oldIdToDuplicatedId.set(element.id, newElement.id);\r\n return newElement;\r\n });\r\n const nextElements = [\r\n ...this.scene.getElementsIncludingDeleted(),\r\n ...newElements,\r\n ];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\r\n if (opts.files) {\r\n this.files = Object.assign(Object.assign({}, this.files), opts.files);\r\n }\r\n this.scene.replaceAllElements(nextElements);\r\n this.history.resumeRecording();\r\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: false, selectedElementIds: newElements.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {}), selectedGroupIds: {} }), this.scene.getElements()), () => {\r\n if (opts.files) {\r\n this.addNewImagesToImageCache();\r\n }\r\n });\r\n this.selectShapeTool(\"selection\");\r\n };\r\n // Collaboration\r\n this.setAppState = (obj) => {\r\n this.setState(obj);\r\n };\r\n this.removePointer = (event) => {\r\n // remove touch handler for context menu on touch devices\r\n if (event.pointerType === \"touch\" && touchTimeout) {\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n invalidateContextMenu = false;\r\n }\r\n gesture.pointers.delete(event.pointerId);\r\n };\r\n this.toggleLock = () => {\r\n this.setState((prevState) => {\r\n return {\r\n elementLocked: !prevState.elementLocked,\r\n elementType: prevState.elementLocked\r\n ? \"selection\"\r\n : prevState.elementType,\r\n };\r\n });\r\n };\r\n this.toggleZenMode = () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode);\r\n };\r\n this.toggleStats = () => {\r\n if (!this.state.showStats) {\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_8__.trackEvent)(\"dialog\", \"stats\");\r\n }\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats);\r\n };\r\n this.scrollToContent = (target = this.scene.getElements()) => {\r\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\r\n };\r\n this.zoomToFit = (target = this.scene.getElements(), maxZoom = 1, //null will zoom to max based on viewport\r\n margin = 0.03) => {\r\n if (!target) {\r\n target = this.scene.getElements();\r\n }\r\n if (target.length === 0) {\r\n maxZoom = 1;\r\n }\r\n this.setState((0,_actions__WEBPACK_IMPORTED_MODULE_4__.zoomToFitElements)(target, this.state, false, maxZoom, margin).appState);\r\n };\r\n this.clearToast = () => {\r\n this.setState({ toastMessage: null });\r\n };\r\n this.setToastMessage = (toastMessage) => {\r\n this.setState({ toastMessage });\r\n };\r\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const webShareTargetCache = yield caches.open(\"web-share-target\");\r\n const file = yield webShareTargetCache.match(\"shared-file\");\r\n if (file) {\r\n const blob = yield file.blob();\r\n this.loadFileToCanvas(blob);\r\n yield webShareTargetCache.delete(\"shared-file\");\r\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_11__.APP_NAME, window.location.pathname);\r\n }\r\n }\r\n catch (error) {\r\n this.setState({ errorMessage: error.message });\r\n }\r\n });\r\n /** adds supplied files to existing files in the appState */\r\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((files) => {\r\n const filesMap = files.reduce((acc, fileData) => {\r\n acc.set(fileData.id, fileData);\r\n return acc;\r\n }, new Map());\r\n this.files = Object.assign(Object.assign({}, this.files), Object.fromEntries(filesMap));\r\n // bump versions for elements that reference added files so that\r\n // we/host apps can detect the change, and invalidate the image & shape\r\n // cache\r\n this.scene.getElements().forEach((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\r\n filesMap.has(element.fileId)) {\r\n this.imageCache.delete(element.fileId);\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.bumpVersion)(element);\r\n }\r\n });\r\n this.scene.informMutation();\r\n this.addNewImagesToImageCache();\r\n });\r\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((sceneData) => {\r\n if (sceneData.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n if (sceneData.appState) {\r\n this.setState(sceneData.appState);\r\n }\r\n if (sceneData.elements) {\r\n this.scene.replaceAllElements(sceneData.elements);\r\n }\r\n if (sceneData.collaborators) {\r\n this.setState({ collaborators: sceneData.collaborators });\r\n }\r\n });\r\n this.onSceneUpdated = () => {\r\n this.setState({});\r\n };\r\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n cursorX = event.clientX;\r\n cursorY = event.clientY;\r\n });\r\n // Input handling\r\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // normalize `event.key` when CapsLock is pressed #2372\r\n if (\"Proxy\" in window &&\r\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\r\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\r\n event = new Proxy(event, {\r\n get(ev, prop) {\r\n const value = ev[prop];\r\n if (typeof value === \"function\") {\r\n // fix for Proxies hijacking `this`\r\n return value.bind(ev);\r\n }\r\n return prop === \"key\"\r\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\r\n // it back\r\n event.shiftKey\r\n ? ev.key.toUpperCase()\r\n : ev.key.toLowerCase()\r\n : value;\r\n },\r\n });\r\n }\r\n if (((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ESCAPE) ||\r\n // case: using arrows to move between buttons\r\n ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isInputLike)(event.target))) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.QUESTION_MARK) {\r\n this.setState({\r\n showHelpDialog: true,\r\n });\r\n }\r\n if (this.actionManager.handleKeyDown(event)) {\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: false });\r\n }\r\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.ZERO) {\r\n this.setState({ isLibraryOpen: !this.state.isLibraryOpen });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const step = (this.state.gridSize &&\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT\r\n : this.state.gridSize)) ||\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.ELEMENT_TRANSLATE_AMOUNT);\r\n const selectedElements = this.scene\r\n .getElements()\r\n .filter((element) => this.state.selectedElementIds[element.id]);\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_LEFT) {\r\n offsetX = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_RIGHT) {\r\n offsetX = step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_UP) {\r\n offsetY = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_DOWN) {\r\n offsetY = step;\r\n }\r\n selectedElements.forEach((element) => {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n x: element.x + offsetX,\r\n y: element.y + offsetY,\r\n });\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element, {\r\n simultaneouslyUpdated: selectedElements,\r\n });\r\n });\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n event.preventDefault();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ENTER) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n }\r\n else if (selectedElements.length === 1 &&\r\n !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n const selectedElement = selectedElements[0];\r\n this.startTextEditing({\r\n sceneX: selectedElement.x + selectedElement.width / 2,\r\n sceneY: selectedElement.y + selectedElement.height / 2,\r\n });\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n else if (!event.ctrlKey &&\r\n !event.altKey &&\r\n !event.metaKey &&\r\n this.state.draggingElement === null) {\r\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_33__.findShapeByKey)(event.key);\r\n if (shape) {\r\n this.selectShapeTool(shape);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.Q) {\r\n this.toggleLock();\r\n }\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE && gesture.pointers.size === 0) {\r\n isHoldingSpace = true;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (this.state.elementType === \"selection\" &&\r\n !selectedElements.length) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G &&\r\n ((0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(this.state.elementType) ||\r\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(element.type)))) {\r\n this.setState({ openPopup: \"backgroundColorPicker\" });\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\r\n this.setState({ openPopup: \"strokeColorPicker\" });\r\n }\r\n }\r\n });\r\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (this.state.elementType === \"selection\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n isHoldingSpace = false;\r\n }\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: true });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements)(selectedElements)\r\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)(selectedElements);\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n });\r\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n gesture.initialScale = this.state.zoom.value;\r\n });\r\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n // onGestureChange only has zoom factor but not the center.\r\n // If we're on iPad or iPhone, then we recognize multi-touch and will\r\n // zoom in at the right location on the touchMove handler already.\r\n // On Macbook, we don't have those events so will zoom in at the\r\n // current location instead.\r\n if (gesture.pointers.size === 2) {\r\n return;\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (initialScale) {\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * event.scale), zoom, { left: offsetLeft, top: offsetTop }, { x: cursorX, y: cursorY }),\r\n }));\r\n }\r\n });\r\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n gesture.initialScale = null;\r\n });\r\n this.startTextEditing = ({ sceneX, sceneY, insertAtParentCenter = true, }) => {\r\n const existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\r\n const parentCenterPosition = insertAtParentCenter &&\r\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n const element = existingTextElement\r\n ? existingTextElement\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x: parentCenterPosition\r\n ? parentCenterPosition.elementCenterX\r\n : sceneX,\r\n y: parentCenterPosition\r\n ? parentCenterPosition.elementCenterY\r\n : sceneY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text: \"\",\r\n rawText: \"\",\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: parentCenterPosition\r\n ? \"center\"\r\n : this.state.currentItemTextAlign,\r\n verticalAlign: parentCenterPosition\r\n ? \"middle\"\r\n : _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.setState({ editingElement: element });\r\n if (existingTextElement) {\r\n // if text element is no longer centered to a container, reset\r\n // verticalAlign to default because it's currently internal-only\r\n if (!parentCenterPosition || element.textAlign !== \"center\") {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, { verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN });\r\n }\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n // case: creating new text not centered to parent elemenent → offset Y\r\n // so that the text is centered to cursor position\r\n if (!parentCenterPosition) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n y: element.y - element.baseline / 2,\r\n });\r\n }\r\n }\r\n this.setState({\r\n editingElement: element,\r\n });\r\n this.handleTextWysiwyg(element, {\r\n isExistingElement: !!existingTextElement,\r\n });\r\n };\r\n this.handleCanvasDoubleClick = (event) => {\r\n // case: double-clicking with arrow/line tool selected would both create\r\n // text and enter multiElement mode\r\n if (this.state.multiElement) {\r\n return;\r\n }\r\n // we should only be able to double click when mode is selection\r\n if (this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n return;\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIds)(this.state);\r\n if (selectedGroupIds.length > 0) {\r\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\r\n const selectedGroupId = hitElement &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\r\n if (selectedGroupId) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getElements()));\r\n return;\r\n }\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n }\r\n };\r\n this.handleCanvasPointerMove = (event) => {\r\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\r\n if (gesture.pointers.has(event.pointerId)) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (gesture.pointers.size === 2 &&\r\n gesture.lastCenter &&\r\n initialScale &&\r\n gesture.initialDistance) {\r\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n const deltaX = center.x - gesture.lastCenter.x;\r\n const deltaY = center.y - gesture.lastCenter.y;\r\n gesture.lastCenter = center;\r\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n const scaleFactor = distance / gesture.initialDistance;\r\n this.setState(({ zoom, scrollX, scrollY, offsetLeft, offsetTop }) => ({\r\n scrollX: scrollX + deltaX / zoom.value,\r\n scrollY: scrollY + deltaY / zoom.value,\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * scaleFactor), zoom, { left: offsetLeft, top: offsetTop }, center),\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n }\r\n else {\r\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\r\n }\r\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\r\n return;\r\n }\r\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\r\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\r\n if (!this.state.draggingElement && !this.state.multiElement) {\r\n if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\r\n if (this.state.editingLinearElement &&\r\n !this.state.editingLinearElement.isDragging) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({ editingLinearElement });\r\n }\r\n if (editingLinearElement.lastUncommittedPoint != null) {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n else {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElementType)(this.state.elementType)) {\r\n // Hovering with a selected tool or creating new linear element via click\r\n // and point\r\n const { draggingElement } = this.state;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", scenePointer, this.state.startBoundElement);\r\n }\r\n else {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n }\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n const { x: rx, y: ry } = multiElement;\r\n const { points, lastCommittedPoint } = multiElement;\r\n const lastPoint = points[points.length - 1];\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n if (lastPoint === lastCommittedPoint) {\r\n // if we haven't yet created a temp point and we're beyond commit-zone\r\n // threshold, add a point\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\r\n });\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n // in this branch, we're inside the commit zone, and no uncommitted\r\n // point exists. Thus do nothing (don't add/remove points).\r\n }\r\n }\r\n else if (points.length > 2 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: points.slice(0, -1),\r\n });\r\n }\r\n else {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(points, this.state.zoom.value)) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n // update last uncommitted point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n points: [\r\n ...points.slice(0, -1),\r\n [scenePointerX - rx, scenePointerY - ry],\r\n ],\r\n });\r\n }\r\n return;\r\n }\r\n const hasDeselectedButton = Boolean(event.buttons);\r\n if (hasDeselectedButton ||\r\n (this.state.elementType !== \"selection\" &&\r\n this.state.elementType !== \"text\")) {\r\n return;\r\n }\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 &&\r\n !isOverScrollBar &&\r\n !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType &&\r\n elementWithTransformHandleType.transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)(elementWithTransformHandleType));\r\n return;\r\n }\r\n }\r\n else if (selectedElements.length > 1 && !isOverScrollBar) {\r\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType,\r\n }));\r\n return;\r\n }\r\n }\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n if (this.state.elementType === \"text\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n }\r\n else if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n else if (\r\n // if using cmd/ctrl, we're not dragging\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] &&\r\n (hitElement ||\r\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.AUTO);\r\n }\r\n };\r\n // set touch moving for mobile context menu\r\n this.handleTouchMove = (event) => {\r\n invalidateContextMenu = true;\r\n };\r\n this.handleCanvasPointerDown = (event) => {\r\n // remove any active selection when we start to interact with canvas\r\n // (mainly, we care about removing selection outside the component which\r\n // would prevent our copy handling otherwise)\r\n const selection = document.getSelection();\r\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\r\n selection.removeAllRanges();\r\n }\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\r\n this.maybeCleanupAfterMissingPointerUp(event);\r\n if (isPanning) {\r\n return;\r\n }\r\n this.setState({\r\n lastPointerDownWith: event.pointerType,\r\n cursorButton: \"down\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"down\");\r\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\r\n return;\r\n }\r\n // only handle left mouse button or touch\r\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN &&\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.TOUCH) {\r\n return;\r\n }\r\n this.updateGestureOnPointerDown(event);\r\n // don't select while panning\r\n if (gesture.pointers.size > 1) {\r\n return;\r\n }\r\n // State for the duration of a pointer interaction, which starts with a\r\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\r\n const pointerDownState = this.initialPointerDownState(event);\r\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\r\n return;\r\n }\r\n this.clearSelectionIfNotUsingSelection();\r\n this.updateBindingEnabledOnPointerMove(event);\r\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\r\n return;\r\n }\r\n if (this.state.elementType === \"text\") {\r\n this.handleTextOnPointerDown(event, pointerDownState);\r\n return;\r\n }\r\n else if (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\") {\r\n this.handleLinearElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType === \"image\") {\r\n // reset image preview on pointerdown\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.CROSSHAIR);\r\n if (!this.state.pendingImageElement) {\r\n return;\r\n }\r\n this.setState({\r\n draggingElement: this.state.pendingImageElement,\r\n editingElement: this.state.pendingImageElement,\r\n pendingImageElement: null,\r\n multiElement: null,\r\n });\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(this.state.pendingImageElement, {\r\n x,\r\n y,\r\n });\r\n }\r\n else if (this.state.elementType === \"freedraw\") {\r\n this.handleFreeDrawElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else {\r\n this.createGenericElementOnPointerDown(this.state.elementType, pointerDownState);\r\n }\r\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\r\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\r\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\r\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\r\n lastPointerUp = onPointerUp;\r\n if (!this.state.viewModeEnabled) {\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, onKeyDown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, onKeyUp);\r\n pointerDownState.eventListeners.onMove = onPointerMove;\r\n pointerDownState.eventListeners.onUp = onPointerUp;\r\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\r\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\r\n }\r\n };\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\r\n // deal with opening context menu on touch devices\r\n if (event.pointerType === \"touch\") {\r\n invalidateContextMenu = false;\r\n if (touchTimeout) {\r\n // If there's already a touchTimeout, this means that there's another\r\n // touch down and we are doing another touch, so we shouldn't open the\r\n // context menu.\r\n invalidateContextMenu = true;\r\n }\r\n else {\r\n // open the context menu with the first touch's clientX and clientY\r\n // if the touch is not moving\r\n touchTimeout = window.setTimeout(() => {\r\n touchTimeout = 0;\r\n if (!invalidateContextMenu) {\r\n this.handleCanvasContextMenu(event);\r\n }\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.TOUCH_CTX_MENU_TIMEOUT);\r\n }\r\n }\r\n };\r\n // Returns whether the event is a panning\r\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\r\n if (!(gesture.pointers.size === 0 &&\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.WHEEL ||\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_11__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\r\n this.state.viewModeEnabled))) {\r\n return false;\r\n }\r\n isPanning = true;\r\n let nextPastePrevented = false;\r\n const isLinux = /Linux/.test(window.navigator.platform);\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRABBING);\r\n let { clientX: lastX, clientY: lastY } = event;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n const deltaX = lastX - event.clientX;\r\n const deltaY = lastY - event.clientY;\r\n lastX = event.clientX;\r\n lastY = event.clientY;\r\n /*\r\n * Prevent paste event if we move while middle clicking on Linux.\r\n * See issue #1383.\r\n */\r\n if (isLinux &&\r\n !nextPastePrevented &&\r\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\r\n nextPastePrevented = true;\r\n /* Prevent the next paste event */\r\n const preventNextPaste = (event) => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n event.stopPropagation();\r\n };\r\n /*\r\n * Reenable next paste in case of disabled middle click paste for\r\n * any reason:\r\n * - rigth click paste\r\n * - empty clipboard\r\n */\r\n const enableNextPaste = () => {\r\n setTimeout(() => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }, 100);\r\n };\r\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, preventNextPaste);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, enableNextPaste);\r\n }\r\n this.setState({\r\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\r\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\r\n });\r\n });\r\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((lastPointerUp = () => {\r\n lastPointerUp = null;\r\n isPanning = false;\r\n if (!isHoldingSpace) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n }));\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, teardown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove, {\r\n passive: true,\r\n });\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, teardown);\r\n return true;\r\n };\r\n this.clearSelectionIfNotUsingSelection = () => {\r\n if (this.state.elementType !== \"selection\") {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n };\r\n /**\r\n * @returns whether the pointer event has been completely handled\r\n */\r\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType != null) {\r\n this.setState({\r\n resizingElement: elementWithTransformHandleType.element,\r\n });\r\n pointerDownState.resize.handleType =\r\n elementWithTransformHandleType.transformHandleType;\r\n }\r\n }\r\n else if (selectedElements.length > 1) {\r\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n }\r\n if (pointerDownState.resize.handleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\r\n transformHandleType: pointerDownState.resize.handleType,\r\n }));\r\n pointerDownState.resize.isResizing = true;\r\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0]) &&\r\n selectedElements[0].points.length === 2) {\r\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\r\n }\r\n }\r\n else {\r\n if (this.state.editingLinearElement) {\r\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\r\n if (ret.hitElement) {\r\n pointerDownState.hit.element = ret.hitElement;\r\n }\r\n if (ret.didAddPoint) {\r\n return true;\r\n }\r\n }\r\n // hitElement may already be set above, so check first\r\n pointerDownState.hit.element =\r\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n // For overlapped elements one position may hit\r\n // multiple elements\r\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n const hitElement = pointerDownState.hit.element;\r\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hitElement === null || !someHitElementIsSelected) &&\r\n !event.shiftKey &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.clearSelection(hitElement);\r\n }\r\n // If we click on something\r\n if (hitElement != null) {\r\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\r\n // mark as not completely handled so as to allow dragging etc.\r\n return false;\r\n }\r\n // deselect if item is selected\r\n // if shift is not clicked, this will always return true\r\n // otherwise, it will trigger selection based on current\r\n // state of the box\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n // if we are currently editing a group, exiting editing mode and deselect the group.\r\n if (this.state.editingGroupId &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n // Add hit element to selection. At this point if we're not holding\r\n // SHIFT the previously selected element(s) were deselected above\r\n // (make sure you use setState updater to use latest state)\r\n if (!someHitElementIsSelected &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.setState((prevState) => {\r\n return (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }) }), this.scene.getElements());\r\n });\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n }\r\n }\r\n this.setState({\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n }\r\n return false;\r\n };\r\n this.handleTextOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n // if we're currently still editing text, clicking outside\r\n // should only finalize it, not create another (irrespective\r\n // of state.elementLocked)\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.type) === \"text\") {\r\n return;\r\n }\r\n this.startTextEditing({\r\n sceneX: pointerDownState.origin.x,\r\n sceneY: pointerDownState.origin.y,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n if (!this.state.elementLocked) {\r\n this.setState({\r\n elementType: \"selection\",\r\n });\r\n }\r\n };\r\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n // Begin a mark capture. This does not have to update state yet.\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\r\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.newFreeDrawElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n simulatePressure: event.pressure === 0.5,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n const pressures = element.simulatePressure\r\n ? element.pressures\r\n : [...element.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [[0, 0]],\r\n pressures,\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n };\r\n this.createImageElement = ({ sceneX, sceneY, }) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(sceneX, sceneY, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newImageElement)({\r\n type: \"image\",\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n });\r\n return element;\r\n };\r\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n // finalize if completing a loop\r\n if (multiElement.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\r\n // clicking inside commit zone → finalize arrow\r\n if (multiElement.points.length > 1 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_11__.LINE_CONFIRM_THRESHOLD) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\r\n }));\r\n // clicking outside commit zone → update reference for last committed\r\n // point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.POINTER);\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\r\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\r\n an arrow, we want it to be null for both. Otherwise, we want it to use the\r\n values from appState. */\r\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\r\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\r\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\r\n : [null, null];\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newLinearElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n startArrowhead,\r\n endArrowhead,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\r\n points: [...element.points, [0, 0]],\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n };\r\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n });\r\n if (element.type === \"selection\") {\r\n this.setState({\r\n selectionElement: element,\r\n draggingElement: element,\r\n });\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n multiElement: null,\r\n draggingElement: element,\r\n editingElement: element,\r\n });\r\n }\r\n };\r\n this.initializeImage = ({ imageFile, imageElement: _imageElement, showCursorImagePreview = false, }) => __awaiter(this, void 0, void 0, function* () {\r\n var _d, _e, _f, _g;\r\n // at this point this should be guaranteed image file, but we do this check\r\n // to satisfy TS down the line\r\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(imageFile)) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.unsupportedFileType\"));\r\n }\r\n const mimeType = imageFile.type;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, \"wait\");\r\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.normalizeSVG)(yield imageFile.text()), imageFile.name);\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.svgImageInsertError\"));\r\n }\r\n }\r\n // generate image id (by default the file digest) before any\r\n // resizing/compression takes place to keep it more portable\r\n const fileId = yield (((_e = (_d = this.props).generateIdForFile) === null || _e === void 0 ? void 0 : _e.call(_d, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.generateIdFromFile)(imageFile));\r\n if (!fileId) {\r\n console.warn(\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\");\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"));\r\n }\r\n const existingFileData = this.files[fileId];\r\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\r\n try {\r\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT);\r\n }\r\n catch (error) {\r\n console.error(\"error trying to resing image file on insertion\", error);\r\n }\r\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES) {\r\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.fileTooBig\", {\r\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_11__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\r\n }));\r\n }\r\n }\r\n if (showCursorImagePreview) {\r\n const dataURL = (_f = this.files[fileId]) === null || _f === void 0 ? void 0 : _f.dataURL;\r\n // optimization so that we don't unnecessarily resize the original\r\n // full-size file for cursor preview\r\n // (it's much faster to convert the resized dataURL to File)\r\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.dataURLToFile)(dataURL);\r\n this.setImagePreviewCursor(resizedFile || imageFile);\r\n }\r\n const dataURL = ((_g = this.files[fileId]) === null || _g === void 0 ? void 0 : _g.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imageFile));\r\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(_imageElement, {\r\n fileId,\r\n }, false);\r\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\r\n var _h, _j;\r\n try {\r\n this.files = Object.assign(Object.assign({}, this.files), { [fileId]: {\r\n mimeType,\r\n id: fileId,\r\n dataURL,\r\n created: Date.now(),\r\n } });\r\n const cachedImageData = this.imageCache.get(fileId);\r\n if (!cachedImageData) {\r\n this.addNewImagesToImageCache();\r\n yield this.updateImageCache([imageElement]);\r\n }\r\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\r\n yield cachedImageData.image;\r\n }\r\n if (((_h = this.state.pendingImageElement) === null || _h === void 0 ? void 0 : _h.id) !== imageElement.id &&\r\n ((_j = this.state.draggingElement) === null || _j === void 0 ? void 0 : _j.id) !== imageElement.id) {\r\n this.initializeImageDimensions(imageElement, true);\r\n }\r\n resolve(imageElement);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\")));\r\n }\r\n finally {\r\n if (!showCursorImagePreview) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n }\r\n }\r\n }));\r\n });\r\n /**\r\n * inserts image into elements array and rerenders\r\n */\r\n this.insertImageElement = (imageElement, imageFile, showCursorImagePreview) => __awaiter(this, void 0, void 0, function* () {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n imageElement,\r\n ]);\r\n try {\r\n yield this.initializeImage({\r\n imageFile,\r\n imageElement,\r\n showCursorImagePreview,\r\n });\r\n }\r\n catch (error) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n isDeleted: true,\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n this.setState({\r\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"),\r\n });\r\n }\r\n });\r\n this.setImagePreviewCursor = (imageFile) => __awaiter(this, void 0, void 0, function* () {\r\n // mustn't be larger than 128 px\r\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\r\n const cursorImageSizePx = 96;\r\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.resizeImageFile)(imageFile, cursorImageSizePx);\r\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.getDataURL)(imagePreview);\r\n // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\r\n // a small canvas\r\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.loadHTMLImageElement)(previewDataURL);\r\n let height = Math.min(img.height, cursorImageSizePx);\r\n let width = height * (img.width / img.height);\r\n if (width > cursorImageSizePx) {\r\n width = cursorImageSizePx;\r\n height = width * (img.height / img.width);\r\n }\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.height = height;\r\n canvas.width = width;\r\n const context = canvas.getContext(\"2d\");\r\n context.drawImage(img, 0, 0, width, height);\r\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg);\r\n }\r\n if (this.state.pendingImageElement) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, `url(${previewDataURL}) 4 4, auto`);\r\n }\r\n });\r\n this.onImageAction = ({ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }) => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const clientX = this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.fileOpen)({\r\n description: \"Image\",\r\n extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\r\n });\r\n const imageElement = this.createImageElement({\r\n sceneX: x,\r\n sceneY: y,\r\n });\r\n if (insertOnCanvasDirectly) {\r\n this.insertImageElement(imageElement, imageFile);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({\r\n selectedElementIds: { [imageElement.id]: true },\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n else {\r\n this.setState({\r\n pendingImageElement: imageElement,\r\n }, () => {\r\n this.insertImageElement(imageElement, imageFile, \r\n /* showCursorImagePreview */ true);\r\n });\r\n }\r\n }\r\n catch (error) {\r\n if (error.name !== \"AbortError\") {\r\n console.error(error);\r\n }\r\n this.setState({\r\n pendingImageElement: null,\r\n editingElement: null,\r\n elementType: \"selection\",\r\n }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n });\r\n this.initializeImageDimensions = (imageElement, forceNaturalSize = false) => {\r\n var _a;\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(imageElement) &&\r\n ((_a = this.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n if (!image || image instanceof Promise) {\r\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value) {\r\n const placeholderSize = 100 / this.state.zoom.value;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\r\n x: imageElement.x - placeholderSize / 2,\r\n y: imageElement.y - placeholderSize / 2,\r\n width: placeholderSize,\r\n height: placeholderSize,\r\n });\r\n }\r\n return;\r\n }\r\n if (forceNaturalSize ||\r\n // if user-created bounding box is below threshold, assume the\r\n // intention was to click instead of drag, and use the image's\r\n // intrinsic size\r\n (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value &&\r\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / this.state.zoom.value)) {\r\n const minHeight = Math.max(this.state.height - 120, 160);\r\n // max 65% of canvas height, clamped to <300px, vh - 120px>\r\n const maxHeight = Math.min(minHeight, Math.floor(this.state.height * 0.5) / this.state.zoom.value);\r\n const height = Math.min(image.naturalHeight, maxHeight);\r\n const width = height * (image.naturalWidth / image.naturalHeight);\r\n // add current imageElement width/height to account for previous centering\r\n // of the placholder image\r\n const x = imageElement.x + imageElement.width / 2 - width / 2;\r\n const y = imageElement.y + imageElement.height / 2 - height / 2;\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, { x, y, width, height });\r\n }\r\n };\r\n /** updates image cache, refreshing updated elements and/or setting status\r\n to error for images that fail during <img> element creation */\r\n this.updateImageCache = (elements, files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.updateImageCache)({\r\n imageCache: this.imageCache,\r\n fileIds: elements.map((element) => element.fileId),\r\n files,\r\n });\r\n if (updatedFiles.size || erroredFiles.size) {\r\n for (const element of elements) {\r\n if (updatedFiles.has(element.fileId)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n if (erroredFiles.has(element.fileId)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, { status: \"error\" }, \r\n /* informMutation */ false);\r\n }\r\n }\r\n }\r\n return { updatedFiles, erroredFiles };\r\n });\r\n /** adds new images to imageCache and re-renders if needed */\r\n this.addNewImagesToImageCache = (imageElements = (0,_element_image__WEBPACK_IMPORTED_MODULE_41__.getInitializedImageElements)(this.scene.getElements()), files = this.files) => __awaiter(this, void 0, void 0, function* () {\r\n const uncachedImageElements = imageElements.filter((element) => !element.isDeleted && !this.imageCache.has(element.fileId));\r\n if (uncachedImageElements.length) {\r\n const { updatedFiles } = yield this.updateImageCache(uncachedImageElements, files);\r\n if (updatedFiles.size) {\r\n this.scene.informMutation();\r\n }\r\n }\r\n });\r\n /** generally you should use `addNewImagesToImageCache()` directly if you need\r\n * to render new images. This is just a failsafe */\r\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_42___default()(() => {\r\n this.addNewImagesToImageCache();\r\n }, _constants__WEBPACK_IMPORTED_MODULE_11__.IMAGE_RENDER_TIMEOUT);\r\n this.updateBindingEnabledOnPointerMove = (event) => {\r\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.shouldEnableBindingForPointerEvent)(event);\r\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\r\n this.setState({ isBindingEnabled: shouldEnableBinding });\r\n }\r\n };\r\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\r\n });\r\n };\r\n this.maybeSuggestBindingForLinearElementAtCursor = (linearElement, startOrEnd, pointerCoords, \r\n // During line creation the start binding hasn't been written yet\r\n // into `linearElement`\r\n oppositeBindingBoundElement) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null &&\r\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)\r\n ? [hoveredBindableElement]\r\n : [],\r\n });\r\n };\r\n this.handleCanvasRef = (canvas) => {\r\n var _a, _b, _c;\r\n // canvas is null when unmounting\r\n if (canvas !== null) {\r\n this.canvas = canvas;\r\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__.default.canvas(this.canvas);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel, {\r\n passive: false,\r\n });\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n else {\r\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.WHEEL, this.handleWheel);\r\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_START, this.onTapStart);\r\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n };\r\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\r\n var _k, _l;\r\n try {\r\n if (this.props.onDrop) {\r\n try {\r\n if ((yield this.props.onDrop(event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n const file = event.dataTransfer.files[0];\r\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_40__.isSupportedImageFile)(file)) {\r\n // first attempt to decode scene from the image if it's embedded\r\n // ---------------------------------------------------------------------\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.svg) {\r\n try {\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted());\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n return;\r\n }\r\n catch (error) {\r\n if (error.name !== \"EncodingError\") {\r\n throw error;\r\n }\r\n }\r\n }\r\n // if no scene is embedded or we fail for whatever reason, fall back\r\n // to importing as regular image\r\n // ---------------------------------------------------------------------\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const imageElement = this.createImageElement({ sceneX, sceneY });\r\n this.insertImageElement(imageElement, file);\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n return this.setState({\r\n isLoading: false,\r\n errorMessage: error.message,\r\n });\r\n }\r\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib);\r\n if (libraryShapes !== \"\") {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: JSON.parse(libraryShapes),\r\n position: event,\r\n files: null,\r\n });\r\n return;\r\n }\r\n const file = (_k = event.dataTransfer) === null || _k === void 0 ? void 0 : _k.files[0];\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_11__.MIME_TYPES.excalidrawlib ||\r\n ((_l = file === null || file === void 0 ? void 0 : file.name) === null || _l === void 0 ? void 0 : _l.endsWith(\".excalidrawlib\"))) {\r\n this.library\r\n .importLibrary(file)\r\n .then(() => {\r\n // Close and then open to get the libraries updated\r\n this.setState({ isLibraryOpen: false });\r\n this.setState({ isLibraryOpen: true });\r\n })\r\n .catch((error) => this.setState({ isLoading: false, errorMessage: error.message }));\r\n // default: assume an Excalidraw file regardless of extension/MimeType\r\n }\r\n else {\r\n this.setState({ isLoading: true });\r\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_43__.nativeFileSystemSupported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n yield this.loadFileToCanvas(file);\r\n }\r\n });\r\n this.loadFileToCanvas = (file) => {\r\n (0,_data__WEBPACK_IMPORTED_MODULE_12__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted())\r\n .then((scene) => {\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\r\n })\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n };\r\n this.handleCanvasContextMenu = (event) => {\r\n event.preventDefault();\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const element = this.getElementAtPosition(x, y, { preferSelected: true });\r\n const type = element ? \"element\" : \"canvas\";\r\n const container = this.excalidrawContainerRef.current;\r\n const { top: offsetTop, left: offsetLeft, } = container.getBoundingClientRect();\r\n const left = event.clientX - offsetLeft;\r\n const top = event.clientY - offsetTop;\r\n if (element && !this.state.selectedElementIds[element.id]) {\r\n this.setState({ selectedElementIds: { [element.id]: true } }, () => {\r\n this._openContextMenu({ top, left }, type);\r\n });\r\n }\r\n else {\r\n this._openContextMenu({ top, left }, type);\r\n }\r\n };\r\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\r\n var _a;\r\n const draggingElement = this.state.draggingElement;\r\n const pointerCoords = pointerDownState.lastCoords;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"selection\") {\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event));\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(draggingElement) &&\r\n ((_a = this.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\r\n const aspectRatio = image && !(image instanceof Promise)\r\n ? image.width / image.height\r\n : null;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), aspectRatio);\r\n this.maybeSuggestBindingForAll([draggingElement]);\r\n }\r\n };\r\n this.maybeHandleResize = (pointerDownState, event) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const transformHandleType = pointerDownState.resize.handleType;\r\n this.setState({\r\n // TODO: rename this state field to \"isScaling\" to distinguish\r\n // it from the generic \"isResizing\" which includes scaling and\r\n // rotating\r\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\r\n isRotating: transformHandleType === \"rotation\",\r\n });\r\n const pointerCoords = pointerDownState.lastCoords;\r\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(selectedElements[0])\r\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\r\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n return true;\r\n }\r\n return false;\r\n };\r\n /** @private use this.handleCanvasContextMenu */\r\n this._openContextMenu = ({ left, top, }, type) => {\r\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const separator = \"separator\";\r\n const elements = this.scene.getElements();\r\n const options = [];\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng);\r\n }\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg);\r\n }\r\n if (type === \"canvas\") {\r\n const viewModeOptions = [\r\n ...options,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ];\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: viewModeOptions,\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: [\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && navigator.clipboard && separator,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsPng,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyAsSvg,\r\n ((_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardBlob && elements.length > 0) ||\r\n (_clipboard__WEBPACK_IMPORTED_MODULE_10__.probablySupportsClipboardWriteText && elements.length > 0)) &&\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSelectAll,\r\n separator,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_39__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionToggleStats,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n }\r\n else if (type === \"element\") {\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy, ...options],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n else {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__.default.push({\r\n options: [\r\n this.isMobile && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCut,\r\n this.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopy,\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && separator,\r\n ...options,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionCopyStyles,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionPasteStyles,\r\n separator,\r\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionGroup,\r\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_4__.actionUngroup,\r\n (maybeGroupAction || maybeUngroupAction) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionAddToLibrary,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendBackward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringForward,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionSendToBack,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionBringToFront,\r\n separator,\r\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipHorizontal,\r\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_4__.actionFlipVertical,\r\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDuplicateSelection,\r\n _actions__WEBPACK_IMPORTED_MODULE_4__.actionDeleteSelected,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n }\r\n }\r\n };\r\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n if (isPanning) {\r\n return;\r\n }\r\n const { deltaX, deltaY } = event;\r\n const { selectedElementIds, previousSelectedElementIds } = this.state;\r\n // note that event.ctrlKey is necessary to handle pinch zooming\r\n if (event.metaKey || event.ctrlKey) {\r\n const sign = Math.sign(deltaY);\r\n const MAX_STEP = 10;\r\n let delta = Math.abs(deltaY);\r\n if (delta > MAX_STEP) {\r\n delta = MAX_STEP;\r\n }\r\n delta *= sign;\r\n if (Object.keys(previousSelectedElementIds).length !== 0) {\r\n setTimeout(() => {\r\n this.setState({\r\n selectedElementIds: previousSelectedElementIds,\r\n previousSelectedElementIds: {},\r\n });\r\n }, 1000);\r\n }\r\n let newZoom = this.state.zoom.value - delta / 100;\r\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\r\n newZoom += Math.log10(Math.max(1, this.state.zoom.value)) * -sign;\r\n // round to nearest step\r\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_11__.ZOOM_STEP * 100);\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(newZoom), zoom, { left: offsetLeft, top: offsetTop }, {\r\n x: cursorX,\r\n y: cursorY,\r\n }),\r\n selectedElementIds: {},\r\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0\r\n ? selectedElementIds\r\n : previousSelectedElementIds,\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n return;\r\n }\r\n // scroll horizontally when shift pressed\r\n if (event.shiftKey) {\r\n this.setState(({ zoom, scrollX }) => ({\r\n // on Mac, shift+wheel tends to result in deltaX\r\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\r\n }));\r\n return;\r\n }\r\n this.setState(({ zoom, scrollX, scrollY }) => ({\r\n scrollX: scrollX - deltaX / zoom.value,\r\n scrollY: scrollY - deltaY / zoom.value,\r\n }));\r\n });\r\n this.savePointer = (x, y, button) => {\r\n var _a, _b;\r\n if (!x || !y) {\r\n return;\r\n }\r\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\r\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\r\n // sometimes the pointer goes off screen\r\n }\r\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\r\n pointer,\r\n button,\r\n pointersMap: gesture.pointers,\r\n });\r\n };\r\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\r\n if (!this.unmounted) {\r\n this.setState({ shouldCacheIgnoreZoom: false });\r\n }\r\n }, 300);\r\n this.updateDOMRect = (cb) => {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\r\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\r\n if (width === currentWidth &&\r\n height === currentHeight &&\r\n offsetLeft === currentOffsetLeft &&\r\n offsetTop === currentOffsetTop) {\r\n if (cb) {\r\n cb();\r\n }\r\n return;\r\n }\r\n this.setState({\r\n width,\r\n height,\r\n offsetLeft,\r\n offsetTop,\r\n }, () => {\r\n cb && cb();\r\n });\r\n }\r\n };\r\n this.refresh = () => {\r\n this.setState(Object.assign({}, this.getCanvasOffsets()));\r\n };\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_9__.getDefaultAppState)();\r\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\r\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\r\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight });\r\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_44__.nanoid)();\r\n if (excalidrawRef) {\r\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resolvablePromise)();\r\n const api = {\r\n ready: true,\r\n readyPromise,\r\n updateScene: this.updateScene,\r\n addFiles: this.addFiles,\r\n resetScene: this.resetScene,\r\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\r\n history: {\r\n clear: this.resetHistory,\r\n },\r\n scrollToContent: this.scrollToContent,\r\n zoomToFit: this.zoomToFit,\r\n getSceneElements: this.getSceneElements,\r\n getAppState: () => this.state,\r\n getFiles: () => this.files,\r\n refresh: this.refresh,\r\n importLibrary: this.importLibraryFromUrl,\r\n setToastMessage: this.setToastMessage,\r\n id: this.id,\r\n };\r\n if (typeof excalidrawRef === \"function\") {\r\n excalidrawRef(api);\r\n }\r\n else {\r\n excalidrawRef.current = api;\r\n }\r\n readyPromise.resolve(api);\r\n }\r\n this.excalidrawContainerValue = {\r\n container: this.excalidrawContainerRef.current,\r\n id: this.id,\r\n };\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__.default();\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__.default(this);\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__.default();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_6__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_7__.actions);\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createUndoAction)(this.history));\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_5__.createRedoAction)(this.history));\r\n }\r\n renderCanvas() {\r\n const canvasScale = window.devicePixelRatio;\r\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\r\n const canvasWidth = canvasDOMWidth * canvasScale;\r\n const canvasHeight = canvasDOMHeight * canvasScale;\r\n if (viewModeEnabled) {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n cursor: _constants__WEBPACK_IMPORTED_MODULE_11__.CURSOR_TYPE.GRAB,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n render() {\r\n var _a, _b;\r\n const { zenModeEnabled, viewModeEnabled } = this.state;\r\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__.default)(\"excalidraw excalidraw-container\", {\r\n \"excalidraw--view-mode\": viewModeEnabled,\r\n \"excalidraw--mobile\": this.isMobile,\r\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(IsMobileContext.Provider, Object.assign({ value: this.isMobile }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_36__.default, { canvas: this.canvas, appState: this.state, files: this.files, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\r\n elements,\r\n position: \"center\",\r\n files: null,\r\n }), zenModeEnabled: zenModeEnabled, toggleZenMode: this.toggleZenMode, langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.getLanguage)().code, isCollaborating: this.props.isCollaborating || false, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, viewModeEnabled: viewModeEnabled, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\r\n zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\r\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id, onImageAction: this.onImageAction }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }, void 0), this.state.showStats && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_37__.Stats, { appState: this.state, setAppState: this.setAppState, elements: this.scene.getElements(), onClose: this.toggleStats, renderCustomStats: renderCustomStats }, void 0)), this.state.toastMessage !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_38__.Toast, { message: this.state.toastMessage, clearToast: this.clearToast }, void 0)), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() }, void 0)] }), void 0) }), void 0) }), void 0));\r\n }\r\n componentDidMount() {\r\n var _a, _b;\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.excalidrawContainerValue.container = this.excalidrawContainerRef.current;\r\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n const setState = this.setState.bind(this);\r\n Object.defineProperties(window.h, {\r\n state: {\r\n configurable: true,\r\n get: () => {\r\n return this.state;\r\n },\r\n },\r\n setState: {\r\n configurable: true,\r\n value: (...args) => {\r\n return this.setState(...args);\r\n },\r\n },\r\n app: {\r\n configurable: true,\r\n value: this,\r\n },\r\n history: {\r\n configurable: true,\r\n value: this.history,\r\n },\r\n });\r\n }\r\n this.scene.addCallback(this.onSceneUpdated);\r\n this.addEventListeners();\r\n if (this.excalidrawContainerRef.current) {\r\n this.focusContainer();\r\n }\r\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // compute isMobile state\r\n // ---------------------------------------------------------------------\r\n const { width, height, } = this.excalidrawContainerRef.current.getBoundingClientRect();\r\n this.isMobile =\r\n width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT ||\r\n (height < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE);\r\n // refresh offsets\r\n // ---------------------------------------------------------------------\r\n this.updateDOMRect();\r\n });\r\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\r\n }\r\n else if (window.matchMedia) {\r\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_11__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\r\n const handler = () => (this.isMobile = mediaQuery.matches);\r\n mediaQuery.addListener(handler);\r\n this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);\r\n }\r\n const searchParams = new URLSearchParams(window.location.search.slice(1));\r\n if (searchParams.has(\"web-share-target\")) {\r\n // Obtain a file that was shared via the Web Share Target API.\r\n this.restoreFileFromShare();\r\n }\r\n else {\r\n this.updateDOMRect(this.initializeScene);\r\n }\r\n });\r\n }\r\n componentWillUnmount() {\r\n var _a;\r\n this.files = {};\r\n this.imageCache.clear();\r\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\r\n this.unmounted = true;\r\n this.removeEventListeners();\r\n this.scene.destroy();\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n }\r\n removeEventListeners() {\r\n var _a, _b;\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n (_b = this.detachIsMobileMqHandler) === null || _b === void 0 ? void 0 : _b.call(this);\r\n }\r\n addEventListeners() {\r\n var _a, _b;\r\n this.removeEventListeners();\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, this.removePointer); // #3553\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.COPY, this.onCopy);\r\n if (this.props.handleKeyboardGlobally) {\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, this.onKeyUp, { passive: true });\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\r\n // rerender text elements on font load to fix #637 && #1553\r\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \"loadingdone\", this.onFontLoaded);\r\n // Safari-only desktop pinch zoom\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.CUT, this.onCut);\r\n if (this.props.detectScroll) {\r\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\r\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.SCROLL, this.onScroll);\r\n }\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.RESIZE, this.onResize, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.UNLOAD, this.onUnload, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.BLUR, this.onBlur, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.DROP, this.disableEvent, false);\r\n }\r\n componentDidUpdate(prevProps, prevState) {\r\n var _a, _b, _c, _d;\r\n if (prevProps.langCode !== this.props.langCode) {\r\n this.updateLanguage();\r\n }\r\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\r\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\r\n }\r\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\r\n this.addEventListeners();\r\n this.deselectElements();\r\n }\r\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\r\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\r\n }\r\n if (prevProps.theme !== this.props.theme && this.props.theme) {\r\n this.setState({ theme: this.props.theme });\r\n }\r\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\r\n this.setState({\r\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_11__.GRID_SIZE : null,\r\n });\r\n }\r\n if (this.props.name && prevProps.name !== this.props.name) {\r\n this.setState({\r\n name: this.props.name,\r\n });\r\n }\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\r\n if (this.state.editingLinearElement &&\r\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\r\n // defer so that the commitToHistory flag isn't reset via current update\r\n setTimeout(() => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n const { multiElement } = prevState;\r\n if (prevState.elementType !== this.state.elementType &&\r\n multiElement != null &&\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(multiElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\r\n }\r\n const cursorButton = {};\r\n const pointerViewportCoords = {};\r\n const remoteSelectedElementIds = {};\r\n const pointerUsernames = {};\r\n const pointerUserStates = {};\r\n this.state.collaborators.forEach((user, socketId) => {\r\n if (user.selectedElementIds) {\r\n for (const id of Object.keys(user.selectedElementIds)) {\r\n if (!(id in remoteSelectedElementIds)) {\r\n remoteSelectedElementIds[id] = [];\r\n }\r\n remoteSelectedElementIds[id].push(socketId);\r\n }\r\n }\r\n if (!user.pointer) {\r\n return;\r\n }\r\n if (user.username) {\r\n pointerUsernames[socketId] = user.username;\r\n }\r\n if (user.userState) {\r\n pointerUserStates[socketId] = user.userState;\r\n }\r\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: user.pointer.x,\r\n sceneY: user.pointer.y,\r\n }, this.state);\r\n cursorButton[socketId] = user.button;\r\n });\r\n const renderingElements = this.scene.getElements().filter((element) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(element)) {\r\n if (\r\n // not placed on canvas yet (but in elements array)\r\n this.state.pendingImageElement &&\r\n element.id === this.state.pendingImageElement.id) {\r\n return false;\r\n }\r\n }\r\n // don't render text element that's being currently edited (it's\r\n // rendered on remote only)\r\n return (!this.state.editingElement ||\r\n this.state.editingElement.type !== \"text\" ||\r\n element.id !== this.state.editingElement.id);\r\n });\r\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_28__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\r\n scrollX: this.state.scrollX,\r\n scrollY: this.state.scrollY,\r\n viewBackgroundColor: this.state.viewBackgroundColor,\r\n zoom: this.state.zoom,\r\n remotePointerViewportCoords: pointerViewportCoords,\r\n remotePointerButton: cursorButton,\r\n remoteSelectedElementIds,\r\n remotePointerUsernames: pointerUsernames,\r\n remotePointerUserStates: pointerUserStates,\r\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\r\n theme: this.state.theme,\r\n imageCache: this.imageCache,\r\n }, {\r\n renderOptimizations: true,\r\n renderScrollbars: !this.isMobile,\r\n });\r\n if (scrollBars) {\r\n currentScrollBars = scrollBars;\r\n }\r\n const scrolledOutside = \r\n // hide when editing text\r\n ((_b = this.state.editingElement) === null || _b === void 0 ? void 0 : _b.type) === \"text\"\r\n ? false\r\n : !atLeastOneVisibleElement && renderingElements.length > 0;\r\n if (this.state.scrolledOutside !== scrolledOutside) {\r\n this.setState({ scrolledOutside });\r\n }\r\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\r\n this.scheduleImageRefresh();\r\n // Do not notify consumers if we're still loading the scene. Among other\r\n // potential issues, this fixes a case where the tab isn't focused during\r\n // init, which would trigger onChange with empty elements, which would then\r\n // override whatever is in localStorage currently.\r\n if (!this.state.isLoading) {\r\n (_d = (_c = this.props).onChange) === null || _d === void 0 ? void 0 : _d.call(_c, this.scene.getElementsIncludingDeleted(), this.state, this.files);\r\n }\r\n }\r\n static resetTapTwice() {\r\n didTapTwice = false;\r\n }\r\n addTextFromPaste(text) {\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\r\n x,\r\n y,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text,\r\n rawText: text,\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: this.state.currentItemTextAlign,\r\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({ selectedElementIds: { [element.id]: true } });\r\n this.history.resumeRecording();\r\n }\r\n selectShapeTool(elementType) {\r\n if (!isHoldingSpace) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, elementType);\r\n }\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isToolIcon)(document.activeElement)) {\r\n this.focusContainer();\r\n }\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElementType)(elementType)) {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n if (elementType === \"image\") {\r\n this.onImageAction();\r\n }\r\n if (elementType !== \"selection\") {\r\n this.setState({\r\n elementType,\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n else {\r\n this.setState({ elementType });\r\n }\r\n }\r\n handleTextWysiwyg(element, { isExistingElement = false, }) {\r\n const updateElement = (text, rawText, isDeleted = false) => {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\r\n text,\r\n rawText: rawText ? rawText : text,\r\n isDeleted,\r\n });\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n };\r\n if (isExistingElement && this.props.onBeforeTextEdit) {\r\n const text = this.props.onBeforeTextEdit(element);\r\n if (text) {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\r\n element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\r\n text,\r\n isDeleted: false,\r\n });\r\n return element;\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\r\n }\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.textWysiwyg)({\r\n id: element.id,\r\n appState: this.state,\r\n canvas: this.canvas,\r\n getViewportCoords: (x, y) => {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\r\n sceneX: x,\r\n sceneY: y,\r\n }, this.state);\r\n return [\r\n viewportX - this.state.offsetLeft,\r\n viewportY - this.state.offsetTop,\r\n ];\r\n },\r\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((text) => {\r\n updateElement(text);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element);\r\n }\r\n }),\r\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(({ text, viaKeyboard }) => {\r\n const isDeleted = !text.trim();\r\n const rawText = text;\r\n if (this.props.onBeforeTextSubmit) {\r\n const updatedText = this.props.onBeforeTextSubmit(element, text, isDeleted);\r\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\r\n }\r\n updateElement(text, rawText, isDeleted);\r\n // select the created text element only if submitting via keyboard\r\n // (when submitting via click it should act as signal to deselect)\r\n if (!isDeleted && viaKeyboard) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: true }),\r\n }));\r\n }\r\n if (isDeleted) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDeletion)(this.scene.getElements(), [element]);\r\n }\r\n if (!isDeleted || isExistingElement) {\r\n this.history.resumeRecording();\r\n }\r\n this.setState({\r\n draggingElement: null,\r\n editingElement: null,\r\n });\r\n if (this.state.elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n this.focusContainer();\r\n }),\r\n element,\r\n excalidrawContainer: this.excalidrawContainerRef.current,\r\n });\r\n // deselect all other elements when inserting text\r\n this.deselectElements();\r\n // do an initial update to re-initialize element position since we were\r\n // modifying element's x/y for sake of editor (case: syncing to remote)\r\n updateElement(element.text);\r\n }\r\n deselectElements() {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n getTextElementAtPosition(x, y) {\r\n const element = this.getElementAtPosition(x, y);\r\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && !element.isDeleted) {\r\n return element;\r\n }\r\n return null;\r\n }\r\n getElementAtPosition(x, y, opts) {\r\n const allHitElements = this.getElementsAtPosition(x, y);\r\n if (allHitElements.length > 1) {\r\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\r\n for (let index = allHitElements.length - 1; index > -1; index--) {\r\n if (this.state.selectedElementIds[allHitElements[index].id]) {\r\n return allHitElements[index];\r\n }\r\n }\r\n }\r\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\r\n // If we're hitting element with highest z-index only on its bounding box\r\n // while also hitting other element figure, the latter should be considered.\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\r\n ? allHitElements[allHitElements.length - 2]\r\n : elementWithHighestZIndex;\r\n }\r\n if (allHitElements.length === 1) {\r\n return allHitElements[0];\r\n }\r\n return null;\r\n }\r\n getElementsAtPosition(x, y) {\r\n return (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsAtPosition)(this.scene.getElements(), (element) => (0,_element__WEBPACK_IMPORTED_MODULE_16__.hitTest)(element, this.state, x, y));\r\n }\r\n maybeCleanupAfterMissingPointerUp(event) {\r\n if (lastPointerUp !== null) {\r\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\r\n // this can happen when a contextual menu or alert is triggered. In order to avoid\r\n // being in a weird state, we clean up on the next pointerdown\r\n lastPointerUp(event);\r\n }\r\n }\r\n updateGestureOnPointerDown(event) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n if (gesture.pointers.size === 2) {\r\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\r\n gesture.initialScale = this.state.zoom.value;\r\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\r\n }\r\n }\r\n initialPointerDownState(event) {\r\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return {\r\n origin,\r\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD],\r\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\r\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\r\n // we need to duplicate because we'll be updating this state\r\n lastCoords: Object.assign({}, origin),\r\n originalElements: this.scene.getElements().reduce((acc, element) => {\r\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.deepCopyElement)(element));\r\n return acc;\r\n }, new Map()),\r\n resize: {\r\n handleType: false,\r\n isResizing: false,\r\n offset: { x: 0, y: 0 },\r\n arrowDirection: \"origin\",\r\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\r\n },\r\n hit: {\r\n element: null,\r\n allHitElements: [],\r\n wasAddedToSelection: false,\r\n hasBeenDuplicated: false,\r\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\r\n },\r\n drag: {\r\n hasOccurred: false,\r\n offset: null,\r\n },\r\n eventListeners: {\r\n onMove: null,\r\n onUp: null,\r\n onKeyUp: null,\r\n onKeyDown: null,\r\n },\r\n };\r\n }\r\n // Returns whether the event is a dragging a scrollbar\r\n handleDraggingScrollBar(event, pointerDownState) {\r\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\r\n return false;\r\n }\r\n isDraggingScrollBar = true;\r\n pointerDownState.lastCoords.x = event.clientX;\r\n pointerDownState.lastCoords.y = event.clientY;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\r\n });\r\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\r\n isDraggingScrollBar = false;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state.elementType);\r\n lastPointerUp = null;\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n });\r\n lastPointerUp = onPointerUp;\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, onPointerUp);\r\n return true;\r\n }\r\n isASelectedElement(hitElement) {\r\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\r\n }\r\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\r\n if (selectedElements.length < 2) {\r\n return false;\r\n }\r\n // How many pixels off the shape boundary we still consider a hit\r\n const threshold = 10 / this.state.zoom.value;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\r\n return (point.x > x1 - threshold &&\r\n point.x < x2 + threshold &&\r\n point.y > y1 - threshold &&\r\n point.y < y2 + threshold);\r\n }\r\n onKeyDownFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onKeyUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // Prevents focus from escaping excalidraw tab\r\n event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ALT && event.preventDefault();\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onPointerMoveFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\r\n // We need to initialize dragOffsetXY only after we've updated\r\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\r\n // event handler should hopefully ensure we're already working with\r\n // the updated state.\r\n if (pointerDownState.drag.offset === null) {\r\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\r\n }\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\r\n return;\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n // for arrows/lines, don't start dragging until a given threshold\r\n // to ensure we don't create a 2-point arrow by mistake when\r\n // user clicks mouse in a way that it moves a tiny bit (thus\r\n // triggering pointermove)\r\n if (!pointerDownState.drag.hasOccurred &&\r\n (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\")) {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD) {\r\n return;\r\n }\r\n }\r\n if (pointerDownState.resize.isResizing) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return true;\r\n }\r\n }\r\n if (this.state.editingLinearElement) {\r\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, startOrEnd) => {\r\n this.maybeSuggestBindingForLinearElementAtCursor(element, startOrEnd, pointerCoords);\r\n });\r\n if (didDrag) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n return;\r\n }\r\n }\r\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if (hasHitASelectedElement ||\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n // Marking that click was used for dragging to check\r\n // if elements should be deselected on pointerup\r\n pointerDownState.drag.hasOccurred = true;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state);\r\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\r\n // it would have weird results (stuff jumping all over the screen)\r\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\r\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n const [dragDistanceX, dragDistanceY] = [\r\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\r\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\r\n ];\r\n // We only drag in one direction if shift is pressed\r\n const lockDirection = event.shiftKey;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, this.scene, lockDirection, dragDistanceX, dragDistanceY);\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n // We duplicate the selected element if alt is pressed on pointer move\r\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\r\n // Move the currently selected elements to the top of the z index stack, and\r\n // put the duplicates where the selected elements used to be.\r\n // (the origin point where the dragging started)\r\n pointerDownState.hit.hasBeenDuplicated = true;\r\n const nextElements = [];\r\n const elementsToAppend = [];\r\n const groupIdMap = new Map();\r\n const oldIdToDuplicatedId = new Map();\r\n const hitElement = pointerDownState.hit.element;\r\n for (const element of this.scene.getElementsIncludingDeleted()) {\r\n if (this.state.selectedElementIds[element.id] ||\r\n // case: the state.selectedElementIds might not have been\r\n // updated yet by the time this mousemove event is fired\r\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\r\n pointerDownState.hit.wasAddedToSelection)) {\r\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\r\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(duplicatedElement, {\r\n x: duplicatedElement.x + (originDragX - dragX),\r\n y: duplicatedElement.y + (originDragY - dragY),\r\n });\r\n nextElements.push(duplicatedElement);\r\n elementsToAppend.push(element);\r\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\r\n }\r\n else {\r\n nextElements.push(element);\r\n }\r\n }\r\n const nextSceneElements = [...nextElements, ...elementsToAppend];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\r\n this.scene.replaceAllElements(nextSceneElements);\r\n }\r\n return;\r\n }\r\n }\r\n // It is very important to read this.state within each move event,\r\n // otherwise we would read a stale one!\r\n const draggingElement = this.state.draggingElement;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"freedraw\") {\r\n const points = draggingElement.points;\r\n const dx = pointerCoords.x - draggingElement.x;\r\n const dy = pointerCoords.y - draggingElement.y;\r\n const pressures = draggingElement.simulatePressure\r\n ? draggingElement.pressures\r\n : [...draggingElement.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n pointerDownState.drag.hasOccurred = true;\r\n const points = draggingElement.points;\r\n let dx = gridX - draggingElement.x;\r\n let dy = gridY - draggingElement.y;\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\r\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getPerfectElementSize)(this.state.elementType, dx, dy));\r\n }\r\n if (points.length === 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\r\n }\r\n else if (points.length > 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points.slice(0, -1), [dx, dy]],\r\n });\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n // When creating a linear element by dragging\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", pointerCoords, this.state.startBoundElement);\r\n }\r\n }\r\n else {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n }\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n if (!event.shiftKey && (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(elements, this.state)) {\r\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\r\n [pointerDownState.hit.element.id]: true,\r\n } }), this.scene.getElements()));\r\n }\r\n else {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n }\r\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsWithinSelection)(elements, draggingElement);\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {})), (pointerDownState.hit.element\r\n ? {\r\n // if using ctrl/cmd, select the hitElement only if we\r\n // haven't box-selected anything else\r\n [pointerDownState.hit.element\r\n .id]: !elementsWithinSelection.length,\r\n }\r\n : null)) }), this.scene.getElements()));\r\n }\r\n });\r\n }\r\n // Returns whether the pointer move happened over either scrollbar\r\n handlePointerMoveOverScrollbars(event, pointerDownState) {\r\n if (pointerDownState.scrollbars.isOverHorizontal) {\r\n const x = event.clientX;\r\n const dx = x - pointerDownState.lastCoords.x;\r\n this.setState({\r\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.x = x;\r\n return true;\r\n }\r\n if (pointerDownState.scrollbars.isOverVertical) {\r\n const y = event.clientY;\r\n const dy = y - pointerDownState.lastCoords.y;\r\n this.setState({\r\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.y = y;\r\n return true;\r\n }\r\n return false;\r\n }\r\n onPointerUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((childEvent) => {\r\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating, } = this.state;\r\n this.setState({\r\n isResizing: false,\r\n isRotating: false,\r\n resizingElement: null,\r\n selectionElement: null,\r\n cursorButton: \"up\",\r\n // text elements are reset on finalize, and resetting on pointerup\r\n // may cause issues with double taps\r\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\r\n ? this.state.editingElement\r\n : null,\r\n });\r\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\r\n // Handle end of dragging a point of a linear element, might close a loop\r\n // and sets binding element\r\n if (this.state.editingLinearElement) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({\r\n editingLinearElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n }\r\n lastPointerUp = null;\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_11__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\r\n if (this.state.pendingImageElement) {\r\n this.setState({ pendingImageElement: null });\r\n }\r\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n const points = draggingElement.points;\r\n let dx = pointerCoords.x - draggingElement.x;\r\n let dy = pointerCoords.y - draggingElement.y;\r\n // Allows dots to avoid being flagged as infinitely small\r\n if (dx === points[0][0] && dy === points[0][1]) {\r\n dy += 0.0001;\r\n dx += 0.0001;\r\n }\r\n const pressures = draggingElement.simulatePressure\r\n ? []\r\n : [...draggingElement.pressures, childEvent.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n lastCommittedPoint: [dx, dy],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)) {\r\n const imageElement = draggingElement;\r\n try {\r\n this.initializeImageDimensions(imageElement);\r\n this.setState({ selectedElementIds: { [imageElement.id]: true } }, () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n });\r\n }\r\n catch (error) {\r\n console.error(error);\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== imageElement.id));\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_4__.actionFinalize);\r\n }\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\r\n if (draggingElement.points.length > 1) {\r\n this.history.resumeRecording();\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n if (!pointerDownState.drag.hasOccurred &&\r\n draggingElement &&\r\n !multiElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\r\n points: [\r\n ...draggingElement.points,\r\n [\r\n pointerCoords.x - draggingElement.x,\r\n pointerCoords.y - draggingElement.y,\r\n ],\r\n ],\r\n });\r\n this.setState({\r\n multiElement: draggingElement,\r\n editingElement: this.state.draggingElement,\r\n });\r\n }\r\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\r\n }\r\n this.setState({ suggestedBindings: [], startBoundElement: null });\r\n if (!elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n elementType: \"selection\",\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n else {\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n }\r\n return;\r\n }\r\n if (elementType !== \"selection\" &&\r\n draggingElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(draggingElement)) {\r\n // remove invisible element which was added in onPointerDown\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\r\n this.setState({\r\n draggingElement: null,\r\n });\r\n return;\r\n }\r\n if (draggingElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getNormalizedDimensions)(draggingElement));\r\n }\r\n if (resizingElement) {\r\n this.history.resumeRecording();\r\n }\r\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(resizingElement)) {\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== resizingElement.id));\r\n }\r\n // Code below handles selection when element(s) weren't\r\n // drag or added to selection on pointer down phase.\r\n const hitElement = pointerDownState.hit.element;\r\n if (hitElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !pointerDownState.hit.wasAddedToSelection) {\r\n if (childEvent.shiftKey) {\r\n if (this.state.selectedElementIds[hitElement.id]) {\r\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_23__.isSelectedViaGroup)(this.state, hitElement)) {\r\n // We want to unselect all groups hitElement is part of\r\n // as well as all elements that are part of the groups\r\n // hitElement is part of\r\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\r\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getElementsInGroup)(this.scene.getElements(), groupId))\r\n .map((element) => ({ [element.id]: false }))\r\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\r\n this.setState((_prevState) => ({\r\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\r\n .map((gId) => ({ [gId]: false }))\r\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\r\n }));\r\n }\r\n else {\r\n // remove element from selection while\r\n // keeping prev elements selected\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getElements()));\r\n }\r\n }\r\n else {\r\n // add element to selection while\r\n // keeping prev elements selected\r\n this.setState((_prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\r\n }));\r\n }\r\n }\r\n else {\r\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getElements()))));\r\n }\r\n }\r\n if (!this.state.editingLinearElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !this.state.isResizing &&\r\n ((hitElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\r\n (!hitElement &&\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\r\n // Deselect selected elements\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n return;\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\" && draggingElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\r\n }));\r\n }\r\n if (elementType !== \"selection\" ||\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(this.scene.getElements(), this.state)) {\r\n this.history.resumeRecording();\r\n }\r\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\r\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\r\n ? _element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements\r\n : _element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getElements(), this.state));\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n elementType: \"selection\",\r\n });\r\n }\r\n else {\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n });\r\n }\r\n });\r\n }\r\n maybeSuggestBindingForAll(selectedElements) {\r\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getEligibleElementsForBinding)(selectedElements);\r\n this.setState({ suggestedBindings });\r\n }\r\n clearSelection(hitElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n // Continue editing the same group if the user selected a different\r\n // element from it\r\n editingGroupId: prevState.editingGroupId &&\r\n hitElement != null &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, prevState.editingGroupId)\r\n ? prevState.editingGroupId\r\n : null,\r\n }));\r\n this.setState({\r\n selectedElementIds: {},\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\r\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementContainingPosition)(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)), x, y);\r\n if (elementClickedInside) {\r\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\r\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\r\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\r\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_11__.TEXT_TO_CENTER_SNAP_THRESHOLD;\r\n if (isSnappedToCenter) {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\r\n return { viewportX, viewportY, elementCenterX, elementCenterY };\r\n }\r\n }\r\n }\r\n getCanvasOffsets() {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { left, top } = excalidrawContainer.getBoundingClientRect();\r\n return {\r\n offsetLeft: left,\r\n offsetTop: top,\r\n };\r\n }\r\n return {\r\n offsetLeft: 0,\r\n offsetTop: 0,\r\n };\r\n }\r\n updateLanguage() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_25__.languages.find((lang) => lang.code === this.props.langCode) ||\r\n _i18n__WEBPACK_IMPORTED_MODULE_25__.defaultLang;\r\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.setLanguage)(currentLang);\r\n this.setAppState({});\r\n });\r\n }\r\n}\r\nApp.defaultProps = {\r\n // needed for tests to pass since we directly render App in many tests\r\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_UI_OPTIONS,\r\n};\r\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_11__.ENV.DEVELOPMENT) {\r\n window.h = window.h || {};\r\n Object.defineProperties(window.h, {\r\n elements: {\r\n configurable: true,\r\n get() {\r\n return this.app.scene.getElementsIncludingDeleted();\r\n },\r\n set(elements) {\r\n return this.app.scene.replaceAllElements(elements);\r\n },\r\n },\r\n });\r\n}\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFVBQVUsRUFBRSxDQUFDO1lBQ2IsU0FBUyxFQUFFLENBQUM7U0FDYixDQUFDO0lBQ0osQ0FBQztJQUVhLGNBQWM7O1lBQzFCLE1BQU0sV0FBVyxHQUNmLGtEQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBQzNELCtDQUFXLENBQUM7WUFDZCxNQUFNLG1EQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDO0tBQUE7O0FBOXNKYSxnQkFBWSxHQUFzQjtJQUM5QyxzRUFBc0U7SUFDdEUsU0FBUyxFQUFFLDJEQUFrQjtDQUM5QixDQUFDO0FBOHRKSixJQUNFLGFBQW9CLEtBQUssaURBQVE7SUFDakMsYUFBb0IsS0FBSyx3REFBZSxFQUN4QztJQUNBLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSyxFQUFrQixDQUFDO0lBRTNDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1FBQ2hDLFFBQVEsRUFBRTtZQUNSLFlBQVksRUFBRSxJQUFJO1lBQ2xCLEdBQUc7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFDRCxHQUFHLENBQUMsUUFBNkI7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNGO0tBQ0YsQ0FBQyxDQUFDO0NBQ0o7QUFDRCxpRUFBZSxHQUFHLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9BcHAudHN4PzAwNzAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJvdWdoQ2FudmFzIH0gZnJvbSBcInJvdWdoanMvYmluL2NhbnZhc1wiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IGNsc3ggZnJvbSBcImNsc3hcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCJuYW5vaWRcIjtcblxuaW1wb3J0IHtcbiAgYWN0aW9uQWRkVG9MaWJyYXJ5LFxuICBhY3Rpb25CcmluZ0ZvcndhcmQsXG4gIGFjdGlvbkJyaW5nVG9Gcm9udCxcbiAgYWN0aW9uQ29weSxcbiAgYWN0aW9uQ29weUFzUG5nLFxuICBhY3Rpb25Db3B5QXNTdmcsXG4gIGFjdGlvbkNvcHlTdHlsZXMsXG4gIGFjdGlvbkN1dCxcbiAgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsXG4gIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbixcbiAgYWN0aW9uRmluYWxpemUsXG4gIGFjdGlvbkZsaXBIb3Jpem9udGFsLFxuICBhY3Rpb25GbGlwVmVydGljYWwsXG4gIGFjdGlvbkdyb3VwLFxuICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgYWN0aW9uU2VsZWN0QWxsLFxuICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gIGFjdGlvblNlbmRUb0JhY2ssXG4gIGFjdGlvblRvZ2dsZUdyaWRNb2RlLFxuICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgYWN0aW9uVW5ncm91cCxcbiAgem9vbVRvRml0RWxlbWVudHMsXG59IGZyb20gXCIuLi9hY3Rpb25zXCI7XG5pbXBvcnQgeyBjcmVhdGVSZWRvQWN0aW9uLCBjcmVhdGVVbmRvQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uSGlzdG9yeVwiO1xuaW1wb3J0IHsgQWN0aW9uTWFuYWdlciB9IGZyb20gXCIuLi9hY3Rpb25zL21hbmFnZXJcIjtcbmltcG9ydCB7IGFjdGlvbnMgfSBmcm9tIFwiLi4vYWN0aW9ucy9yZWdpc3RlclwiO1xuaW1wb3J0IHsgQWN0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdHlwZXNcIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7XG4gIGNvcHlUb0NsaXBib2FyZCxcbiAgcGFyc2VDbGlwYm9hcmQsXG4gIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iLFxuICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0LFxufSBmcm9tIFwiLi4vY2xpcGJvYXJkXCI7XG5pbXBvcnQge1xuICBBUFBfTkFNRSxcbiAgQ1VSU09SX1RZUEUsXG4gIERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVCxcbiAgREVGQVVMVF9VSV9PUFRJT05TLFxuICBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICBEUkFHR0lOR19USFJFU0hPTEQsXG4gIEVMRU1FTlRfU0hJRlRfVFJBTlNMQVRFX0FNT1VOVCxcbiAgRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5ULFxuICBFTlYsXG4gIEVWRU5ULFxuICBHUklEX1NJWkUsXG4gIElNQUdFX1JFTkRFUl9USU1FT1VULFxuICBMSU5FX0NPTkZJUk1fVEhSRVNIT0xELFxuICBNQVhfQUxMT1dFRF9GSUxFX0JZVEVTLFxuICBNSU1FX1RZUEVTLFxuICBNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRSxcbiAgTVFfTUFYX1dJRFRIX0xBTkRTQ0FQRSxcbiAgTVFfTUFYX1dJRFRIX1BPUlRSQUlULFxuICBQT0lOVEVSX0JVVFRPTixcbiAgU0NST0xMX1RJTUVPVVQsXG4gIFRBUF9UV0lDRV9USU1FT1VULFxuICBURVhUX1RPX0NFTlRFUl9TTkFQX1RIUkVTSE9MRCxcbiAgVEhFTUUsXG4gIFRPVUNIX0NUWF9NRU5VX1RJTUVPVVQsXG4gIFVSTF9IQVNIX0tFWVMsXG4gIFVSTF9RVUVSWV9LRVlTLFxuICBaT09NX1NURVAsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvYWRGcm9tQmxvYiB9IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBpc1ZhbGlkTGlicmFyeSB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVFbGVtZW50cyB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcbmltcG9ydCB7XG4gIGRyYWdOZXdFbGVtZW50LFxuICBkcmFnU2VsZWN0ZWRFbGVtZW50cyxcbiAgZHVwbGljYXRlRWxlbWVudCxcbiAgZ2V0Q29tbW9uQm91bmRzLFxuICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsXG4gIGdldERyYWdPZmZzZXRYWSxcbiAgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgZ2V0UGVyZmVjdEVsZW1lbnRTaXplLFxuICBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbixcbiAgZ2V0UmVzaXplT2Zmc2V0WFksXG4gIGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzLFxuICBoaXRUZXN0LFxuICBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxuICBpc05vbkRlbGV0ZWRFbGVtZW50LFxuICBpc1RleHRFbGVtZW50LFxuICBuZXdFbGVtZW50LFxuICBuZXdMaW5lYXJFbGVtZW50LFxuICBuZXdUZXh0RWxlbWVudCxcbiAgbmV3SW1hZ2VFbGVtZW50LFxuICB0ZXh0V3lzaXd5ZyxcbiAgdHJhbnNmb3JtRWxlbWVudHMsXG4gIHVwZGF0ZVRleHRFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyxcbiAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uLFxuICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24sXG4gIGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nLFxuICBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcsXG4gIGlzQmluZGluZ0VuYWJsZWQsXG4gIGlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZCxcbiAgbWF5YmVCaW5kTGluZWFyRWxlbWVudCxcbiAgc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudCxcbiAgdW5iaW5kTGluZWFyRWxlbWVudHMsXG4gIHVwZGF0ZUJvdW5kRWxlbWVudHMsXG59IGZyb20gXCIuLi9lbGVtZW50L2JpbmRpbmdcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBidW1wVmVyc2lvbiwgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBDb3B5RWxlbWVudCwgbmV3RnJlZURyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbmV3RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaXNCaW5kaW5nRWxlbWVudCxcbiAgaXNCaW5kaW5nRWxlbWVudFR5cGUsXG4gIGlzSW1hZ2VFbGVtZW50LFxuICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudFR5cGUsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRmlsZUlkLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q2VudGVyLCBnZXREaXN0YW5jZSB9IGZyb20gXCIuLi9nZXN0dXJlXCI7XG5pbXBvcnQge1xuICBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQsXG4gIGdldEVsZW1lbnRzSW5Hcm91cCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkcyxcbiAgaXNFbGVtZW50SW5Hcm91cCxcbiAgaXNTZWxlY3RlZFZpYUdyb3VwLFxuICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcsIGdldExhbmd1YWdlLCBsYW5ndWFnZXMsIHNldExhbmd1YWdlLCB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7XG4gIENPREVTLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyLFxuICBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvLFxuICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgaXNBcnJvd0tleSxcbiAgS0VZUyxcbn0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIGdldEdyaWRQb2ludCwgaXNQYXRoQUxvb3AgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUgfSBmcm9tIFwiLi4vcmVuZGVyZXJcIjtcbmltcG9ydCB7IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyLFxuICBnZXRFbGVtZW50Q29udGFpbmluZ1Bvc2l0aW9uLFxuICBnZXRFbGVtZW50c0F0UG9zaXRpb24sXG4gIGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLFxuICBnZXROb3JtYWxpemVkWm9vbSxcbiAgZ2V0U2VsZWN0ZWRFbGVtZW50cyxcbiAgaGFzQmFja2dyb3VuZCxcbiAgaXNPdmVyU2Nyb2xsQmFycyxcbiAgaXNTb21lRWxlbWVudFNlbGVjdGVkLFxufSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IFNjZW5lU3RhdGUsIFNjcm9sbEJhcnMgfSBmcm9tIFwiLi4vc2NlbmUvdHlwZXNcIjtcbmltcG9ydCB7IGdldE5ld1pvb20gfSBmcm9tIFwiLi4vc2NlbmUvem9vbVwiO1xuaW1wb3J0IHsgZmluZFNoYXBlQnlLZXkgfSBmcm9tIFwiLi4vc2hhcGVzXCI7XG5pbXBvcnQge1xuICBBcHBDbGFzc1Byb3BlcnRpZXMsXG4gIEFwcFByb3BzLFxuICBBcHBTdGF0ZSxcbiAgQmluYXJ5RmlsZURhdGEsXG4gIERhdGFVUkwsXG4gIEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJLFxuICBCaW5hcnlGaWxlcyxcbiAgR2VzdHVyZSxcbiAgR2VzdHVyZUV2ZW50LFxuICBMaWJyYXJ5SXRlbXMsXG4gIFBvaW50ZXJEb3duU3RhdGUsXG4gIFNjZW5lRGF0YSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBkZWJvdW5jZSxcbiAgZGlzdGFuY2UsXG4gIGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLFxuICBpc0lucHV0TGlrZSxcbiAgaXNUb29sSWNvbixcbiAgaXNXcml0YWJsZUVsZW1lbnQsXG4gIHJlc2V0Q3Vyc29yLFxuICByZXNvbHZhYmxlUHJvbWlzZSxcbiAgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzLFxuICBzZXRDdXJzb3IsXG4gIHNldEN1cnNvckZvclNoYXBlLFxuICB0dXBsZVRvQ29vcnMsXG4gIHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyxcbiAgd2l0aEJhdGNoZWRVcGRhdGVzLFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBDb250ZXh0TWVudSwgeyBDb250ZXh0TWVudU9wdGlvbiB9IGZyb20gXCIuL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgTGF5ZXJVSSBmcm9tIFwiLi9MYXllclVJXCI7XG5pbXBvcnQgeyBTdGF0cyB9IGZyb20gXCIuL1N0YXRzXCI7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gXCIuL1RvYXN0XCI7XG5pbXBvcnQgeyBhY3Rpb25Ub2dnbGVWaWV3TW9kZSB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblRvZ2dsZVZpZXdNb2RlXCI7XG5pbXBvcnQge1xuICBkYXRhVVJMVG9GaWxlLFxuICBnZW5lcmF0ZUlkRnJvbUZpbGUsXG4gIGdldERhdGFVUkwsXG4gIGlzU3VwcG9ydGVkSW1hZ2VGaWxlLFxuICByZXNpemVJbWFnZUZpbGUsXG4gIFNWR1N0cmluZ1RvRmlsZSxcbn0gZnJvbSBcIi4uL2RhdGEvYmxvYlwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICBsb2FkSFRNTEltYWdlRWxlbWVudCxcbiAgbm9ybWFsaXplU1ZHLFxuICB1cGRhdGVJbWFnZUNhY2hlIGFzIF91cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCJsb2Rhc2gudGhyb3R0bGVcIjtcbmltcG9ydCB7IGZpbGVPcGVuLCBuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkIH0gZnJvbSBcIi4uL2RhdGEvZmlsZXN5c3RlbVwiO1xuXG5jb25zdCBJc01vYmlsZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmV4cG9ydCBjb25zdCB1c2VJc01vYmlsZSA9ICgpID0+IHVzZUNvbnRleHQoSXNNb2JpbGVDb250ZXh0KTtcbmNvbnN0IEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDx7XG4gIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBpZDogc3RyaW5nIHwgbnVsbDtcbn0+KHsgY29udGFpbmVyOiBudWxsLCBpZDogbnVsbCB9KTtcbmV4cG9ydCBjb25zdCB1c2VFeGNhbGlkcmF3Q29udGFpbmVyID0gKCkgPT5cbiAgdXNlQ29udGV4dChFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCk7XG5cbmxldCBkaWRUYXBUd2ljZTogYm9vbGVhbiA9IGZhbHNlO1xubGV0IHRhcHBlZFR3aWNlVGltZXIgPSAwO1xubGV0IGN1cnNvclggPSAwO1xubGV0IGN1cnNvclkgPSAwO1xubGV0IGlzSG9sZGluZ1NwYWNlOiBib29sZWFuID0gZmFsc2U7XG5sZXQgaXNQYW5uaW5nOiBib29sZWFuID0gZmFsc2U7XG5sZXQgaXNEcmFnZ2luZ1Njcm9sbEJhcjogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGN1cnJlbnRTY3JvbGxCYXJzOiBTY3JvbGxCYXJzID0geyBob3Jpem9udGFsOiBudWxsLCB2ZXJ0aWNhbDogbnVsbCB9O1xubGV0IHRvdWNoVGltZW91dCA9IDA7XG5sZXQgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbmxldCBsYXN0UG9pbnRlclVwOiAoKGV2ZW50OiBhbnkpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5jb25zdCBnZXN0dXJlOiBHZXN0dXJlID0ge1xuICBwb2ludGVyczogbmV3IE1hcCgpLFxuICBsYXN0Q2VudGVyOiBudWxsLFxuICBpbml0aWFsRGlzdGFuY2U6IG51bGwsXG4gIGluaXRpYWxTY2FsZTogbnVsbCxcbn07XG5cbmNsYXNzIEFwcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxBcHBQcm9wcywgQXBwU3RhdGU+IHtcbiAgY2FudmFzOiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJjYW52YXNcIl0gPSBudWxsO1xuICByYzogUm91Z2hDYW52YXMgfCBudWxsID0gbnVsbDtcbiAgdW5tb3VudGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGFjdGlvbk1hbmFnZXI6IEFjdGlvbk1hbmFnZXI7XG4gIGlzTW9iaWxlID0gZmFsc2U7XG4gIGRldGFjaElzTW9iaWxlTXFIYW5kbGVyPzogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGV4Y2FsaWRyYXdDb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8QXBwUHJvcHM+ID0ge1xuICAgIC8vIG5lZWRlZCBmb3IgdGVzdHMgdG8gcGFzcyBzaW5jZSB3ZSBkaXJlY3RseSByZW5kZXIgQXBwIGluIG1hbnkgdGVzdHNcbiAgICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgfTtcblxuICBwcml2YXRlIHNjZW5lOiBTY2VuZTtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBsaWJyYXJ5OiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJsaWJyYXJ5XCJdO1xuICBwdWJsaWMgbGlicmFyeUl0ZW1zRnJvbVN0b3JhZ2U6IExpYnJhcnlJdGVtcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpZDogc3RyaW5nO1xuICBwcml2YXRlIGhpc3Rvcnk6IEhpc3Rvcnk7XG4gIHByaXZhdGUgZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlOiB7XG4gICAgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gICAgaWQ6IHN0cmluZztcbiAgfTtcblxuICBwdWJsaWMgZmlsZXM6IEJpbmFyeUZpbGVzID0ge307XG4gIHB1YmxpYyBpbWFnZUNhY2hlOiBBcHBDbGFzc1Byb3BlcnRpZXNbXCJpbWFnZUNhY2hlXCJdID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBBcHBQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBleGNhbGlkcmF3UmVmLFxuICAgICAgdmlld01vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgZ3JpZE1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB0aGVtZSA9IGRlZmF1bHRBcHBTdGF0ZS50aGVtZSxcbiAgICAgIG5hbWUgPSBkZWZhdWx0QXBwU3RhdGUubmFtZSxcbiAgICB9ID0gcHJvcHM7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIC4uLmRlZmF1bHRBcHBTdGF0ZSxcbiAgICAgIHRoZW1lLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgLi4udGhpcy5nZXRDYW52YXNPZmZzZXRzKCksXG4gICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgIGdyaWRTaXplOiBncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsLFxuICAgICAgbmFtZSxcbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgIH07XG5cbiAgICB0aGlzLmlkID0gbmFub2lkKCk7XG5cbiAgICBpZiAoZXhjYWxpZHJhd1JlZikge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID1cbiAgICAgICAgKFwiY3VycmVudFwiIGluIGV4Y2FsaWRyYXdSZWYgJiYgZXhjYWxpZHJhd1JlZi5jdXJyZW50Py5yZWFkeVByb21pc2UpIHx8XG4gICAgICAgIHJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPigpO1xuXG4gICAgICBjb25zdCBhcGk6IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcmVhZHlQcm9taXNlLFxuICAgICAgICB1cGRhdGVTY2VuZTogdGhpcy51cGRhdGVTY2VuZSxcbiAgICAgICAgYWRkRmlsZXM6IHRoaXMuYWRkRmlsZXMsXG4gICAgICAgIHJlc2V0U2NlbmU6IHRoaXMucmVzZXRTY2VuZSxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQsXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBjbGVhcjogdGhpcy5yZXNldEhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICAgIHNjcm9sbFRvQ29udGVudDogdGhpcy5zY3JvbGxUb0NvbnRlbnQsXG4gICAgICAgIHpvb21Ub0ZpdDogdGhpcy56b29tVG9GaXQsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHM6IHRoaXMuZ2V0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgZ2V0QXBwU3RhdGU6ICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAgIGdldEZpbGVzOiAoKSA9PiB0aGlzLmZpbGVzLFxuICAgICAgICByZWZyZXNoOiB0aGlzLnJlZnJlc2gsXG4gICAgICAgIGltcG9ydExpYnJhcnk6IHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwsXG4gICAgICAgIHNldFRvYXN0TWVzc2FnZTogdGhpcy5zZXRUb2FzdE1lc3NhZ2UsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICAgIGlmICh0eXBlb2YgZXhjYWxpZHJhd1JlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYuY3VycmVudCA9IGFwaTtcbiAgICAgIH1cbiAgICAgIHJlYWR5UHJvbWlzZS5yZXNvbHZlKGFwaSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUgPSB7XG4gICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgfTtcblxuICAgIHRoaXMuc2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICB0aGlzLmxpYnJhcnkgPSBuZXcgTGlicmFyeSh0aGlzKTtcbiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKFxuICAgICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0LFxuICAgICAgKCkgPT4gdGhpcy5zdGF0ZSxcbiAgICAgICgpID0+IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLFxuICAgICk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWxsKGFjdGlvbnMpO1xuXG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVVuZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVJlZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNhbnZhcygpIHtcbiAgICBjb25zdCBjYW52YXNTY2FsZSA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gY2FudmFzRE9NV2lkdGggKiBjYW52YXNTY2FsZTtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXNET01IZWlnaHQgKiBjYW52YXNTY2FsZTtcbiAgICBpZiAodmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Y2FudmFzXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZXhjYWxpZHJhd19fY2FudmFzXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICAgICAgICBjdXJzb3I6IENVUlNPUl9UWVBFLkdSQUIsXG4gICAgICAgICAgfX1cbiAgICAgICAgICB3aWR0aD17Y2FudmFzV2lkdGh9XG4gICAgICAgICAgaGVpZ2h0PXtjYW52YXNIZWlnaHR9XG4gICAgICAgICAgcmVmPXt0aGlzLmhhbmRsZUNhbnZhc1JlZn1cbiAgICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51fVxuICAgICAgICAgIG9uUG9pbnRlck1vdmU9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmV9XG4gICAgICAgICAgb25Qb2ludGVyVXA9e3RoaXMucmVtb3ZlUG9pbnRlcn1cbiAgICAgICAgICBvblBvaW50ZXJDYW5jZWw9e3RoaXMucmVtb3ZlUG9pbnRlcn1cbiAgICAgICAgICBvblRvdWNoTW92ZT17dGhpcy5oYW5kbGVUb3VjaE1vdmV9XG4gICAgICAgICAgb25Qb2ludGVyRG93bj17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bn1cbiAgICAgICAgPlxuICAgICAgICAgIHt0KFwibGFiZWxzLmRyYXdpbmdDYW52YXNcIil9XG4gICAgICAgIDwvY2FudmFzPlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxjYW52YXNcbiAgICAgICAgY2xhc3NOYW1lPVwiZXhjYWxpZHJhd19fY2FudmFzXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICAgIH19XG4gICAgICAgIHdpZHRoPXtjYW52YXNXaWR0aH1cbiAgICAgICAgaGVpZ2h0PXtjYW52YXNIZWlnaHR9XG4gICAgICAgIHJlZj17dGhpcy5oYW5kbGVDYW52YXNSZWZ9XG4gICAgICAgIG9uQ29udGV4dE1lbnU9e3RoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnV9XG4gICAgICAgIG9uUG9pbnRlckRvd249e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd259XG4gICAgICAgIG9uRG91YmxlQ2xpY2s9e3RoaXMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2t9XG4gICAgICAgIG9uUG9pbnRlck1vdmU9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmV9XG4gICAgICAgIG9uUG9pbnRlclVwPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgIG9uUG9pbnRlckNhbmNlbD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICBvblRvdWNoTW92ZT17dGhpcy5oYW5kbGVUb3VjaE1vdmV9XG4gICAgICA+XG4gICAgICAgIHt0KFwibGFiZWxzLmRyYXdpbmdDYW52YXNcIil9XG4gICAgICA8L2NhbnZhcz5cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHplbk1vZGVFbmFibGVkLCB2aWV3TW9kZUVuYWJsZWQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBjb25zdCB7XG4gICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICAgIHJlbmRlckZvb3RlcixcbiAgICAgIHJlbmRlckN1c3RvbVN0YXRzLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFwiZXhjYWxpZHJhdyBleGNhbGlkcmF3LWNvbnRhaW5lclwiLCB7XG4gICAgICAgICAgXCJleGNhbGlkcmF3LS12aWV3LW1vZGVcIjogdmlld01vZGVFbmFibGVkLFxuICAgICAgICAgIFwiZXhjYWxpZHJhdy0tbW9iaWxlXCI6IHRoaXMuaXNNb2JpbGUsXG4gICAgICAgIH0pfVxuICAgICAgICByZWY9e3RoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZn1cbiAgICAgICAgb25Ecm9wPXt0aGlzLmhhbmRsZUFwcE9uRHJvcH1cbiAgICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICAgIG9uS2V5RG93bj17XG4gICAgICAgICAgdGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5ID8gdW5kZWZpbmVkIDogdGhpcy5vbktleURvd25cbiAgICAgICAgfVxuICAgICAgPlxuICAgICAgICA8RXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgICB2YWx1ZT17dGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWV9XG4gICAgICAgID5cbiAgICAgICAgICA8SXNNb2JpbGVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt0aGlzLmlzTW9iaWxlfT5cbiAgICAgICAgICAgIDxMYXllclVJXG4gICAgICAgICAgICAgIGNhbnZhcz17dGhpcy5jYW52YXN9XG4gICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICBmaWxlcz17dGhpcy5maWxlc31cbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI9e3RoaXMuYWN0aW9uTWFuYWdlcn1cbiAgICAgICAgICAgICAgZWxlbWVudHM9e3RoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKX1cbiAgICAgICAgICAgICAgb25Db2xsYWJCdXR0b25DbGljaz17b25Db2xsYWJCdXR0b25DbGlja31cbiAgICAgICAgICAgICAgb25Mb2NrVG9nZ2xlPXt0aGlzLnRvZ2dsZUxvY2t9XG4gICAgICAgICAgICAgIG9uSW5zZXJ0RWxlbWVudHM9eyhlbGVtZW50cykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgICBmaWxlczogbnVsbCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHplbk1vZGVFbmFibGVkPXt6ZW5Nb2RlRW5hYmxlZH1cbiAgICAgICAgICAgICAgdG9nZ2xlWmVuTW9kZT17dGhpcy50b2dnbGVaZW5Nb2RlfVxuICAgICAgICAgICAgICBsYW5nQ29kZT17Z2V0TGFuZ3VhZ2UoKS5jb2RlfVxuICAgICAgICAgICAgICBpc0NvbGxhYm9yYXRpbmc9e3RoaXMucHJvcHMuaXNDb2xsYWJvcmF0aW5nIHx8IGZhbHNlfVxuICAgICAgICAgICAgICByZW5kZXJUb3BSaWdodFVJPXtyZW5kZXJUb3BSaWdodFVJfVxuICAgICAgICAgICAgICByZW5kZXJDdXN0b21Gb290ZXI9e3JlbmRlckZvb3Rlcn1cbiAgICAgICAgICAgICAgdmlld01vZGVFbmFibGVkPXt2aWV3TW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIHNob3dFeGl0WmVuTW9kZUJ0bj17XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHM/Lnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgemVuTW9kZUVuYWJsZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzaG93VGhlbWVCdG49e1xuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzPy50aGVtZSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMudGhlbWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsaWJyYXJ5UmV0dXJuVXJsPXt0aGlzLnByb3BzLmxpYnJhcnlSZXR1cm5Vcmx9XG4gICAgICAgICAgICAgIFVJT3B0aW9ucz17dGhpcy5wcm9wcy5VSU9wdGlvbnN9XG4gICAgICAgICAgICAgIGZvY3VzQ29udGFpbmVyPXt0aGlzLmZvY3VzQ29udGFpbmVyfVxuICAgICAgICAgICAgICBsaWJyYXJ5PXt0aGlzLmxpYnJhcnl9XG4gICAgICAgICAgICAgIGlkPXt0aGlzLmlkfVxuICAgICAgICAgICAgICBvbkltYWdlQWN0aW9uPXt0aGlzLm9uSW1hZ2VBY3Rpb259XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJleGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJleGNhbGlkcmF3LWNvbnRleHRNZW51Q29udGFpbmVyXCIgLz5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnNob3dTdGF0cyAmJiAoXG4gICAgICAgICAgICAgIDxTdGF0c1xuICAgICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlPXt0aGlzLnNldEFwcFN0YXRlfVxuICAgICAgICAgICAgICAgIGVsZW1lbnRzPXt0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCl9XG4gICAgICAgICAgICAgICAgb25DbG9zZT17dGhpcy50b2dnbGVTdGF0c31cbiAgICAgICAgICAgICAgICByZW5kZXJDdXN0b21TdGF0cz17cmVuZGVyQ3VzdG9tU3RhdHN9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RoaXMuc3RhdGUudG9hc3RNZXNzYWdlICE9PSBudWxsICYmIChcbiAgICAgICAgICAgICAgPFRvYXN0XG4gICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS50b2FzdE1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgY2xlYXJUb2FzdD17dGhpcy5jbGVhclRvYXN0fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxtYWluPnt0aGlzLnJlbmRlckNhbnZhcygpfTwvbWFpbj5cbiAgICAgICAgICA8L0lzTW9iaWxlQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgPC9FeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNDb250YWluZXI6IEFwcENsYXNzUHJvcGVydGllc1tcImZvY3VzQ29udGFpbmVyXCJdID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0U2NlbmVFbGVtZW50cyA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuICB9O1xuXG4gIHByaXZhdGUgc3luY0FjdGlvblJlc3VsdCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAoYWN0aW9uUmVzdWx0OiBBY3Rpb25SZXN1bHQpID0+IHtcbiAgICAgIGlmICh0aGlzLnVubW91bnRlZCB8fCBhY3Rpb25SZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGVkaXRpbmdFbGVtZW50OiBBcHBTdGF0ZVtcImVkaXRpbmdFbGVtZW50XCJdIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKSB7XG4gICAgICAgIGFjdGlvblJlc3VsdC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudD8uaWQgPT09IGVsZW1lbnQuaWQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQgIT09IGVsZW1lbnQgJiZcbiAgICAgICAgICAgIGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhhY3Rpb25SZXN1bHQuZWxlbWVudHMpO1xuICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmZpbGVzKSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBhY3Rpb25SZXN1bHQucmVwbGFjZUZpbGVzXG4gICAgICAgICAgPyBhY3Rpb25SZXN1bHQuZmlsZXNcbiAgICAgICAgICA6IHsgLi4udGhpcy5maWxlcywgLi4uYWN0aW9uUmVzdWx0LmZpbGVzIH07XG4gICAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwgZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlld01vZGVFbmFibGVkID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8udmlld01vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBsZXQgemVuTW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy56ZW5Nb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgbGV0IGdyaWRTaXplID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uZ3JpZFNpemUgfHwgbnVsbDtcbiAgICAgICAgbGV0IHRoZW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8udGhlbWUgfHwgVEhFTUUuTElHSFQ7XG4gICAgICAgIGxldCBuYW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8ubmFtZSA/PyB0aGlzLnN0YXRlLm5hbWU7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQgPSB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHplbk1vZGVFbmFibGVkID0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBncmlkU2l6ZSA9IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy50aGVtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRoZW1lID0gdGhpcy5wcm9wcy50aGVtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5uYW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgbmFtZSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdXNpbmcgT2JqZWN0LmFzc2lnbiBpbnN0ZWFkIG9mIHNwcmVhZCB0byBmb29sIFRTIDQuMi4yKyBpbnRvXG4gICAgICAgICAgICAvLyByZWdhcmRpbmcgdGhlIHJlc3VsdGluZyB0eXBlIGFzIG5vdCBjb250YWluaW5nIHVuZGVmaW5lZFxuICAgICAgICAgICAgLy8gKHdoaWNoIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3aWxsIG5ldmVyIGNvbnRhaW4pXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwge30sIHtcbiAgICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6XG4gICAgICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQgfHwgYWN0aW9uUmVzdWx0LmFwcFN0YXRlPy5lZGl0aW5nRWxlbWVudCB8fCBudWxsLFxuICAgICAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgICAgICAgICBncmlkU2l6ZSxcbiAgICAgICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmIChhY3Rpb25SZXN1bHQuc3luY0hpc3RvcnkpIHtcbiAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnNldEN1cnJlbnRTdGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICApO1xuXG4gIC8vIExpZmVjeWNsZVxuXG4gIHByaXZhdGUgb25CbHVyID0gd2l0aEJhdGNoZWRVcGRhdGVzKCgpID0+IHtcbiAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiB0cnVlIH0pO1xuICB9KTtcblxuICBwcml2YXRlIG9uVW5sb2FkID0gKCkgPT4ge1xuICAgIHRoaXMub25CbHVyKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRXZlbnQ6IEV2ZW50SGFuZGxlck5vbk51bGwgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuXG4gIHByaXZhdGUgb25Gb250TG9hZGVkID0gKCkgPT4ge1xuICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm9uU2NlbmVVcGRhdGVkKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBpbXBvcnRMaWJyYXJ5RnJvbVVybCA9IGFzeW5jICh1cmw6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluY2x1ZGVzKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgIGNvbnN0IGhhc2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKTtcbiAgICAgIGhhc2guZGVsZXRlKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSk7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgIyR7aGFzaC50b1N0cmluZygpfWApO1xuICAgIH0gZWxzZSBpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcyhVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5KSkge1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgcXVlcnkuZGVsZXRlKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBBUFBfTkFNRSwgYD8ke3F1ZXJ5LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBmZXRjaChkZWNvZGVVUklDb21wb25lbnQodXJsKSk7XG4gICAgICBjb25zdCBibG9iID0gYXdhaXQgcmVxdWVzdC5ibG9iKCk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBibG9iLnRleHQoKSk7XG4gICAgICBpZiAoIWlzVmFsaWRMaWJyYXJ5KGpzb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0b2tlbiA9PT0gdGhpcy5pZCB8fFxuICAgICAgICB3aW5kb3cuY29uZmlybShcbiAgICAgICAgICB0KFwiYWxlcnRzLmNvbmZpcm1BZGRMaWJyYXJ5XCIsIHsgbnVtU2hhcGVzOiBqc29uLmxpYnJhcnkubGVuZ3RoIH0pLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5saWJyYXJ5LmltcG9ydExpYnJhcnkoYmxvYik7XG4gICAgICAgIC8vIGhhY2sgdG8gcmVyZW5kZXIgdGhlIGxpYnJhcnkgaXRlbXMgYWZ0ZXIgaW1wb3J0XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4pIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHdpbmRvdy5hbGVydCh0KFwiYWxlcnRzLmVycm9yTG9hZGluZ0xpYnJhcnlcIikpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBzY2VuZSAmIGhpc3RvcnkuXG4gICAqICEgRG8gbm90IHVzZSB0byBjbGVhciBzY2VuZSB1c2VyIGFjdGlvbiAhXG4gICAqL1xuICBwcml2YXRlIHJlc2V0U2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKG9wdHM/OiB7IHJlc2V0TG9hZGluZ1N0YXRlOiBib29sZWFuIH0pID0+IHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAuLi5nZXREZWZhdWx0QXBwU3RhdGUoKSxcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGluaXRpYWxpemVTY2VuZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgKHdpbmRvdyBhcyBhbnkpLmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKFxuICAgICAgICBhc3luYyAobGF1bmNoUGFyYW1zOiB7IGZpbGVzOiBhbnlbXSB9KSA9PiB7XG4gICAgICAgICAgaWYgKCFsYXVuY2hQYXJhbXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYjogQmxvYiA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgIGJsb2IuaGFuZGxlID0gZmlsZUhhbmRsZTtcbiAgICAgICAgICBsb2FkRnJvbUJsb2IoXG4gICAgICAgICAgICBibG9iLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKHNjZW5lKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgLi4uc2NlbmUsXG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihzY2VuZS5hcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogZmFsc2UsIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgIH1cbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBpbml0aWFsRGF0YSA9IChhd2FpdCB0aGlzLnByb3BzLmluaXRpYWxEYXRhKSB8fCBudWxsO1xuICAgICAgaWYgKGluaXRpYWxEYXRhPy5saWJyYXJ5SXRlbXMpIHtcbiAgICAgICAgdGhpcy5saWJyYXJ5SXRlbXNGcm9tU3RvcmFnZSA9IGluaXRpYWxEYXRhLmxpYnJhcnlJdGVtcztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIGluaXRpYWxEYXRhID0ge1xuICAgICAgICBhcHBTdGF0ZToge1xuICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgfHxcbiAgICAgICAgICAgIFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGltcG9ydGluZyBvciByZXN0b3Jpbmcgc2NlbmUgZGF0YVwiLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2VuZSA9IHJlc3RvcmUoaW5pdGlhbERhdGEsIG51bGwsIG51bGwpO1xuXG4gICAgc2NlbmUuYXBwU3RhdGUgPSB7XG4gICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgIGVsZW1lbnRUeXBlOlxuICAgICAgICBzY2VuZS5hcHBTdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiXG4gICAgICAgICAgPyBcInNlbGVjdGlvblwiXG4gICAgICAgICAgOiBzY2VuZS5hcHBTdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgfTtcbiAgICBpZiAoaW5pdGlhbERhdGE/LnNjcm9sbFRvQ29udGVudCkge1xuICAgICAgc2NlbmUuYXBwU3RhdGUgPSB7XG4gICAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgICAuLi5jYWxjdWxhdGVTY3JvbGxDZW50ZXIoXG4gICAgICAgICAgc2NlbmUuZWxlbWVudHMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5zdGF0ZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5zdGF0ZS5oZWlnaHQsXG4gICAgICAgICAgICBvZmZzZXRUb3A6IHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgICAgICAgb2Zmc2V0TGVmdDogdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldEhpc3RvcnkoKTtcbiAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgLi4uc2NlbmUsXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBsaWJyYXJ5VXJsID1cbiAgICAgIC8vIGN1cnJlbnRcbiAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkpLmdldChcbiAgICAgICAgVVJMX0hBU0hfS0VZUy5hZGRMaWJyYXJ5LFxuICAgICAgKSB8fFxuICAgICAgLy8gbGVnYWN5LCBrZXB0IGZvciBjb21wYXQgcmVhc29uc1xuICAgICAgbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoXG4gICAgICAgIFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnksXG4gICAgICApO1xuXG4gICAgaWYgKGxpYnJhcnlVcmwpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwobGlicmFyeVVybCk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBhc3luYyBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZS5jb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcblxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuVEVTVCB8fFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVFxuICAgICkge1xuICAgICAgY29uc3Qgc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNldFN0YXRlOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2Ygc2V0U3RhdGU+KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZSguLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhcHA6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgIH0sXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IHRoaXMuaGlzdG9yeSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmUuYWRkQ2FsbGJhY2sodGhpcy5vblNjZW5lVXBkYXRlZCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuXG4gICAgaWYgKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cgJiYgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgLy8gY29tcHV0ZSBpc01vYmlsZSBzdGF0ZVxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgfSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50IS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5pc01vYmlsZSA9XG4gICAgICAgICAgd2lkdGggPCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQgfHxcbiAgICAgICAgICAoaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiYgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFKTtcbiAgICAgICAgLy8gcmVmcmVzaCBvZmZzZXRzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB0aGlzLnVwZGF0ZURPTVJlY3QoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlcj8ub2JzZXJ2ZSh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgfSBlbHNlIGlmICh3aW5kb3cubWF0Y2hNZWRpYSkge1xuICAgICAgY29uc3QgbWVkaWFRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKFxuICAgICAgICBgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfUE9SVFJBSVR9cHgpLCAobWF4LWhlaWdodDogJHtNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRX1weCkgYW5kIChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX0xBTkRTQ0FQRX1weClgLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiAodGhpcy5pc01vYmlsZSA9IG1lZGlhUXVlcnkubWF0Y2hlcyk7XG4gICAgICBtZWRpYVF1ZXJ5LmFkZExpc3RlbmVyKGhhbmRsZXIpO1xuICAgICAgdGhpcy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlciA9ICgpID0+IG1lZGlhUXVlcnkucmVtb3ZlTGlzdGVuZXIoaGFuZGxlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpKTtcblxuICAgIGlmIChzZWFyY2hQYXJhbXMuaGFzKFwid2ViLXNoYXJlLXRhcmdldFwiKSkge1xuICAgICAgLy8gT2J0YWluIGEgZmlsZSB0aGF0IHdhcyBzaGFyZWQgdmlhIHRoZSBXZWIgU2hhcmUgVGFyZ2V0IEFQSS5cbiAgICAgIHRoaXMucmVzdG9yZUZpbGVGcm9tU2hhcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVET01SZWN0KHRoaXMuaW5pdGlhbGl6ZVNjZW5lKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5maWxlcyA9IHt9O1xuICAgIHRoaXMuaW1hZ2VDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuc2NlbmUuZGVzdHJveSgpO1xuICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgIHRvdWNoVGltZW91dCA9IDA7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKCgpID0+IHtcbiAgICB0aGlzLnNjZW5lXG4gICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpKTtcbiAgICB0aGlzLnNldFN0YXRlKHt9KTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ1VULCB0aGlzLm9uQ3V0KTtcbiAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuU0NST0xMLFxuICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuTU9VU0VfTU9WRSxcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXApO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9TVEFSVCxcbiAgICAgIHRoaXMub25HZXN0dXJlU3RhcnQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9DSEFOR0UsXG4gICAgICB0aGlzLm9uR2VzdHVyZUNoYW5nZSBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0VORCxcbiAgICAgIHRoaXMub25HZXN0dXJlRW5kIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTsgLy8gIzM1NTNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5NT1VTRV9NT1ZFLFxuICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sXG4gICAgKTtcbiAgICAvLyByZXJlbmRlciB0ZXh0IGVsZW1lbnRzIG9uIGZvbnQgbG9hZCB0byBmaXggIzYzNyAmJiAjMTU1M1xuICAgIGRvY3VtZW50LmZvbnRzPy5hZGRFdmVudExpc3RlbmVyPy4oXCJsb2FkaW5nZG9uZVwiLCB0aGlzLm9uRm9udExvYWRlZCk7XG4gICAgLy8gU2FmYXJpLW9ubHkgZGVza3RvcCBwaW5jaCB6b29tXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZGV0ZWN0U2Nyb2xsKSB7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIoXG4gICAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICAgICk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBBcHBQcm9wcywgcHJldlN0YXRlOiBBcHBTdGF0ZSkge1xuICAgIGlmIChwcmV2UHJvcHMubGFuZ0NvZGUgIT09IHRoaXMucHJvcHMubGFuZ0NvZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aWV3TW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZTdGF0ZS52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnplbk1vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgemVuTW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnRoZW1lICE9PSB0aGlzLnByb3BzLnRoZW1lICYmIHRoaXMucHJvcHMudGhlbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB0aGVtZTogdGhpcy5wcm9wcy50aGVtZSB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBncmlkU2l6ZTogdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMubmFtZSAmJiBwcmV2UHJvcHMubmFtZSAhPT0gdGhpcy5wcm9wcy5uYW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbmFtZTogdGhpcy5wcm9wcy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICBcInRoZW1lLS1kYXJrXCIsXG4gICAgICB0aGlzLnN0YXRlLnRoZW1lID09PSBcImRhcmtcIixcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkXVxuICAgICkge1xuICAgICAgLy8gZGVmZXIgc28gdGhhdCB0aGUgY29tbWl0VG9IaXN0b3J5IGZsYWcgaXNuJ3QgcmVzZXQgdmlhIGN1cnJlbnQgdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgbXVsdGlFbGVtZW50IH0gPSBwcmV2U3RhdGU7XG4gICAgaWYgKFxuICAgICAgcHJldlN0YXRlLmVsZW1lbnRUeXBlICE9PSB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICYmXG4gICAgICBtdWx0aUVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJlxuICAgICAgaXNCaW5kaW5nRWxlbWVudChtdWx0aUVsZW1lbnQpXG4gICAgKSB7XG4gICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgIHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50QXRJbmRleEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yQnV0dG9uOiB7XG4gICAgICBbaWQ6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclZpZXdwb3J0Q29vcmRzOiBTY2VuZVN0YXRlW1wicmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzXCJdID0ge307XG4gICAgY29uc3QgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiBTY2VuZVN0YXRlW1wicmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzXCJdID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJuYW1lczogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJTdGF0ZXM6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKCh1c2VyLCBzb2NrZXRJZCkgPT4ge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdLnB1c2goc29ja2V0SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXIucG9pbnRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VyU3RhdGUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJTdGF0ZXNbc29ja2V0SWRdID0gdXNlci51c2VyU3RhdGU7XG4gICAgICB9XG4gICAgICBwb2ludGVyVmlld3BvcnRDb29yZHNbc29ja2V0SWRdID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICB7XG4gICAgICAgICAgc2NlbmVYOiB1c2VyLnBvaW50ZXIueCxcbiAgICAgICAgICBzY2VuZVk6IHVzZXIucG9pbnRlci55LFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGN1cnNvckJ1dHRvbltzb2NrZXRJZF0gPSB1c2VyLmJ1dHRvbjtcbiAgICB9KTtcbiAgICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5maWx0ZXIoKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8gbm90IHBsYWNlZCBvbiBjYW52YXMgeWV0IChidXQgaW4gZWxlbWVudHMgYXJyYXkpXG4gICAgICAgICAgdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50ICYmXG4gICAgICAgICAgZWxlbWVudC5pZCA9PT0gdGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50LmlkXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZG9uJ3QgcmVuZGVyIHRleHQgZWxlbWVudCB0aGF0J3MgYmVpbmcgY3VycmVudGx5IGVkaXRlZCAoaXQnc1xuICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCB8fFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8XG4gICAgICAgIGVsZW1lbnQuaWQgIT09IHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQuaWRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgeyBhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQsIHNjcm9sbEJhcnMgfSA9IHJlbmRlclNjZW5lKFxuICAgICAgcmVuZGVyaW5nRWxlbWVudHMsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb25FbGVtZW50LFxuICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICB0aGlzLnJjISxcbiAgICAgIHRoaXMuY2FudmFzISxcbiAgICAgIHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYLFxuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFksXG4gICAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUudmlld0JhY2tncm91bmRDb2xvcixcbiAgICAgICAgem9vbTogdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHBvaW50ZXJWaWV3cG9ydENvb3JkcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlckJ1dHRvbjogY3Vyc29yQnV0dG9uLFxuICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHBvaW50ZXJVc2VybmFtZXMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiBwb2ludGVyVXNlclN0YXRlcyxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0aGlzLnN0YXRlLnNob3VsZENhY2hlSWdub3JlWm9vbSxcbiAgICAgICAgdGhlbWU6IHRoaXMuc3RhdGUudGhlbWUsXG4gICAgICAgIGltYWdlQ2FjaGU6IHRoaXMuaW1hZ2VDYWNoZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlbmRlck9wdGltaXphdGlvbnM6IHRydWUsXG4gICAgICAgIHJlbmRlclNjcm9sbGJhcnM6ICF0aGlzLmlzTW9iaWxlLFxuICAgICAgfSxcbiAgICApO1xuICAgIGlmIChzY3JvbGxCYXJzKSB7XG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyA9IHNjcm9sbEJhcnM7XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbGVkT3V0c2lkZSA9XG4gICAgICAvLyBoaWRlIHdoZW4gZWRpdGluZyB0ZXh0XG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py50eXBlID09PSBcInRleHRcIlxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2Nyb2xsZWRPdXRzaWRlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG5cbiAgICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7XG5cbiAgICAvLyBEbyBub3Qgbm90aWZ5IGNvbnN1bWVycyBpZiB3ZSdyZSBzdGlsbCBsb2FkaW5nIHRoZSBzY2VuZS4gQW1vbmcgb3RoZXJcbiAgICAvLyBwb3RlbnRpYWwgaXNzdWVzLCB0aGlzIGZpeGVzIGEgY2FzZSB3aGVyZSB0aGUgdGFiIGlzbid0IGZvY3VzZWQgZHVyaW5nXG4gICAgLy8gaW5pdCwgd2hpY2ggd291bGQgdHJpZ2dlciBvbkNoYW5nZSB3aXRoIGVtcHR5IGVsZW1lbnRzLCB3aGljaCB3b3VsZCB0aGVuXG4gICAgLy8gb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gbG9jYWxTdG9yYWdlIGN1cnJlbnRseS5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlPy4oXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuZmlsZXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TY3JvbGwgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgY29uc3QgeyBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpO1xuICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiB7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0TGVmdCA9PT0gb2Zmc2V0TGVmdCAmJiBzdGF0ZS5vZmZzZXRUb3AgPT09IG9mZnNldFRvcCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9O1xuICAgIH0pO1xuICB9LCBTQ1JPTExfVElNRU9VVCk7XG5cbiAgLy8gQ29weS9wYXN0ZVxuXG4gIHByaXZhdGUgb25DdXQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3V0QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvbkNvcHkgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHByaXZhdGUgY3V0QWxsID0gKCkgPT4ge1xuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlbGV0ZVNlbGVjdGVkKTtcbiAgfTtcblxuICBwcml2YXRlIGNvcHlBbGwgPSAoKSA9PiB7XG4gICAgY29weVRvQ2xpcGJvYXJkKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSwgdGhpcy5maWxlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzZXRUYXBUd2ljZSgpIHtcbiAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblRhcFN0YXJ0ID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgaWYgKCFkaWRUYXBUd2ljZSkge1xuICAgICAgZGlkVGFwVHdpY2UgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgICAgdGFwcGVkVHdpY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICBBcHAucmVzZXRUYXBUd2ljZSxcbiAgICAgICAgVEFQX1RXSUNFX1RJTUVPVVQsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpbnNlcnQgdGV4dCBvbmx5IGlmIHdlIHRhcHBlZCB0d2ljZSB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIC8vIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxIHdpbGwgYWxzbyBwcmV2ZW50IGluc2VydGluZyB0ZXh0IHdoZW4gdXNlcidzIHpvb21pbmdcbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayh7XG4gICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICB9KTtcbiAgICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uVGFwRW5kID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcGFzdGVGcm9tQ2xpcGJvYXJkID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIGFzeW5jIChldmVudDogQ2xpcGJvYXJkRXZlbnQgfCBudWxsKSA9PiB7XG4gICAgICAvLyAjNjg2XG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgICB0YXJnZXQsXG4gICAgICApO1xuICAgICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50VW5kZXJDdXJzb3IgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGN1cnNvclgsIGN1cnNvclkpO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAgIC8vIHRodXMgdGhlc2UgY2hlY2tzIGRvbid0IG1ha2Ugc2Vuc2VcbiAgICAgICAgZXZlbnQgJiZcbiAgICAgICAgKCEoZWxlbWVudFVuZGVyQ3Vyc29yIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHx8XG4gICAgICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGluIHRoZSBzYW1lIGZyYW1lICh0aHVzIGJlZm9yZSBhbnkgYXdhaXRzKSBhcyB0aGUgcGFzdGVcbiAgICAgIC8vIGV2ZW50IGVsc2Ugc29tZSBicm93c2VycyAoRkYuLi4pIHdpbGwgY2xlYXIgdGhlIGNsaXBib2FyZERhdGFcbiAgICAgIC8vIChzb21ldGhpbmcgc29tZXRoaW5nIHNlY3VyaXR5KVxuICAgICAgbGV0IGZpbGUgPSBldmVudD8uY2xpcGJvYXJkRGF0YT8uZmlsZXNbMF07XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGlmICghZmlsZSAmJiBkYXRhLnRleHQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gZGF0YS50ZXh0LnRyaW0oKTtcbiAgICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKFwiPHN2Z1wiKSAmJiBzdHJpbmcuZW5kc1dpdGgoXCI8L3N2Zz5cIikpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgU1ZHIHZhbGlkYXRpb24vbm9ybWFsaXphdGlvbiB3aGljaCB3aWxsIGJlIGRvbmUgZHVyaW5nIGltYWdlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb25cbiAgICAgICAgICBmaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpKSB7XG4gICAgICAgIGNvbnN0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICB7IGNsaWVudFg6IGN1cnNvclgsIGNsaWVudFk6IGN1cnNvclkgfSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHsgc2NlbmVYLCBzY2VuZVkgfSk7XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlIH0gfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9wcy5vblBhc3RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKChhd2FpdCB0aGlzLnByb3BzLm9uUGFzdGUoZGF0YSwgZXZlbnQpKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVycm9yTWVzc2FnZTogZGF0YS5lcnJvck1lc3NhZ2UgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuc3ByZWFkc2hlZXQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcGFzdGVEaWFsb2c6IHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGEuc3ByZWFkc2hlZXQsXG4gICAgICAgICAgICBzaG93bjogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5lbGVtZW50cykge1xuICAgICAgICB0aGlzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICBlbGVtZW50czogZGF0YS5lbGVtZW50cyxcbiAgICAgICAgICBmaWxlczogZGF0YS5maWxlcyB8fCBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiBcImN1cnNvclwiLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50ZXh0KSB7XG4gICAgICAgIHRoaXMuYWRkVGV4dEZyb21QYXN0ZShkYXRhLnRleHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RTaGFwZVRvb2woXCJzZWxlY3Rpb25cIik7XG4gICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICApO1xuXG4gIHByaXZhdGUgYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkgPSAob3B0czoge1xuICAgIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdO1xuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGw7XG4gICAgcG9zaXRpb246IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSB8IFwiY3Vyc29yXCIgfCBcImNlbnRlclwiO1xuICB9KSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMob3B0cy5lbGVtZW50cywgbnVsbCk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcblxuICAgIGNvbnN0IGVsZW1lbnRzQ2VudGVyWCA9IGRpc3RhbmNlKG1pblgsIG1heFgpIC8gMjtcbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclkgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSAvIDI7XG5cbiAgICBjb25zdCBjbGllbnRYID1cbiAgICAgIHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gb3B0cy5wb3NpdGlvbi5jbGllbnRYXG4gICAgICAgIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIlxuICAgICAgICA/IGN1cnNvclhcbiAgICAgICAgOiB0aGlzLnN0YXRlLndpZHRoIC8gMiArIHRoaXMuc3RhdGUub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjbGllbnRZID1cbiAgICAgIHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gb3B0cy5wb3NpdGlvbi5jbGllbnRZXG4gICAgICAgIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIlxuICAgICAgICA/IGN1cnNvcllcbiAgICAgICAgOiB0aGlzLnN0YXRlLmhlaWdodCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldFRvcDtcblxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYLCBjbGllbnRZIH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBkeCA9IHggLSBlbGVtZW50c0NlbnRlclg7XG4gICAgY29uc3QgZHkgPSB5IC0gZWxlbWVudHNDZW50ZXJZO1xuICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChkeCwgZHksIHRoaXMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgY29uc3Qgb2xkSWRUb0R1cGxpY2F0ZWRJZCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBuZXdFbGVtZW50cyA9IGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQsXG4gICAgICAgIGdyb3VwSWRNYXAsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHtcbiAgICAgICAgICB4OiBlbGVtZW50LnggKyBncmlkWCAtIG1pblgsXG4gICAgICAgICAgeTogZWxlbWVudC55ICsgZ3JpZFkgLSBtaW5ZLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIG5ld0VsZW1lbnQuaWQpO1xuICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgfSk7XG4gICAgY29uc3QgbmV4dEVsZW1lbnRzID0gW1xuICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIC4uLm5ld0VsZW1lbnRzLFxuICAgIF07XG4gICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuXG4gICAgaWYgKG9wdHMuZmlsZXMpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSB7IC4uLnRoaXMuZmlsZXMsIC4uLm9wdHMuZmlsZXMgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0RWxlbWVudHMpO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAge1xuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgaXNMaWJyYXJ5T3BlbjogZmFsc2UsXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBuZXdFbGVtZW50cy5yZWR1Y2UoKG1hcCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgfSwge30gYXMgYW55KSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgKSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKG9wdHMuZmlsZXMpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RTaGFwZVRvb2woXCJzZWxlY3Rpb25cIik7XG4gIH07XG5cbiAgcHJpdmF0ZSBhZGRUZXh0RnJvbVBhc3RlKHRleHQ6IGFueSkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYOiBjdXJzb3JYLCBjbGllbnRZOiBjdXJzb3JZIH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHRleHQsXG4gICAgICByYXdUZXh0OiB0ZXh0LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICB9KTtcblxuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICBlbGVtZW50LFxuICAgIF0pO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2VsZW1lbnQuaWRdOiB0cnVlIH0gfSk7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICB9XG5cbiAgLy8gQ29sbGFib3JhdGlvblxuXG4gIHNldEFwcFN0YXRlID0gKG9iajogYW55KSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZShvYmopO1xuICB9O1xuXG4gIHJlbW92ZVBvaW50ZXIgPSAoZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRWxlbWVudD4gfCBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAvLyByZW1vdmUgdG91Y2ggaGFuZGxlciBmb3IgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiAmJiB0b3VjaFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdlc3R1cmUucG9pbnRlcnMuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH07XG5cbiAgdG9nZ2xlTG9jayA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRMb2NrZWQ6ICFwcmV2U3RhdGUuZWxlbWVudExvY2tlZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IHByZXZTdGF0ZS5lbGVtZW50TG9ja2VkXG4gICAgICAgICAgPyBcInNlbGVjdGlvblwiXG4gICAgICAgICAgOiBwcmV2U3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRvZ2dsZVplbk1vZGUgPSAoKSA9PiB7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uVG9nZ2xlWmVuTW9kZSk7XG4gIH07XG5cbiAgdG9nZ2xlU3RhdHMgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLnNob3dTdGF0cykge1xuICAgICAgdHJhY2tFdmVudChcImRpYWxvZ1wiLCBcInN0YXRzXCIpO1xuICAgIH1cbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVTdGF0cyk7XG4gIH07XG5cbiAgc2Nyb2xsVG9Db250ZW50ID0gKFxuICAgIHRhcmdldDpcbiAgICAgIHwgRXhjYWxpZHJhd0VsZW1lbnRcbiAgICAgIHwgcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAuLi5jYWxjdWxhdGVTY3JvbGxDZW50ZXIoXG4gICAgICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICksXG4gICAgfSk7XG4gIH07XG5cbiAgem9vbVRvRml0ID0gKFxuICAgIHRhcmdldDogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICBtYXhab29tOiBudW1iZXIgPSAxLCAvL251bGwgd2lsbCB6b29tIHRvIG1heCBiYXNlZCBvbiB2aWV3cG9ydFxuICAgIG1hcmdpbjogbnVtYmVyID0gMC4wMywgLy9wZXJjZW50YWdlIG9mIHZpZXdwb3J0IHdpZHRoJmhlaWdodFxuICApID0+IHtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGFyZ2V0ID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWF4Wm9vbSA9IDE7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB6b29tVG9GaXRFbGVtZW50cyh0YXJnZXQsIHRoaXMuc3RhdGUsIGZhbHNlLCBtYXhab29tLCBtYXJnaW4pLmFwcFN0YXRlLFxuICAgICk7XG4gIH07XG5cbiAgY2xlYXJUb2FzdCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgdG9hc3RNZXNzYWdlOiBudWxsIH0pO1xuICB9O1xuXG4gIHNldFRvYXN0TWVzc2FnZSA9ICh0b2FzdE1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyB0b2FzdE1lc3NhZ2UgfSk7XG4gIH07XG5cbiAgcmVzdG9yZUZpbGVGcm9tU2hhcmUgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUgPSBhd2FpdCBjYWNoZXMub3BlbihcIndlYi1zaGFyZS10YXJnZXRcIik7XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB3ZWJTaGFyZVRhcmdldENhY2hlLm1hdGNoKFwic2hhcmVkLWZpbGVcIik7XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgZmlsZS5ibG9iKCk7XG4gICAgICAgIHRoaXMubG9hZEZpbGVUb0NhbnZhcyhibG9iKTtcbiAgICAgICAgYXdhaXQgd2ViU2hhcmVUYXJnZXRDYWNoZS5kZWxldGUoXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIEFQUF9OQU1FLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBhZGRzIHN1cHBsaWVkIGZpbGVzIHRvIGV4aXN0aW5nIGZpbGVzIGluIHRoZSBhcHBTdGF0ZSAqL1xuICBwdWJsaWMgYWRkRmlsZXM6IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJW1wiYWRkRmlsZXNcIl0gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGZpbGVzKSA9PiB7XG4gICAgICBjb25zdCBmaWxlc01hcCA9IGZpbGVzLnJlZHVjZSgoYWNjLCBmaWxlRGF0YSkgPT4ge1xuICAgICAgICBhY2Muc2V0KGZpbGVEYXRhLmlkLCBmaWxlRGF0YSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwPEZpbGVJZCwgQmluYXJ5RmlsZURhdGE+KCkpO1xuXG4gICAgICB0aGlzLmZpbGVzID0geyAuLi50aGlzLmZpbGVzLCAuLi5PYmplY3QuZnJvbUVudHJpZXMoZmlsZXNNYXApIH07XG5cbiAgICAgIC8vIGJ1bXAgdmVyc2lvbnMgZm9yIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIGFkZGVkIGZpbGVzIHNvIHRoYXRcbiAgICAgIC8vIHdlL2hvc3QgYXBwcyBjYW4gZGV0ZWN0IHRoZSBjaGFuZ2UsIGFuZCBpbnZhbGlkYXRlIHRoZSBpbWFnZSAmIHNoYXBlXG4gICAgICAvLyBjYWNoZVxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgICAgICBmaWxlc01hcC5oYXMoZWxlbWVudC5maWxlSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuaW1hZ2VDYWNoZS5kZWxldGUoZWxlbWVudC5maWxlSWQpO1xuICAgICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgYnVtcFZlcnNpb24oZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY2VuZS5pbmZvcm1NdXRhdGlvbigpO1xuXG4gICAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgIH0sXG4gICk7XG5cbiAgcHVibGljIHVwZGF0ZVNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIDxLIGV4dGVuZHMga2V5b2YgQXBwU3RhdGU+KHNjZW5lRGF0YToge1xuICAgICAgZWxlbWVudHM/OiBTY2VuZURhdGFbXCJlbGVtZW50c1wiXTtcbiAgICAgIGFwcFN0YXRlPzogUGljazxBcHBTdGF0ZSwgSz4gfCBudWxsO1xuICAgICAgY29sbGFib3JhdG9ycz86IFNjZW5lRGF0YVtcImNvbGxhYm9yYXRvcnNcIl07XG4gICAgICBjb21taXRUb0hpc3Rvcnk/OiBTY2VuZURhdGFbXCJjb21taXRUb0hpc3RvcnlcIl07XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKHNjZW5lRGF0YS5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NlbmVEYXRhLmFwcFN0YXRlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoc2NlbmVEYXRhLmFwcFN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjZW5lRGF0YS5lbGVtZW50cykge1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhzY2VuZURhdGEuZWxlbWVudHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnMpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGNvbGxhYm9yYXRvcnM6IHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBvblNjZW5lVXBkYXRlZCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHt9KTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbiA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGN1cnNvclggPSBldmVudC5jbGllbnRYO1xuICAgICAgY3Vyc29yWSA9IGV2ZW50LmNsaWVudFk7XG4gICAgfSxcbiAgKTtcblxuICAvLyBJbnB1dCBoYW5kbGluZ1xuXG4gIHByaXZhdGUgb25LZXlEb3duID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChldmVudDogUmVhY3QuS2V5Ym9hcmRFdmVudCB8IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIC8vIG5vcm1hbGl6ZSBgZXZlbnQua2V5YCB3aGVuIENhcHNMb2NrIGlzIHByZXNzZWQgIzIzNzJcbiAgICAgIGlmIChcbiAgICAgICAgXCJQcm94eVwiIGluIHdpbmRvdyAmJlxuICAgICAgICAoKCFldmVudC5zaGlmdEtleSAmJiAvXltBLVpdJC8udGVzdChldmVudC5rZXkpKSB8fFxuICAgICAgICAgIChldmVudC5zaGlmdEtleSAmJiAvXlthLXpdJC8udGVzdChldmVudC5rZXkpKSlcbiAgICAgICkge1xuICAgICAgICBldmVudCA9IG5ldyBQcm94eShldmVudCwge1xuICAgICAgICAgIGdldChldjogYW55LCBwcm9wKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2W3Byb3BdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIC8vIGZpeCBmb3IgUHJveGllcyBoaWphY2tpbmcgYHRoaXNgXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9wID09PSBcImtleVwiXG4gICAgICAgICAgICAgID8gLy8gQ2Fwc0xvY2sgaW52ZXJ0cyBjYXBpdGFsaXphdGlvbiBiYXNlZCBvbiBTaGlmdEtleSwgc28gaW52ZXJ0XG4gICAgICAgICAgICAgICAgLy8gaXQgYmFja1xuICAgICAgICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgICAgICAgPyBldi5rZXkudG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgICAgIDogZXYua2V5LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAoaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJiBldmVudC5rZXkgIT09IEtFWVMuRVNDQVBFKSB8fFxuICAgICAgICAvLyBjYXNlOiB1c2luZyBhcnJvd3MgdG8gbW92ZSBiZXR3ZWVuIGJ1dHRvbnNcbiAgICAgICAgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSAmJiBpc0lucHV0TGlrZShldmVudC50YXJnZXQpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RVUVTVElPTl9NQVJLKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNob3dIZWxwRGlhbG9nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYWN0aW9uTWFuYWdlci5oYW5kbGVLZXlEb3duKGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiB0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzQmluZGluZ0VuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuY29kZSA9PT0gQ09ERVMuWkVSTykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogIXRoaXMuc3RhdGUuaXNMaWJyYXJ5T3BlbiB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgICBjb25zdCBzdGVwID1cbiAgICAgICAgICAodGhpcy5zdGF0ZS5ncmlkU2l6ZSAmJlxuICAgICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgICAgID8gRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UXG4gICAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5ncmlkU2l6ZSkpIHx8XG4gICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgICA/IEVMRU1FTlRfU0hJRlRfVFJBTlNMQVRFX0FNT1VOVFxuICAgICAgICAgICAgOiBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLnNjZW5lXG4gICAgICAgICAgLmdldEVsZW1lbnRzKClcbiAgICAgICAgICAuZmlsdGVyKChlbGVtZW50KSA9PiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSk7XG5cbiAgICAgICAgbGV0IG9mZnNldFggPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19MRUZUKSB7XG4gICAgICAgICAgb2Zmc2V0WCA9IC1zdGVwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19SSUdIVCkge1xuICAgICAgICAgIG9mZnNldFggPSBzdGVwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19VUCkge1xuICAgICAgICAgIG9mZnNldFkgPSAtc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfRE9XTikge1xuICAgICAgICAgIG9mZnNldFkgPSBzdGVwO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgICB4OiBlbGVtZW50LnggKyBvZmZzZXRYLFxuICAgICAgICAgICAgeTogZWxlbWVudC55ICsgb2Zmc2V0WSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCwge1xuICAgICAgICAgICAgc2ltdWx0YW5lb3VzbHlVcGRhdGVkOiBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgIT09IHNlbGVjdGVkRWxlbWVudHNbMF0uaWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3IoXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgIWlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgICAgIHRoaXMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICAgICAgICBzY2VuZVg6IHNlbGVjdGVkRWxlbWVudC54ICsgc2VsZWN0ZWRFbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICAgIHNjZW5lWTogc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWV2ZW50LmN0cmxLZXkgJiZcbiAgICAgICAgIWV2ZW50LmFsdEtleSAmJlxuICAgICAgICAhZXZlbnQubWV0YUtleSAmJlxuICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCA9PT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gZmluZFNoYXBlQnlLZXkoZXZlbnQua2V5KTtcbiAgICAgICAgaWYgKHNoYXBlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RTaGFwZVRvb2woc2hhcGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVMb2NrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UgJiYgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAwKSB7XG4gICAgICAgIGlzSG9sZGluZ1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCQklORyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuRyB8fCBldmVudC5rZXkgPT09IEtFWVMuUykge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgICAgICAhc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5HICYmXG4gICAgICAgICAgKGhhc0JhY2tncm91bmQodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSkgfHxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzQmFja2dyb3VuZChlbGVtZW50LnR5cGUpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5Qb3B1cDogXCJiYWNrZ3JvdW5kQ29sb3JQaWNrZXJcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlblBvcHVwOiBcInN0cm9rZUNvbG9yUGlja2VyXCIgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICApO1xuXG4gIHByaXZhdGUgb25LZXlVcCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlNQQUNFKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5HUkFCKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaXNIb2xkaW5nU3BhY2UgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAhdGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZSB9KTtcbiAgICB9XG4gICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpXG4gICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKVxuICAgICAgICA6IHVuYmluZExpbmVhckVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByaXZhdGUgc2VsZWN0U2hhcGVUb29sKGVsZW1lbnRUeXBlOiBBcHBTdGF0ZVtcImVsZW1lbnRUeXBlXCJdKSB7XG4gICAgaWYgKCFpc0hvbGRpbmdTcGFjZSkge1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIGVsZW1lbnRUeXBlKTtcbiAgICB9XG4gICAgaWYgKGlzVG9vbEljb24oZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG4gICAgaWYgKCFpc0xpbmVhckVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIHRoaXMub25JbWFnZUFjdGlvbigpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlbGVtZW50VHlwZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uR2VzdHVyZVN0YXJ0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgfSk7XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gIH0pO1xuXG4gIHByaXZhdGUgb25HZXN0dXJlQ2hhbmdlID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIG9uR2VzdHVyZUNoYW5nZSBvbmx5IGhhcyB6b29tIGZhY3RvciBidXQgbm90IHRoZSBjZW50ZXIuXG4gICAgLy8gSWYgd2UncmUgb24gaVBhZCBvciBpUGhvbmUsIHRoZW4gd2UgcmVjb2duaXplIG11bHRpLXRvdWNoIGFuZCB3aWxsXG4gICAgLy8gem9vbSBpbiBhdCB0aGUgcmlnaHQgbG9jYXRpb24gb24gdGhlIHRvdWNoTW92ZSBoYW5kbGVyIGFscmVhZHkuXG4gICAgLy8gT24gTWFjYm9vaywgd2UgZG9uJ3QgaGF2ZSB0aG9zZSBldmVudHMgc28gd2lsbCB6b29tIGluIGF0IHRoZVxuICAgIC8vIGN1cnJlbnQgbG9jYXRpb24gaW5zdGVhZC5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSkgPT4gKHtcbiAgICAgICAgem9vbTogZ2V0TmV3Wm9vbShcbiAgICAgICAgICBnZXROb3JtYWxpemVkWm9vbShpbml0aWFsU2NhbGUgKiBldmVudC5zY2FsZSksXG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICB7IGxlZnQ6IG9mZnNldExlZnQsIHRvcDogb2Zmc2V0VG9wIH0sXG4gICAgICAgICAgeyB4OiBjdXJzb3JYLCB5OiBjdXJzb3JZIH0sXG4gICAgICAgICksXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIG9uR2VzdHVyZUVuZCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgfSk7XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICB9KTtcblxuICBwcml2YXRlIGhhbmRsZVRleHRXeXNpd3lnKFxuICAgIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgICB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gKFxuICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgcmF3VGV4dD86IHN0cmluZyxcbiAgICAgIGlzRGVsZXRlZCA9IGZhbHNlLFxuICAgICkgPT4ge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoX2VsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICByYXdUZXh0OiByYXdUZXh0ID8gcmF3VGV4dCA6IHRleHQsXG4gICAgICAgICAgICAgIGlzRGVsZXRlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfTtcblxuICAgIGlmIChpc0V4aXN0aW5nRWxlbWVudCAmJiB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dEVkaXQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dEVkaXQoZWxlbWVudCk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoKF9lbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHVwZGF0ZVRleHRFbGVtZW50KF9lbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBpc0RlbGV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICAgICAgfSksXG4gICAgICAgIF0pO1xuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRleHRXeXNpd3lnKHtcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4LCB5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeDogdmlld3BvcnRYLCB5OiB2aWV3cG9ydFkgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY2VuZVg6IHgsXG4gICAgICAgICAgICBzY2VuZVk6IHksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHZpZXdwb3J0WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgICB2aWV3cG9ydFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogd2l0aEJhdGNoZWRVcGRhdGVzKCh0ZXh0KSA9PiB7XG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCk7XG4gICAgICAgIGlmIChpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBvblN1Ym1pdDogd2l0aEJhdGNoZWRVcGRhdGVzKCh7IHRleHQsIHZpYUtleWJvYXJkIH0pID0+IHtcbiAgICAgICAgY29uc3QgaXNEZWxldGVkID0gIXRleHQudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdUZXh0ID0gdGV4dDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25CZWZvcmVUZXh0U3VibWl0KSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZFRleHQgPSB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdChcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgaXNEZWxldGVkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGV4dCA9IHVwZGF0ZWRUZXh0ID8/IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0LCByYXdUZXh0LCBpc0RlbGV0ZWQpO1xuICAgICAgICAvLyBzZWxlY3QgdGhlIGNyZWF0ZWQgdGV4dCBlbGVtZW50IG9ubHkgaWYgc3VibWl0dGluZyB2aWEga2V5Ym9hcmRcbiAgICAgICAgLy8gKHdoZW4gc3VibWl0dGluZyB2aWEgY2xpY2sgaXQgc2hvdWxkIGFjdCBhcyBzaWduYWwgdG8gZGVzZWxlY3QpXG4gICAgICAgIGlmICghaXNEZWxldGVkICYmIHZpYUtleWJvYXJkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlbGV0ZWQpIHtcbiAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRGVsZXRpb24odGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCBbZWxlbWVudF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEZWxldGVkIHx8IGlzRXhpc3RpbmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudExvY2tlZCkge1xuICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICAgIH0pLFxuICAgICAgZWxlbWVudCxcbiAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgIH0pO1xuICAgIC8vIGRlc2VsZWN0IGFsbCBvdGhlciBlbGVtZW50cyB3aGVuIGluc2VydGluZyB0ZXh0XG4gICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG5cbiAgICAvLyBkbyBhbiBpbml0aWFsIHVwZGF0ZSB0byByZS1pbml0aWFsaXplIGVsZW1lbnQgcG9zaXRpb24gc2luY2Ugd2Ugd2VyZVxuICAgIC8vIG1vZGlmeWluZyBlbGVtZW50J3MgeC95IGZvciBzYWtlIG9mIGVkaXRvciAoY2FzZTogc3luY2luZyB0byByZW1vdGUpXG4gICAgdXBkYXRlRWxlbWVudChlbGVtZW50LnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gfCBudWxsIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0cz86IHtcbiAgICAgIC8qKiBpZiB0cnVlLCByZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50ICh3aXRoIGhpZ2hlc3Qgei1pbmRleClcbiAgICAgICAgb2YgYWxsIGhpdCBlbGVtZW50cyAqL1xuICAgICAgcHJlZmVyU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbCB7XG4gICAgY29uc3QgYWxsSGl0RWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQXRQb3NpdGlvbih4LCB5KTtcbiAgICBpZiAoYWxsSGl0RWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKG9wdHM/LnByZWZlclNlbGVjdGVkKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMTsgaW5kZXggPiAtMTsgaW5kZXgtLSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1thbGxIaXRFbGVtZW50c1tpbmRleF0uaWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsSGl0RWxlbWVudHNbaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID1cbiAgICAgICAgYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBJZiB3ZSdyZSBoaXR0aW5nIGVsZW1lbnQgd2l0aCBoaWdoZXN0IHotaW5kZXggb25seSBvbiBpdHMgYm91bmRpbmcgYm94XG4gICAgICAvLyB3aGlsZSBhbHNvIGhpdHRpbmcgb3RoZXIgZWxlbWVudCBmaWd1cmUsIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICByZXR1cm4gaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICApXG4gICAgICAgID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1swXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRzQXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdIHtcbiAgICByZXR1cm4gZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgKGVsZW1lbnQpID0+XG4gICAgICBoaXRUZXN0KGVsZW1lbnQsIHRoaXMuc3RhdGUsIHgsIHkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGV4dEVkaXRpbmcgPSAoe1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVksXG4gICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgPSB0cnVlLFxuICB9OiB7XG4gICAgLyoqIFggcG9zaXRpb24gdG8gaW5zZXJ0IHRleHQgYXQgKi9cbiAgICBzY2VuZVg6IG51bWJlcjtcbiAgICAvKiogWSBwb3NpdGlvbiB0byBpbnNlcnQgdGV4dCBhdCAqL1xuICAgIHNjZW5lWTogbnVtYmVyO1xuICAgIC8qKiB3aGV0aGVyIHRvIGF0dGVtcHQgdG8gaW5zZXJ0IGF0IGVsZW1lbnQgY2VudGVyIGlmIGFwcGxpY2FibGUgKi9cbiAgICBpbnNlcnRBdFBhcmVudENlbnRlcj86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICBjb25zdCBleGlzdGluZ1RleHRFbGVtZW50ID0gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgY29uc3QgcGFyZW50Q2VudGVyUG9zaXRpb24gPVxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgJiZcbiAgICAgIHRoaXMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZXhpc3RpbmdUZXh0RWxlbWVudFxuICAgICAgPyBleGlzdGluZ1RleHRFbGVtZW50XG4gICAgICA6IG5ld1RleHRFbGVtZW50KHtcbiAgICAgICAgICB4OiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWFxuICAgICAgICAgICAgOiBzY2VuZVgsXG4gICAgICAgICAgeTogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlcllcbiAgICAgICAgICAgIDogc2NlbmVZLFxuICAgICAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgIHJhd1RleHQ6IFwiXCIsXG4gICAgICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgICAgICB0ZXh0QWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IFwiY2VudGVyXCJcbiAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBcIm1pZGRsZVwiXG4gICAgICAgICAgICA6IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmdFbGVtZW50OiBlbGVtZW50IH0pO1xuXG4gICAgaWYgKGV4aXN0aW5nVGV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIGlmIHRleHQgZWxlbWVudCBpcyBubyBsb25nZXIgY2VudGVyZWQgdG8gYSBjb250YWluZXIsIHJlc2V0XG4gICAgICAvLyB2ZXJ0aWNhbEFsaWduIHRvIGRlZmF1bHQgYmVjYXVzZSBpdCdzIGN1cnJlbnRseSBpbnRlcm5hbC1vbmx5XG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uIHx8IGVsZW1lbnQudGV4dEFsaWduICE9PSBcImNlbnRlclwiKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgeyB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcblxuICAgICAgLy8gY2FzZTogY3JlYXRpbmcgbmV3IHRleHQgbm90IGNlbnRlcmVkIHRvIHBhcmVudCBlbGVtZW5lbnQg4oaSIG9mZnNldCBZXG4gICAgICAvLyBzbyB0aGF0IHRoZSB0ZXh0IGlzIGNlbnRlcmVkIHRvIGN1cnNvciBwb3NpdGlvblxuICAgICAgaWYgKCFwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB5OiBlbGVtZW50LnkgLSBlbGVtZW50LmJhc2VsaW5lIC8gMixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICB9KTtcblxuICAgIHRoaXMuaGFuZGxlVGV4dFd5c2l3eWcoZWxlbWVudCwge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQ6ICEhZXhpc3RpbmdUZXh0RWxlbWVudCxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgLy8gY2FzZTogZG91YmxlLWNsaWNraW5nIHdpdGggYXJyb3cvbGluZSB0b29sIHNlbGVjdGVkIHdvdWxkIGJvdGggY3JlYXRlXG4gICAgLy8gdGV4dCBhbmQgZW50ZXIgbXVsdGlFbGVtZW50IG1vZGVcbiAgICBpZiAodGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gd2Ugc2hvdWxkIG9ubHkgYmUgYWJsZSB0byBkb3VibGUgY2xpY2sgd2hlbiBtb2RlIGlzIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3IoXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG5cbiAgICBjb25zdCB7IHg6IHNjZW5lWCwgeTogc2NlbmVZIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICBldmVudCxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZHMgPSBnZXRTZWxlY3RlZEdyb3VwSWRzKHRoaXMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEdyb3VwSWQgPVxuICAgICAgICBoaXRFbGVtZW50ICYmXG4gICAgICAgIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQoaGl0RWxlbWVudCwgdGhpcy5zdGF0ZS5zZWxlY3RlZEdyb3VwSWRzKTtcblxuICAgICAgaWYgKHNlbGVjdGVkR3JvdXBJZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogc2VsZWN0ZWRHcm91cElkLFxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2hpdEVsZW1lbnQhLmlkXTogdHJ1ZSB9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyOiAhZXZlbnQuYWx0S2V5LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5zdGF0ZS5jdXJzb3JCdXR0b24pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2V0KGV2ZW50LnBvaW50ZXJJZCwge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG4gICAgaWYgKFxuICAgICAgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyICYmXG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgJiZcbiAgICAgIGluaXRpYWxTY2FsZSAmJlxuICAgICAgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2VcbiAgICApIHtcbiAgICAgIGNvbnN0IGNlbnRlciA9IGdldENlbnRlcihnZXN0dXJlLnBvaW50ZXJzKTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGNlbnRlci54IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLng7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjZW50ZXIueSAtIGdlc3R1cmUubGFzdENlbnRlci55O1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gY2VudGVyO1xuXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGdldERpc3RhbmNlKEFycmF5LmZyb20oZ2VzdHVyZS5wb2ludGVycy52YWx1ZXMoKSkpO1xuICAgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBkaXN0YW5jZSAvIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFksIG9mZnNldExlZnQsIG9mZnNldFRvcCB9KSA9PiAoe1xuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYICsgZGVsdGFYIC8gem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogc2Nyb2xsWSArIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgICAgIHpvb206IGdldE5ld1pvb20oXG4gICAgICAgICAgZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogc2NhbGVGYWN0b3IpLFxuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgeyBsZWZ0OiBvZmZzZXRMZWZ0LCB0b3A6IG9mZnNldFRvcCB9LFxuICAgICAgICAgIGNlbnRlcixcbiAgICAgICAgKSxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaXNIb2xkaW5nU3BhY2UgfHwgaXNQYW5uaW5nIHx8IGlzRHJhZ2dpbmdTY3JvbGxCYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycyA9IGlzT3ZlclNjcm9sbEJhcnMoXG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICBldmVudC5jbGllbnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgeyB4OiBzY2VuZVBvaW50ZXJYLCB5OiBzY2VuZVBvaW50ZXJZIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nXG4gICAgKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZWRpdGluZ0xpbmVhckVsZW1lbnQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSkpIHtcbiAgICAgIC8vIEhvdmVyaW5nIHdpdGggYSBzZWxlY3RlZCB0b29sIG9yIGNyZWF0aW5nIG5ldyBsaW5lYXIgZWxlbWVudCB2aWEgY2xpY2tcbiAgICAgIC8vIGFuZCBwb2ludFxuICAgICAgY29uc3QgeyBkcmFnZ2luZ0VsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckxpbmVhckVsZW1lbnRBdEN1cnNvcihcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgXCJlbmRcIixcbiAgICAgICAgICBzY2VuZVBvaW50ZXIsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHsgeDogcngsIHk6IHJ5IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IHsgcG9pbnRzLCBsYXN0Q29tbWl0dGVkUG9pbnQgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcblxuICAgICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdENvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgeWV0IGNyZWF0ZWQgYSB0ZW1wIHBvaW50IGFuZCB3ZSdyZSBiZXlvbmQgY29tbWl0LXpvbmVcbiAgICAgICAgLy8gdGhyZXNob2xkLCBhZGQgYSBwb2ludFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICAgIGxhc3RQb2ludFswXSxcbiAgICAgICAgICAgIGxhc3RQb2ludFsxXSxcbiAgICAgICAgICApID49IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgICAvLyBpbiB0aGlzIGJyYW5jaCwgd2UncmUgaW5zaWRlIHRoZSBjb21taXQgem9uZSwgYW5kIG5vIHVuY29tbWl0dGVkXG4gICAgICAgICAgLy8gcG9pbnQgZXhpc3RzLiBUaHVzIGRvIG5vdGhpbmcgKGRvbid0IGFkZC9yZW1vdmUgcG9pbnRzKS5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcG9pbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50ICYmXG4gICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgc2NlbmVQb2ludGVyWCAtIHJ4LFxuICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzFdLFxuICAgICAgICApIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRFxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBwb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChwb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBsYXN0IHVuY29tbWl0dGVkIHBvaW50XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAuLi5wb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRCdXR0b24gPSBCb29sZWFuKGV2ZW50LmJ1dHRvbnMpO1xuICAgIGlmIChcbiAgICAgIGhhc0Rlc2VsZWN0ZWRCdXR0b24gfHxcbiAgICAgICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwidGV4dFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaXNPdmVyU2Nyb2xsQmFyICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJlxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgaXNUZXh0RWxlbWVudChoaXRFbGVtZW50KSA/IENVUlNPUl9UWVBFLlRFWFQgOiBDVVJTT1JfVFlQRS5DUk9TU0hBSVIsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgfSBlbHNlIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGlmIHVzaW5nIGNtZC9jdHJsLCB3ZSdyZSBub3QgZHJhZ2dpbmdcbiAgICAgICFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJlxuICAgICAgKGhpdEVsZW1lbnQgfHxcbiAgICAgICAgdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICBzY2VuZVBvaW50ZXIsXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHNldCB0b3VjaCBtb3ZpbmcgZm9yIG1vYmlsZSBjb250ZXh0IG1lbnVcbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFJlYWN0LlRvdWNoRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+KSA9PiB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyhldmVudCk7XG4gICAgdGhpcy5tYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiLFxuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9ubHkgaGFuZGxlIGxlZnQgbW91c2UgYnV0dG9uIG9yIHRvdWNoXG4gICAgaWYgKFxuICAgICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmXG4gICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7XG5cbiAgICAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSB0aGlzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlVGV4dE9uUG9pbnRlckRvd24oZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImFycm93XCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duKFxuICAgICAgICBldmVudCxcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIC8vIHJlc2V0IGltYWdlIHByZXZpZXcgb24gcG9pbnRlcmRvd25cbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcblxuICAgICAgaWYgKCF0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgICBtdXRhdGVFbGVtZW50KHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUdlbmVyaWNFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHRoaXMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IHRoaXMub25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gdGhpcy5vbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIGNvbnN0IG9uS2V5VXAgPSB0aGlzLm9uS2V5VXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgbGFzdFBvaW50ZXJVcCA9IG9uUG9pbnRlclVwO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIG9uS2V5RG93bik7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgb25LZXlVcCk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSA9IG9uUG9pbnRlck1vdmU7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uVXAgPSBvblBvaW50ZXJVcDtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCA9IG9uS2V5VXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5RG93biA9IG9uS2V5RG93bjtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgICAgICBpZiAoIWludmFsaWRhdGVDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBUT1VDSF9DVFhfTUVOVV9USU1FT1VUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQge1xuICAgIGlmIChsYXN0UG9pbnRlclVwICE9PSBudWxsKSB7XG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzb21ldGltZXMgd2UgZG9uJ3QgZ2V0IGEgcG9pbnRlcnVwIGFmdGVyIGEgcG9pbnRlcmRvd24sXG4gICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbnRleHR1YWwgbWVudSBvciBhbGVydCBpcyB0cmlnZ2VyZWQuIEluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAvLyBiZWluZyBpbiBhIHdlaXJkIHN0YXRlLCB3ZSBjbGVhbiB1cCBvbiB0aGUgbmV4dCBwb2ludGVyZG93blxuICAgICAgbGFzdFBvaW50ZXJVcChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIHBhbm5pbmdcbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCAmJlxuICAgICAgICAoZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5XSEVFTCB8fFxuICAgICAgICAgIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgaXNIb2xkaW5nU3BhY2UpIHx8XG4gICAgICAgICAgdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzUGFubmluZyA9IHRydWU7XG5cbiAgICBsZXQgbmV4dFBhc3RlUHJldmVudGVkID0gZmFsc2U7XG4gICAgY29uc3QgaXNMaW51eCA9IC9MaW51eC8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtKTtcblxuICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgIGxldCB7IGNsaWVudFg6IGxhc3RYLCBjbGllbnRZOiBsYXN0WSB9ID0gZXZlbnQ7XG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gbGFzdFggLSBldmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gbGFzdFkgLSBldmVudC5jbGllbnRZO1xuICAgICAgbGFzdFggPSBldmVudC5jbGllbnRYO1xuICAgICAgbGFzdFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvKlxuICAgICAgICogUHJldmVudCBwYXN0ZSBldmVudCBpZiB3ZSBtb3ZlIHdoaWxlIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eC5cbiAgICAgICAqIFNlZSBpc3N1ZSAjMTM4My5cbiAgICAgICAqL1xuICAgICAgaWYgKFxuICAgICAgICBpc0xpbnV4ICYmXG4gICAgICAgICFuZXh0UGFzdGVQcmV2ZW50ZWQgJiZcbiAgICAgICAgKE1hdGguYWJzKGRlbHRhWCkgPiAxIHx8IE1hdGguYWJzKGRlbHRhWSkgPiAxKVxuICAgICAgKSB7XG4gICAgICAgIG5leHRQYXN0ZVByZXZlbnRlZCA9IHRydWU7XG5cbiAgICAgICAgLyogUHJldmVudCB0aGUgbmV4dCBwYXN0ZSBldmVudCAqL1xuICAgICAgICBjb25zdCBwcmV2ZW50TmV4dFBhc3RlID0gKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLypcbiAgICAgICAgICogUmVlbmFibGUgbmV4dCBwYXN0ZSBpbiBjYXNlIG9mIGRpc2FibGVkIG1pZGRsZSBjbGljayBwYXN0ZSBmb3JcbiAgICAgICAgICogYW55IHJlYXNvbjpcbiAgICAgICAgICogLSByaWd0aCBjbGljayBwYXN0ZVxuICAgICAgICAgKiAtIGVtcHR5IGNsaXBib2FyZFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZW5hYmxlTmV4dFBhc3RlID0gKCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYIC0gZGVsdGFYIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkZWx0YVkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0ZWFyZG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAgIChsYXN0UG9pbnRlclVwID0gKCkgPT4ge1xuICAgICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwidXBcIik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGVhcmRvd24pO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgICAgICBBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxQb2ludGVyRG93blN0YXRlKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBQb2ludGVyRG93blN0YXRlIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKFxuICAgICAgICBnZXRHcmlkUG9pbnQob3JpZ2luLngsIG9yaWdpbi55LCB0aGlzLnN0YXRlLmdyaWRTaXplKSxcbiAgICAgICksXG4gICAgICBzY3JvbGxiYXJzOiBpc092ZXJTY3JvbGxCYXJzKFxuICAgICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgICAgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gZHVwbGljYXRlIGJlY2F1c2Ugd2UnbGwgYmUgdXBkYXRpbmcgdGhpcyBzdGF0ZVxuICAgICAgbGFzdENvb3JkczogeyAuLi5vcmlnaW4gfSxcbiAgICAgIG9yaWdpbmFsRWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwKCkgYXMgUG9pbnRlckRvd25TdGF0ZVtcIm9yaWdpbmFsRWxlbWVudHNcIl0pLFxuICAgICAgcmVzaXplOiB7XG4gICAgICAgIGhhbmRsZVR5cGU6IGZhbHNlLFxuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIsXG4gICAgICAgIGNlbnRlcjogeyB4OiAobWF4WCArIG1pblgpIC8gMiwgeTogKG1heFkgKyBtaW5ZKSAvIDIgfSxcbiAgICAgIH0sXG4gICAgICBoaXQ6IHtcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgYWxsSGl0RWxlbWVudHM6IFtdLFxuICAgICAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzQmVlbkR1cGxpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czogdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBkcmFnOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIShwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyRWl0aGVyICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgfSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIGV2ZW50IGhhcyBiZWVuIGNvbXBsZXRlbHkgaGFuZGxlZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLnN0YXRlKTtcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nRWxlbWVudDogZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLmVsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9XG4gICAgICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKFxuICAgICAgICAgIGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldFJlc2l6ZU9mZnNldFhZKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgJiZcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLnBvaW50cy5sZW5ndGggPT09IDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24gPSBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbihcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIChhcHBTdGF0ZSkgPT4gdGhpcy5zZXRTdGF0ZShhcHBTdGF0ZSksXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXQuaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHJldC5oaXRFbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoaXRFbGVtZW50IG1heSBhbHJlYWR5IGJlIHNldCBhYm92ZSwgc28gY2hlY2sgZmlyc3RcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA/P1xuICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIEZvciBvdmVybGFwcGVkIGVsZW1lbnRzIG9uZSBwb3NpdGlvbiBtYXkgaGl0XG4gICAgICAgIC8vIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgICBjb25zdCBzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKFxuICAgICAgICAgIChlbGVtZW50KSA9PiB0aGlzLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChoaXRFbGVtZW50ID09PSBudWxsIHx8ICFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQpICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBjbGljayBvbiBzb21ldGhpbmdcbiAgICAgICAgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudChwcmV2U3RhdGUsIGhpdEVsZW1lbnQpLFxuICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgICAgICAgICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHByaXZhdGUgaXNBU2VsZWN0ZWRFbGVtZW50KGhpdEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoaXRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF07XG4gIH1cblxuICBwcml2YXRlIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgIHBvaW50OiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+LFxuICAgIHNlbGVjdGVkRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBIb3cgbWFueSBwaXhlbHMgb2ZmIHRoZSBzaGFwZSBib3VuZGFyeSB3ZSBzdGlsbCBjb25zaWRlciBhIGhpdFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBvaW50LnggPiB4MSAtIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueCA8IHgyICsgdGhyZXNob2xkICYmXG4gICAgICBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnkgPCB5MiArIHRocmVzaG9sZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBzdGlsbCBlZGl0aW5nIHRleHQsIGNsaWNraW5nIG91dHNpZGVcbiAgICAvLyBzaG91bGQgb25seSBmaW5hbGl6ZSBpdCwgbm90IGNyZWF0ZSBhbm90aGVyIChpcnJlc3BlY3RpdmVcbiAgICAvLyBvZiBzdGF0ZS5lbGVtZW50TG9ja2VkKVxuICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py50eXBlID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICBzY2VuZVg6IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBzY2VuZVk6IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICB9KTtcblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZWxlbWVudExvY2tlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKSA9PiB7XG4gICAgLy8gQmVnaW4gYSBtYXJrIGNhcHR1cmUuIFRoaXMgZG9lcyBub3QgaGF2ZSB0byB1cGRhdGUgc3RhdGUgeWV0LlxuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICBudWxsLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RnJlZURyYXdFbGVtZW50KHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgc2ltdWxhdGVQcmVzc3VyZTogZXZlbnQucHJlc3N1cmUgPT09IDAuNSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBwcmVzc3VyZXMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgID8gZWxlbWVudC5wcmVzc3VyZXNcbiAgICAgIDogWy4uLmVsZW1lbnQucHJlc3N1cmVzLCBldmVudC5wcmVzc3VyZV07XG5cbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHBvaW50czogW1swLCAwXV0sXG4gICAgICBwcmVzc3VyZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBib3VuZEVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgIHRoaXMuc2NlbmUsXG4gICAgKTtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGNyZWF0ZUltYWdlRWxlbWVudCA9ICh7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWSxcbiAgfToge1xuICAgIHNjZW5lWDogbnVtYmVyO1xuICAgIHNjZW5lWTogbnVtYmVyO1xuICB9KSA9PiB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoc2NlbmVYLCBzY2VuZVksIHRoaXMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ltYWdlRWxlbWVudCh7XG4gICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3MsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgLy8gZmluYWxpemUgaWYgY29tcGxldGluZyBhIGxvb3BcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmXG4gICAgICAgIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDpcbiAgICAgICAgICAgIG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSwgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIC8vIGNsaWNraW5nIGluc2lkZSBjb21taXQgem9uZSDihpIgZmluYWxpemUgYXJyb3dcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSByeCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFttdWx0aUVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgLy8gY2xpY2tpbmcgb3V0c2lkZSBjb21taXQgem9uZSDihpIgdXBkYXRlIHJlZmVyZW5jZSBmb3IgbGFzdCBjb21taXR0ZWRcbiAgICAgIC8vIHBvaW50XG4gICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgIH0pO1xuICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvKiBJZiBhcnJvdyBpcyBwcmUtYXJyb3doZWFkcywgaXQgd2lsbCBoYXZlIHVuZGVmaW5lZCBmb3IgYm90aCBzdGFydCBhbmQgZW5kIGFycm93aGVhZHMuXG4gICAgICBJZiBzbywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBzdGFydCBhbmQgXCJhcnJvd1wiIGZvciBlbmQuIElmIHRoZSBsaW5lYXIgaXRlbSBpcyBub3RcbiAgICAgIGFuIGFycm93LCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIGJvdGguIE90aGVyd2lzZSwgd2Ugd2FudCBpdCB0byB1c2UgdGhlXG4gICAgICB2YWx1ZXMgZnJvbSBhcHBTdGF0ZS4gKi9cblxuICAgICAgY29uc3QgeyBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IFtzdGFydEFycm93aGVhZCwgZW5kQXJyb3doZWFkXSA9XG4gICAgICAgIGVsZW1lbnRUeXBlID09PSBcImFycm93XCJcbiAgICAgICAgICA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF1cbiAgICAgICAgICA6IFtudWxsLCBudWxsXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgeDogZ3JpZFgsXG4gICAgICAgIHk6IGdyaWRZLFxuICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICBwb2ludHM6IFsuLi5lbGVtZW50LnBvaW50cywgWzAsIDBdXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uS2V5VXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIC8vIFByZXZlbnRzIGZvY3VzIGZyb20gZXNjYXBpbmcgZXhjYWxpZHJhdyB0YWJcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5BTFQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmICh0aGlzLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldERyYWdPZmZzZXRYWShcbiAgICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvLyBmb3IgYXJyb3dzL2xpbmVzLCBkb24ndCBzdGFydCBkcmFnZ2luZyB1bnRpbCBhIGdpdmVuIHRocmVzaG9sZFxuICAgICAgLy8gdG8gZW5zdXJlIHdlIGRvbid0IGNyZWF0ZSBhIDItcG9pbnQgYXJyb3cgYnkgbWlzdGFrZSB3aGVuXG4gICAgICAvLyB1c2VyIGNsaWNrcyBtb3VzZSBpbiBhIHdheSB0aGF0IGl0IG1vdmVzIGEgdGlueSBiaXQgKHRodXNcbiAgICAgIC8vIHRyaWdnZXJpbmcgcG9pbnRlcm1vdmUpXG4gICAgICBpZiAoXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSA8IERSQUdHSU5HX1RIUkVTSE9MRFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBkaWREcmFnID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludERyYWdnaW5nKFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgKGFwcFN0YXRlKSA9PiB0aGlzLnNldFN0YXRlKGFwcFN0YXRlKSxcbiAgICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICAgIChlbGVtZW50LCBzdGFydE9yRW5kKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHN0YXJ0T3JFbmQsXG4gICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRpZERyYWcpIHtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzSGl0QVNlbGVjdGVkRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzLnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PiB0aGlzLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgKSB7XG4gICAgICAgIC8vIE1hcmtpbmcgdGhhdCBjbGljayB3YXMgdXNlZCBmb3IgZHJhZ2dpbmcgdG8gY2hlY2tcbiAgICAgICAgLy8gaWYgZWxlbWVudHMgc2hvdWxkIGJlIGRlc2VsZWN0ZWQgb24gcG9pbnRlcnVwXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICAvLyBwcmV2ZW50IGRyYWdnaW5nIGV2ZW4gaWYgd2UncmUgbm8gbG9uZ2VyIGhvbGRpbmcgY21kL2N0cmwgb3RoZXJ3aXNlXG4gICAgICAgIC8vIGl0IHdvdWxkIGhhdmUgd2VpcmQgcmVzdWx0cyAoc3R1ZmYganVtcGluZyBhbGwgb3ZlciB0aGUgc2NyZWVuKVxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmICFwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwpIHtcbiAgICAgICAgICBjb25zdCBbZHJhZ1gsIGRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCxcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IFtkcmFnRGlzdGFuY2VYLCBkcmFnRGlzdGFuY2VZXSA9IFtcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngpLFxuICAgICAgICAgICAgTWF0aC5hYnMocG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSksXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIFdlIG9ubHkgZHJhZyBpbiBvbmUgZGlyZWN0aW9uIGlmIHNoaWZ0IGlzIHByZXNzZWRcbiAgICAgICAgICBjb25zdCBsb2NrRGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICAgICAgICBkcmFnU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgZHJhZ1gsXG4gICAgICAgICAgICBkcmFnWSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICBsb2NrRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHJhZ0Rpc3RhbmNlWCxcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgICAgICAvLyBXZSBkdXBsaWNhdGUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaWYgYWx0IGlzIHByZXNzZWQgb24gcG9pbnRlciBtb3ZlXG4gICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgdG9wIG9mIHRoZSB6IGluZGV4IHN0YWNrLCBhbmRcbiAgICAgICAgICAgIC8vIHB1dCB0aGUgZHVwbGljYXRlcyB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdXNlZCB0byBiZS5cbiAgICAgICAgICAgIC8vICh0aGUgb3JpZ2luIHBvaW50IHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydGVkKVxuXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNCZWVuRHVwbGljYXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0FwcGVuZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBJZE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSB8fFxuICAgICAgICAgICAgICAgIC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKFxuICAgICAgICAgICAgICBuZXh0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgICAgICAgZWxlbWVudHNUb0FwcGVuZCxcbiAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZCxcbiAgICAgICAgICAgICAgXCJkdXBsaWNhdGVzU2VydmVBc09sZFwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRTY2VuZUVsZW1lbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIHJlYWQgdGhpcy5zdGF0ZSB3aXRoaW4gZWFjaCBtb3ZlIGV2ZW50LFxuICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvdWxkIHJlYWQgYSBzdGFsZSBvbmUhXG4gICAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcbiAgICAgIGlmICghZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgY29uc3QgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgY29uc3QgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgICAgID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlc1xuICAgICAgICAgIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGV2ZW50LnByZXNzdXJlXTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHsgd2lkdGg6IGR4LCBoZWlnaHQ6IGR5IH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgZHgsXG4gICAgICAgICAgICBkeSxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHsgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0gfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW2R4LCBkeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckxpbmVhckVsZW1lbnRBdEN1cnNvcihcbiAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIFwiZW5kXCIsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoZWxlbWVudHMsIHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50c1dpdGhpblNlbGVjdGlvbiA9IGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAuLi5lbGVtZW50c1dpdGhpblNlbGVjdGlvbi5yZWR1Y2UoKG1hcCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfSwge30gYXMgYW55KSxcbiAgICAgICAgICAgICAgICAuLi4ocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudFxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgY3RybC9jbWQsIHNlbGVjdCB0aGUgaGl0RWxlbWVudCBvbmx5IGlmIHdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAuaWRdOiAhZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIG1vdmUgaGFwcGVuZWQgb3ZlciBlaXRoZXIgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVySG9yaXpvbnRhbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkeCA9IHggLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFggLSBkeCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSB4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJWZXJ0aWNhbCkge1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkeSA9IHkgLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkeSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSB5O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChjaGlsZEV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICByZXNpemluZ0VsZW1lbnQsXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIGVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGlzUmVzaXppbmcsXG4gICAgICAgIGlzUm90YXRpbmcsXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50OiBudWxsLFxuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBudWxsLFxuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgICAgLy8gdGV4dCBlbGVtZW50cyBhcmUgcmVzZXQgb24gZmluYWxpemUsIGFuZCByZXNldHRpbmcgb24gcG9pbnRlcnVwXG4gICAgICAgIC8vIG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBkb3VibGUgdGFwc1xuICAgICAgICBlZGl0aW5nRWxlbWVudDpcbiAgICAgICAgICBtdWx0aUVsZW1lbnQgfHwgaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KVxuICAgICAgICAgICAgPyB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zYXZlUG9pbnRlcihjaGlsZEV2ZW50LmNsaWVudFgsIGNoaWxkRXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcblxuICAgICAgLy8gSGFuZGxlIGVuZCBvZiBkcmFnZ2luZyBhIHBvaW50IG9mIGEgbGluZWFyIGVsZW1lbnQsIG1pZ2h0IGNsb3NlIGEgbG9vcFxuICAgICAgLy8gYW5kIHNldHMgYmluZGluZyBlbGVtZW50XG4gICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlclVwKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuUE9JTlRFUl9NT1ZFLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlBPSU5URVJfVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULktFWURPV04sXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuS0VZVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCEsXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50Py50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICBjaGlsZEV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55O1xuXG4gICAgICAgIC8vIEFsbG93cyBkb3RzIHRvIGF2b2lkIGJlaW5nIGZsYWdnZWQgYXMgaW5maW5pdGVseSBzbWFsbFxuICAgICAgICBpZiAoZHggPT09IHBvaW50c1swXVswXSAmJiBkeSA9PT0gcG9pbnRzWzBdWzFdKSB7XG4gICAgICAgICAgZHkgKz0gMC4wMDAxO1xuICAgICAgICAgIGR4ICs9IDAuMDAwMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXNzdXJlcyA9IGRyYWdnaW5nRWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGNoaWxkRXZlbnQucHJlc3N1cmVdO1xuXG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0sXG4gICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogW2R4LCBkeV0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBkcmFnZ2luZ0VsZW1lbnQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAgIHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgICAgICAgLmZpbHRlcigoZWwpID0+IGVsLmlkICE9PSBpbWFnZUVsZW1lbnQuaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQhLnBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50ICYmXG4gICAgICAgICAgIW11bHRpRWxlbWVudFxuICAgICAgICApIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAgIC4uLmRyYWdnaW5nRWxlbWVudC5wb2ludHMsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueCxcbiAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQ6IGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIW11bHRpRWxlbWVudCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSkgJiZcbiAgICAgICAgICAgIGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWF5YmVCaW5kTGluZWFyRWxlbWVudChcbiAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICB0aGlzLnNjZW5lLFxuICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSwgc3RhcnRCb3VuZEVsZW1lbnQ6IG51bGwgfSk7XG4gICAgICAgICAgaWYgKCFlbGVtZW50TG9ja2VkKSB7XG4gICAgICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW3RoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCEuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50ICYmXG4gICAgICAgIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICkge1xuICAgICAgICAvLyByZW1vdmUgaW52aXNpYmxlIGVsZW1lbnQgd2hpY2ggd2FzIGFkZGVkIGluIG9uUG9pbnRlckRvd25cbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5zbGljZSgwLCAtMSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyhkcmFnZ2luZ0VsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChyZXNpemluZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmVcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKVxuICAgICAgICAgICAgLmZpbHRlcigoZWwpID0+IGVsLmlkICE9PSByZXNpemluZ0VsZW1lbnQuaWQpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDb2RlIGJlbG93IGhhbmRsZXMgc2VsZWN0aW9uIHdoZW4gZWxlbWVudChzKSB3ZXJlbid0XG4gICAgICAvLyBkcmFnIG9yIGFkZGVkIHRvIHNlbGVjdGlvbiBvbiBwb2ludGVyIGRvd24gcGhhc2UuXG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgIGlmIChcbiAgICAgICAgaGl0RWxlbWVudCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNoaWxkRXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkVmlhR3JvdXAodGhpcy5zdGF0ZSwgaGl0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1bnNlbGVjdCBhbGwgZ3JvdXBzIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBncm91cHNcbiAgICAgICAgICAgICAgLy8gaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIGNvbnN0IGlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyA9IGhpdEVsZW1lbnQuZ3JvdXBJZHNcbiAgICAgICAgICAgICAgICAuZmxhdE1hcCgoZ3JvdXBJZCkgPT5cbiAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRzSW5Hcm91cCh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIGdyb3VwSWQpLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiAoeyBbZWxlbWVudC5pZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZJZCwgYWNjKSA9PiAoeyAuLi5wcmV2SWQsIC4uLmFjYyB9KSwge30pO1xuXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKF9wcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge1xuICAgICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAuLi5oaXRFbGVtZW50Lmdyb3VwSWRzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGdJZCkgPT4gKHsgW2dJZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChwcmV2LCBhY2MpID0+ICh7IC4uLnByZXYsIC4uLmFjYyB9KSwge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgIC4uLmlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudCEuaWRdOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYWRkIGVsZW1lbnQgdG8gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKF9wcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLl9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtoaXRFbGVtZW50LmlkXTogdHJ1ZSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgIXRoaXMuc3RhdGUuaXNSZXNpemluZyAmJlxuICAgICAgICAoKGhpdEVsZW1lbnQgJiZcbiAgICAgICAgICBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQoXG4gICAgICAgICAgICBoaXRFbGVtZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICkpIHx8XG4gICAgICAgICAgKCFoaXRFbGVtZW50ICYmXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykpXG4gICAgICApIHtcbiAgICAgICAgLy8gRGVzZWxlY3Qgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnRMb2NrZWQgJiYgZWxlbWVudFR5cGUgIT09IFwiZnJlZWRyYXdcIiAmJiBkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgIFtkcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiB8fFxuICAgICAgICBpc1NvbWVFbGVtZW50U2VsZWN0ZWQodGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCB8fCBpc1Jlc2l6aW5nIHx8IGlzUm90YXRpbmcpIHtcbiAgICAgICAgKGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSlcbiAgICAgICAgICA/IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHNcbiAgICAgICAgICA6IHVuYmluZExpbmVhckVsZW1lbnRzKShcbiAgICAgICAgICBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUltYWdlID0gYXN5bmMgKHtcbiAgICBpbWFnZUZpbGUsXG4gICAgaW1hZ2VFbGVtZW50OiBfaW1hZ2VFbGVtZW50LFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZSxcbiAgfToge1xuICAgIGltYWdlRmlsZTogRmlsZTtcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ7XG4gICAgc2hvd0N1cnNvckltYWdlUHJldmlldz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICAvLyBhdCB0aGlzIHBvaW50IHRoaXMgc2hvdWxkIGJlIGd1YXJhbnRlZWQgaW1hZ2UgZmlsZSwgYnV0IHdlIGRvIHRoaXMgY2hlY2tcbiAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICBpZiAoIWlzU3VwcG9ydGVkSW1hZ2VGaWxlKGltYWdlRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLnVuc3VwcG9ydGVkRmlsZVR5cGVcIikpO1xuICAgIH1cbiAgICBjb25zdCBtaW1lVHlwZSA9IGltYWdlRmlsZS50eXBlO1xuXG4gICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBcIndhaXRcIik7XG5cbiAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWFnZUZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoXG4gICAgICAgICAgYXdhaXQgbm9ybWFsaXplU1ZHKGF3YWl0IGltYWdlRmlsZS50ZXh0KCkpLFxuICAgICAgICAgIGltYWdlRmlsZS5uYW1lLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuc3ZnSW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2VuZXJhdGUgaW1hZ2UgaWQgKGJ5IGRlZmF1bHQgdGhlIGZpbGUgZGlnZXN0KSBiZWZvcmUgYW55XG4gICAgLy8gcmVzaXppbmcvY29tcHJlc3Npb24gdGFrZXMgcGxhY2UgdG8ga2VlcCBpdCBtb3JlIHBvcnRhYmxlXG4gICAgY29uc3QgZmlsZUlkID0gYXdhaXQgKCh0aGlzLnByb3BzLmdlbmVyYXRlSWRGb3JGaWxlPy4oXG4gICAgICBpbWFnZUZpbGUsXG4gICAgKSBhcyBQcm9taXNlPEZpbGVJZD4pIHx8IGdlbmVyYXRlSWRGcm9tRmlsZShpbWFnZUZpbGUpKTtcblxuICAgIGlmICghZmlsZUlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQ291bGRuJ3QgZ2VuZXJhdGUgZmlsZSBpZCBvciB0aGUgc3VwcGxpZWQgYGdlbmVyYXRlSWRGb3JGaWxlYCBkaWRuJ3QgcmVzb2x2ZSB0byBvbmUuXCIsXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdGaWxlRGF0YSA9IHRoaXMuZmlsZXNbZmlsZUlkXTtcbiAgICBpZiAoIWV4aXN0aW5nRmlsZURhdGE/LmRhdGFVUkwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGltYWdlRmlsZSA9IGF3YWl0IHJlc2l6ZUltYWdlRmlsZShcbiAgICAgICAgICBpbWFnZUZpbGUsXG4gICAgICAgICAgREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hULFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIHRyeWluZyB0byByZXNpbmcgaW1hZ2UgZmlsZSBvbiBpbnNlcnRpb25cIiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW1hZ2VGaWxlLnNpemUgPiBNQVhfQUxMT1dFRF9GSUxFX0JZVEVTKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICB0KFwiZXJyb3JzLmZpbGVUb29CaWdcIiwge1xuICAgICAgICAgICAgbWF4U2l6ZTogYCR7TWF0aC50cnVuYyhNQVhfQUxMT1dFRF9GSUxFX0JZVEVTIC8gMTAyNCAvIDEwMjQpfU1CYCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0N1cnNvckltYWdlUHJldmlldykge1xuICAgICAgY29uc3QgZGF0YVVSTCA9IHRoaXMuZmlsZXNbZmlsZUlkXT8uZGF0YVVSTDtcbiAgICAgIC8vIG9wdGltaXphdGlvbiBzbyB0aGF0IHdlIGRvbid0IHVubmVjZXNzYXJpbHkgcmVzaXplIHRoZSBvcmlnaW5hbFxuICAgICAgLy8gZnVsbC1zaXplIGZpbGUgZm9yIGN1cnNvciBwcmV2aWV3XG4gICAgICAvLyAoaXQncyBtdWNoIGZhc3RlciB0byBjb252ZXJ0IHRoZSByZXNpemVkIGRhdGFVUkwgdG8gRmlsZSlcbiAgICAgIGNvbnN0IHJlc2l6ZWRGaWxlID0gZGF0YVVSTCAmJiBkYXRhVVJMVG9GaWxlKGRhdGFVUkwpO1xuXG4gICAgICB0aGlzLnNldEltYWdlUHJldmlld0N1cnNvcihyZXNpemVkRmlsZSB8fCBpbWFnZUZpbGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFVUkwgPVxuICAgICAgdGhpcy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMIHx8IChhd2FpdCBnZXREYXRhVVJMKGltYWdlRmlsZSkpO1xuXG4gICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gbXV0YXRlRWxlbWVudChcbiAgICAgIF9pbWFnZUVsZW1lbnQsXG4gICAgICB7XG4gICAgICAgIGZpbGVJZCxcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApIGFzIE5vbkRlbGV0ZWQ8SW5pdGlhbGl6ZWRFeGNhbGlkcmF3SW1hZ2VFbGVtZW50PjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxOb25EZWxldGVkPEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudD4+KFxuICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZmlsZXMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmZpbGVzLFxuICAgICAgICAgICAgW2ZpbGVJZF06IHtcbiAgICAgICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgICAgIGlkOiBmaWxlSWQsXG4gICAgICAgICAgICAgIGRhdGFVUkwsXG4gICAgICAgICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY2FjaGVkSW1hZ2VEYXRhID0gdGhpcy5pbWFnZUNhY2hlLmdldChmaWxlSWQpO1xuICAgICAgICAgIGlmICghY2FjaGVkSW1hZ2VEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVJbWFnZUNhY2hlKFtpbWFnZUVsZW1lbnRdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNhY2hlZEltYWdlRGF0YT8uaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBhd2FpdCBjYWNoZWRJbWFnZURhdGEuaW1hZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudD8uaWQgIT09IGltYWdlRWxlbWVudC5pZCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGltYWdlRWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0KFwiZXJyb3JzLmltYWdlSW5zZXJ0RXJyb3JcIikpKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoIXNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogaW5zZXJ0cyBpbWFnZSBpbnRvIGVsZW1lbnRzIGFycmF5IGFuZCByZXJlbmRlcnNcbiAgICovXG4gIHByaXZhdGUgaW5zZXJ0SW1hZ2VFbGVtZW50ID0gYXN5bmMgKFxuICAgIGltYWdlRWxlbWVudDogRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgICBpbWFnZUZpbGU6IEZpbGUsXG4gICAgc2hvd0N1cnNvckltYWdlUHJldmlldz86IGJvb2xlYW4sXG4gICkgPT4ge1xuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICBpbWFnZUVsZW1lbnQsXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplSW1hZ2Uoe1xuICAgICAgICBpbWFnZUZpbGUsXG4gICAgICAgIGltYWdlRWxlbWVudCxcbiAgICAgICAgc2hvd0N1cnNvckltYWdlUHJldmlldyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICBpc0RlbGV0ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgdChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yID0gYXN5bmMgKGltYWdlRmlsZTogRmlsZSkgPT4ge1xuICAgIC8vIG11c3RuJ3QgYmUgbGFyZ2VyIHRoYW4gMTI4IHB4XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSA5NjtcblxuICAgIGNvbnN0IGltYWdlUHJldmlldyA9IGF3YWl0IHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIGN1cnNvckltYWdlU2l6ZVB4KTtcblxuICAgIGxldCBwcmV2aWV3RGF0YVVSTCA9IGF3YWl0IGdldERhdGFVUkwoaW1hZ2VQcmV2aWV3KTtcblxuICAgIC8vIFNWRyBjYW5ub3QgYmUgcmVzaXplZCB2aWEgYHJlc2l6ZUltYWdlRmlsZWAgc28gd2UgcmVzaXplIGJ5IHJlbmRlcmluZyB0b1xuICAgIC8vIGEgc21hbGwgY2FudmFzXG4gICAgaWYgKGltYWdlRmlsZS50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgY29uc3QgaW1nID0gYXdhaXQgbG9hZEhUTUxJbWFnZUVsZW1lbnQocHJldmlld0RhdGFVUkwpO1xuXG4gICAgICBsZXQgaGVpZ2h0ID0gTWF0aC5taW4oaW1nLmhlaWdodCwgY3Vyc29ySW1hZ2VTaXplUHgpO1xuICAgICAgbGV0IHdpZHRoID0gaGVpZ2h0ICogKGltZy53aWR0aCAvIGltZy5oZWlnaHQpO1xuXG4gICAgICBpZiAod2lkdGggPiBjdXJzb3JJbWFnZVNpemVQeCkge1xuICAgICAgICB3aWR0aCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIChpbWcuaGVpZ2h0IC8gaW1nLndpZHRoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcblxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgcHJldmlld0RhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKE1JTUVfVFlQRVMuc3ZnKSBhcyBEYXRhVVJMO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgNCA0LCBhdXRvYCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25JbWFnZUFjdGlvbiA9IGFzeW5jIChcbiAgICB7IGluc2VydE9uQ2FudmFzRGlyZWN0bHkgfSA9IHsgaW5zZXJ0T25DYW52YXNEaXJlY3RseTogZmFsc2UgfSxcbiAgKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudFggPSB0aGlzLnN0YXRlLndpZHRoIC8gMiArIHRoaXMuc3RhdGUub2Zmc2V0TGVmdDtcbiAgICAgIGNvbnN0IGNsaWVudFkgPSB0aGlzLnN0YXRlLmhlaWdodCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldFRvcDtcblxuICAgICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgIHsgY2xpZW50WCwgY2xpZW50WSB9LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaW1hZ2VGaWxlID0gYXdhaXQgZmlsZU9wZW4oe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJJbWFnZVwiLFxuICAgICAgICBleHRlbnNpb25zOiBbXCJqcGdcIiwgXCJwbmdcIiwgXCJzdmdcIiwgXCJnaWZcIl0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gdGhpcy5jcmVhdGVJbWFnZUVsZW1lbnQoe1xuICAgICAgICBzY2VuZVg6IHgsXG4gICAgICAgIHNjZW5lWTogeSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaW5zZXJ0T25DYW52YXNEaXJlY3RseSkge1xuICAgICAgICB0aGlzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGltYWdlRmlsZSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IGltYWdlRWxlbWVudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KFxuICAgICAgICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgICAgICAgLyogc2hvd0N1cnNvckltYWdlUHJldmlldyAqLyB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IubmFtZSAhPT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICB7XG4gICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyA9IChcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gICAgZm9yY2VOYXR1cmFsU2l6ZSA9IGZhbHNlLFxuICApID0+IHtcbiAgICBjb25zdCBpbWFnZSA9XG4gICAgICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCkgJiZcbiAgICAgIHRoaXMuaW1hZ2VDYWNoZS5nZXQoaW1hZ2VFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuXG4gICAgaWYgKCFpbWFnZSB8fCBpbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlICYmXG4gICAgICAgIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyB0aGlzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclNpemUgPSAxMDAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgeDogaW1hZ2VFbGVtZW50LnggLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHk6IGltYWdlRWxlbWVudC55IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXJTaXplLFxuICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJTaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZvcmNlTmF0dXJhbFNpemUgfHxcbiAgICAgIC8vIGlmIHVzZXItY3JlYXRlZCBib3VuZGluZyBib3ggaXMgYmVsb3cgdGhyZXNob2xkLCBhc3N1bWUgdGhlXG4gICAgICAvLyBpbnRlbnRpb24gd2FzIHRvIGNsaWNrIGluc3RlYWQgb2YgZHJhZywgYW5kIHVzZSB0aGUgaW1hZ2Unc1xuICAgICAgLy8gaW50cmluc2ljIHNpemVcbiAgICAgIChpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUgJiZcbiAgICAgICAgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSlcbiAgICApIHtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IE1hdGgubWF4KHRoaXMuc3RhdGUuaGVpZ2h0IC0gMTIwLCAxNjApO1xuICAgICAgLy8gbWF4IDY1JSBvZiBjYW52YXMgaGVpZ2h0LCBjbGFtcGVkIHRvIDwzMDBweCwgdmggLSAxMjBweD5cbiAgICAgIGNvbnN0IG1heEhlaWdodCA9IE1hdGgubWluKFxuICAgICAgICBtaW5IZWlnaHQsXG4gICAgICAgIE1hdGguZmxvb3IodGhpcy5zdGF0ZS5oZWlnaHQgKiAwLjUpIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4oaW1hZ2UubmF0dXJhbEhlaWdodCwgbWF4SGVpZ2h0KTtcbiAgICAgIGNvbnN0IHdpZHRoID0gaGVpZ2h0ICogKGltYWdlLm5hdHVyYWxXaWR0aCAvIGltYWdlLm5hdHVyYWxIZWlnaHQpO1xuXG4gICAgICAvLyBhZGQgY3VycmVudCBpbWFnZUVsZW1lbnQgd2lkdGgvaGVpZ2h0IHRvIGFjY291bnQgZm9yIHByZXZpb3VzIGNlbnRlcmluZ1xuICAgICAgLy8gb2YgdGhlIHBsYWNob2xkZXIgaW1hZ2VcbiAgICAgIGNvbnN0IHggPSBpbWFnZUVsZW1lbnQueCArIGltYWdlRWxlbWVudC53aWR0aCAvIDIgLSB3aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gaW1hZ2VFbGVtZW50LnkgKyBpbWFnZUVsZW1lbnQuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG5cbiAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiB1cGRhdGVzIGltYWdlIGNhY2hlLCByZWZyZXNoaW5nIHVwZGF0ZWQgZWxlbWVudHMgYW5kL29yIHNldHRpbmcgc3RhdHVzXG4gICAgICB0byBlcnJvciBmb3IgaW1hZ2VzIHRoYXQgZmFpbCBkdXJpbmcgPGltZz4gZWxlbWVudCBjcmVhdGlvbiAqL1xuICBwcml2YXRlIHVwZGF0ZUltYWdlQ2FjaGUgPSBhc3luYyAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtdLFxuICAgIGZpbGVzID0gdGhpcy5maWxlcyxcbiAgKSA9PiB7XG4gICAgY29uc3QgeyB1cGRhdGVkRmlsZXMsIGVycm9yZWRGaWxlcyB9ID0gYXdhaXQgX3VwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgZmlsZUlkczogZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgICBmaWxlcyxcbiAgICB9KTtcbiAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUgfHwgZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAodXBkYXRlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yZWRGaWxlcy5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICB7IHN0YXR1czogXCJlcnJvclwiIH0sXG4gICAgICAgICAgICAvKiBpbmZvcm1NdXRhdGlvbiAqLyBmYWxzZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHVwZGF0ZWRGaWxlcywgZXJyb3JlZEZpbGVzIH07XG4gIH07XG5cbiAgLyoqIGFkZHMgbmV3IGltYWdlcyB0byBpbWFnZUNhY2hlIGFuZCByZS1yZW5kZXJzIGlmIG5lZWRlZCAqL1xuICBwcml2YXRlIGFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSA9IGFzeW5jIChcbiAgICBpbWFnZUVsZW1lbnRzOiBJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXSA9IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICApLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyA9IHRoaXMuZmlsZXMsXG4gICkgPT4ge1xuICAgIGNvbnN0IHVuY2FjaGVkSW1hZ2VFbGVtZW50cyA9IGltYWdlRWxlbWVudHMuZmlsdGVyKFxuICAgICAgKGVsZW1lbnQpID0+ICFlbGVtZW50LmlzRGVsZXRlZCAmJiAhdGhpcy5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCksXG4gICAgKTtcblxuICAgIGlmICh1bmNhY2hlZEltYWdlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZWRGaWxlcyB9ID0gYXdhaXQgdGhpcy51cGRhdGVJbWFnZUNhY2hlKFxuICAgICAgICB1bmNhY2hlZEltYWdlRWxlbWVudHMsXG4gICAgICAgIGZpbGVzLFxuICAgICAgKTtcbiAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSkge1xuICAgICAgICB0aGlzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBnZW5lcmFsbHkgeW91IHNob3VsZCB1c2UgYGFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpYCBkaXJlY3RseSBpZiB5b3UgbmVlZFxuICAgKiAgdG8gcmVuZGVyIG5ldyBpbWFnZXMuIFRoaXMgaXMganVzdCBhIGZhaWxzYWZlICAqL1xuICBwcml2YXRlIHNjaGVkdWxlSW1hZ2VSZWZyZXNoID0gdGhyb3R0bGUoKCkgPT4ge1xuICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gIH0sIElNQUdFX1JFTkRFUl9USU1FT1VUKTtcblxuICBwcml2YXRlIHVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZSA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkRW5hYmxlQmluZGluZyA9IHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQoZXZlbnQpO1xuICAgIGlmICh0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQgIT09IHNob3VsZEVuYWJsZUJpbmRpbmcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiBzaG91bGRFbmFibGVCaW5kaW5nIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvciA9IChwb2ludGVyQ29vcmRzOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6XG4gICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCA/IFtob3ZlcmVkQmluZGFibGVFbGVtZW50XSA6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ0ZvckxpbmVhckVsZW1lbnRBdEN1cnNvciA9IChcbiAgICBsaW5lYXJFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICBzdGFydE9yRW5kOiBcInN0YXJ0XCIgfCBcImVuZFwiLFxuICAgIHBvaW50ZXJDb29yZHM6IHtcbiAgICAgIHg6IG51bWJlcjtcbiAgICAgIHk6IG51bWJlcjtcbiAgICB9LFxuICAgIC8vIER1cmluZyBsaW5lIGNyZWF0aW9uIHRoZSBzdGFydCBiaW5kaW5nIGhhc24ndCBiZWVuIHdyaXR0ZW4geWV0XG4gICAgLy8gaW50byBgbGluZWFyRWxlbWVudGBcbiAgICBvcHBvc2l0ZUJpbmRpbmdCb3VuZEVsZW1lbnQ/OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50IHwgbnVsbCxcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgIHBvaW50ZXJDb29yZHMsXG4gICAgICB0aGlzLnNjZW5lLFxuICAgICk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczpcbiAgICAgICAgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsICYmXG4gICAgICAgICFpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQoXG4gICAgICAgICAgbGluZWFyRWxlbWVudCxcbiAgICAgICAgICBvcHBvc2l0ZUJpbmRpbmdCb3VuZEVsZW1lbnQ/LmlkLFxuICAgICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQsXG4gICAgICAgIClcbiAgICAgICAgICA/IFtob3ZlcmVkQmluZGFibGVFbGVtZW50XVxuICAgICAgICAgIDogW10sXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKFxuICAgIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHN1Z2dlc3RlZEJpbmRpbmdzID0gZ2V0RWxpZ2libGVFbGVtZW50c0ZvckJpbmRpbmcoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdGlvbihoaXRFbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAvLyBDb250aW51ZSBlZGl0aW5nIHRoZSBzYW1lIGdyb3VwIGlmIHRoZSB1c2VyIHNlbGVjdGVkIGEgZGlmZmVyZW50XG4gICAgICAvLyBlbGVtZW50IGZyb20gaXRcbiAgICAgIGVkaXRpbmdHcm91cElkOlxuICAgICAgICBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQgJiZcbiAgICAgICAgaGl0RWxlbWVudCAhPSBudWxsICYmXG4gICAgICAgIGlzRWxlbWVudEluR3JvdXAoaGl0RWxlbWVudCwgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkKVxuICAgICAgICAgID8gcHJldlN0YXRlLmVkaXRpbmdHcm91cElkXG4gICAgICAgICAgOiBudWxsLFxuICAgIH0pKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1JlZiA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB7XG4gICAgLy8gY2FudmFzIGlzIG51bGwgd2hlbiB1bm1vdW50aW5nXG4gICAgaWYgKGNhbnZhcyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgICB0aGlzLnJjID0gcm91Z2guY2FudmFzKHRoaXMuY2FudmFzKTtcblxuICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5XSEVFTCwgdGhpcy5oYW5kbGVXaGVlbCwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9TVEFSVCwgdGhpcy5vblRhcFN0YXJ0KTtcbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCB0aGlzLm9uVGFwRW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMuaGFuZGxlV2hlZWwpO1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIHRoaXMub25UYXBTdGFydCk7XG4gICAgICB0aGlzLmNhbnZhcz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5UT1VDSF9FTkQsIHRoaXMub25UYXBFbmQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUFwcE9uRHJvcCA9IGFzeW5jIChldmVudDogUmVhY3QuRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkRyb3ApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoKGF3YWl0IHRoaXMucHJvcHMub25Ecm9wKGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXTtcblxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpKSB7XG4gICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gZGVjb2RlIHNjZW5lIGZyb20gdGhlIGltYWdlIGlmIGl0J3MgZW1iZWRkZWRcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgaWYgKGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMucG5nIHx8IGZpbGU/LnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgd29yayBhcyBvZiBDaHJvbWUgODYsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgICAgICAgICAgIChmaWxlIGFzIGFueSkuaGFuZGxlID0gYXdhaXQgKGl0ZW0gYXMgYW55KS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2VuZSA9IGF3YWl0IGxvYWRGcm9tQmxvYihcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgICAgICAuLi5zY2VuZSxcbiAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAuLi4oc2NlbmUuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gXCJFbmNvZGluZ0Vycm9yXCIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm8gc2NlbmUgaXMgZW1iZWRkZWQgb3Igd2UgZmFpbCBmb3Igd2hhdGV2ZXIgcmVhc29uLCBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgY29uc3QgeyB4OiBzY2VuZVgsIHk6IHNjZW5lWSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gdGhpcy5jcmVhdGVJbWFnZUVsZW1lbnQoeyBzY2VuZVgsIHNjZW5lWSB9KTtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBmaWxlKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsaWJyYXJ5U2hhcGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliKTtcbiAgICBpZiAobGlicmFyeVNoYXBlcyAhPT0gXCJcIikge1xuICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgIGVsZW1lbnRzOiBKU09OLnBhcnNlKGxpYnJhcnlTaGFwZXMpLFxuICAgICAgICBwb3NpdGlvbjogZXZlbnQsXG4gICAgICAgIGZpbGVzOiBudWxsLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXNbMF07XG4gICAgaWYgKFxuICAgICAgZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliIHx8XG4gICAgICBmaWxlPy5uYW1lPy5lbmRzV2l0aChcIi5leGNhbGlkcmF3bGliXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmxpYnJhcnlcbiAgICAgICAgLmltcG9ydExpYnJhcnkoZmlsZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIENsb3NlIGFuZCB0aGVuIG9wZW4gdG8gZ2V0IHRoZSBsaWJyYXJpZXMgdXBkYXRlZFxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiBmYWxzZSwgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pLFxuICAgICAgICApO1xuICAgICAgLy8gZGVmYXVsdDogYXNzdW1lIGFuIEV4Y2FsaWRyYXcgZmlsZSByZWdhcmRsZXNzIG9mIGV4dGVuc2lvbi9NaW1lVHlwZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgICAgaWYgKG5hdGl2ZUZpbGVTeXN0ZW1TdXBwb3J0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgb25seSB3b3JrIGFzIG9mIENocm9tZSA4NixcbiAgICAgICAgICAvLyBidXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIG9uIG9sZGVyIHJlbGVhc2VzLlxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgKGZpbGUgYXMgYW55KS5oYW5kbGUgPSBhd2FpdCAoaXRlbSBhcyBhbnkpLmdldEFzRmlsZVN5c3RlbUhhbmRsZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmxvYWRGaWxlVG9DYW52YXMoZmlsZSk7XG4gICAgfVxuICB9O1xuXG4gIGxvYWRGaWxlVG9DYW52YXMgPSAoZmlsZTogQmxvYikgPT4ge1xuICAgIGxvYWRGcm9tQmxvYihmaWxlLCB0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKVxuICAgICAgLnRoZW4oKHNjZW5lKSA9PiB7XG4gICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgLi4uc2NlbmUsXG4gICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgIC4uLihzY2VuZS5hcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXBsYWNlRmlsZXM6IHRydWUsXG4gICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc0NvbnRleHRNZW51ID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIHsgcHJlZmVyU2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCB0eXBlID0gZWxlbWVudCA/IFwiZWxlbWVudFwiIDogXCJjYW52YXNcIjtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ITtcbiAgICBjb25zdCB7XG4gICAgICB0b3A6IG9mZnNldFRvcCxcbiAgICAgIGxlZnQ6IG9mZnNldExlZnQsXG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbZWxlbWVudC5pZF06IHRydWUgfSB9LCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29wZW5Db250ZXh0TWVudSh7IHRvcCwgbGVmdCB9LCB0eXBlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSxcbiAgICAgICAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaW1hZ2UgPVxuICAgICAgICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgJiZcbiAgICAgICAgdGhpcy5pbWFnZUNhY2hlLmdldChkcmFnZ2luZ0VsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9XG4gICAgICAgIGltYWdlICYmICEoaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgID8gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHRcbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgIGRyYWdOZXdFbGVtZW50KFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksXG4gICAgICAgIGdyaWRYLFxuICAgICAgICBncmlkWSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgZ3JpZFgpLFxuICAgICAgICBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC55LCBncmlkWSksXG4gICAgICAgIGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICAgICA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KVxuICAgICAgICAgIDogc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLFxuICAgICAgICBhc3BlY3RSYXRpbyxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChbZHJhZ2dpbmdFbGVtZW50XSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVIYW5kbGVSZXNpemUgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgY29uc3QgW3Jlc2l6ZVgsIHJlc2l6ZVldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsXG4gICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24sXG4gICAgICAgIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzSW1hZ2VFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICAgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudClcbiAgICAgICAgICA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICByZXNpemVYLFxuICAgICAgICByZXNpemVZLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLnksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKiBAcHJpdmF0ZSB1c2UgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSAqL1xuICBwcml2YXRlIF9vcGVuQ29udGV4dE1lbnUgPSAoXG4gICAge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICB9OiB7XG4gICAgICBsZWZ0OiBudW1iZXI7XG4gICAgICB0b3A6IG51bWJlcjtcbiAgICB9LFxuICAgIHR5cGU6IFwiY2FudmFzXCIgfCBcImVsZW1lbnRcIixcbiAgKSA9PiB7XG4gICAgY29uc3QgbWF5YmVHcm91cEFjdGlvbiA9IGFjdGlvbkdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZVVuZ3JvdXBBY3Rpb24gPSBhY3Rpb25Vbmdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBIb3Jpem9udGFsID0gYWN0aW9uRmxpcEhvcml6b250YWwuY29udGV4dEl0ZW1QcmVkaWNhdGUhKFxuICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCksXG4gICAgKTtcblxuICAgIGNvbnN0IG1heWJlRmxpcFZlcnRpY2FsID0gYWN0aW9uRmxpcFZlcnRpY2FsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBvcHRpb25zOiBDb250ZXh0TWVudU9wdGlvbltdID0gW107XG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNQbmcpO1xuICAgIH1cblxuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wdGlvbnMucHVzaChhY3Rpb25Db3B5QXNTdmcpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgY29uc3Qgdmlld01vZGVPcHRpb25zID0gW1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgIGFjdGlvblRvZ2dsZVN0YXRzLFxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IHZpZXdNb2RlT3B0aW9ucyxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5pc01vYmlsZSAmJlxuICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInBhc3RlXCIsXG4gICAgICAgICAgICAgICAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5wYXN0ZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHNlcGFyYXRvcixcbiAgICAgICAgICAgIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmXG4gICAgICAgICAgICAgIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgYWN0aW9uQ29weUFzUG5nLFxuICAgICAgICAgICAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJlxuICAgICAgICAgICAgICBlbGVtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGFjdGlvbkNvcHlBc1N2ZyxcbiAgICAgICAgICAgICgocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkpICYmXG4gICAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIGFjdGlvblNlbGVjdEFsbCxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgIGFjdGlvblRvZ2dsZVplbk1vZGUsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgICAgICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IFtuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIGFjdGlvbkNvcHksIC4uLm9wdGlvbnNdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB0aGlzLmlzTW9iaWxlICYmIGFjdGlvbkN1dCxcbiAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LFxuICAgICAgICAgICAgdGhpcy5pc01vYmlsZSAmJlxuICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInBhc3RlXCIsXG4gICAgICAgICAgICAgICAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5wYXN0ZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5pc01vYmlsZSAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uQ29weVN0eWxlcyxcbiAgICAgICAgICAgIGFjdGlvblBhc3RlU3R5bGVzLFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgbWF5YmVHcm91cEFjdGlvbiAmJiBhY3Rpb25Hcm91cCxcbiAgICAgICAgICAgIG1heWJlVW5ncm91cEFjdGlvbiAmJiBhY3Rpb25Vbmdyb3VwLFxuICAgICAgICAgICAgKG1heWJlR3JvdXBBY3Rpb24gfHwgbWF5YmVVbmdyb3VwQWN0aW9uKSAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25BZGRUb0xpYnJhcnksXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gICAgICAgICAgICBhY3Rpb25CcmluZ0ZvcndhcmQsXG4gICAgICAgICAgICBhY3Rpb25TZW5kVG9CYWNrLFxuICAgICAgICAgICAgYWN0aW9uQnJpbmdUb0Zyb250LFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgbWF5YmVGbGlwSG9yaXpvbnRhbCAmJiBhY3Rpb25GbGlwSG9yaXpvbnRhbCxcbiAgICAgICAgICAgIG1heWJlRmxpcFZlcnRpY2FsICYmIGFjdGlvbkZsaXBWZXJ0aWNhbCxcbiAgICAgICAgICAgIChtYXliZUZsaXBIb3Jpem9udGFsIHx8IG1heWJlRmxpcFZlcnRpY2FsKSAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sXG4gICAgICAgICAgICBhY3Rpb25EZWxldGVTZWxlY3RlZCxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlV2hlZWwgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZIH0gPSBldmVudDtcbiAgICBjb25zdCB7IHNlbGVjdGVkRWxlbWVudElkcywgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgLy8gbm90ZSB0aGF0IGV2ZW50LmN0cmxLZXkgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBwaW5jaCB6b29taW5nXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkge1xuICAgICAgY29uc3Qgc2lnbiA9IE1hdGguc2lnbihkZWx0YVkpO1xuICAgICAgY29uc3QgTUFYX1NURVAgPSAxMDtcbiAgICAgIGxldCBkZWx0YSA9IE1hdGguYWJzKGRlbHRhWSk7XG4gICAgICBpZiAoZGVsdGEgPiBNQVhfU1RFUCkge1xuICAgICAgICBkZWx0YSA9IE1BWF9TVEVQO1xuICAgICAgfVxuICAgICAgZGVsdGEgKj0gc2lnbjtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdab29tID0gdGhpcy5zdGF0ZS56b29tLnZhbHVlIC0gZGVsdGEgLyAxMDA7XG4gICAgICAvLyBpbmNyZWFzZSB6b29tIHN0ZXBzIHRoZSBtb3JlIHpvb21lZC1pbiB3ZSBhcmUgKGFwcGxpZXMgdG8gPjEwMCUgb25seSlcbiAgICAgIG5ld1pvb20gKz0gTWF0aC5sb2cxMChNYXRoLm1heCgxLCB0aGlzLnN0YXRlLnpvb20udmFsdWUpKSAqIC1zaWduO1xuICAgICAgLy8gcm91bmQgdG8gbmVhcmVzdCBzdGVwXG4gICAgICBuZXdab29tID0gTWF0aC5yb3VuZChuZXdab29tICogWk9PTV9TVEVQICogMTAwKSAvIChaT09NX1NURVAgKiAxMDApO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIG9mZnNldExlZnQsIG9mZnNldFRvcCB9KSA9PiAoe1xuICAgICAgICB6b29tOiBnZXROZXdab29tKFxuICAgICAgICAgIGdldE5vcm1hbGl6ZWRab29tKG5ld1pvb20pLFxuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgeyBsZWZ0OiBvZmZzZXRMZWZ0LCB0b3A6IG9mZnNldFRvcCB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHg6IGN1cnNvclgsXG4gICAgICAgICAgICB5OiBjdXJzb3JZLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOlxuICAgICAgICAgIE9iamVjdC5rZXlzKHNlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwXG4gICAgICAgICAgICA/IHNlbGVjdGVkRWxlbWVudElkc1xuICAgICAgICAgICAgOiBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNjcm9sbCBob3Jpem9udGFsbHkgd2hlbiBzaGlmdCBwcmVzc2VkXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFggfSkgPT4gKHtcbiAgICAgICAgLy8gb24gTWFjLCBzaGlmdCt3aGVlbCB0ZW5kcyB0byByZXN1bHQgaW4gZGVsdGFYXG4gICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSAoZGVsdGFZIHx8IGRlbHRhWCkgLyB6b29tLnZhbHVlLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoKHsgem9vbSwgc2Nyb2xsWCwgc2Nyb2xsWSB9KSA9PiAoe1xuICAgICAgc2Nyb2xsWDogc2Nyb2xsWCAtIGRlbHRhWCAvIHpvb20udmFsdWUsXG4gICAgICBzY3JvbGxZOiBzY3JvbGxZIC0gZGVsdGFZIC8gem9vbS52YWx1ZSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgICBzY2FsZTogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50Q2xpY2tlZEluc2lkZSA9IGdldEVsZW1lbnRDb250YWluaW5nUG9zaXRpb24oXG4gICAgICB0aGlzLnNjZW5lXG4gICAgICAgIC5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKVxuICAgICAgICAuZmlsdGVyKChlbGVtZW50KSA9PiAhaXNUZXh0RWxlbWVudChlbGVtZW50KSksXG4gICAgICB4LFxuICAgICAgeSxcbiAgICApO1xuICAgIGlmIChlbGVtZW50Q2xpY2tlZEluc2lkZSkge1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclggPVxuICAgICAgICBlbGVtZW50Q2xpY2tlZEluc2lkZS54ICsgZWxlbWVudENsaWNrZWRJbnNpZGUud2lkdGggLyAyO1xuICAgICAgY29uc3QgZWxlbWVudENlbnRlclkgPVxuICAgICAgICBlbGVtZW50Q2xpY2tlZEluc2lkZS55ICsgZWxlbWVudENsaWNrZWRJbnNpZGUuaGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlVG9DZW50ZXIgPSBNYXRoLmh5cG90KFxuICAgICAgICB4IC0gZWxlbWVudENlbnRlclgsXG4gICAgICAgIHkgLSBlbGVtZW50Q2VudGVyWSxcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1NuYXBwZWRUb0NlbnRlciA9XG4gICAgICAgIGRpc3RhbmNlVG9DZW50ZXIgPCBURVhUX1RPX0NFTlRFUl9TTkFQX1RIUkVTSE9MRDtcbiAgICAgIGlmIChpc1NuYXBwZWRUb0NlbnRlcikge1xuICAgICAgICBjb25zdCB7IHg6IHZpZXdwb3J0WCwgeTogdmlld3BvcnRZIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgICAgeyBzY2VuZVg6IGVsZW1lbnRDZW50ZXJYLCBzY2VuZVk6IGVsZW1lbnRDZW50ZXJZIH0sXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHZpZXdwb3J0WCwgdmlld3BvcnRZLCBlbGVtZW50Q2VudGVyWCwgZWxlbWVudENlbnRlclkgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVQb2ludGVyID0gKHg6IG51bWJlciwgeTogbnVtYmVyLCBidXR0b246IFwidXBcIiB8IFwiZG93blwiKSA9PiB7XG4gICAgaWYgKCF4IHx8ICF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBvaW50ZXIgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGlmIChpc05hTihwb2ludGVyLngpIHx8IGlzTmFOKHBvaW50ZXIueSkpIHtcbiAgICAgIC8vIHNvbWV0aW1lcyB0aGUgcG9pbnRlciBnb2VzIG9mZiBzY3JlZW5cbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLm9uUG9pbnRlclVwZGF0ZT8uKHtcbiAgICAgIHBvaW50ZXIsXG4gICAgICBidXR0b24sXG4gICAgICBwb2ludGVyc01hcDogZ2VzdHVyZS5wb2ludGVycyxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkID0gZGVib3VuY2UoKCkgPT4ge1xuICAgIGlmICghdGhpcy51bm1vdW50ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlIH0pO1xuICAgIH1cbiAgfSwgMzAwKTtcblxuICBwcml2YXRlIHVwZGF0ZURPTVJlY3QgPSAoY2I/OiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgaWYgKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgY29uc3QgZXhjYWxpZHJhd0NvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgICAgICB0b3A6IG9mZnNldFRvcCxcbiAgICAgIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aDogY3VycmVudFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGN1cnJlbnRIZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogY3VycmVudE9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdDogY3VycmVudE9mZnNldExlZnQsXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgaWYgKFxuICAgICAgICB3aWR0aCA9PT0gY3VycmVudFdpZHRoICYmXG4gICAgICAgIGhlaWdodCA9PT0gY3VycmVudEhlaWdodCAmJlxuICAgICAgICBvZmZzZXRMZWZ0ID09PSBjdXJyZW50T2Zmc2V0TGVmdCAmJlxuICAgICAgICBvZmZzZXRUb3AgPT09IGN1cnJlbnRPZmZzZXRUb3BcbiAgICAgICkge1xuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBvZmZzZXRMZWZ0LFxuICAgICAgICAgIG9mZnNldFRvcCxcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGNiICYmIGNiKCk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgcmVmcmVzaCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgLi4udGhpcy5nZXRDYW52YXNPZmZzZXRzKCkgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRDYW52YXNPZmZzZXRzKCk6IFBpY2s8QXBwU3RhdGUsIFwib2Zmc2V0VG9wXCIgfCBcIm9mZnNldExlZnRcIj4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0TGVmdDogbGVmdCxcbiAgICAgICAgb2Zmc2V0VG9wOiB0b3AsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgb2Zmc2V0TGVmdDogMCxcbiAgICAgIG9mZnNldFRvcDogMCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVMYW5ndWFnZSgpIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZyA9XG4gICAgICBsYW5ndWFnZXMuZmluZCgobGFuZykgPT4gbGFuZy5jb2RlID09PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB8fFxuICAgICAgZGVmYXVsdExhbmc7XG4gICAgYXdhaXQgc2V0TGFuZ3VhZ2UoY3VycmVudExhbmcpO1xuICAgIHRoaXMuc2V0QXBwU3RhdGUoe30pO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBURVNUIEhPT0tTXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGg6IHtcbiAgICAgIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdO1xuICAgICAgc3RhdGU6IEFwcFN0YXRlO1xuICAgICAgc2V0U3RhdGU6IFJlYWN0LkNvbXBvbmVudDxhbnksIEFwcFN0YXRlPltcInNldFN0YXRlXCJdO1xuICAgICAgYXBwOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD47XG4gICAgICBoaXN0b3J5OiBIaXN0b3J5O1xuICAgIH07XG4gIH1cbn1cblxuaWYgKFxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHxcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVFxuKSB7XG4gIHdpbmRvdy5oID0gd2luZG93LmggfHwgKHt9IGFzIFdpbmRvd1tcImhcIl0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICAgICAgfSxcbiAgICAgIHNldChlbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHAuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBBcHA7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
1678
1678
 
1679
1679
  /***/ }),
1680
1680
 
@@ -1938,7 +1938,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1938
1938
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1939
1939
 
1940
1940
  "use strict";
1941
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LibraryUnit\": () => (/* binding */ LibraryUnit)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _scene_export__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene/export */ \"../../scene/export.ts\");\n/* harmony import */ var _LibraryUnit_scss__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./LibraryUnit.scss */ \"../../components/LibraryUnit.scss\");\n/* harmony import */ var _LibraryUnit_scss__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_LibraryUnit_scss__WEBPACK_IMPORTED_MODULE_9__);\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// fa-plus\r\nconst PLUS_ICON = ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"svg\", Object.assign({ viewBox: \"0 0 1792 1792\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"path\", { fill: \"currentColor\", d: \"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z\" }, void 0) }), void 0));\r\nconst LibraryUnit = ({ elements, files, pendingElements, onRemoveFromLibrary, onClick, }) => {\r\n const ref = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(null);\r\n (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)(() => {\r\n (() => __awaiter(void 0, void 0, void 0, function* () {\r\n const elementsToRender = elements || pendingElements;\r\n if (!elementsToRender) {\r\n return;\r\n }\r\n const svg = yield (0,_scene_export__WEBPACK_IMPORTED_MODULE_8__.exportToSvg)(elementsToRender, {\r\n exportBackground: false,\r\n viewBackgroundColor: open_color__WEBPACK_IMPORTED_MODULE_2__.white,\r\n }, files);\r\n if (ref.current) {\r\n ref.current.innerHTML = svg.outerHTML;\r\n }\r\n }))();\r\n }, [elements, pendingElements, files]);\r\n const [isHovered, setIsHovered] = (0,react__WEBPACK_IMPORTED_MODULE_3__.useState)(false);\r\n const isMobile = (0,_components_App__WEBPACK_IMPORTED_MODULE_7__.useIsMobile)();\r\n const adder = (isHovered || isMobile) && pendingElements && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"library-unit__adder\" }, { children: PLUS_ICON }), void 0));\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__.default)(\"library-unit\", {\r\n \"library-unit__active\": elements || pendingElements,\r\n }), onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false) }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__.default)(\"library-unit__dragger\", {\r\n \"library-unit__pulse\": !!pendingElements,\r\n }), ref: ref, draggable: !!elements, onClick: !!elements || !!pendingElements ? onClick : undefined, onDragStart: (event) => {\r\n setIsHovered(false);\r\n event.dataTransfer.setData(_constants__WEBPACK_IMPORTED_MODULE_5__.MIME_TYPES.excalidrawlib, JSON.stringify(elements));\r\n } }, void 0), adder, elements && (isHovered || isMobile) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: \"library-unit__removeFromLibrary\", \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.removeFromLibrary\"), onClick: onRemoveFromLibrary }, { children: _components_icons__WEBPACK_IMPORTED_MODULE_4__.close }), void 0))] }), void 0));\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU8sRUFBRSxtQkFBbUIsZ0JBRTNCLG9EQUFLLFlBQ0MsQ0FDVixhQUNHLENBQ1AsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0xpYnJhcnlVbml0LnRzeD84ODkyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjbHN4IGZyb20gXCJjbHN4XCI7XG5pbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY2xvc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9pY29uc1wiO1xuaW1wb3J0IHsgTUlNRV9UWVBFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgdXNlSXNNb2JpbGUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCB7IGV4cG9ydFRvU3ZnIH0gZnJvbSBcIi4uL3NjZW5lL2V4cG9ydFwiO1xuaW1wb3J0IHsgQmluYXJ5RmlsZXMsIExpYnJhcnlJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgXCIuL0xpYnJhcnlVbml0LnNjc3NcIjtcblxuLy8gZmEtcGx1c1xuY29uc3QgUExVU19JQ09OID0gKFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTc5MiAxNzkyXCI+XG4gICAgPHBhdGhcbiAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgZD1cIk0xNjAwIDczNnYxOTJxMCA0MC0yOCA2OHQtNjggMjhoLTQxNnY0MTZxMCA0MC0yOCA2OHQtNjggMjhoLTE5MnEtNDAgMC02OC0yOHQtMjgtNjh2LTQxNmgtNDE2cS00MCAwLTY4LTI4dC0yOC02OHYtMTkycTAtNDAgMjgtNjh0NjgtMjhoNDE2di00MTZxMC00MCAyOC02OHQ2OC0yOGgxOTJxNDAgMCA2OCAyOHQyOCA2OHY0MTZoNDE2cTQwIDAgNjggMjh0MjggNjh6XCJcbiAgICAvPlxuICA8L3N2Zz5cbik7XG5cbmV4cG9ydCBjb25zdCBMaWJyYXJ5VW5pdCA9ICh7XG4gIGVsZW1lbnRzLFxuICBmaWxlcyxcbiAgcGVuZGluZ0VsZW1lbnRzLFxuICBvblJlbW92ZUZyb21MaWJyYXJ5LFxuICBvbkNsaWNrLFxufToge1xuICBlbGVtZW50cz86IExpYnJhcnlJdGVtO1xuICBmaWxlczogQmluYXJ5RmlsZXM7XG4gIHBlbmRpbmdFbGVtZW50cz86IExpYnJhcnlJdGVtO1xuICBvblJlbW92ZUZyb21MaWJyYXJ5OiAoKSA9PiB2b2lkO1xuICBvbkNsaWNrOiAoKSA9PiB2b2lkO1xufSkgPT4ge1xuICBjb25zdCByZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudHNUb1JlbmRlciA9IGVsZW1lbnRzIHx8IHBlbmRpbmdFbGVtZW50cztcbiAgICAgIGlmICghZWxlbWVudHNUb1JlbmRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdmcgPSBhd2FpdCBleHBvcnRUb1N2ZyhcbiAgICAgICAgZWxlbWVudHNUb1JlbmRlcixcbiAgICAgICAge1xuICAgICAgICAgIGV4cG9ydEJhY2tncm91bmQ6IGZhbHNlLFxuICAgICAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IG9jLndoaXRlLFxuICAgICAgICB9LFxuICAgICAgICBmaWxlcyxcbiAgICAgICk7XG4gICAgICBpZiAocmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmVmLmN1cnJlbnQuaW5uZXJIVE1MID0gc3ZnLm91dGVySFRNTDtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9LCBbZWxlbWVudHMsIHBlbmRpbmdFbGVtZW50cywgZmlsZXNdKTtcblxuICBjb25zdCBbaXNIb3ZlcmVkLCBzZXRJc0hvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBpc01vYmlsZSA9IHVzZUlzTW9iaWxlKCk7XG5cbiAgY29uc3QgYWRkZXIgPSAoaXNIb3ZlcmVkIHx8IGlzTW9iaWxlKSAmJiBwZW5kaW5nRWxlbWVudHMgJiYgKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibGlicmFyeS11bml0X19hZGRlclwiPntQTFVTX0lDT059PC9kaXY+XG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXCJsaWJyYXJ5LXVuaXRcIiwge1xuICAgICAgICBcImxpYnJhcnktdW5pdF9fYWN0aXZlXCI6IGVsZW1lbnRzIHx8IHBlbmRpbmdFbGVtZW50cyxcbiAgICAgIH0pfVxuICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRJc0hvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldElzSG92ZXJlZChmYWxzZSl9XG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXCJsaWJyYXJ5LXVuaXRfX2RyYWdnZXJcIiwge1xuICAgICAgICAgIFwibGlicmFyeS11bml0X19wdWxzZVwiOiAhIXBlbmRpbmdFbGVtZW50cyxcbiAgICAgICAgfSl9XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBkcmFnZ2FibGU9eyEhZWxlbWVudHN9XG4gICAgICAgIG9uQ2xpY2s9eyEhZWxlbWVudHMgfHwgISFwZW5kaW5nRWxlbWVudHMgPyBvbkNsaWNrIDogdW5kZWZpbmVkfVxuICAgICAgICBvbkRyYWdTdGFydD17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgc2V0SXNIb3ZlcmVkKGZhbHNlKTtcbiAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcbiAgICAgICAgICAgIE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYixcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGVsZW1lbnRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIHthZGRlcn1cbiAgICAgIHtlbGVtZW50cyAmJiAoaXNIb3ZlcmVkIHx8IGlzTW9iaWxlKSAmJiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJsaWJyYXJ5LXVuaXRfX3JlbW92ZUZyb21MaWJyYXJ5XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPXt0KFwibGFiZWxzLnJlbW92ZUZyb21MaWJyYXJ5XCIpfVxuICAgICAgICAgIG9uQ2xpY2s9e29uUmVtb3ZlRnJvbUxpYnJhcnl9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2xvc2V9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/LibraryUnit.tsx\n");
1941
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LibraryUnit\": () => (/* binding */ LibraryUnit)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _scene_export__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene/export */ \"../../scene/export.ts\");\n/* harmony import */ var _LibraryUnit_scss__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./LibraryUnit.scss */ \"../../components/LibraryUnit.scss\");\n/* harmony import */ var _LibraryUnit_scss__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_LibraryUnit_scss__WEBPACK_IMPORTED_MODULE_9__);\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// fa-plus\r\nconst PLUS_ICON = ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"svg\", Object.assign({ viewBox: \"0 0 1792 1792\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"path\", { fill: \"currentColor\", d: \"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z\" }, void 0) }), void 0));\r\nconst LibraryUnit = ({ elements, files, pendingElements, onRemoveFromLibrary, onClick, }) => {\r\n const ref = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(null);\r\n (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)(() => {\r\n const node = ref.current;\r\n if (!node) {\r\n return;\r\n }\r\n (() => __awaiter(void 0, void 0, void 0, function* () {\r\n const elementsToRender = elements || pendingElements;\r\n if (!elementsToRender) {\r\n return;\r\n }\r\n const svg = yield (0,_scene_export__WEBPACK_IMPORTED_MODULE_8__.exportToSvg)(elementsToRender, {\r\n exportBackground: false,\r\n viewBackgroundColor: open_color__WEBPACK_IMPORTED_MODULE_2__.white,\r\n }, files);\r\n node.innerHTML = svg.outerHTML;\r\n }))();\r\n return () => {\r\n node.innerHTML = \"\";\r\n };\r\n }, [elements, pendingElements, files]);\r\n const [isHovered, setIsHovered] = (0,react__WEBPACK_IMPORTED_MODULE_3__.useState)(false);\r\n const isMobile = (0,_components_App__WEBPACK_IMPORTED_MODULE_7__.useIsMobile)();\r\n const adder = (isHovered || isMobile) && pendingElements && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"library-unit__adder\" }, { children: PLUS_ICON }), void 0));\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__.default)(\"library-unit\", {\r\n \"library-unit__active\": elements || pendingElements,\r\n }), onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false) }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__.default)(\"library-unit__dragger\", {\r\n \"library-unit__pulse\": !!pendingElements,\r\n }), ref: ref, draggable: !!elements, onClick: !!elements || !!pendingElements ? onClick : undefined, onDragStart: (event) => {\r\n setIsHovered(false);\r\n event.dataTransfer.setData(_constants__WEBPACK_IMPORTED_MODULE_5__.MIME_TYPES.excalidrawlib, JSON.stringify(elements));\r\n } }, void 0), adder, elements && (isHovered || isMobile) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: \"library-unit__removeFromLibrary\", \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_6__.t)(\"labels.removeFromLibrary\"), onClick: onRemoveFromLibrary }, { children: _components_icons__WEBPACK_IMPORTED_MODULE_4__.close }), void 0))] }), void 0));\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFRLElBQUksQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksQ0FDdEMsaUZBQ0UsU0FBUyxFQUFDLGlDQUFpQyxnQkFDL0Isd0NBQUMsQ0FBQywwQkFBMEIsQ0FBQyxFQUN6QyxPQUFPLEVBQUUsbUJBQW1CLGdCQUUzQixvREFBSyxZQUNDLENBQ1YsYUFDRyxDQUNQLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9MaWJyYXJ5VW5pdC50c3g/ODg5MiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNsb3NlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaWNvbnNcIjtcbmltcG9ydCB7IE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7IHVzZUlzTW9iaWxlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBleHBvcnRUb1N2ZyB9IGZyb20gXCIuLi9zY2VuZS9leHBvcnRcIjtcbmltcG9ydCB7IEJpbmFyeUZpbGVzLCBMaWJyYXJ5SXRlbSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IFwiLi9MaWJyYXJ5VW5pdC5zY3NzXCI7XG5cbi8vIGZhLXBsdXNcbmNvbnN0IFBMVVNfSUNPTiA9IChcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE3OTIgMTc5MlwiPlxuICAgIDxwYXRoXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgIGQ9XCJNMTYwMCA3MzZ2MTkycTAgNDAtMjggNjh0LTY4IDI4aC00MTZ2NDE2cTAgNDAtMjggNjh0LTY4IDI4aC0xOTJxLTQwIDAtNjgtMjh0LTI4LTY4di00MTZoLTQxNnEtNDAgMC02OC0yOHQtMjgtNjh2LTE5MnEwLTQwIDI4LTY4dDY4LTI4aDQxNnYtNDE2cTAtNDAgMjgtNjh0NjgtMjhoMTkycTQwIDAgNjggMjh0MjggNjh2NDE2aDQxNnE0MCAwIDY4IDI4dDI4IDY4elwiXG4gICAgLz5cbiAgPC9zdmc+XG4pO1xuXG5leHBvcnQgY29uc3QgTGlicmFyeVVuaXQgPSAoe1xuICBlbGVtZW50cyxcbiAgZmlsZXMsXG4gIHBlbmRpbmdFbGVtZW50cyxcbiAgb25SZW1vdmVGcm9tTGlicmFyeSxcbiAgb25DbGljayxcbn06IHtcbiAgZWxlbWVudHM/OiBMaWJyYXJ5SXRlbTtcbiAgZmlsZXM6IEJpbmFyeUZpbGVzO1xuICBwZW5kaW5nRWxlbWVudHM/OiBMaWJyYXJ5SXRlbTtcbiAgb25SZW1vdmVGcm9tTGlicmFyeTogKCkgPT4gdm9pZDtcbiAgb25DbGljazogKCkgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgcmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IHJlZi5jdXJyZW50O1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50c1RvUmVuZGVyID0gZWxlbWVudHMgfHwgcGVuZGluZ0VsZW1lbnRzO1xuICAgICAgaWYgKCFlbGVtZW50c1RvUmVuZGVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN2ZyA9IGF3YWl0IGV4cG9ydFRvU3ZnKFxuICAgICAgICBlbGVtZW50c1RvUmVuZGVyLFxuICAgICAgICB7XG4gICAgICAgICAgZXhwb3J0QmFja2dyb3VuZDogZmFsc2UsXG4gICAgICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogb2Mud2hpdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGZpbGVzLFxuICAgICAgKTtcbiAgICAgIG5vZGUuaW5uZXJIVE1MID0gc3ZnLm91dGVySFRNTDtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG5vZGUuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9O1xuICB9LCBbZWxlbWVudHMsIHBlbmRpbmdFbGVtZW50cywgZmlsZXNdKTtcblxuICBjb25zdCBbaXNIb3ZlcmVkLCBzZXRJc0hvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBpc01vYmlsZSA9IHVzZUlzTW9iaWxlKCk7XG5cbiAgY29uc3QgYWRkZXIgPSAoaXNIb3ZlcmVkIHx8IGlzTW9iaWxlKSAmJiBwZW5kaW5nRWxlbWVudHMgJiYgKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibGlicmFyeS11bml0X19hZGRlclwiPntQTFVTX0lDT059PC9kaXY+XG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Nsc3goXCJsaWJyYXJ5LXVuaXRcIiwge1xuICAgICAgICBcImxpYnJhcnktdW5pdF9fYWN0aXZlXCI6IGVsZW1lbnRzIHx8IHBlbmRpbmdFbGVtZW50cyxcbiAgICAgIH0pfVxuICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRJc0hvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldElzSG92ZXJlZChmYWxzZSl9XG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXCJsaWJyYXJ5LXVuaXRfX2RyYWdnZXJcIiwge1xuICAgICAgICAgIFwibGlicmFyeS11bml0X19wdWxzZVwiOiAhIXBlbmRpbmdFbGVtZW50cyxcbiAgICAgICAgfSl9XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBkcmFnZ2FibGU9eyEhZWxlbWVudHN9XG4gICAgICAgIG9uQ2xpY2s9eyEhZWxlbWVudHMgfHwgISFwZW5kaW5nRWxlbWVudHMgPyBvbkNsaWNrIDogdW5kZWZpbmVkfVxuICAgICAgICBvbkRyYWdTdGFydD17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgc2V0SXNIb3ZlcmVkKGZhbHNlKTtcbiAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcbiAgICAgICAgICAgIE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYixcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGVsZW1lbnRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIHthZGRlcn1cbiAgICAgIHtlbGVtZW50cyAmJiAoaXNIb3ZlcmVkIHx8IGlzTW9iaWxlKSAmJiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJsaWJyYXJ5LXVuaXRfX3JlbW92ZUZyb21MaWJyYXJ5XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPXt0KFwibGFiZWxzLnJlbW92ZUZyb21MaWJyYXJ5XCIpfVxuICAgICAgICAgIG9uQ2xpY2s9e29uUmVtb3ZlRnJvbUxpYnJhcnl9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2xvc2V9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/LibraryUnit.tsx\n");
1942
1942
 
1943
1943
  /***/ }),
1944
1944
 
@@ -2763,7 +2763,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2763
2763
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2764
2764
 
2765
2765
  "use strict";
2766
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserIdleState\": () => (/* binding */ UserIdleState)\n/* harmony export */ });\nvar UserIdleState;\r\n(function (UserIdleState) {\r\n UserIdleState[\"ACTIVE\"] = \"active\";\r\n UserIdleState[\"AWAY\"] = \"away\";\r\n UserIdleState[\"IDLE\"] = \"idle\";\r\n})(UserIdleState || (UserIdleState = {}));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdHlwZXMudHMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQTRQQSxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsa0NBQWlCO0lBQ2pCLDhCQUFhO0lBQ2IsOEJBQWE7QUFDZixDQUFDLEVBSlcsYUFBYSxLQUFiLGFBQWEsUUFJeEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdHlwZXMudHM/MDI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQb2ludGVyVHlwZSxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBDaGFydFR5cGUsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEZpbGVJZCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBUaGVtZSxcbn0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5pbXBvcnQgeyBQb2ludCBhcyBSb3VnaFBvaW50IH0gZnJvbSBcInJvdWdoanMvYmluL2dlb21ldHJ5XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBTdWdnZXN0ZWRCaW5kaW5nIH0gZnJvbSBcIi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuL2RhdGEvdHlwZXNcIjtcbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlUHJvbWlzZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTcHJlYWRzaGVldCB9IGZyb20gXCIuL2NoYXJ0c1wiO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tIFwiLi9pMThuXCI7XG5pbXBvcnQgeyBDbGlwYm9hcmREYXRhIH0gZnJvbSBcIi4vY2xpcGJvYXJkXCI7XG5pbXBvcnQgeyBpc092ZXJTY3JvbGxCYXJzIH0gZnJvbSBcIi4vc2NlbmVcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL2VsZW1lbnQvdHJhbnNmb3JtSGFuZGxlc1wiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVTeXN0ZW1IYW5kbGUgfSBmcm9tIFwiLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcbmltcG9ydCB0eXBlIHsgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTLCBNSU1FX1RZUEVTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBvaW50ID0gUmVhZG9ubHk8Um91Z2hQb2ludD47XG5cbmV4cG9ydCB0eXBlIENvbGxhYm9yYXRvciA9IHtcbiAgcG9pbnRlcj86IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9O1xuICBidXR0b24/OiBcInVwXCIgfCBcImRvd25cIjtcbiAgc2VsZWN0ZWRFbGVtZW50SWRzPzogQXBwU3RhdGVbXCJzZWxlY3RlZEVsZW1lbnRJZHNcIl07XG4gIHVzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgdXNlclN0YXRlPzogVXNlcklkbGVTdGF0ZTtcbiAgY29sb3I/OiB7XG4gICAgYmFja2dyb3VuZDogc3RyaW5nO1xuICAgIHN0cm9rZTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YVVSTCA9IHN0cmluZyAmIHsgX2JyYW5kOiBcIkRhdGFVUkxcIiB9O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlRGF0YSA9IHtcbiAgbWltZVR5cGU6XG4gICAgfCB0eXBlb2YgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTW251bWJlcl1cbiAgICAvLyBmdXR1cmUgdXNlciBvciB1bmtub3duIGZpbGUgdHlwZVxuICAgIHwgdHlwZW9mIE1JTUVfVFlQRVMuYmluYXJ5O1xuICBpZDogRmlsZUlkO1xuICBkYXRhVVJMOiBEYXRhVVJMO1xuICBjcmVhdGVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlTWV0YWRhdGEgPSBPbWl0PEJpbmFyeUZpbGVEYXRhLCBcImRhdGFVUkxcIj47XG5cbmV4cG9ydCB0eXBlIEJpbmFyeUZpbGVzID0gUmVjb3JkPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEJpbmFyeUZpbGVEYXRhPjtcblxuZXhwb3J0IHR5cGUgQXBwU3RhdGUgPSB7XG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICBkcmFnZ2luZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIHJlc2l6aW5nRWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbDtcbiAgbXVsdGlFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PiB8IG51bGw7XG4gIHNlbGVjdGlvbkVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGlzQmluZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIHN0YXJ0Qm91bmRFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ+IHwgbnVsbDtcbiAgc3VnZ2VzdGVkQmluZGluZ3M6IFN1Z2dlc3RlZEJpbmRpbmdbXTtcbiAgLy8gZWxlbWVudCBiZWluZyBlZGl0ZWQsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYWRkZWQgdG8gZWxlbWVudHMgYXJyYXkgeWV0XG4gIC8vIChlLmcuIHRleHQgZWxlbWVudCB3aGVuIHR5cGluZyBpbnRvIHRoZSBpbnB1dClcbiAgZWRpdGluZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBMaW5lYXJFbGVtZW50RWRpdG9yIHwgbnVsbDtcbiAgZWxlbWVudFR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdO1xuICBlbGVtZW50TG9ja2VkOiBib29sZWFuO1xuICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICBleHBvcnRFbWJlZFNjZW5lOiBib29sZWFuO1xuICBleHBvcnRXaXRoRGFya01vZGU6IGJvb2xlYW47XG4gIGV4cG9ydFNjYWxlOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1GaWxsU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wiZmlsbFN0eWxlXCJdO1xuICBjdXJyZW50SXRlbVN0cm9rZVdpZHRoOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU3R5bGVcIl07XG4gIGN1cnJlbnRJdGVtUm91Z2huZXNzOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtT3BhY2l0eTogbnVtYmVyO1xuICBjdXJyZW50SXRlbUZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG4gIGN1cnJlbnRJdGVtRm9udFNpemU6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1UZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICBjdXJyZW50SXRlbUVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICB2aWV3QmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIHNjcm9sbFg6IG51bWJlcjtcbiAgc2Nyb2xsWTogbnVtYmVyO1xuICBjdXJzb3JCdXR0b246IFwidXBcIiB8IFwiZG93blwiO1xuICBzY3JvbGxlZE91dHNpZGU6IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbiAgaXNSZXNpemluZzogYm9vbGVhbjtcbiAgaXNSb3RhdGluZzogYm9vbGVhbjtcbiAgem9vbTogWm9vbTtcbiAgb3Blbk1lbnU6IFwiY2FudmFzXCIgfCBcInNoYXBlXCIgfCBudWxsO1xuICBvcGVuUG9wdXA6XG4gICAgfCBcImNhbnZhc0NvbG9yUGlja2VyXCJcbiAgICB8IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCJcbiAgICB8IFwic3Ryb2tlQ29sb3JQaWNrZXJcIlxuICAgIHwgbnVsbDtcbiAgbGFzdFBvaW50ZXJEb3duV2l0aDogUG9pbnRlclR5cGU7XG4gIHNlbGVjdGVkRWxlbWVudElkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH07XG4gIHNob3VsZENhY2hlSWdub3JlWm9vbTogYm9vbGVhbjtcbiAgc2hvd0hlbHBEaWFsb2c6IGJvb2xlYW47XG4gIHRvYXN0TWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgemVuTW9kZUVuYWJsZWQ6IGJvb2xlYW47XG4gIHRoZW1lOiBUaGVtZTtcbiAgZ3JpZFNpemU6IG51bWJlciB8IG51bGw7XG4gIHZpZXdNb2RlRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKiogdG9wLW1vc3Qgc2VsZWN0ZWQgZ3JvdXBzIChpLmUuIGRvZXMgbm90IGluY2x1ZGUgbmVzdGVkIGdyb3VwcykgKi9cbiAgc2VsZWN0ZWRHcm91cElkczogeyBbZ3JvdXBJZDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICAvKiogZ3JvdXAgYmVpbmcgZWRpdGVkIHdoZW4geW91IGRyaWxsIGRvd24gdG8gaXRzIGNvbnN0aXR1ZW50IGVsZW1lbnRcbiAgICAoZS5nLiB3aGVuIHlvdSBkb3VibGUtY2xpY2sgb24gYSBncm91cCdzIGVsZW1lbnQpICovXG4gIGVkaXRpbmdHcm91cElkOiBHcm91cElkIHwgbnVsbDtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIG9mZnNldFRvcDogbnVtYmVyO1xuICBvZmZzZXRMZWZ0OiBudW1iZXI7XG5cbiAgaXNMaWJyYXJ5T3BlbjogYm9vbGVhbjtcbiAgZmlsZUhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGw7XG4gIGNvbGxhYm9yYXRvcnM6IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIHNob3dTdGF0czogYm9vbGVhbjtcbiAgY3VycmVudENoYXJ0VHlwZTogQ2hhcnRUeXBlO1xuICBwYXN0ZURpYWxvZzpcbiAgICB8IHtcbiAgICAgICAgc2hvd246IGZhbHNlO1xuICAgICAgICBkYXRhOiBudWxsO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzaG93bjogdHJ1ZTtcbiAgICAgICAgZGF0YTogU3ByZWFkc2hlZXQ7XG4gICAgICB9O1xuICAvKiogaW1hZ2VFbGVtZW50IHdhaXRpbmcgdG8gYmUgcGxhY2VkIG9uIGNhbnZhcyAqL1xuICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+IHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRab29tVmFsdWUgPSBudW1iZXIgJiB7IF9icmFuZDogXCJub3JtYWxpemVkWm9vbVwiIH07XG5cbmV4cG9ydCB0eXBlIFpvb20gPSBSZWFkb25seTx7XG4gIHZhbHVlOiBOb3JtYWxpemVkWm9vbVZhbHVlO1xuICB0cmFuc2xhdGlvbjogUmVhZG9ubHk8e1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0+O1xufT47XG5cbmV4cG9ydCB0eXBlIFBvaW50ZXJDb29yZHMgPSBSZWFkb25seTx7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufT47XG5cbmV4cG9ydCB0eXBlIEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBNYXA8bnVtYmVyLCBQb2ludGVyQ29vcmRzPjtcbiAgbGFzdENlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgaW5pdGlhbERpc3RhbmNlOiBudW1iZXIgfCBudWxsO1xuICBpbml0aWFsU2NhbGU6IG51bWJlciB8IG51bGw7XG59O1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBHZXN0dXJlRXZlbnQgZXh0ZW5kcyBVSUV2ZW50IHtcbiAgcmVhZG9ubHkgcm90YXRpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NhbGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW0gPSByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1zID0gcmVhZG9ubHkgTGlicmFyeUl0ZW1bXTtcblxuLy8gTk9URSByZWFkeS9yZWFkeVByb21pc2UgcHJvcHMgYXJlIG9wdGlvbmFsIGZvciBob3N0IGFwcHMnIHNha2UgKG91ciBvd25cbi8vIGltcGxlbSBndWFyYW50ZWVzIGV4aXN0ZW5jZSlcbmV4cG9ydCB0eXBlIEV4Y2FsaWRyYXdBUElSZWZWYWx1ZSA9XG4gIHwgRXhjYWxpZHJhd0ltcGVyYXRpdmVBUElcbiAgfCB7XG4gICAgICByZWFkeVByb21pc2U/OiBSZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST47XG4gICAgICByZWFkeT86IGZhbHNlO1xuICAgIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjYWxpZHJhd1Byb3BzIHtcbiAgb25DaGFuZ2U/OiAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgKSA9PiB2b2lkO1xuICBpbml0aWFsRGF0YT86IEltcG9ydGVkRGF0YVN0YXRlIHwgbnVsbCB8IFByb21pc2U8SW1wb3J0ZWREYXRhU3RhdGUgfCBudWxsPjtcbiAgZXhjYWxpZHJhd1JlZj86IEZvcndhcmRSZWY8RXhjYWxpZHJhd0FQSVJlZlZhbHVlPjtcbiAgb25Db2xsYWJCdXR0b25DbGljaz86ICgpID0+IHZvaWQ7XG4gIGlzQ29sbGFib3JhdGluZz86IGJvb2xlYW47XG4gIG9uUG9pbnRlclVwZGF0ZT86IChwYXlsb2FkOiB7XG4gICAgcG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAgIGJ1dHRvbjogXCJkb3duXCIgfCBcInVwXCI7XG4gICAgcG9pbnRlcnNNYXA6IEdlc3R1cmVbXCJwb2ludGVyc1wiXTtcbiAgfSkgPT4gdm9pZDtcbiAgb25QYXN0ZT86IChcbiAgICBkYXRhOiBDbGlwYm9hcmREYXRhLFxuICAgIGV2ZW50OiBDbGlwYm9hcmRFdmVudCB8IG51bGwsXG4gICkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW47XG4gIG9uRHJvcD86IChcbiAgICBldmVudDogUmVhY3QuRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PixcbiAgKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgcmVuZGVyVG9wUmlnaHRVST86IChcbiAgICBpc01vYmlsZTogYm9vbGVhbixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkgPT4gSlNYLkVsZW1lbnQgfCBudWxsO1xuICByZW5kZXJGb290ZXI/OiAoaXNNb2JpbGU6IGJvb2xlYW4sIGFwcFN0YXRlOiBBcHBTdGF0ZSkgPT4gSlNYLkVsZW1lbnQ7XG4gIGxhbmdDb2RlPzogTGFuZ3VhZ2VbXCJjb2RlXCJdO1xuICB2aWV3TW9kZUVuYWJsZWQ/OiBib29sZWFuO1xuICB6ZW5Nb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIGdyaWRNb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIGxpYnJhcnlSZXR1cm5Vcmw/OiBzdHJpbmc7XG4gIHRoZW1lPzogVGhlbWU7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHJlbmRlckN1c3RvbVN0YXRzPzogKFxuICAgIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkgPT4gSlNYLkVsZW1lbnQ7XG4gIFVJT3B0aW9ucz86IFVJT3B0aW9ucztcbiAgZGV0ZWN0U2Nyb2xsPzogYm9vbGVhbjtcbiAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseT86IGJvb2xlYW47XG4gIG9uTGlicmFyeUNoYW5nZT86IChsaWJyYXJ5SXRlbXM6IExpYnJhcnlJdGVtcykgPT4gdm9pZCB8IFByb21pc2U8YW55PjtcbiAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgb25CZWZvcmVUZXh0RWRpdD86ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiBzdHJpbmc7XG4gIG9uQmVmb3JlVGV4dFN1Ym1pdD86IChcbiAgICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIHRleHRUb1N1Ym1pdDogc3RyaW5nLFxuICAgIGlzRGVsZXRlZDogYm9vbGVhbixcbiAgKSA9PiBzdHJpbmc7XG4gIGdlbmVyYXRlSWRGb3JGaWxlPzogKGZpbGU6IEZpbGUpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbn1cblxuZXhwb3J0IHR5cGUgU2NlbmVEYXRhID0ge1xuICBlbGVtZW50cz86IEltcG9ydGVkRGF0YVN0YXRlW1wiZWxlbWVudHNcIl07XG4gIGFwcFN0YXRlPzogSW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXTtcbiAgY29sbGFib3JhdG9ycz86IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIGNvbW1pdFRvSGlzdG9yeT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZW51bSBVc2VySWRsZVN0YXRlIHtcbiAgQUNUSVZFID0gXCJhY3RpdmVcIixcbiAgQVdBWSA9IFwiYXdheVwiLFxuICBJRExFID0gXCJpZGxlXCIsXG59XG5cbmV4cG9ydCB0eXBlIEV4cG9ydE9wdHMgPSB7XG4gIHNhdmVGaWxlVG9EaXNrPzogYm9vbGVhbjtcbiAgb25FeHBvcnRUb0JhY2tlbmQ/OiAoXG4gICAgZXhwb3J0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgKSA9PiB2b2lkO1xuICByZW5kZXJDdXN0b21VST86IChcbiAgICBleHBvcnRlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICApID0+IEpTWC5FbGVtZW50O1xufTtcblxudHlwZSBDYW52YXNBY3Rpb25zID0ge1xuICBjaGFuZ2VWaWV3QmFja2dyb3VuZENvbG9yPzogYm9vbGVhbjtcbiAgY2xlYXJDYW52YXM/OiBib29sZWFuO1xuICBleHBvcnQ/OiBmYWxzZSB8IEV4cG9ydE9wdHM7XG4gIGxvYWRTY2VuZT86IGJvb2xlYW47XG4gIHNhdmVUb0FjdGl2ZUZpbGU/OiBib29sZWFuO1xuICB0aGVtZT86IGJvb2xlYW47XG4gIHNhdmVBc0ltYWdlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFVJT3B0aW9ucyA9IHtcbiAgY2FudmFzQWN0aW9ucz86IENhbnZhc0FjdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBBcHBQcm9wcyA9IEV4Y2FsaWRyYXdQcm9wcyAmIHtcbiAgVUlPcHRpb25zOiB7XG4gICAgY2FudmFzQWN0aW9uczogUmVxdWlyZWQ8Q2FudmFzQWN0aW9ucz4gJiB7IGV4cG9ydDogRXhwb3J0T3B0cyB9O1xuICB9O1xuICBkZXRlY3RTY3JvbGw6IGJvb2xlYW47XG4gIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk6IGJvb2xlYW47XG59O1xuXG4vKiogQSBzdWJzZXQgb2YgQXBwIGNsYXNzIHByb3BlcnRpZXMgdGhhdCB3ZSBuZWVkIHRvIHVzZSBlbHNld2hlcmVcbiAqIGluIHRoZSBhcHAsIGVnIE1hbmFnZXIuIEZhY3RvcmVkIG91dCBpbnRvIGEgc2VwYXJhdGUgdHlwZSB0byBrZWVwIERSWS4gKi9cbmV4cG9ydCB0eXBlIEFwcENsYXNzUHJvcGVydGllcyA9IHtcbiAgcHJvcHM6IEFwcFByb3BzO1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZm9jdXNDb250YWluZXIoKTogdm9pZDtcbiAgbGlicmFyeTogTGlicmFyeTtcbiAgaW1hZ2VDYWNoZTogTWFwPFxuICAgIEZpbGVJZCxcbiAgICB7XG4gICAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD47XG4gICAgICBtaW1lVHlwZTogdHlwZW9mIEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFU1tudW1iZXJdO1xuICAgIH1cbiAgPjtcbiAgZmlsZXM6IEJpbmFyeUZpbGVzO1xufTtcblxuZXhwb3J0IHR5cGUgUG9pbnRlckRvd25TdGF0ZSA9IFJlYWRvbmx5PHtcbiAgLy8gVGhlIGZpcnN0IHBvc2l0aW9uIGF0IHdoaWNoIHBvaW50ZXJEb3duIGhhcHBlbmVkXG4gIG9yaWdpbjogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PjtcbiAgLy8gU2FtZSBhcyBcIm9yaWdpblwiIGJ1dCBzbmFwcGVkIHRvIHRoZSBncmlkLCBpZiBncmlkIGlzIG9uXG4gIG9yaWdpbkluR3JpZDogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PjtcbiAgLy8gU2Nyb2xsYmFyIGNoZWNrc1xuICBzY3JvbGxiYXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBpc092ZXJTY3JvbGxCYXJzPjtcbiAgLy8gVGhlIHByZXZpb3VzIHBvaW50ZXIgcG9zaXRpb25cbiAgbGFzdENvb3JkczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAvLyBtYXAgb2Ygb3JpZ2luYWwgZWxlbWVudHMgZGF0YVxuICBvcmlnaW5hbEVsZW1lbnRzOiBNYXA8c3RyaW5nLCBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50Pj47XG4gIHJlc2l6ZToge1xuICAgIC8vIEhhbmRsZSB3aGVuIHJlc2l6aW5nLCBtaWdodCBjaGFuZ2UgZHVyaW5nIHRoZSBwb2ludGVyIGludGVyYWN0aW9uXG4gICAgaGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBpc1Jlc2l6aW5nOiBib29sZWFuO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvZmZzZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIgfCBcImVuZFwiO1xuICAgIC8vIFRoaXMgaXMgYSBjZW50ZXIgcG9pbnQgb2Ygc2VsZWN0ZWQgZWxlbWVudHMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnQgKGZvciByb3RhdGlvbiBvbmx5KVxuICAgIGNlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICB9O1xuICBoaXQ6IHtcbiAgICAvLyBUaGUgZWxlbWVudCB0aGUgcG9pbnRlciBpcyBcImhpdHRpbmdcIiwgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbFxuICAgIC8vIHBvaW50ZXIgZG93biBldmVudFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbDtcbiAgICAvLyBUaGUgZWxlbWVudHMgdGhlIHBvaW50ZXIgaXMgXCJoaXR0aW5nXCIsIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWxcbiAgICAvLyBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBhbGxIaXRFbGVtZW50czogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXTtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgd2FzQWRkZWRUb1NlbGVjdGlvbjogYm9vbGVhbjtcbiAgICAvLyBXaGV0aGVyIHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkdXBsaWNhdGVkLCBtaWdodCBjaGFuZ2UgZHVyaW5nIHRoZVxuICAgIC8vIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgICBoYXNCZWVuRHVwbGljYXRlZDogYm9vbGVhbjtcbiAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czogYm9vbGVhbjtcbiAgfTtcbiAgd2l0aENtZE9yQ3RybDogYm9vbGVhbjtcbiAgZHJhZzoge1xuICAgIC8vIE1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhdGlvblxuICAgIGhhc09jY3VycmVkOiBib29sZWFuO1xuICAgIC8vIE1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhdGlvblxuICAgIG9mZnNldDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgfTtcbiAgLy8gV2UgbmVlZCB0byBoYXZlIHRoZXNlIGluIHRoZSBzdGF0ZSBzbyB0aGF0IHdlIGNhbiB1bnN1YnNjcmliZSB0aGVtXG4gIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uTW92ZTogbnVsbCB8ICgoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCk7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uVXA6IG51bGwgfCAoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQpO1xuICAgIC8vIEl0J3MgZGVmaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvbktleURvd246IG51bGwgfCAoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkKTtcbiAgICAvLyBJdCdzIGRlZmluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb25LZXlVcDogbnVsbCB8ICgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQpO1xuICB9O1xufT47XG5cbmV4cG9ydCB0eXBlIEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICB1cGRhdGVTY2VuZTogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1widXBkYXRlU2NlbmVcIl07XG4gIHJlc2V0U2NlbmU6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInJlc2V0U2NlbmVcIl07XG4gIGdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkOiBJbnN0YW5jZVR5cGU8XG4gICAgdHlwZW9mIEFwcFxuICA+W1wiZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWRcIl07XG4gIGhpc3Rvcnk6IHtcbiAgICBjbGVhcjogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wicmVzZXRIaXN0b3J5XCJdO1xuICB9O1xuICBzY3JvbGxUb0NvbnRlbnQ6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInNjcm9sbFRvQ29udGVudFwiXTtcbiAgem9vbVRvRml0OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJ6b29tVG9GaXRcIl07XG4gIGdldFNjZW5lRWxlbWVudHM6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImdldFNjZW5lRWxlbWVudHNcIl07XG4gIGdldEFwcFN0YXRlOiAoKSA9PiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzdGF0ZVwiXTtcbiAgZ2V0RmlsZXM6ICgpID0+IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImZpbGVzXCJdO1xuICByZWZyZXNoOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZWZyZXNoXCJdO1xuICBpbXBvcnRMaWJyYXJ5OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJpbXBvcnRMaWJyYXJ5RnJvbVVybFwiXTtcbiAgc2V0VG9hc3RNZXNzYWdlOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzZXRUb2FzdE1lc3NhZ2VcIl07XG4gIGFkZEZpbGVzOiAoZGF0YTogQmluYXJ5RmlsZURhdGFbXSkgPT4gdm9pZDtcbiAgcmVhZHlQcm9taXNlOiBSZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST47XG4gIHJlYWR5OiB0cnVlO1xuICBpZDogc3RyaW5nO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../types.ts\n");
2766
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserIdleState\": () => (/* binding */ UserIdleState)\n/* harmony export */ });\nvar UserIdleState;\r\n(function (UserIdleState) {\r\n UserIdleState[\"ACTIVE\"] = \"active\";\r\n UserIdleState[\"AWAY\"] = \"away\";\r\n UserIdleState[\"IDLE\"] = \"idle\";\r\n})(UserIdleState || (UserIdleState = {}));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdHlwZXMudHMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQTRQQSxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsa0NBQWlCO0lBQ2pCLDhCQUFhO0lBQ2IsOEJBQWE7QUFDZixDQUFDLEVBSlcsYUFBYSxLQUFiLGFBQWEsUUFJeEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdHlwZXMudHM/MDI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQb2ludGVyVHlwZSxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBDaGFydFR5cGUsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRmlsZUlkLFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBUaGVtZSxcbn0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5pbXBvcnQgeyBQb2ludCBhcyBSb3VnaFBvaW50IH0gZnJvbSBcInJvdWdoanMvYmluL2dlb21ldHJ5XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBTdWdnZXN0ZWRCaW5kaW5nIH0gZnJvbSBcIi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuL2RhdGEvdHlwZXNcIjtcbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlUHJvbWlzZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTcHJlYWRzaGVldCB9IGZyb20gXCIuL2NoYXJ0c1wiO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tIFwiLi9pMThuXCI7XG5pbXBvcnQgeyBDbGlwYm9hcmREYXRhIH0gZnJvbSBcIi4vY2xpcGJvYXJkXCI7XG5pbXBvcnQgeyBpc092ZXJTY3JvbGxCYXJzIH0gZnJvbSBcIi4vc2NlbmVcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL2VsZW1lbnQvdHJhbnNmb3JtSGFuZGxlc1wiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVTeXN0ZW1IYW5kbGUgfSBmcm9tIFwiLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcbmltcG9ydCB0eXBlIHsgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTLCBNSU1FX1RZUEVTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBvaW50ID0gUmVhZG9ubHk8Um91Z2hQb2ludD47XG5cbmV4cG9ydCB0eXBlIENvbGxhYm9yYXRvciA9IHtcbiAgcG9pbnRlcj86IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9O1xuICBidXR0b24/OiBcInVwXCIgfCBcImRvd25cIjtcbiAgc2VsZWN0ZWRFbGVtZW50SWRzPzogQXBwU3RhdGVbXCJzZWxlY3RlZEVsZW1lbnRJZHNcIl07XG4gIHVzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgdXNlclN0YXRlPzogVXNlcklkbGVTdGF0ZTtcbiAgY29sb3I/OiB7XG4gICAgYmFja2dyb3VuZDogc3RyaW5nO1xuICAgIHN0cm9rZTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YVVSTCA9IHN0cmluZyAmIHsgX2JyYW5kOiBcIkRhdGFVUkxcIiB9O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlRGF0YSA9IHtcbiAgbWltZVR5cGU6XG4gICAgfCB0eXBlb2YgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTW251bWJlcl1cbiAgICAvLyBmdXR1cmUgdXNlciBvciB1bmtub3duIGZpbGUgdHlwZVxuICAgIHwgdHlwZW9mIE1JTUVfVFlQRVMuYmluYXJ5O1xuICBpZDogRmlsZUlkO1xuICBkYXRhVVJMOiBEYXRhVVJMO1xuICBjcmVhdGVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlTWV0YWRhdGEgPSBPbWl0PEJpbmFyeUZpbGVEYXRhLCBcImRhdGFVUkxcIj47XG5cbmV4cG9ydCB0eXBlIEJpbmFyeUZpbGVzID0gUmVjb3JkPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEJpbmFyeUZpbGVEYXRhPjtcblxuZXhwb3J0IHR5cGUgQXBwU3RhdGUgPSB7XG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICBkcmFnZ2luZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIHJlc2l6aW5nRWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbDtcbiAgbXVsdGlFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PiB8IG51bGw7XG4gIHNlbGVjdGlvbkVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGlzQmluZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIHN0YXJ0Qm91bmRFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ+IHwgbnVsbDtcbiAgc3VnZ2VzdGVkQmluZGluZ3M6IFN1Z2dlc3RlZEJpbmRpbmdbXTtcbiAgLy8gZWxlbWVudCBiZWluZyBlZGl0ZWQsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYWRkZWQgdG8gZWxlbWVudHMgYXJyYXkgeWV0XG4gIC8vIChlLmcuIHRleHQgZWxlbWVudCB3aGVuIHR5cGluZyBpbnRvIHRoZSBpbnB1dClcbiAgZWRpdGluZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBMaW5lYXJFbGVtZW50RWRpdG9yIHwgbnVsbDtcbiAgZWxlbWVudFR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdO1xuICBlbGVtZW50TG9ja2VkOiBib29sZWFuO1xuICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICBleHBvcnRFbWJlZFNjZW5lOiBib29sZWFuO1xuICBleHBvcnRXaXRoRGFya01vZGU6IGJvb2xlYW47XG4gIGV4cG9ydFNjYWxlOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1GaWxsU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wiZmlsbFN0eWxlXCJdO1xuICBjdXJyZW50SXRlbVN0cm9rZVdpZHRoOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU3R5bGVcIl07XG4gIGN1cnJlbnRJdGVtUm91Z2huZXNzOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtT3BhY2l0eTogbnVtYmVyO1xuICBjdXJyZW50SXRlbUZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG4gIGN1cnJlbnRJdGVtRm9udFNpemU6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1UZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICBjdXJyZW50SXRlbUVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICB2aWV3QmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIHNjcm9sbFg6IG51bWJlcjtcbiAgc2Nyb2xsWTogbnVtYmVyO1xuICBjdXJzb3JCdXR0b246IFwidXBcIiB8IFwiZG93blwiO1xuICBzY3JvbGxlZE91dHNpZGU6IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbiAgaXNSZXNpemluZzogYm9vbGVhbjtcbiAgaXNSb3RhdGluZzogYm9vbGVhbjtcbiAgem9vbTogWm9vbTtcbiAgb3Blbk1lbnU6IFwiY2FudmFzXCIgfCBcInNoYXBlXCIgfCBudWxsO1xuICBvcGVuUG9wdXA6XG4gICAgfCBcImNhbnZhc0NvbG9yUGlja2VyXCJcbiAgICB8IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCJcbiAgICB8IFwic3Ryb2tlQ29sb3JQaWNrZXJcIlxuICAgIHwgbnVsbDtcbiAgbGFzdFBvaW50ZXJEb3duV2l0aDogUG9pbnRlclR5cGU7XG4gIHNlbGVjdGVkRWxlbWVudElkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH07XG4gIHNob3VsZENhY2hlSWdub3JlWm9vbTogYm9vbGVhbjtcbiAgc2hvd0hlbHBEaWFsb2c6IGJvb2xlYW47XG4gIHRvYXN0TWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgemVuTW9kZUVuYWJsZWQ6IGJvb2xlYW47XG4gIHRoZW1lOiBUaGVtZTtcbiAgZ3JpZFNpemU6IG51bWJlciB8IG51bGw7XG4gIHZpZXdNb2RlRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKiogdG9wLW1vc3Qgc2VsZWN0ZWQgZ3JvdXBzIChpLmUuIGRvZXMgbm90IGluY2x1ZGUgbmVzdGVkIGdyb3VwcykgKi9cbiAgc2VsZWN0ZWRHcm91cElkczogeyBbZ3JvdXBJZDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICAvKiogZ3JvdXAgYmVpbmcgZWRpdGVkIHdoZW4geW91IGRyaWxsIGRvd24gdG8gaXRzIGNvbnN0aXR1ZW50IGVsZW1lbnRcbiAgICAoZS5nLiB3aGVuIHlvdSBkb3VibGUtY2xpY2sgb24gYSBncm91cCdzIGVsZW1lbnQpICovXG4gIGVkaXRpbmdHcm91cElkOiBHcm91cElkIHwgbnVsbDtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIG9mZnNldFRvcDogbnVtYmVyO1xuICBvZmZzZXRMZWZ0OiBudW1iZXI7XG5cbiAgaXNMaWJyYXJ5T3BlbjogYm9vbGVhbjtcbiAgZmlsZUhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGw7XG4gIGNvbGxhYm9yYXRvcnM6IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIHNob3dTdGF0czogYm9vbGVhbjtcbiAgY3VycmVudENoYXJ0VHlwZTogQ2hhcnRUeXBlO1xuICBwYXN0ZURpYWxvZzpcbiAgICB8IHtcbiAgICAgICAgc2hvd246IGZhbHNlO1xuICAgICAgICBkYXRhOiBudWxsO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzaG93bjogdHJ1ZTtcbiAgICAgICAgZGF0YTogU3ByZWFkc2hlZXQ7XG4gICAgICB9O1xuICAvKiogaW1hZ2VFbGVtZW50IHdhaXRpbmcgdG8gYmUgcGxhY2VkIG9uIGNhbnZhcyAqL1xuICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+IHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRab29tVmFsdWUgPSBudW1iZXIgJiB7IF9icmFuZDogXCJub3JtYWxpemVkWm9vbVwiIH07XG5cbmV4cG9ydCB0eXBlIFpvb20gPSBSZWFkb25seTx7XG4gIHZhbHVlOiBOb3JtYWxpemVkWm9vbVZhbHVlO1xuICB0cmFuc2xhdGlvbjogUmVhZG9ubHk8e1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0+O1xufT47XG5cbmV4cG9ydCB0eXBlIFBvaW50ZXJDb29yZHMgPSBSZWFkb25seTx7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufT47XG5cbmV4cG9ydCB0eXBlIEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBNYXA8bnVtYmVyLCBQb2ludGVyQ29vcmRzPjtcbiAgbGFzdENlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgaW5pdGlhbERpc3RhbmNlOiBudW1iZXIgfCBudWxsO1xuICBpbml0aWFsU2NhbGU6IG51bWJlciB8IG51bGw7XG59O1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBHZXN0dXJlRXZlbnQgZXh0ZW5kcyBVSUV2ZW50IHtcbiAgcmVhZG9ubHkgcm90YXRpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NhbGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW0gPSByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1zID0gcmVhZG9ubHkgTGlicmFyeUl0ZW1bXTtcblxuLy8gTk9URSByZWFkeS9yZWFkeVByb21pc2UgcHJvcHMgYXJlIG9wdGlvbmFsIGZvciBob3N0IGFwcHMnIHNha2UgKG91ciBvd25cbi8vIGltcGxlbSBndWFyYW50ZWVzIGV4aXN0ZW5jZSlcbmV4cG9ydCB0eXBlIEV4Y2FsaWRyYXdBUElSZWZWYWx1ZSA9XG4gIHwgRXhjYWxpZHJhd0ltcGVyYXRpdmVBUElcbiAgfCB7XG4gICAgICByZWFkeVByb21pc2U/OiBSZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST47XG4gICAgICByZWFkeT86IGZhbHNlO1xuICAgIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjYWxpZHJhd1Byb3BzIHtcbiAgb25DaGFuZ2U/OiAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgKSA9PiB2b2lkO1xuICBpbml0aWFsRGF0YT86IEltcG9ydGVkRGF0YVN0YXRlIHwgbnVsbCB8IFByb21pc2U8SW1wb3J0ZWREYXRhU3RhdGUgfCBudWxsPjtcbiAgZXhjYWxpZHJhd1JlZj86IEZvcndhcmRSZWY8RXhjYWxpZHJhd0FQSVJlZlZhbHVlPjtcbiAgb25Db2xsYWJCdXR0b25DbGljaz86ICgpID0+IHZvaWQ7XG4gIGlzQ29sbGFib3JhdGluZz86IGJvb2xlYW47XG4gIG9uUG9pbnRlclVwZGF0ZT86IChwYXlsb2FkOiB7XG4gICAgcG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAgIGJ1dHRvbjogXCJkb3duXCIgfCBcInVwXCI7XG4gICAgcG9pbnRlcnNNYXA6IEdlc3R1cmVbXCJwb2ludGVyc1wiXTtcbiAgfSkgPT4gdm9pZDtcbiAgb25QYXN0ZT86IChcbiAgICBkYXRhOiBDbGlwYm9hcmREYXRhLFxuICAgIGV2ZW50OiBDbGlwYm9hcmRFdmVudCB8IG51bGwsXG4gICkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW47XG4gIG9uRHJvcD86IChcbiAgICBldmVudDogUmVhY3QuRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PixcbiAgKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgcmVuZGVyVG9wUmlnaHRVST86IChcbiAgICBpc01vYmlsZTogYm9vbGVhbixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkgPT4gSlNYLkVsZW1lbnQgfCBudWxsO1xuICByZW5kZXJGb290ZXI/OiAoaXNNb2JpbGU6IGJvb2xlYW4sIGFwcFN0YXRlOiBBcHBTdGF0ZSkgPT4gSlNYLkVsZW1lbnQ7XG4gIGxhbmdDb2RlPzogTGFuZ3VhZ2VbXCJjb2RlXCJdO1xuICB2aWV3TW9kZUVuYWJsZWQ/OiBib29sZWFuO1xuICB6ZW5Nb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIGdyaWRNb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIGxpYnJhcnlSZXR1cm5Vcmw/OiBzdHJpbmc7XG4gIHRoZW1lPzogVGhlbWU7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHJlbmRlckN1c3RvbVN0YXRzPzogKFxuICAgIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkgPT4gSlNYLkVsZW1lbnQ7XG4gIFVJT3B0aW9ucz86IFVJT3B0aW9ucztcbiAgZGV0ZWN0U2Nyb2xsPzogYm9vbGVhbjtcbiAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseT86IGJvb2xlYW47XG4gIG9uTGlicmFyeUNoYW5nZT86IChsaWJyYXJ5SXRlbXM6IExpYnJhcnlJdGVtcykgPT4gdm9pZCB8IFByb21pc2U8YW55PjtcbiAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgb25CZWZvcmVUZXh0RWRpdD86ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiBzdHJpbmc7XG4gIG9uQmVmb3JlVGV4dFN1Ym1pdD86IChcbiAgICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIHRleHRUb1N1Ym1pdDogc3RyaW5nLFxuICAgIGlzRGVsZXRlZDogYm9vbGVhbixcbiAgKSA9PiBzdHJpbmc7XG4gIGdlbmVyYXRlSWRGb3JGaWxlPzogKGZpbGU6IEZpbGUpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbn1cblxuZXhwb3J0IHR5cGUgU2NlbmVEYXRhID0ge1xuICBlbGVtZW50cz86IEltcG9ydGVkRGF0YVN0YXRlW1wiZWxlbWVudHNcIl07XG4gIGFwcFN0YXRlPzogSW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXTtcbiAgY29sbGFib3JhdG9ycz86IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIGNvbW1pdFRvSGlzdG9yeT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZW51bSBVc2VySWRsZVN0YXRlIHtcbiAgQUNUSVZFID0gXCJhY3RpdmVcIixcbiAgQVdBWSA9IFwiYXdheVwiLFxuICBJRExFID0gXCJpZGxlXCIsXG59XG5cbmV4cG9ydCB0eXBlIEV4cG9ydE9wdHMgPSB7XG4gIHNhdmVGaWxlVG9EaXNrPzogYm9vbGVhbjtcbiAgb25FeHBvcnRUb0JhY2tlbmQ/OiAoXG4gICAgZXhwb3J0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgKSA9PiB2b2lkO1xuICByZW5kZXJDdXN0b21VST86IChcbiAgICBleHBvcnRlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICApID0+IEpTWC5FbGVtZW50O1xufTtcblxudHlwZSBDYW52YXNBY3Rpb25zID0ge1xuICBjaGFuZ2VWaWV3QmFja2dyb3VuZENvbG9yPzogYm9vbGVhbjtcbiAgY2xlYXJDYW52YXM/OiBib29sZWFuO1xuICBleHBvcnQ/OiBmYWxzZSB8IEV4cG9ydE9wdHM7XG4gIGxvYWRTY2VuZT86IGJvb2xlYW47XG4gIHNhdmVUb0FjdGl2ZUZpbGU/OiBib29sZWFuO1xuICB0aGVtZT86IGJvb2xlYW47XG4gIHNhdmVBc0ltYWdlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFVJT3B0aW9ucyA9IHtcbiAgY2FudmFzQWN0aW9ucz86IENhbnZhc0FjdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBBcHBQcm9wcyA9IEV4Y2FsaWRyYXdQcm9wcyAmIHtcbiAgVUlPcHRpb25zOiB7XG4gICAgY2FudmFzQWN0aW9uczogUmVxdWlyZWQ8Q2FudmFzQWN0aW9ucz4gJiB7IGV4cG9ydDogRXhwb3J0T3B0cyB9O1xuICB9O1xuICBkZXRlY3RTY3JvbGw6IGJvb2xlYW47XG4gIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk6IGJvb2xlYW47XG59O1xuXG4vKiogQSBzdWJzZXQgb2YgQXBwIGNsYXNzIHByb3BlcnRpZXMgdGhhdCB3ZSBuZWVkIHRvIHVzZSBlbHNld2hlcmVcbiAqIGluIHRoZSBhcHAsIGVnIE1hbmFnZXIuIEZhY3RvcmVkIG91dCBpbnRvIGEgc2VwYXJhdGUgdHlwZSB0byBrZWVwIERSWS4gKi9cbmV4cG9ydCB0eXBlIEFwcENsYXNzUHJvcGVydGllcyA9IHtcbiAgcHJvcHM6IEFwcFByb3BzO1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZm9jdXNDb250YWluZXIoKTogdm9pZDtcbiAgbGlicmFyeTogTGlicmFyeTtcbiAgaW1hZ2VDYWNoZTogTWFwPFxuICAgIEZpbGVJZCxcbiAgICB7XG4gICAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD47XG4gICAgICBtaW1lVHlwZTogdHlwZW9mIEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFU1tudW1iZXJdO1xuICAgIH1cbiAgPjtcbiAgZmlsZXM6IEJpbmFyeUZpbGVzO1xufTtcblxuZXhwb3J0IHR5cGUgUG9pbnRlckRvd25TdGF0ZSA9IFJlYWRvbmx5PHtcbiAgLy8gVGhlIGZpcnN0IHBvc2l0aW9uIGF0IHdoaWNoIHBvaW50ZXJEb3duIGhhcHBlbmVkXG4gIG9yaWdpbjogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PjtcbiAgLy8gU2FtZSBhcyBcIm9yaWdpblwiIGJ1dCBzbmFwcGVkIHRvIHRoZSBncmlkLCBpZiBncmlkIGlzIG9uXG4gIG9yaWdpbkluR3JpZDogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PjtcbiAgLy8gU2Nyb2xsYmFyIGNoZWNrc1xuICBzY3JvbGxiYXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBpc092ZXJTY3JvbGxCYXJzPjtcbiAgLy8gVGhlIHByZXZpb3VzIHBvaW50ZXIgcG9zaXRpb25cbiAgbGFzdENvb3JkczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAvLyBtYXAgb2Ygb3JpZ2luYWwgZWxlbWVudHMgZGF0YVxuICBvcmlnaW5hbEVsZW1lbnRzOiBNYXA8c3RyaW5nLCBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50Pj47XG4gIHJlc2l6ZToge1xuICAgIC8vIEhhbmRsZSB3aGVuIHJlc2l6aW5nLCBtaWdodCBjaGFuZ2UgZHVyaW5nIHRoZSBwb2ludGVyIGludGVyYWN0aW9uXG4gICAgaGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBpc1Jlc2l6aW5nOiBib29sZWFuO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvZmZzZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIgfCBcImVuZFwiO1xuICAgIC8vIFRoaXMgaXMgYSBjZW50ZXIgcG9pbnQgb2Ygc2VsZWN0ZWQgZWxlbWVudHMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnQgKGZvciByb3RhdGlvbiBvbmx5KVxuICAgIGNlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICB9O1xuICBoaXQ6IHtcbiAgICAvLyBUaGUgZWxlbWVudCB0aGUgcG9pbnRlciBpcyBcImhpdHRpbmdcIiwgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbFxuICAgIC8vIHBvaW50ZXIgZG93biBldmVudFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbDtcbiAgICAvLyBUaGUgZWxlbWVudHMgdGhlIHBvaW50ZXIgaXMgXCJoaXR0aW5nXCIsIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWxcbiAgICAvLyBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBhbGxIaXRFbGVtZW50czogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXTtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgd2FzQWRkZWRUb1NlbGVjdGlvbjogYm9vbGVhbjtcbiAgICAvLyBXaGV0aGVyIHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkdXBsaWNhdGVkLCBtaWdodCBjaGFuZ2UgZHVyaW5nIHRoZVxuICAgIC8vIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgICBoYXNCZWVuRHVwbGljYXRlZDogYm9vbGVhbjtcbiAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czogYm9vbGVhbjtcbiAgfTtcbiAgd2l0aENtZE9yQ3RybDogYm9vbGVhbjtcbiAgZHJhZzoge1xuICAgIC8vIE1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhdGlvblxuICAgIGhhc09jY3VycmVkOiBib29sZWFuO1xuICAgIC8vIE1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhdGlvblxuICAgIG9mZnNldDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgfTtcbiAgLy8gV2UgbmVlZCB0byBoYXZlIHRoZXNlIGluIHRoZSBzdGF0ZSBzbyB0aGF0IHdlIGNhbiB1bnN1YnNjcmliZSB0aGVtXG4gIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uTW92ZTogbnVsbCB8ICgoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCk7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uVXA6IG51bGwgfCAoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQpO1xuICAgIC8vIEl0J3MgZGVmaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvbktleURvd246IG51bGwgfCAoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkKTtcbiAgICAvLyBJdCdzIGRlZmluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb25LZXlVcDogbnVsbCB8ICgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQpO1xuICB9O1xufT47XG5cbmV4cG9ydCB0eXBlIEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICB1cGRhdGVTY2VuZTogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1widXBkYXRlU2NlbmVcIl07XG4gIHJlc2V0U2NlbmU6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInJlc2V0U2NlbmVcIl07XG4gIGdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkOiBJbnN0YW5jZVR5cGU8XG4gICAgdHlwZW9mIEFwcFxuICA+W1wiZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWRcIl07XG4gIGhpc3Rvcnk6IHtcbiAgICBjbGVhcjogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wicmVzZXRIaXN0b3J5XCJdO1xuICB9O1xuICBzY3JvbGxUb0NvbnRlbnQ6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInNjcm9sbFRvQ29udGVudFwiXTtcbiAgem9vbVRvRml0OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJ6b29tVG9GaXRcIl07XG4gIGdldFNjZW5lRWxlbWVudHM6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImdldFNjZW5lRWxlbWVudHNcIl07XG4gIGdldEFwcFN0YXRlOiAoKSA9PiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzdGF0ZVwiXTtcbiAgZ2V0RmlsZXM6ICgpID0+IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImZpbGVzXCJdO1xuICByZWZyZXNoOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZWZyZXNoXCJdO1xuICBpbXBvcnRMaWJyYXJ5OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJpbXBvcnRMaWJyYXJ5RnJvbVVybFwiXTtcbiAgc2V0VG9hc3RNZXNzYWdlOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzZXRUb2FzdE1lc3NhZ2VcIl07XG4gIGFkZEZpbGVzOiAoZGF0YTogQmluYXJ5RmlsZURhdGFbXSkgPT4gdm9pZDtcbiAgcmVhZHlQcm9taXNlOiBSZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST47XG4gIHJlYWR5OiB0cnVlO1xuICBpZDogc3RyaW5nO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../types.ts\n");
2767
2767
 
2768
2768
  /***/ }),
2769
2769
 
@@ -2928,7 +2928,7 @@ module.exports = JSON.parse('{"ar-SA":100,"bg-BG":68,"ca-ES":84,"cs-CZ":29,"da-D
2928
2928
  /***/ ((module) => {
2929
2929
 
2930
2930
  "use strict";
2931
- module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-obsidian-image-support-2","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.14.8","@babel/plugin-transform-arrow-functions":"7.14.5","@babel/plugin-transform-async-to-generator":"7.14.5","@babel/plugin-transform-runtime":"7.15.8","@babel/plugin-transform-typescript":"7.14.6","@babel/preset-env":"7.14.9","@babel/preset-react":"7.14.5","@babel/preset-typescript":"7.14.5","autoprefixer":"10.3.1","babel-loader":"8.2.2","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"5.2.6","file-loader":"6.2.0","mini-css-extract-plugin":"1.6.1","postcss-loader":"6.1.1","sass-loader":"12.1.0","terser-webpack-plugin":"5.1.4","ts-loader":"9.2.4","typescript":"4.3.5","webpack":"5.50.0","webpack-bundle-analyzer":"4.4.2","webpack-cli":"4.7.2"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack"}}');
2931
+ module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-obsidian-3","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.14.8","@babel/plugin-transform-arrow-functions":"7.14.5","@babel/plugin-transform-async-to-generator":"7.14.5","@babel/plugin-transform-runtime":"7.15.8","@babel/plugin-transform-typescript":"7.14.6","@babel/preset-env":"7.14.9","@babel/preset-react":"7.14.5","@babel/preset-typescript":"7.14.5","autoprefixer":"10.3.1","babel-loader":"8.2.2","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"5.2.6","file-loader":"6.2.0","mini-css-extract-plugin":"1.6.1","postcss-loader":"6.1.1","sass-loader":"12.1.0","terser-webpack-plugin":"5.1.4","ts-loader":"9.2.4","typescript":"4.3.5","webpack":"5.50.0","webpack-bundle-analyzer":"4.4.2","webpack-cli":"4.7.2"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack"}}');
2932
2932
 
2933
2933
  /***/ })
2934
2934