@dwelle/excalidraw 0.3.34 → 0.3.35

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.
@@ -1350,7 +1350,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1350
1350
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1351
1351
 
1352
1352
  "use strict";
1353
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionChangeStrokeColor\": () => (/* binding */ actionChangeStrokeColor),\n/* harmony export */ \"actionChangeBackgroundColor\": () => (/* binding */ actionChangeBackgroundColor),\n/* harmony export */ \"actionChangeFillStyle\": () => (/* binding */ actionChangeFillStyle),\n/* harmony export */ \"actionChangeStrokeWidth\": () => (/* binding */ actionChangeStrokeWidth),\n/* harmony export */ \"actionChangeSloppiness\": () => (/* binding */ actionChangeSloppiness),\n/* harmony export */ \"actionChangeStrokeStyle\": () => (/* binding */ actionChangeStrokeStyle),\n/* harmony export */ \"actionChangeOpacity\": () => (/* binding */ actionChangeOpacity),\n/* harmony export */ \"actionChangeFontSize\": () => (/* binding */ actionChangeFontSize),\n/* harmony export */ \"actionChangeFontFamily\": () => (/* binding */ actionChangeFontFamily),\n/* harmony export */ \"actionChangeTextAlign\": () => (/* binding */ actionChangeTextAlign),\n/* harmony export */ \"actionChangeSharpness\": () => (/* binding */ actionChangeSharpness),\n/* harmony export */ \"actionChangeArrowhead\": () => (/* binding */ actionChangeArrowhead)\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 _components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ButtonIconSelect */ \"../../components/ButtonIconSelect.tsx\");\n/* harmony import */ var _components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ColorPicker */ \"../../components/ColorPicker.tsx\");\n/* harmony import */ var _components_IconPicker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/IconPicker */ \"../../components/IconPicker.tsx\");\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 _element__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_comparisons__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../scene/comparisons */ \"../../scene/comparisons.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./register */ \"../../actions/register.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\n\r\n\r\nconst changeProperty = (elements, appState, callback, includeBoundText = false) => {\r\n const selectedElementIds = (0,_utils__WEBPACK_IMPORTED_MODULE_14__.arrayToMap)((0,_scene__WEBPACK_IMPORTED_MODULE_11__.getSelectedElements)(elements, appState, includeBoundText));\r\n return elements.map((element) => {\r\n var _a;\r\n if (selectedElementIds.get(element.id) ||\r\n element.id === ((_a = appState.editingElement) === null || _a === void 0 ? void 0 : _a.id)) {\r\n return callback(element);\r\n }\r\n return element;\r\n });\r\n};\r\nconst getFormValue = function (elements, appState, getAttribute, defaultValue) {\r\n var _a, _b;\r\n const editingElement = appState.editingElement;\r\n const nonDeletedElements = (0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements);\r\n return ((_b = (_a = (editingElement && getAttribute(editingElement))) !== null && _a !== void 0 ? _a : ((0,_scene__WEBPACK_IMPORTED_MODULE_11__.isSomeElementSelected)(nonDeletedElements, appState)\r\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_11__.getCommonAttributeOfSelectedElements)(nonDeletedElements, appState, getAttribute)\r\n : defaultValue)) !== null && _b !== void 0 ? _b : null);\r\n};\r\nconst actionChangeStrokeColor = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeStrokeColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemStrokeColor && {\r\n elements: changeProperty(elements, appState, (el) => {\r\n return (0,_scene_comparisons__WEBPACK_IMPORTED_MODULE_12__.hasStrokeColor)(el.type)\r\n ? (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeColor: value.currentItemStrokeColor,\r\n })\r\n : el;\r\n }),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemStrokeColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.stroke\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementStroke\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.stroke\"), color: getFormValue(elements, appState, (element) => element.strokeColor, appState.currentItemStrokeColor), onChange: (color) => updateData({ currentItemStrokeColor: color }), isActive: appState.openPopup === \"strokeColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"strokeColorPicker\" : null }) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeBackgroundColor = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeBackgroundColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemBackgroundColor && {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n backgroundColor: value.currentItemBackgroundColor,\r\n })),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemBackgroundColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.background\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementBackground\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.background\"), color: getFormValue(elements, appState, (element) => element.backgroundColor, appState.currentItemBackgroundColor), onChange: (color) => updateData({ currentItemBackgroundColor: color }), isActive: appState.openPopup === \"backgroundColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"backgroundColorPicker\" : null }) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeFillStyle = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeFillStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fillStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFillStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_9__.t)(\"labels.fill\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { options: [\r\n {\r\n value: \"hachure\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.hachure\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillHachureIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"cross-hatch\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.crossHatch\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillCrossHatchIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], group: \"fill\", value: getFormValue(elements, appState, (element) => element.fillStyle, appState.currentItemFillStyle), onChange: (value) => {\r\n updateData(value);\r\n } }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeWidth = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeStrokeWidth\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeWidth: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeWidth: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_9__.t)(\"labels.strokeWidth\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"stroke-width\", options: [\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.thin\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 2 }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.bold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 6 }, void 0),\r\n },\r\n {\r\n value: 4,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.extraBold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 10 }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeWidth, appState.currentItemStrokeWidth), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeSloppiness = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeSloppiness\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n seed: (0,_random__WEBPACK_IMPORTED_MODULE_10__.randomInteger)(),\r\n roughness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemRoughness: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_9__.t)(\"labels.sloppiness\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"sloppiness\", options: [\r\n {\r\n value: 0,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.architect\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArchitectIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.artist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArtistIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.cartoonist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessCartoonistIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.roughness, appState.currentItemRoughness), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeStyle = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeStrokeStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_9__.t)(\"labels.strokeStyle\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"strokeStyle\", options: [\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.strokeStyle_solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dashed\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.strokeStyle_dashed\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDashedIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dotted\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.strokeStyle_dotted\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDottedIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeStyle, appState.currentItemStrokeStyle), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeOpacity = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeOpacity\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n opacity: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemOpacity: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n var _a;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"label\", Object.assign({ className: \"control-label\" }, { children: [(0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.opacity\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"input\", { type: \"range\", min: \"0\", max: \"100\", step: \"10\", onChange: (event) => updateData(+event.target.value), onWheel: (event) => {\r\n event.stopPropagation();\r\n const target = event.target;\r\n const STEP = 10;\r\n const MAX = 100;\r\n const MIN = 0;\r\n const value = +target.value;\r\n if (event.deltaY < 0 && value < MAX) {\r\n updateData(value + STEP);\r\n }\r\n else if (event.deltaY > 0 && value > MIN) {\r\n updateData(value - STEP);\r\n }\r\n }, value: (_a = getFormValue(elements, appState, (element) => element.opacity, appState.currentItemOpacity)) !== null && _a !== void 0 ? _a : undefined }, void 0)] }), void 0));\r\n },\r\n});\r\nconst actionChangeFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeFontSize\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(el)) {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fontSize: value,\r\n });\r\n let container = null;\r\n if (el.containerId) {\r\n container = _scene_Scene__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getScene(el).getElement(el.containerId);\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(element, container, appState);\r\n return element;\r\n }\r\n return el;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFontSize: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_9__.t)(\"labels.fontSize\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-size\", options: [\r\n {\r\n value: 16,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.small\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeSmallIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 20,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.medium\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeMediumIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 28,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.large\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeLargeIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 36,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.veryLarge\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeExtraLargeIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element) && element.fontSize, appState.currentItemFontSize || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_SIZE), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeFontFamily = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeFontFamily\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(el)) {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fontFamily: value,\r\n });\r\n let container = null;\r\n if (el.containerId) {\r\n container = _scene_Scene__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getScene(el).getElement(el.containerId);\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(element, container, appState);\r\n return element;\r\n }\r\n return el;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFontFamily: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const options = [\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Virgil,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.handDrawn\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyHandDrawnIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Helvetica,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.normal\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyNormalIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Cascadia,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.code\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyCodeIcon, { theme: appState.theme }, void 0),\r\n },\r\n ];\r\n return ((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_9__.t)(\"labels.fontFamily\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-family\", options: options, value: getFormValue(elements, appState, (element) => (0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element) && element.fontFamily, appState.currentItemFontFamily || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_FAMILY), onChange: (value) => updateData(value) }, void 0)] }, void 0));\r\n },\r\n});\r\nconst actionChangeTextAlign = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeTextAlign\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(el)) {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n textAlign: value,\r\n });\r\n let container = null;\r\n if (el.containerId) {\r\n container = _scene_Scene__WEBPACK_IMPORTED_MODULE_13__[\"default\"].getScene(el).getElement(el.containerId);\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(element, container, appState);\r\n return element;\r\n }\r\n return el;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemTextAlign: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_9__.t)(\"labels.textAlign\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"text-align\", options: [\r\n {\r\n value: \"left\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.left\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignLeftIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"center\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.center\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignCenterIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"right\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.right\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignRightIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element) && element.textAlign, appState.currentItemTextAlign), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeSharpness = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeSharpness\",\r\n perform: (elements, appState, value) => {\r\n const targetElements = (0,_scene__WEBPACK_IMPORTED_MODULE_11__.getTargetElements)((0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements), appState);\r\n const shouldUpdateForNonLinearElements = targetElements.length\r\n ? targetElements.every((el) => !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElement)(el))\r\n : !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElementType)(appState.elementType);\r\n const shouldUpdateForLinearElements = targetElements.length\r\n ? targetElements.every(_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElement)\r\n : (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElementType)(appState.elementType);\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeSharpness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeSharpness: shouldUpdateForNonLinearElements\r\n ? value\r\n : appState.currentItemStrokeSharpness, currentItemLinearStrokeSharpness: shouldUpdateForLinearElements\r\n ? value\r\n : appState.currentItemLinearStrokeSharpness }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_9__.t)(\"labels.edges\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"edges\", options: [\r\n {\r\n value: \"sharp\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.sharp\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeSharpIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"round\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.round\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeRoundIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeSharpness, ((0,_scene__WEBPACK_IMPORTED_MODULE_11__.canChangeSharpness)(appState.elementType) &&\r\n ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElementType)(appState.elementType)\r\n ? appState.currentItemLinearStrokeSharpness\r\n : appState.currentItemStrokeSharpness)) ||\r\n null), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeArrowhead = (0,_register__WEBPACK_IMPORTED_MODULE_15__.register)({\r\n name: \"changeArrowhead\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElement)(el)) {\r\n const { position, type } = value;\r\n if (position === \"start\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n startArrowhead: type,\r\n });\r\n return element;\r\n }\r\n else if (position === \"end\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n endArrowhead: type,\r\n });\r\n return element;\r\n }\r\n }\r\n return el;\r\n }),\r\n appState: Object.assign(Object.assign({}, appState), { [value.position === \"start\"\r\n ? \"currentItemStartArrowhead\"\r\n : \"currentItemEndArrowhead\"]: value.type }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const isRTL = (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.getLanguage)().rtl;\r\n return ((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_9__.t)(\"labels.arrowheads\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"iconSelectList\" }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_start\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_none\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n keyBinding: \"q\",\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_arrow\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"w\",\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_bar\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"e\",\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_dot\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"r\",\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_11__.canHaveArrowheads)(element.type)\r\n ? element.startArrowhead\r\n : appState.currentItemStartArrowhead, appState.currentItemStartArrowhead), onChange: (value) => updateData({ position: \"start\", type: value }) }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_end\", group: \"arrowheads\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_none\"),\r\n keyBinding: \"q\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_arrow\"),\r\n keyBinding: \"w\",\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_bar\"),\r\n keyBinding: \"e\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_dot\"),\r\n keyBinding: \"r\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_8__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_11__.canHaveArrowheads)(element.type)\r\n ? element.endArrowhead\r\n : appState.currentItemEndArrowhead, appState.currentItemEndArrowhead), onChange: (value) => updateData({ position: \"end\", type: value }) }, void 0)] }), void 0)] }, void 0));\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQ0QsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxXQUNqRSxhQUNFLFlBQ0csQ0FDWixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXMudHN4Pzg2OTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vLi4vc3JjL3R5cGVzXCI7XG5pbXBvcnQgeyBCdXR0b25JY29uU2VsZWN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQnV0dG9uSWNvblNlbGVjdFwiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXIgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Db2xvclBpY2tlclwiO1xuaW1wb3J0IHsgSWNvblBpY2tlciB9IGZyb20gXCIuLi9jb21wb25lbnRzL0ljb25QaWNrZXJcIjtcbmltcG9ydCB7XG4gIEFycm93aGVhZEFycm93SWNvbixcbiAgQXJyb3doZWFkQmFySWNvbixcbiAgQXJyb3doZWFkRG90SWNvbixcbiAgQXJyb3doZWFkVHJpYW5nbGVJY29uLFxuICBBcnJvd2hlYWROb25lSWNvbixcbiAgRWRnZVJvdW5kSWNvbixcbiAgRWRnZVNoYXJwSWNvbixcbiAgRmlsbENyb3NzSGF0Y2hJY29uLFxuICBGaWxsSGFjaHVyZUljb24sXG4gIEZpbGxTb2xpZEljb24sXG4gIEZvbnRGYW1pbHlDb2RlSWNvbixcbiAgRm9udEZhbWlseUhhbmREcmF3bkljb24sXG4gIEZvbnRGYW1pbHlOb3JtYWxJY29uLFxuICBGb250U2l6ZUV4dHJhTGFyZ2VJY29uLFxuICBGb250U2l6ZUxhcmdlSWNvbixcbiAgRm9udFNpemVNZWRpdW1JY29uLFxuICBGb250U2l6ZVNtYWxsSWNvbixcbiAgU2xvcHBpbmVzc0FyY2hpdGVjdEljb24sXG4gIFNsb3BwaW5lc3NBcnRpc3RJY29uLFxuICBTbG9wcGluZXNzQ2FydG9vbmlzdEljb24sXG4gIFN0cm9rZVN0eWxlRGFzaGVkSWNvbixcbiAgU3Ryb2tlU3R5bGVEb3R0ZWRJY29uLFxuICBTdHJva2VTdHlsZVNvbGlkSWNvbixcbiAgU3Ryb2tlV2lkdGhJY29uLFxuICBUZXh0QWxpZ25DZW50ZXJJY29uLFxuICBUZXh0QWxpZ25MZWZ0SWNvbixcbiAgVGV4dEFsaWduUmlnaHRJY29uLFxufSBmcm9tIFwiLi4vY29tcG9uZW50cy9pY29uc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIEZPTlRfRkFNSUxZLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBnZXROb25EZWxldGVkRWxlbWVudHMsXG4gIGlzVGV4dEVsZW1lbnQsXG4gIHJlZHJhd1RleHRCb3VuZGluZ0JveCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgaXNMaW5lYXJFbGVtZW50LCBpc0xpbmVhckVsZW1lbnRUeXBlIH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgVGV4dEFsaWduLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0TGFuZ3VhZ2UsIHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgcmFuZG9tSW50ZWdlciB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7XG4gIGNhbkNoYW5nZVNoYXJwbmVzcyxcbiAgY2FuSGF2ZUFycm93aGVhZHMsXG4gIGdldENvbW1vbkF0dHJpYnV0ZU9mU2VsZWN0ZWRFbGVtZW50cyxcbiAgZ2V0U2VsZWN0ZWRFbGVtZW50cyxcbiAgZ2V0VGFyZ2V0RWxlbWVudHMsXG4gIGlzU29tZUVsZW1lbnRTZWxlY3RlZCxcbn0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgeyBoYXNTdHJva2VDb2xvciB9IGZyb20gXCIuLi9zY2VuZS9jb21wYXJpc29uc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuXG5jb25zdCBjaGFuZ2VQcm9wZXJ0eSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgY2FsbGJhY2s6IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT4gRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGluY2x1ZGVCb3VuZFRleHQgPSBmYWxzZSxcbikgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHMgPSBhcnJheVRvTWFwKFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlLCBpbmNsdWRlQm91bmRUZXh0KSxcbiAgKTtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkcy5nZXQoZWxlbWVudC5pZCkgfHxcbiAgICAgIGVsZW1lbnQuaWQgPT09IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSk7XG59O1xuXG5jb25zdCBnZXRGb3JtVmFsdWUgPSBmdW5jdGlvbiA8VD4oXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGdldEF0dHJpYnV0ZTogKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiBULFxuICBkZWZhdWx0VmFsdWU/OiBULFxuKTogVCB8IG51bGwge1xuICBjb25zdCBlZGl0aW5nRWxlbWVudCA9IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50O1xuICBjb25zdCBub25EZWxldGVkRWxlbWVudHMgPSBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpO1xuICByZXR1cm4gKFxuICAgIChlZGl0aW5nRWxlbWVudCAmJiBnZXRBdHRyaWJ1dGUoZWRpdGluZ0VsZW1lbnQpKSA/P1xuICAgIChpc1NvbWVFbGVtZW50U2VsZWN0ZWQobm9uRGVsZXRlZEVsZW1lbnRzLCBhcHBTdGF0ZSlcbiAgICAgID8gZ2V0Q29tbW9uQXR0cmlidXRlT2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIG5vbkRlbGV0ZWRFbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICBnZXRBdHRyaWJ1dGUsXG4gICAgICAgIClcbiAgICAgIDogZGVmYXVsdFZhbHVlKSA/P1xuICAgIG51bGxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VTdHJva2VDb2xvciA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTdHJva2VDb2xvclwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odmFsdWUuY3VycmVudEl0ZW1TdHJva2VDb2xvciAmJiB7XG4gICAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBoYXNTdHJva2VDb2xvcihlbC50eXBlKVxuICAgICAgICAgICAgPyBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiB2YWx1ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBlbDtcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICAuLi52YWx1ZSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6ICEhdmFsdWUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8PlxuICAgICAgPGgzIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt0KFwibGFiZWxzLnN0cm9rZVwiKX08L2gzPlxuICAgICAgPENvbG9yUGlja2VyXG4gICAgICAgIHR5cGU9XCJlbGVtZW50U3Ryb2tlXCJcbiAgICAgICAgbGFiZWw9e3QoXCJsYWJlbHMuc3Ryb2tlXCIpfVxuICAgICAgICBjb2xvcj17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsoY29sb3IpID0+IHVwZGF0ZURhdGEoeyBjdXJyZW50SXRlbVN0cm9rZUNvbG9yOiBjb2xvciB9KX1cbiAgICAgICAgaXNBY3RpdmU9e2FwcFN0YXRlLm9wZW5Qb3B1cCA9PT0gXCJzdHJva2VDb2xvclBpY2tlclwifVxuICAgICAgICBzZXRBY3RpdmU9eyhhY3RpdmUpID0+XG4gICAgICAgICAgdXBkYXRlRGF0YSh7IG9wZW5Qb3B1cDogYWN0aXZlID8gXCJzdHJva2VDb2xvclBpY2tlclwiIDogbnVsbCB9KVxuICAgICAgICB9XG4gICAgICAvPlxuICAgIDwvPlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VCYWNrZ3JvdW5kQ29sb3IgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlQmFja2dyb3VuZENvbG9yXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLih2YWx1ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvciAmJiB7XG4gICAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB2YWx1ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIC4uLnZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogISF2YWx1ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8PlxuICAgICAgPGgzIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt0KFwibGFiZWxzLmJhY2tncm91bmRcIil9PC9oMz5cbiAgICAgIDxDb2xvclBpY2tlclxuICAgICAgICB0eXBlPVwiZWxlbWVudEJhY2tncm91bmRcIlxuICAgICAgICBsYWJlbD17dChcImxhYmVscy5iYWNrZ3JvdW5kXCIpfVxuICAgICAgICBjb2xvcj17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyhjb2xvcikgPT4gdXBkYXRlRGF0YSh7IGN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yOiBjb2xvciB9KX1cbiAgICAgICAgaXNBY3RpdmU9e2FwcFN0YXRlLm9wZW5Qb3B1cCA9PT0gXCJiYWNrZ3JvdW5kQ29sb3JQaWNrZXJcIn1cbiAgICAgICAgc2V0QWN0aXZlPXsoYWN0aXZlKSA9PlxuICAgICAgICAgIHVwZGF0ZURhdGEoeyBvcGVuUG9wdXA6IGFjdGl2ZSA/IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCIgOiBudWxsIH0pXG4gICAgICAgIH1cbiAgICAgIC8+XG4gICAgPC8+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZUZpbGxTdHlsZSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VGaWxsU3R5bGVcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgIGZpbGxTdHlsZTogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBjdXJyZW50SXRlbUZpbGxTdHlsZTogdmFsdWUgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmZpbGxcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwiaGFjaHVyZVwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5oYWNodXJlXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZpbGxIYWNodXJlSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwiY3Jvc3MtaGF0Y2hcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY3Jvc3NIYXRjaFwiKSxcbiAgICAgICAgICAgIGljb246IDxGaWxsQ3Jvc3NIYXRjaEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcInNvbGlkXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnNvbGlkXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZpbGxTb2xpZEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICBncm91cD1cImZpbGxcIlxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGxTdHlsZSxcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHVwZGF0ZURhdGEodmFsdWUpO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VTdHJva2VXaWR0aCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTdHJva2VXaWR0aFwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgY3VycmVudEl0ZW1TdHJva2VXaWR0aDogdmFsdWUgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLnN0cm9rZVdpZHRoXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgZ3JvdXA9XCJzdHJva2Utd2lkdGhcIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnRoaW5cIiksXG4gICAgICAgICAgICBpY29uOiA8U3Ryb2tlV2lkdGhJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gc3Ryb2tlV2lkdGg9ezJ9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmJvbGRcIiksXG4gICAgICAgICAgICBpY29uOiA8U3Ryb2tlV2lkdGhJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gc3Ryb2tlV2lkdGg9ezZ9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDQsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmV4dHJhQm9sZFwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VXaWR0aEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBzdHJva2VXaWR0aD17MTB9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVNsb3BwaW5lc3MgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlU2xvcHBpbmVzc1wiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgc2VlZDogcmFuZG9tSW50ZWdlcigpLFxuICAgICAgICAgIHJvdWdobmVzczogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBjdXJyZW50SXRlbVJvdWdobmVzczogdmFsdWUgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLnNsb3BwaW5lc3NcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBncm91cD1cInNsb3BwaW5lc3NcIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFyY2hpdGVjdFwiKSxcbiAgICAgICAgICAgIGljb246IDxTbG9wcGluZXNzQXJjaGl0ZWN0SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFydGlzdFwiKSxcbiAgICAgICAgICAgIGljb246IDxTbG9wcGluZXNzQXJ0aXN0SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmNhcnRvb25pc3RcIiksXG4gICAgICAgICAgICBpY29uOiA8U2xvcHBpbmVzc0NhcnRvb25pc3RJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5yb3VnaG5lc3MsXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VTdHJva2VTdHlsZSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTdHJva2VTdHlsZVwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgc3Ryb2tlU3R5bGU6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgY3VycmVudEl0ZW1TdHJva2VTdHlsZTogdmFsdWUgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLnN0cm9rZVN0eWxlXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgZ3JvdXA9XCJzdHJva2VTdHlsZVwiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJzb2xpZFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zdHJva2VTdHlsZV9zb2xpZFwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VTdHlsZVNvbGlkSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwiZGFzaGVkXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnN0cm9rZVN0eWxlX2Rhc2hlZFwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VTdHlsZURhc2hlZEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcImRvdHRlZFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zdHJva2VTdHlsZV9kb3R0ZWRcIiksXG4gICAgICAgICAgICBpY29uOiA8U3Ryb2tlU3R5bGVEb3R0ZWRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5zdHJva2VTdHlsZSxcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgIC8+XG4gICAgPC9maWVsZHNldD5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlT3BhY2l0eSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VPcGFjaXR5XCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBvcGFjaXR5OiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIGN1cnJlbnRJdGVtT3BhY2l0eTogdmFsdWUgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAge3QoXCJsYWJlbHMub3BhY2l0eVwiKX1cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgc3RlcD1cIjEwXCJcbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gdXBkYXRlRGF0YSgrZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgb25XaGVlbD17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgU1RFUCA9IDEwO1xuICAgICAgICAgIGNvbnN0IE1BWCA9IDEwMDtcbiAgICAgICAgICBjb25zdCBNSU4gPSAwO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gK3RhcmdldC52YWx1ZTtcblxuICAgICAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwICYmIHZhbHVlIDwgTUFYKSB7XG4gICAgICAgICAgICB1cGRhdGVEYXRhKHZhbHVlICsgU1RFUCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwICYmIHZhbHVlID4gTUlOKSB7XG4gICAgICAgICAgICB1cGRhdGVEYXRhKHZhbHVlIC0gU1RFUCk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICB2YWx1ZT17XG4gICAgICAgICAgZ2V0Rm9ybVZhbHVlKFxuICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50Lm9wYWNpdHksXG4gICAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgICAgKSA/PyB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgLz5cbiAgICA8L2xhYmVsPlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VGb250U2l6ZSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VGb250U2l6ZVwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWwpKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgICAgICBmb250U2l6ZTogdmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVsLmNvbnRhaW5lcklkKSB7XG4gICAgICAgICAgICAgIGNvbnRhaW5lciA9IFNjZW5lLmdldFNjZW5lKGVsKSEuZ2V0RWxlbWVudChlbC5jb250YWluZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3goZWxlbWVudCwgY29udGFpbmVyLCBhcHBTdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIGN1cnJlbnRJdGVtRm9udFNpemU6IHZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmZvbnRTaXplXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgZ3JvdXA9XCJmb250LXNpemVcIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDE2LFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zbWFsbFwiKSxcbiAgICAgICAgICAgIGljb246IDxGb250U2l6ZVNtYWxsSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDIwLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5tZWRpdW1cIiksXG4gICAgICAgICAgICBpY29uOiA8Rm9udFNpemVNZWRpdW1JY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMjgsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmxhcmdlXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZvbnRTaXplTGFyZ2VJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMzYsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnZlcnlMYXJnZVwiKSxcbiAgICAgICAgICAgIGljb246IDxGb250U2l6ZUV4dHJhTGFyZ2VJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmZvbnRTaXplLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUgfHwgREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VGb250RmFtaWx5ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUZvbnRGYW1pbHlcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIChlbCkgPT4ge1xuICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsKSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogdmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVsLmNvbnRhaW5lcklkKSB7XG4gICAgICAgICAgICAgIGNvbnRhaW5lciA9IFNjZW5lLmdldFNjZW5lKGVsKSEuZ2V0RWxlbWVudChlbC5jb250YWluZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3goZWxlbWVudCwgY29udGFpbmVyLCBhcHBTdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIGN1cnJlbnRJdGVtRm9udEZhbWlseTogdmFsdWUsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBGb250RmFtaWx5VmFsdWVzO1xuICAgICAgdGV4dDogc3RyaW5nO1xuICAgICAgaWNvbjogSlNYLkVsZW1lbnQ7XG4gICAgfVtdID0gW1xuICAgICAge1xuICAgICAgICB2YWx1ZTogRk9OVF9GQU1JTFkuVmlyZ2lsLFxuICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmhhbmREcmF3blwiKSxcbiAgICAgICAgaWNvbjogPEZvbnRGYW1pbHlIYW5kRHJhd25JY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogRk9OVF9GQU1JTFkuSGVsdmV0aWNhLFxuICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLm5vcm1hbFwiKSxcbiAgICAgICAgaWNvbjogPEZvbnRGYW1pbHlOb3JtYWxJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogRk9OVF9GQU1JTFkuQ2FzY2FkaWEsXG4gICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY29kZVwiKSxcbiAgICAgICAgaWNvbjogPEZvbnRGYW1pbHlDb2RlSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5mb250RmFtaWx5XCIpfTwvbGVnZW5kPlxuICAgICAgICA8QnV0dG9uSWNvblNlbGVjdDxGb250RmFtaWx5VmFsdWVzIHwgZmFsc2U+XG4gICAgICAgICAgZ3JvdXA9XCJmb250LWZhbWlseVwiXG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAgIChlbGVtZW50KSA9PiBpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQuZm9udEZhbWlseSxcbiAgICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSB8fCBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgICAgICAgICl9XG4gICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAgIC8+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgICk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVRleHRBbGlnbiA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VUZXh0QWxpZ25cIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIChlbCkgPT4ge1xuICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsKSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiB2YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZWwuY29udGFpbmVySWQpIHtcbiAgICAgICAgICAgICAgY29udGFpbmVyID0gU2NlbmUuZ2V0U2NlbmUoZWwpIS5nZXRFbGVtZW50KGVsLmNvbnRhaW5lcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChlbGVtZW50LCBjb250YWluZXIsIGFwcFN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgY3VycmVudEl0ZW1UZXh0QWxpZ246IHZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLnRleHRBbGlnblwiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0PFRleHRBbGlnbiB8IGZhbHNlPlxuICAgICAgICBncm91cD1cInRleHQtYWxpZ25cIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwibGVmdFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5sZWZ0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnbkxlZnRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY2VudGVyXCIpLFxuICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnbkNlbnRlckljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcInJpZ2h0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnJpZ2h0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnblJpZ2h0SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC50ZXh0QWxpZ24sXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VTaGFycG5lc3MgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlU2hhcnBuZXNzXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudHMgPSBnZXRUYXJnZXRFbGVtZW50cyhcbiAgICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyksXG4gICAgICBhcHBTdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUZvck5vbkxpbmVhckVsZW1lbnRzID0gdGFyZ2V0RWxlbWVudHMubGVuZ3RoXG4gICAgICA/IHRhcmdldEVsZW1lbnRzLmV2ZXJ5KChlbCkgPT4gIWlzTGluZWFyRWxlbWVudChlbCkpXG4gICAgICA6ICFpc0xpbmVhckVsZW1lbnRUeXBlKGFwcFN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVGb3JMaW5lYXJFbGVtZW50cyA9IHRhcmdldEVsZW1lbnRzLmxlbmd0aFxuICAgICAgPyB0YXJnZXRFbGVtZW50cy5ldmVyeShpc0xpbmVhckVsZW1lbnQpXG4gICAgICA6IGlzTGluZWFyRWxlbWVudFR5cGUoYXBwU3RhdGUuZWxlbWVudFR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIGN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzOiBzaG91bGRVcGRhdGVGb3JOb25MaW5lYXJFbGVtZW50c1xuICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICA6IGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBjdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzczogc2hvdWxkVXBkYXRlRm9yTGluZWFyRWxlbWVudHNcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBhcHBTdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGVsZW1lbnRzLCBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5lZGdlc1wiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIGdyb3VwPVwiZWRnZXNcIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwic2hhcnBcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc2hhcnBcIiksXG4gICAgICAgICAgICBpY29uOiA8RWRnZVNoYXJwSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwicm91bmRcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMucm91bmRcIiksXG4gICAgICAgICAgICBpY29uOiA8RWRnZVJvdW5kSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuc3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICAgIChjYW5DaGFuZ2VTaGFycG5lc3MoYXBwU3RhdGUuZWxlbWVudFR5cGUpICYmXG4gICAgICAgICAgICAoaXNMaW5lYXJFbGVtZW50VHlwZShhcHBTdGF0ZS5lbGVtZW50VHlwZSlcbiAgICAgICAgICAgICAgPyBhcHBTdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzc1xuICAgICAgICAgICAgICA6IGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzKSkgfHxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VBcnJvd2hlYWQgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlQXJyb3doZWFkXCIsXG4gIHBlcmZvcm06IChcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZSxcbiAgICB2YWx1ZTogeyBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIjsgdHlwZTogQXJyb3doZWFkIH0sXG4gICkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+IHtcbiAgICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChlbCkpIHtcbiAgICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCB0eXBlIH0gPSB2YWx1ZTtcblxuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCA9IG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgICAgIHN0YXJ0QXJyb3doZWFkOiB0eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCA9IG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgICAgIGVuZEFycm93aGVhZDogdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfSksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgW3ZhbHVlLnBvc2l0aW9uID09PSBcInN0YXJ0XCJcbiAgICAgICAgICA/IFwiY3VycmVudEl0ZW1TdGFydEFycm93aGVhZFwiXG4gICAgICAgICAgOiBcImN1cnJlbnRJdGVtRW5kQXJyb3doZWFkXCJdOiB2YWx1ZS50eXBlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IHtcbiAgICBjb25zdCBpc1JUTCA9IGdldExhbmd1YWdlKCkucnRsO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5hcnJvd2hlYWRzXCIpfTwvbGVnZW5kPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImljb25TZWxlY3RMaXN0XCI+XG4gICAgICAgICAgPEljb25QaWNrZXJcbiAgICAgICAgICAgIGxhYmVsPVwiYXJyb3doZWFkX3N0YXJ0XCJcbiAgICAgICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX25vbmVcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogPEFycm93aGVhZE5vbmVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJxXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhcnJvd1wiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2Fycm93XCIpLFxuICAgICAgICAgICAgICAgIGljb246IChcbiAgICAgICAgICAgICAgICAgIDxBcnJvd2hlYWRBcnJvd0ljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXshaXNSVEx9IC8+XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcIndcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImJhclwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2JhclwiKSxcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkQmFySWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9eyFpc1JUTH0gLz4sXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJlXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJkb3RcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9kb3RcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogPEFycm93aGVhZERvdEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXshaXNSVEx9IC8+LFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwiclwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwidHJpYW5nbGVcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF90cmlhbmdsZVwiKSxcbiAgICAgICAgICAgICAgICBpY29uOiAoXG4gICAgICAgICAgICAgICAgICA8QXJyb3doZWFkVHJpYW5nbGVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17IWlzUlRMfSAvPlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJ0XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdfVxuICAgICAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZTxBcnJvd2hlYWQgfCBudWxsPihcbiAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgJiYgY2FuSGF2ZUFycm93aGVhZHMoZWxlbWVudC50eXBlKVxuICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LnN0YXJ0QXJyb3doZWFkXG4gICAgICAgICAgICAgICAgICA6IGFwcFN0YXRlLmN1cnJlbnRJdGVtU3RhcnRBcnJvd2hlYWQsXG4gICAgICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtU3RhcnRBcnJvd2hlYWQsXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh7IHBvc2l0aW9uOiBcInN0YXJ0XCIsIHR5cGU6IHZhbHVlIH0pfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPEljb25QaWNrZXJcbiAgICAgICAgICAgIGxhYmVsPVwiYXJyb3doZWFkX2VuZFwiXG4gICAgICAgICAgICBncm91cD1cImFycm93aGVhZHNcIlxuICAgICAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfbm9uZVwiKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInFcIixcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkTm9uZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFycm93XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfYXJyb3dcIiksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJ3XCIsXG4gICAgICAgICAgICAgICAgaWNvbjogKFxuICAgICAgICAgICAgICAgICAgPEFycm93aGVhZEFycm93SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9e2lzUlRMfSAvPlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJiYXJcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9iYXJcIiksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJlXCIsXG4gICAgICAgICAgICAgICAgaWNvbjogPEFycm93aGVhZEJhckljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXtpc1JUTH0gLz4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJkb3RcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9kb3RcIiksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJyXCIsXG4gICAgICAgICAgICAgICAgaWNvbjogPEFycm93aGVhZERvdEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXtpc1JUTH0gLz4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX3RyaWFuZ2xlXCIpLFxuICAgICAgICAgICAgICAgIGljb246IChcbiAgICAgICAgICAgICAgICAgIDxBcnJvd2hlYWRUcmlhbmdsZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXtpc1JUTH0gLz5cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwidFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXX1cbiAgICAgICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWU8QXJyb3doZWFkIHwgbnVsbD4oXG4gICAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpICYmIGNhbkhhdmVBcnJvd2hlYWRzKGVsZW1lbnQudHlwZSlcbiAgICAgICAgICAgICAgICAgID8gZWxlbWVudC5lbmRBcnJvd2hlYWRcbiAgICAgICAgICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1FbmRBcnJvd2hlYWQsXG4gICAgICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRW5kQXJyb3doZWFkLFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEoeyBwb3NpdGlvbjogXCJlbmRcIiwgdHlwZTogdmFsdWUgfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgICk7XG4gIH0sXG59KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/actionProperties.tsx\n");
1353
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionChangeStrokeColor\": () => (/* binding */ actionChangeStrokeColor),\n/* harmony export */ \"actionChangeBackgroundColor\": () => (/* binding */ actionChangeBackgroundColor),\n/* harmony export */ \"actionChangeFillStyle\": () => (/* binding */ actionChangeFillStyle),\n/* harmony export */ \"actionChangeStrokeWidth\": () => (/* binding */ actionChangeStrokeWidth),\n/* harmony export */ \"actionChangeSloppiness\": () => (/* binding */ actionChangeSloppiness),\n/* harmony export */ \"actionChangeStrokeStyle\": () => (/* binding */ actionChangeStrokeStyle),\n/* harmony export */ \"actionChangeOpacity\": () => (/* binding */ actionChangeOpacity),\n/* harmony export */ \"actionChangeFontSize\": () => (/* binding */ actionChangeFontSize),\n/* harmony export */ \"actionChangeFontFamily\": () => (/* binding */ actionChangeFontFamily),\n/* harmony export */ \"actionChangeTextAlign\": () => (/* binding */ actionChangeTextAlign),\n/* harmony export */ \"actionChangeSharpness\": () => (/* binding */ actionChangeSharpness),\n/* harmony export */ \"actionChangeArrowhead\": () => (/* binding */ actionChangeArrowhead)\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 _components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ButtonIconSelect */ \"../../components/ButtonIconSelect.tsx\");\n/* harmony import */ var _components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ColorPicker */ \"../../components/ColorPicker.tsx\");\n/* harmony import */ var _components_IconPicker__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/IconPicker */ \"../../components/IconPicker.tsx\");\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 _element__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_comparisons__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../scene/comparisons */ \"../../scene/comparisons.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./register */ \"../../actions/register.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\n\r\n\r\n\r\nconst changeProperty = (elements, appState, callback, includeBoundText = false) => {\r\n const selectedElementIds = (0,_utils__WEBPACK_IMPORTED_MODULE_15__.arrayToMap)((0,_scene__WEBPACK_IMPORTED_MODULE_12__.getSelectedElements)(elements, appState, includeBoundText));\r\n return elements.map((element) => {\r\n var _a;\r\n if (selectedElementIds.get(element.id) ||\r\n element.id === ((_a = appState.editingElement) === null || _a === void 0 ? void 0 : _a.id)) {\r\n return callback(element);\r\n }\r\n return element;\r\n });\r\n};\r\nconst getFormValue = function (elements, appState, getAttribute, defaultValue) {\r\n var _a, _b;\r\n const editingElement = appState.editingElement;\r\n const nonDeletedElements = (0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements);\r\n return ((_b = (_a = (editingElement && getAttribute(editingElement))) !== null && _a !== void 0 ? _a : ((0,_scene__WEBPACK_IMPORTED_MODULE_12__.isSomeElementSelected)(nonDeletedElements, appState)\r\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_12__.getCommonAttributeOfSelectedElements)(nonDeletedElements, appState, getAttribute)\r\n : defaultValue)) !== null && _b !== void 0 ? _b : null);\r\n};\r\nconst actionChangeStrokeColor = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemStrokeColor && {\r\n elements: changeProperty(elements, appState, (el) => {\r\n return (0,_scene_comparisons__WEBPACK_IMPORTED_MODULE_13__.hasStrokeColor)(el.type)\r\n ? (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeColor: value.currentItemStrokeColor,\r\n })\r\n : el;\r\n }, true),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemStrokeColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.stroke\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementStroke\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.stroke\"), color: getFormValue(elements, appState, (element) => element.strokeColor, appState.currentItemStrokeColor), onChange: (color) => updateData({ currentItemStrokeColor: color }), isActive: appState.openPopup === \"strokeColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"strokeColorPicker\" : null }) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeBackgroundColor = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeBackgroundColor\",\r\n perform: (elements, appState, value) => {\r\n return Object.assign(Object.assign({}, (value.currentItemBackgroundColor && {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n backgroundColor: value.currentItemBackgroundColor,\r\n })),\r\n })), { appState: Object.assign(Object.assign({}, appState), value), commitToHistory: !!value.currentItemBackgroundColor });\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"h3\", Object.assign({ \"aria-hidden\": \"true\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.background\") }), void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_2__.ColorPicker, { type: \"elementBackground\", label: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.background\"), color: getFormValue(elements, appState, (element) => element.backgroundColor, appState.currentItemBackgroundColor), onChange: (color) => updateData({ currentItemBackgroundColor: color }), isActive: appState.openPopup === \"backgroundColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"backgroundColorPicker\" : null }) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeFillStyle = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFillStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fillStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFillStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_10__.t)(\"labels.fill\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { options: [\r\n {\r\n value: \"hachure\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.hachure\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillHachureIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"cross-hatch\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.crossHatch\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillCrossHatchIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FillSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], group: \"fill\", value: getFormValue(elements, appState, (element) => element.fillStyle, appState.currentItemFillStyle), onChange: (value) => {\r\n updateData(value);\r\n } }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeWidth = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeWidth\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeWidth: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeWidth: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_10__.t)(\"labels.strokeWidth\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"stroke-width\", options: [\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.thin\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 2 }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.bold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 6 }, void 0),\r\n },\r\n {\r\n value: 4,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.extraBold\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeWidthIcon, { theme: appState.theme, strokeWidth: 10 }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeWidth, appState.currentItemStrokeWidth), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeSloppiness = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeSloppiness\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n seed: (0,_random__WEBPACK_IMPORTED_MODULE_11__.randomInteger)(),\r\n roughness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemRoughness: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_10__.t)(\"labels.sloppiness\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"sloppiness\", options: [\r\n {\r\n value: 0,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.architect\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArchitectIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 1,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.artist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessArtistIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 2,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.cartoonist\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.SloppinessCartoonistIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.roughness, appState.currentItemRoughness), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeStrokeStyle = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeStrokeStyle\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeStyle: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeStyle: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_10__.t)(\"labels.strokeStyle\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"strokeStyle\", options: [\r\n {\r\n value: \"solid\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_solid\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleSolidIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dashed\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_dashed\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDashedIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"dotted\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.strokeStyle_dotted\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.StrokeStyleDottedIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeStyle, appState.currentItemStrokeStyle), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeOpacity = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeOpacity\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n opacity: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemOpacity: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n var _a;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"label\", Object.assign({ className: \"control-label\" }, { children: [(0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.opacity\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"input\", { type: \"range\", min: \"0\", max: \"100\", step: \"10\", onChange: (event) => updateData(+event.target.value), onWheel: (event) => {\r\n event.stopPropagation();\r\n const target = event.target;\r\n const STEP = 10;\r\n const MAX = 100;\r\n const MIN = 0;\r\n const value = +target.value;\r\n if (event.deltaY < 0 && value < MAX) {\r\n updateData(value + STEP);\r\n }\r\n else if (event.deltaY > 0 && value > MIN) {\r\n updateData(value - STEP);\r\n }\r\n }, value: (_a = getFormValue(elements, appState, (element) => element.opacity, appState.currentItemOpacity)) !== null && _a !== void 0 ? _a : undefined }, void 0)] }), void 0));\r\n },\r\n});\r\nconst actionChangeFontSize = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFontSize\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(el)) {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fontSize: value,\r\n });\r\n let container = null;\r\n if (el.containerId) {\r\n container = _scene_Scene__WEBPACK_IMPORTED_MODULE_14__[\"default\"].getScene(el).getElement(el.containerId);\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(element, container, appState);\r\n return element;\r\n }\r\n return el;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFontSize: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_10__.t)(\"labels.fontSize\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-size\", options: [\r\n {\r\n value: 16,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.small\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeSmallIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 20,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.medium\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeMediumIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 28,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.large\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeLargeIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: 36,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.veryLarge\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontSizeExtraLargeIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.fontSize;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.fontSize;\r\n }\r\n return null;\r\n }, appState.currentItemFontSize || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_SIZE), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeFontFamily = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeFontFamily\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(el)) {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n fontFamily: value,\r\n });\r\n let container = null;\r\n if (el.containerId) {\r\n container = _scene_Scene__WEBPACK_IMPORTED_MODULE_14__[\"default\"].getScene(el).getElement(el.containerId);\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(element, container, appState);\r\n return element;\r\n }\r\n return el;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemFontFamily: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const options = [\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Virgil,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.handDrawn\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyHandDrawnIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Helvetica,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.normal\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyNormalIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: _constants__WEBPACK_IMPORTED_MODULE_5__.FONT_FAMILY.Cascadia,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.code\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.FontFamilyCodeIcon, { theme: appState.theme }, void 0),\r\n },\r\n ];\r\n return ((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_10__.t)(\"labels.fontFamily\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"font-family\", options: options, value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.fontFamily;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.fontFamily;\r\n }\r\n return null;\r\n }, appState.currentItemFontFamily || _constants__WEBPACK_IMPORTED_MODULE_5__.DEFAULT_FONT_FAMILY), onChange: (value) => updateData(value) }, void 0)] }, void 0));\r\n },\r\n});\r\nconst actionChangeTextAlign = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeTextAlign\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(el)) {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n textAlign: value,\r\n });\r\n let container = null;\r\n if (el.containerId) {\r\n container = _scene_Scene__WEBPACK_IMPORTED_MODULE_14__[\"default\"].getScene(el).getElement(el.containerId);\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(element, container, appState);\r\n return element;\r\n }\r\n return el;\r\n }, true),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemTextAlign: value }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_10__.t)(\"labels.textAlign\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"text-align\", options: [\r\n {\r\n value: \"left\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.left\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignLeftIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"center\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.center\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignCenterIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"right\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.right\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.TextAlignRightIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_6__.isTextElement)(element)) {\r\n return element.textAlign;\r\n }\r\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\r\n if (boundTextElement) {\r\n return boundTextElement.textAlign;\r\n }\r\n return null;\r\n }, appState.currentItemTextAlign), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeSharpness = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeSharpness\",\r\n perform: (elements, appState, value) => {\r\n const targetElements = (0,_scene__WEBPACK_IMPORTED_MODULE_12__.getTargetElements)((0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements), appState);\r\n const shouldUpdateForNonLinearElements = targetElements.length\r\n ? targetElements.every((el) => !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(el))\r\n : !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType);\r\n const shouldUpdateForLinearElements = targetElements.length\r\n ? targetElements.every(_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)\r\n : (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType);\r\n return {\r\n elements: changeProperty(elements, appState, (el) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n strokeSharpness: value,\r\n })),\r\n appState: Object.assign(Object.assign({}, appState), { currentItemStrokeSharpness: shouldUpdateForNonLinearElements\r\n ? value\r\n : appState.currentItemStrokeSharpness, currentItemLinearStrokeSharpness: shouldUpdateForLinearElements\r\n ? value\r\n : appState.currentItemLinearStrokeSharpness }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => ((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_10__.t)(\"labels.edges\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ButtonIconSelect__WEBPACK_IMPORTED_MODULE_1__.ButtonIconSelect, { group: \"edges\", options: [\r\n {\r\n value: \"sharp\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.sharp\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeSharpIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"round\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.round\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.EdgeRoundIcon, { theme: appState.theme }, void 0),\r\n },\r\n ], value: getFormValue(elements, appState, (element) => element.strokeSharpness, ((0,_scene__WEBPACK_IMPORTED_MODULE_12__.canChangeSharpness)(appState.elementType) &&\r\n ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElementType)(appState.elementType)\r\n ? appState.currentItemLinearStrokeSharpness\r\n : appState.currentItemStrokeSharpness)) ||\r\n null), onChange: (value) => updateData(value) }, void 0)] }, void 0)),\r\n});\r\nconst actionChangeArrowhead = (0,_register__WEBPACK_IMPORTED_MODULE_16__.register)({\r\n name: \"changeArrowhead\",\r\n perform: (elements, appState, value) => {\r\n return {\r\n elements: changeProperty(elements, appState, (el) => {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(el)) {\r\n const { position, type } = value;\r\n if (position === \"start\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n startArrowhead: type,\r\n });\r\n return element;\r\n }\r\n else if (position === \"end\") {\r\n const element = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_7__.newElementWith)(el, {\r\n endArrowhead: type,\r\n });\r\n return element;\r\n }\r\n }\r\n return el;\r\n }),\r\n appState: Object.assign(Object.assign({}, appState), { [value.position === \"start\"\r\n ? \"currentItemStartArrowhead\"\r\n : \"currentItemEndArrowhead\"]: value.type }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ elements, appState, updateData }) => {\r\n const isRTL = (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.getLanguage)().rtl;\r\n return ((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_10__.t)(\"labels.arrowheads\") }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"iconSelectList\" }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_start\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_none\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n keyBinding: \"q\",\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_arrow\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"w\",\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_bar\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"e\",\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_dot\"),\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: !isRTL }, void 0),\r\n keyBinding: \"r\",\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: !isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_12__.canHaveArrowheads)(element.type)\r\n ? element.startArrowhead\r\n : appState.currentItemStartArrowhead, appState.currentItemStartArrowhead), onChange: (value) => updateData({ position: \"start\", type: value }) }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_IconPicker__WEBPACK_IMPORTED_MODULE_3__.IconPicker, { label: \"arrowhead_end\", group: \"arrowheads\", options: [\r\n {\r\n value: null,\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_none\"),\r\n keyBinding: \"q\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadNoneIcon, { theme: appState.theme }, void 0),\r\n },\r\n {\r\n value: \"arrow\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_arrow\"),\r\n keyBinding: \"w\",\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadArrowIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n },\r\n {\r\n value: \"bar\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_bar\"),\r\n keyBinding: \"e\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadBarIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"dot\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_dot\"),\r\n keyBinding: \"r\",\r\n icon: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadDotIcon, { theme: appState.theme, flip: isRTL }, void 0),\r\n },\r\n {\r\n value: \"triangle\",\r\n text: (0,_i18n__WEBPACK_IMPORTED_MODULE_10__.t)(\"labels.arrowhead_triangle\"),\r\n icon: ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_icons__WEBPACK_IMPORTED_MODULE_4__.ArrowheadTriangleIcon, { theme: appState.theme, flip: isRTL }, void 0)),\r\n keyBinding: \"t\",\r\n },\r\n ], value: getFormValue(elements, appState, (element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isLinearElement)(element) && (0,_scene__WEBPACK_IMPORTED_MODULE_12__.canHaveArrowheads)(element.type)\r\n ? element.endArrowhead\r\n : appState.currentItemEndArrowhead, appState.currentItemEndArrowhead), onChange: (value) => updateData({ position: \"end\", type: value }) }, void 0)] }), void 0)] }, void 0));\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QkFBc0IsQ0FBQztvQ0FDL0IsVUFBVSxFQUFFLEdBQUc7b0NBQ2YsSUFBSSxFQUFFLHVEQUFDLCtEQUFnQixJQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLFdBQUk7aUNBQy9EO2dDQUNEO29DQUNFLEtBQUssRUFBRSxVQUFVO29DQUNqQixJQUFJLEVBQUUseUNBQUMsQ0FBQywyQkFBMkIsQ0FBQztvQ0FDcEMsSUFBSSxFQUFFLENBQ0osdURBQUMsb0VBQXFCLElBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssV0FBSSxDQUM5RDtvQ0FDRCxVQUFVLEVBQUUsR0FBRztpQ0FDaEI7NkJBQ0YsRUFDRCxLQUFLLEVBQUUsWUFBWSxDQUNqQixRQUFRLEVBQ1IsUUFBUSxFQUNSLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDVixvRUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLDBEQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0NBQ3pELENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWTtnQ0FDdEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFDdEMsUUFBUSxDQUFDLHVCQUF1QixDQUNqQyxFQUNELFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsV0FDakUsYUFDRSxZQUNHLENBQ1osQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYWN0aW9ucy9hY3Rpb25Qcm9wZXJ0aWVzLnRzeD84NjkzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uLy4uL3NyYy90eXBlc1wiO1xuaW1wb3J0IHsgQnV0dG9uSWNvblNlbGVjdCB9IGZyb20gXCIuLi9jb21wb25lbnRzL0J1dHRvbkljb25TZWxlY3RcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQ29sb3JQaWNrZXJcIjtcbmltcG9ydCB7IEljb25QaWNrZXIgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9JY29uUGlja2VyXCI7XG5pbXBvcnQge1xuICBBcnJvd2hlYWRBcnJvd0ljb24sXG4gIEFycm93aGVhZEJhckljb24sXG4gIEFycm93aGVhZERvdEljb24sXG4gIEFycm93aGVhZFRyaWFuZ2xlSWNvbixcbiAgQXJyb3doZWFkTm9uZUljb24sXG4gIEVkZ2VSb3VuZEljb24sXG4gIEVkZ2VTaGFycEljb24sXG4gIEZpbGxDcm9zc0hhdGNoSWNvbixcbiAgRmlsbEhhY2h1cmVJY29uLFxuICBGaWxsU29saWRJY29uLFxuICBGb250RmFtaWx5Q29kZUljb24sXG4gIEZvbnRGYW1pbHlIYW5kRHJhd25JY29uLFxuICBGb250RmFtaWx5Tm9ybWFsSWNvbixcbiAgRm9udFNpemVFeHRyYUxhcmdlSWNvbixcbiAgRm9udFNpemVMYXJnZUljb24sXG4gIEZvbnRTaXplTWVkaXVtSWNvbixcbiAgRm9udFNpemVTbWFsbEljb24sXG4gIFNsb3BwaW5lc3NBcmNoaXRlY3RJY29uLFxuICBTbG9wcGluZXNzQXJ0aXN0SWNvbixcbiAgU2xvcHBpbmVzc0NhcnRvb25pc3RJY29uLFxuICBTdHJva2VTdHlsZURhc2hlZEljb24sXG4gIFN0cm9rZVN0eWxlRG90dGVkSWNvbixcbiAgU3Ryb2tlU3R5bGVTb2xpZEljb24sXG4gIFN0cm9rZVdpZHRoSWNvbixcbiAgVGV4dEFsaWduQ2VudGVySWNvbixcbiAgVGV4dEFsaWduTGVmdEljb24sXG4gIFRleHRBbGlnblJpZ2h0SWNvbixcbn0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaWNvbnNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRk9OVF9GQU1JTFksXG4gIERFRkFVTFRfRk9OVF9TSVpFLFxuICBGT05UX0ZBTUlMWSxcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzLFxuICBpc1RleHRFbGVtZW50LFxuICByZWRyYXdUZXh0Qm91bmRpbmdCb3gsXG59IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEJvdW5kVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgaXNMaW5lYXJFbGVtZW50LCBpc0xpbmVhckVsZW1lbnRUeXBlIH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgVGV4dEFsaWduLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0TGFuZ3VhZ2UsIHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgcmFuZG9tSW50ZWdlciB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7XG4gIGNhbkNoYW5nZVNoYXJwbmVzcyxcbiAgY2FuSGF2ZUFycm93aGVhZHMsXG4gIGdldENvbW1vbkF0dHJpYnV0ZU9mU2VsZWN0ZWRFbGVtZW50cyxcbiAgZ2V0U2VsZWN0ZWRFbGVtZW50cyxcbiAgZ2V0VGFyZ2V0RWxlbWVudHMsXG4gIGlzU29tZUVsZW1lbnRTZWxlY3RlZCxcbn0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgeyBoYXNTdHJva2VDb2xvciB9IGZyb20gXCIuLi9zY2VuZS9jb21wYXJpc29uc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuXG5jb25zdCBjaGFuZ2VQcm9wZXJ0eSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgY2FsbGJhY2s6IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT4gRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGluY2x1ZGVCb3VuZFRleHQgPSBmYWxzZSxcbikgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHMgPSBhcnJheVRvTWFwKFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlLCBpbmNsdWRlQm91bmRUZXh0KSxcbiAgKTtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkcy5nZXQoZWxlbWVudC5pZCkgfHxcbiAgICAgIGVsZW1lbnQuaWQgPT09IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSk7XG59O1xuXG5jb25zdCBnZXRGb3JtVmFsdWUgPSBmdW5jdGlvbiA8VD4oXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGdldEF0dHJpYnV0ZTogKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiBULFxuICBkZWZhdWx0VmFsdWU/OiBULFxuKTogVCB8IG51bGwge1xuICBjb25zdCBlZGl0aW5nRWxlbWVudCA9IGFwcFN0YXRlLmVkaXRpbmdFbGVtZW50O1xuICBjb25zdCBub25EZWxldGVkRWxlbWVudHMgPSBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpO1xuICByZXR1cm4gKFxuICAgIChlZGl0aW5nRWxlbWVudCAmJiBnZXRBdHRyaWJ1dGUoZWRpdGluZ0VsZW1lbnQpKSA/P1xuICAgIChpc1NvbWVFbGVtZW50U2VsZWN0ZWQobm9uRGVsZXRlZEVsZW1lbnRzLCBhcHBTdGF0ZSlcbiAgICAgID8gZ2V0Q29tbW9uQXR0cmlidXRlT2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIG5vbkRlbGV0ZWRFbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICBnZXRBdHRyaWJ1dGUsXG4gICAgICAgIClcbiAgICAgIDogZGVmYXVsdFZhbHVlKSA/P1xuICAgIG51bGxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VTdHJva2VDb2xvciA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTdHJva2VDb2xvclwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odmFsdWUuY3VycmVudEl0ZW1TdHJva2VDb2xvciAmJiB7XG4gICAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWwpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYXNTdHJva2VDb2xvcihlbC50eXBlKVxuICAgICAgICAgICAgICA/IG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogdmFsdWUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IGVsO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIC4uLnZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogISF2YWx1ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDw+XG4gICAgICA8aDMgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3QoXCJsYWJlbHMuc3Ryb2tlXCIpfTwvaDM+XG4gICAgICA8Q29sb3JQaWNrZXJcbiAgICAgICAgdHlwZT1cImVsZW1lbnRTdHJva2VcIlxuICAgICAgICBsYWJlbD17dChcImxhYmVscy5zdHJva2VcIil9XG4gICAgICAgIGNvbG9yPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyhjb2xvcikgPT4gdXBkYXRlRGF0YSh7IGN1cnJlbnRJdGVtU3Ryb2tlQ29sb3I6IGNvbG9yIH0pfVxuICAgICAgICBpc0FjdGl2ZT17YXBwU3RhdGUub3BlblBvcHVwID09PSBcInN0cm9rZUNvbG9yUGlja2VyXCJ9XG4gICAgICAgIHNldEFjdGl2ZT17KGFjdGl2ZSkgPT5cbiAgICAgICAgICB1cGRhdGVEYXRhKHsgb3BlblBvcHVwOiBhY3RpdmUgPyBcInN0cm9rZUNvbG9yUGlja2VyXCIgOiBudWxsIH0pXG4gICAgICAgIH1cbiAgICAgIC8+XG4gICAgPC8+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZUJhY2tncm91bmRDb2xvciA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VCYWNrZ3JvdW5kQ29sb3JcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHZhbHVlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yICYmIHtcbiAgICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHZhbHVlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiAhIXZhbHVlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDw+XG4gICAgICA8aDMgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3QoXCJsYWJlbHMuYmFja2dyb3VuZFwiKX08L2gzPlxuICAgICAgPENvbG9yUGlja2VyXG4gICAgICAgIHR5cGU9XCJlbGVtZW50QmFja2dyb3VuZFwiXG4gICAgICAgIGxhYmVsPXt0KFwibGFiZWxzLmJhY2tncm91bmRcIil9XG4gICAgICAgIGNvbG9yPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KGNvbG9yKSA9PiB1cGRhdGVEYXRhKHsgY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3I6IGNvbG9yIH0pfVxuICAgICAgICBpc0FjdGl2ZT17YXBwU3RhdGUub3BlblBvcHVwID09PSBcImJhY2tncm91bmRDb2xvclBpY2tlclwifVxuICAgICAgICBzZXRBY3RpdmU9eyhhY3RpdmUpID0+XG4gICAgICAgICAgdXBkYXRlRGF0YSh7IG9wZW5Qb3B1cDogYWN0aXZlID8gXCJiYWNrZ3JvdW5kQ29sb3JQaWNrZXJcIiA6IG51bGwgfSlcbiAgICAgICAgfVxuICAgICAgLz5cbiAgICA8Lz5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlRmlsbFN0eWxlID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUZpbGxTdHlsZVwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCB2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogY2hhbmdlUHJvcGVydHkoZWxlbWVudHMsIGFwcFN0YXRlLCAoZWwpID0+XG4gICAgICAgIG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgZmlsbFN0eWxlOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIGN1cnJlbnRJdGVtRmlsbFN0eWxlOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuZmlsbFwiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJoYWNodXJlXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmhhY2h1cmVcIiksXG4gICAgICAgICAgICBpY29uOiA8RmlsbEhhY2h1cmVJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJjcm9zcy1oYXRjaFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5jcm9zc0hhdGNoXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZpbGxDcm9zc0hhdGNoSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwic29saWRcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc29saWRcIiksXG4gICAgICAgICAgICBpY29uOiA8RmlsbFNvbGlkSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIGdyb3VwPVwiZmlsbFwiXG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsbFN0eWxlLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgdXBkYXRlRGF0YSh2YWx1ZSk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVN0cm9rZVdpZHRoID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZVN0cm9rZVdpZHRoXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzdHJva2VXaWR0aDogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBjdXJyZW50SXRlbVN0cm9rZVdpZHRoOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuc3Ryb2tlV2lkdGhcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBncm91cD1cInN0cm9rZS13aWR0aFwiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMudGhpblwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VXaWR0aEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBzdHJva2VXaWR0aD17Mn0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYm9sZFwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VXaWR0aEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBzdHJva2VXaWR0aD17Nn0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogNCxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuZXh0cmFCb2xkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVdpZHRoSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IHN0cm9rZVdpZHRoPXsxMH0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5zdHJva2VXaWR0aCxcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICApfVxuICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHZhbHVlKX1cbiAgICAgIC8+XG4gICAgPC9maWVsZHNldD5cbiAgKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlU2xvcHBpbmVzcyA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTbG9wcGluZXNzXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzZWVkOiByYW5kb21JbnRlZ2VyKCksXG4gICAgICAgICAgcm91Z2huZXNzOiB2YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIGN1cnJlbnRJdGVtUm91Z2huZXNzOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuc2xvcHBpbmVzc1wiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0XG4gICAgICAgIGdyb3VwPVwic2xvcHBpbmVzc1wiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJjaGl0ZWN0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFNsb3BwaW5lc3NBcmNoaXRlY3RJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJ0aXN0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFNsb3BwaW5lc3NBcnRpc3RJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY2FydG9vbmlzdFwiKSxcbiAgICAgICAgICAgIGljb246IDxTbG9wcGluZXNzQ2FydG9vbmlzdEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnJvdWdobmVzcyxcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVN0cm9rZVN0eWxlID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZVN0cm9rZVN0eWxlXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzdHJva2VTdHlsZTogdmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBjdXJyZW50SXRlbVN0cm9rZVN0eWxlOiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuc3Ryb2tlU3R5bGVcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBncm91cD1cInN0cm9rZVN0eWxlXCJcbiAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcInNvbGlkXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnN0cm9rZVN0eWxlX3NvbGlkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVN0eWxlU29saWRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJkYXNoZWRcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuc3Ryb2tlU3R5bGVfZGFzaGVkXCIpLFxuICAgICAgICAgICAgaWNvbjogPFN0cm9rZVN0eWxlRGFzaGVkSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwiZG90dGVkXCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnN0cm9rZVN0eWxlX2RvdHRlZFwiKSxcbiAgICAgICAgICAgIGljb246IDxTdHJva2VTdHlsZURvdHRlZEljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LnN0cm9rZVN0eWxlLFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VPcGFjaXR5ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZU9wYWNpdHlcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KGVsZW1lbnRzLCBhcHBTdGF0ZSwgKGVsKSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbCwge1xuICAgICAgICAgIG9wYWNpdHk6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgY3VycmVudEl0ZW1PcGFjaXR5OiB2YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxsYWJlbCBjbGFzc05hbWU9XCJjb250cm9sLWxhYmVsXCI+XG4gICAgICB7dChcImxhYmVscy5vcGFjaXR5XCIpfVxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgIG1pbj1cIjBcIlxuICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICBzdGVwPVwiMTBcIlxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB1cGRhdGVEYXRhKCtldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICBvbldoZWVsPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBTVEVQID0gMTA7XG4gICAgICAgICAgY29uc3QgTUFYID0gMTAwO1xuICAgICAgICAgIGNvbnN0IE1JTiA9IDA7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSArdGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDAgJiYgdmFsdWUgPCBNQVgpIHtcbiAgICAgICAgICAgIHVwZGF0ZURhdGEodmFsdWUgKyBTVEVQKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDAgJiYgdmFsdWUgPiBNSU4pIHtcbiAgICAgICAgICAgIHVwZGF0ZURhdGEodmFsdWUgLSBTVEVQKTtcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAgIHZhbHVlPXtcbiAgICAgICAgICBnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQub3BhY2l0eSxcbiAgICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgICApID8/IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAvPlxuICAgIDwvbGFiZWw+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZUZvbnRTaXplID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUZvbnRTaXplXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAoZWwpID0+IHtcbiAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCA9IG5ld0VsZW1lbnRXaXRoKGVsLCB7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiB2YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZWwuY29udGFpbmVySWQpIHtcbiAgICAgICAgICAgICAgY29udGFpbmVyID0gU2NlbmUuZ2V0U2NlbmUoZWwpIS5nZXRFbGVtZW50KGVsLmNvbnRhaW5lcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChlbGVtZW50LCBjb250YWluZXIsIGFwcFN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgY3VycmVudEl0ZW1Gb250U2l6ZTogdmFsdWUsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxsZWdlbmQ+e3QoXCJsYWJlbHMuZm9udFNpemVcIil9PC9sZWdlbmQ+XG4gICAgICA8QnV0dG9uSWNvblNlbGVjdFxuICAgICAgICBncm91cD1cImZvbnQtc2l6ZVwiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMTYsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnNtYWxsXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZvbnRTaXplU21hbGxJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLm1lZGl1bVwiKSxcbiAgICAgICAgICAgIGljb246IDxGb250U2l6ZU1lZGl1bUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAyOCxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMubGFyZ2VcIiksXG4gICAgICAgICAgICBpY29uOiA8Rm9udFNpemVMYXJnZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAzNixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMudmVyeUxhcmdlXCIpLFxuICAgICAgICAgICAgaWNvbjogPEZvbnRTaXplRXh0cmFMYXJnZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mb250U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kVGV4dEVsZW1lbnQuZm9udFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUgfHwgREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgICl9XG4gICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHVwZGF0ZURhdGEodmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2ZpZWxkc2V0PlxuICApLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DaGFuZ2VGb250RmFtaWx5ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNoYW5nZUZvbnRGYW1pbHlcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIChlbCkgPT4ge1xuICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsKSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogdmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVsLmNvbnRhaW5lcklkKSB7XG4gICAgICAgICAgICAgIGNvbnRhaW5lciA9IFNjZW5lLmdldFNjZW5lKGVsKSEuZ2V0RWxlbWVudChlbC5jb250YWluZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3goZWxlbWVudCwgY29udGFpbmVyLCBhcHBTdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIGN1cnJlbnRJdGVtRm9udEZhbWlseTogdmFsdWUsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBGb250RmFtaWx5VmFsdWVzO1xuICAgICAgdGV4dDogc3RyaW5nO1xuICAgICAgaWNvbjogSlNYLkVsZW1lbnQ7XG4gICAgfVtdID0gW1xuICAgICAge1xuICAgICAgICB2YWx1ZTogRk9OVF9GQU1JTFkuVmlyZ2lsLFxuICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmhhbmREcmF3blwiKSxcbiAgICAgICAgaWNvbjogPEZvbnRGYW1pbHlIYW5kRHJhd25JY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogRk9OVF9GQU1JTFkuSGVsdmV0aWNhLFxuICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLm5vcm1hbFwiKSxcbiAgICAgICAgaWNvbjogPEZvbnRGYW1pbHlOb3JtYWxJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogRk9OVF9GQU1JTFkuQ2FzY2FkaWEsXG4gICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY29kZVwiKSxcbiAgICAgICAgaWNvbjogPEZvbnRGYW1pbHlDb2RlSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgPGxlZ2VuZD57dChcImxhYmVscy5mb250RmFtaWx5XCIpfTwvbGVnZW5kPlxuICAgICAgICA8QnV0dG9uSWNvblNlbGVjdDxGb250RmFtaWx5VmFsdWVzIHwgZmFsc2U+XG4gICAgICAgICAgZ3JvdXA9XCJmb250LWZhbWlseVwiXG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlKFxuICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAgIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZm9udEZhbWlseTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRUZXh0RWxlbWVudC5mb250RmFtaWx5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSB8fCBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgICAgICAgICl9XG4gICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAgIC8+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgICk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVRleHRBbGlnbiA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VUZXh0QWxpZ25cIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGNoYW5nZVByb3BlcnR5KFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgIChlbCkgPT4ge1xuICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsKSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiB2YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZWwuY29udGFpbmVySWQpIHtcbiAgICAgICAgICAgICAgY29udGFpbmVyID0gU2NlbmUuZ2V0U2NlbmUoZWwpIS5nZXRFbGVtZW50KGVsLmNvbnRhaW5lcklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveChlbGVtZW50LCBjb250YWluZXIsIGFwcFN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgY3VycmVudEl0ZW1UZXh0QWxpZ246IHZhbHVlLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLnRleHRBbGlnblwiKX08L2xlZ2VuZD5cbiAgICAgIDxCdXR0b25JY29uU2VsZWN0PFRleHRBbGlnbiB8IGZhbHNlPlxuICAgICAgICBncm91cD1cInRleHQtYWxpZ25cIlxuICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwibGVmdFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5sZWZ0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnbkxlZnRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuY2VudGVyXCIpLFxuICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnbkNlbnRlckljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcInJpZ2h0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLnJpZ2h0XCIpLFxuICAgICAgICAgICAgaWNvbjogPFRleHRBbGlnblJpZ2h0SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgIH0sXG4gICAgICAgIF19XG4gICAgICAgIHZhbHVlPXtnZXRGb3JtVmFsdWUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRleHRBbGlnbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVNoYXJwbmVzcyA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VTaGFycG5lc3NcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50cyA9IGdldFRhcmdldEVsZW1lbnRzKFxuICAgICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRm9yTm9uTGluZWFyRWxlbWVudHMgPSB0YXJnZXRFbGVtZW50cy5sZW5ndGhcbiAgICAgID8gdGFyZ2V0RWxlbWVudHMuZXZlcnkoKGVsKSA9PiAhaXNMaW5lYXJFbGVtZW50KGVsKSlcbiAgICAgIDogIWlzTGluZWFyRWxlbWVudFR5cGUoYXBwU3RhdGUuZWxlbWVudFR5cGUpO1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUZvckxpbmVhckVsZW1lbnRzID0gdGFyZ2V0RWxlbWVudHMubGVuZ3RoXG4gICAgICA/IHRhcmdldEVsZW1lbnRzLmV2ZXJ5KGlzTGluZWFyRWxlbWVudClcbiAgICAgIDogaXNMaW5lYXJFbGVtZW50VHlwZShhcHBTdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICBzdHJva2VTaGFycG5lc3M6IHZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3M6IHNob3VsZFVwZGF0ZUZvck5vbkxpbmVhckVsZW1lbnRzXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICAgIGN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzOiBzaG91bGRVcGRhdGVGb3JMaW5lYXJFbGVtZW50c1xuICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICA6IGFwcFN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgZWxlbWVudHMsIGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmVkZ2VzXCIpfTwvbGVnZW5kPlxuICAgICAgPEJ1dHRvbkljb25TZWxlY3RcbiAgICAgICAgZ3JvdXA9XCJlZGdlc1wiXG4gICAgICAgIG9wdGlvbnM9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJzaGFycFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5zaGFycFwiKSxcbiAgICAgICAgICAgIGljb246IDxFZGdlU2hhcnBJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJyb3VuZFwiLFxuICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5yb3VuZFwiKSxcbiAgICAgICAgICAgIGljb246IDxFZGdlUm91bmRJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gLz4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXX1cbiAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZShcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5zdHJva2VTaGFycG5lc3MsXG4gICAgICAgICAgKGNhbkNoYW5nZVNoYXJwbmVzcyhhcHBTdGF0ZS5lbGVtZW50VHlwZSkgJiZcbiAgICAgICAgICAgIChpc0xpbmVhckVsZW1lbnRUeXBlKGFwcFN0YXRlLmVsZW1lbnRUeXBlKVxuICAgICAgICAgICAgICA/IGFwcFN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzXG4gICAgICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MpKSB8fFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgKX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh2YWx1ZSl9XG4gICAgICAvPlxuICAgIDwvZmllbGRzZXQ+XG4gICksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZUFycm93aGVhZCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VBcnJvd2hlYWRcIixcbiAgcGVyZm9ybTogKFxuICAgIGVsZW1lbnRzLFxuICAgIGFwcFN0YXRlLFxuICAgIHZhbHVlOiB7IHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiOyB0eXBlOiBBcnJvd2hlYWQgfSxcbiAgKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiBjaGFuZ2VQcm9wZXJ0eShlbGVtZW50cywgYXBwU3RhdGUsIChlbCkgPT4ge1xuICAgICAgICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsKSkge1xuICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb24sIHR5cGUgfSA9IHZhbHVlO1xuXG4gICAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgc3RhcnRBcnJvd2hlYWQ6IHR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09IFwiZW5kXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoZWwsIHtcbiAgICAgICAgICAgICAgZW5kQXJyb3doZWFkOiB0eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9KSxcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICBbdmFsdWUucG9zaXRpb24gPT09IFwic3RhcnRcIlxuICAgICAgICAgID8gXCJjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkXCJcbiAgICAgICAgICA6IFwiY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRcIl06IHZhbHVlLnR5cGUsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBlbGVtZW50cywgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4ge1xuICAgIGNvbnN0IGlzUlRMID0gZ2V0TGFuZ3VhZ2UoKS5ydGw7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGZpZWxkc2V0PlxuICAgICAgICA8bGVnZW5kPnt0KFwibGFiZWxzLmFycm93aGVhZHNcIil9PC9sZWdlbmQ+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaWNvblNlbGVjdExpc3RcIj5cbiAgICAgICAgICA8SWNvblBpY2tlclxuICAgICAgICAgICAgbGFiZWw9XCJhcnJvd2hlYWRfc3RhcnRcIlxuICAgICAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfbm9uZVwiKSxcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkTm9uZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSAvPixcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInFcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFycm93XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfYXJyb3dcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogKFxuICAgICAgICAgICAgICAgICAgPEFycm93aGVhZEFycm93SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9eyFpc1JUTH0gLz5cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwid1wiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYmFyXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfYmFyXCIpLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWRCYXJJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17IWlzUlRMfSAvPixcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcImVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImRvdFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2RvdFwiKSxcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkRG90SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9eyFpc1JUTH0gLz4sXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJyXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX3RyaWFuZ2xlXCIpLFxuICAgICAgICAgICAgICAgIGljb246IChcbiAgICAgICAgICAgICAgICAgIDxBcnJvd2hlYWRUcmlhbmdsZUljb24gdGhlbWU9e2FwcFN0YXRlLnRoZW1lfSBmbGlwPXshaXNSVEx9IC8+XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInRcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF19XG4gICAgICAgICAgICB2YWx1ZT17Z2V0Rm9ybVZhbHVlPEFycm93aGVhZCB8IG51bGw+KFxuICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSAmJiBjYW5IYXZlQXJyb3doZWFkcyhlbGVtZW50LnR5cGUpXG4gICAgICAgICAgICAgICAgICA/IGVsZW1lbnQuc3RhcnRBcnJvd2hlYWRcbiAgICAgICAgICAgICAgICAgIDogYXBwU3RhdGUuY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCxcbiAgICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB1cGRhdGVEYXRhKHsgcG9zaXRpb246IFwic3RhcnRcIiwgdHlwZTogdmFsdWUgfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8SWNvblBpY2tlclxuICAgICAgICAgICAgbGFiZWw9XCJhcnJvd2hlYWRfZW5kXCJcbiAgICAgICAgICAgIGdyb3VwPVwiYXJyb3doZWFkc1wiXG4gICAgICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9ub25lXCIpLFxuICAgICAgICAgICAgICAgIGtleUJpbmRpbmc6IFwicVwiLFxuICAgICAgICAgICAgICAgIGljb246IDxBcnJvd2hlYWROb25lSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IC8+LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYXJyb3dcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KFwibGFiZWxzLmFycm93aGVhZF9hcnJvd1wiKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcIndcIixcbiAgICAgICAgICAgICAgICBpY29uOiAoXG4gICAgICAgICAgICAgICAgICA8QXJyb3doZWFkQXJyb3dJY29uIHRoZW1lPXthcHBTdGF0ZS50aGVtZX0gZmxpcD17aXNSVEx9IC8+XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImJhclwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2JhclwiKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcImVcIixcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkQmFySWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9e2lzUlRMfSAvPixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcImRvdFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IHQoXCJsYWJlbHMuYXJyb3doZWFkX2RvdFwiKSxcbiAgICAgICAgICAgICAgICBrZXlCaW5kaW5nOiBcInJcIixcbiAgICAgICAgICAgICAgICBpY29uOiA8QXJyb3doZWFkRG90SWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9e2lzUlRMfSAvPixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBcInRyaWFuZ2xlXCIsXG4gICAgICAgICAgICAgICAgdGV4dDogdChcImxhYmVscy5hcnJvd2hlYWRfdHJpYW5nbGVcIiksXG4gICAgICAgICAgICAgICAgaWNvbjogKFxuICAgICAgICAgICAgICAgICAgPEFycm93aGVhZFRyaWFuZ2xlSWNvbiB0aGVtZT17YXBwU3RhdGUudGhlbWV9IGZsaXA9e2lzUlRMfSAvPlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAga2V5QmluZGluZzogXCJ0XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdfVxuICAgICAgICAgICAgdmFsdWU9e2dldEZvcm1WYWx1ZTxBcnJvd2hlYWQgfCBudWxsPihcbiAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgJiYgY2FuSGF2ZUFycm93aGVhZHMoZWxlbWVudC50eXBlKVxuICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LmVuZEFycm93aGVhZFxuICAgICAgICAgICAgICAgICAgOiBhcHBTdGF0ZS5jdXJyZW50SXRlbUVuZEFycm93aGVhZCxcbiAgICAgICAgICAgICAgYXBwU3RhdGUuY3VycmVudEl0ZW1FbmRBcnJvd2hlYWQsXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gdXBkYXRlRGF0YSh7IHBvc2l0aW9uOiBcImVuZFwiLCB0eXBlOiB2YWx1ZSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgKTtcbiAgfSxcbn0pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../actions/actionProperties.tsx\n");
1354
1354
 
1355
1355
  /***/ }),
1356
1356
 
@@ -2329,7 +2329,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2329
2329
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2330
2330
 
2331
2331
  "use strict";
2332
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n\r\n\r\n\r\n\r\n\r\nconst redrawTextBoundingBox = (element, container, appState) => {\r\n const maxWidth = container\r\n ? container.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2\r\n : undefined;\r\n let text = element.originalText;\r\n // Call wrapText only when updating text properties\r\n // By clicking on the container\r\n if (container && !(0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(appState.editingElement)) {\r\n text = wrapText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), container.width);\r\n }\r\n const metrics = measureText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), maxWidth);\r\n let coordY = element.y;\r\n // Resize container and vertically center align the text\r\n if (container) {\r\n coordY = container.y + container.height / 2 - metrics.height / 2;\r\n let nextHeight = container.height;\r\n if (metrics.height > container.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n nextHeight = metrics.height + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n width: metrics.width,\r\n height: metrics.height,\r\n baseline: metrics.baseline,\r\n y: coordY,\r\n text,\r\n });\r\n};\r\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\r\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\r\n oldElements.forEach((element) => {\r\n var _a;\r\n const newElementId = oldIdToDuplicatedId.get(element.id);\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(sceneElementMap.get(newElementId), {\r\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.concat({\r\n type: \"text\",\r\n id: newTextElementId,\r\n }),\r\n });\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(sceneElementMap.get(newTextElementId), {\r\n containerId: newElementId,\r\n });\r\n }\r\n });\r\n};\r\nconst handleBindTextResize = (elements, transformHandleType) => {\r\n elements.forEach((element) => {\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element).getElement(boundTextElementId);\r\n if (textElement && textElement.text) {\r\n if (!element) {\r\n return;\r\n }\r\n let text = textElement.text;\r\n let nextHeight = textElement.height;\r\n let containerHeight = element.height;\r\n let nextBaseLine = textElement.baseline;\r\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\r\n if (text) {\r\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n }\r\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n nextHeight = dimensions.height;\r\n nextBaseLine = dimensions.baseline;\r\n }\r\n // increase height in case text element height exceeds\r\n if (nextHeight > element.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n containerHeight = nextHeight + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const diff = containerHeight - element.height;\r\n // fix the y coord when resizing from ne/nw/n\r\n const updatedY = transformHandleType === \"ne\" ||\r\n transformHandleType === \"nw\" ||\r\n transformHandleType === \"n\"\r\n ? element.y - diff\r\n : element.y;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n height: containerHeight,\r\n y: updatedY,\r\n });\r\n }\r\n const updatedY = element.y + containerHeight / 2 - nextHeight / 2;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\r\n text,\r\n // preserve padding and set width correctly\r\n width: element.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2,\r\n height: nextHeight,\r\n x: element.x + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING,\r\n y: updatedY,\r\n baseline: nextBaseLine,\r\n });\r\n }\r\n }\r\n });\r\n};\r\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\r\nconst measureText = (text, font, maxWidth) => {\r\n text = text\r\n .split(\"\\n\")\r\n // replace empty lines with single space because leading/trailing empty\r\n // lines would be stripped from computation\r\n .map((x) => x || \" \")\r\n .join(\"\\n\");\r\n const container = document.createElement(\"div\");\r\n container.style.position = \"absolute\";\r\n container.style.whiteSpace = \"pre\";\r\n container.style.font = font;\r\n container.style.minHeight = \"1em\";\r\n if (maxWidth) {\r\n const lineHeight = getApproxLineHeight(font);\r\n container.style.width = `${String(maxWidth)}px`;\r\n container.style.maxWidth = `${String(maxWidth)}px`;\r\n container.style.overflow = \"hidden\";\r\n container.style.wordBreak = \"break-word\";\r\n container.style.lineHeight = `${String(lineHeight)}px`;\r\n container.style.whiteSpace = \"pre-wrap\";\r\n }\r\n document.body.appendChild(container);\r\n container.innerText = text;\r\n const span = document.createElement(\"span\");\r\n span.style.display = \"inline-block\";\r\n span.style.overflow = \"hidden\";\r\n span.style.width = \"1px\";\r\n span.style.height = \"1px\";\r\n container.appendChild(span);\r\n // Baseline is important for positioning text on canvas\r\n const baseline = span.offsetTop + span.offsetHeight;\r\n const width = container.offsetWidth;\r\n const height = container.offsetHeight;\r\n document.body.removeChild(container);\r\n return { width, height, baseline };\r\n};\r\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\r\nconst getApproxLineHeight = (font) => {\r\n return measureText(DUMMY_TEXT, font, null).height;\r\n};\r\nlet canvas;\r\nconst getTextWidth = (text, font) => {\r\n if (!canvas) {\r\n canvas = document.createElement(\"canvas\");\r\n }\r\n const canvas2dContext = canvas.getContext(\"2d\");\r\n canvas2dContext.font = font;\r\n const metrics = canvas2dContext.measureText(text);\r\n // since in test env the canvas measureText algo\r\n // doesn't measure text and instead just returns number of\r\n // characters hence we assume that each letteris 10px\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\r\n return metrics.width * 10;\r\n }\r\n return metrics.width;\r\n};\r\nconst wrapText = (text, font, containerWidth) => {\r\n const maxWidth = containerWidth - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const lines = [];\r\n const originalLines = text.split(\"\\n\");\r\n const spaceWidth = getTextWidth(\" \", font);\r\n originalLines.forEach((originalLine) => {\r\n const words = originalLine.split(\" \");\r\n // This means its newline so push it\r\n if (words.length === 1 && words[0] === \"\") {\r\n lines.push(words[0]);\r\n }\r\n else {\r\n let currentLine = \"\";\r\n let currentLineWidthTillNow = 0;\r\n let index = 0;\r\n while (index < words.length) {\r\n const currentWordWidth = getTextWidth(words[index], font);\r\n // Start breaking longer words exceeding max width\r\n if (currentWordWidth >= maxWidth) {\r\n // push current line since the current word exceeds the max width\r\n // so will be appended in next line\r\n if (currentLine) {\r\n lines.push(currentLine);\r\n }\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n while (words[index].length > 0) {\r\n const currentChar = words[index][0];\r\n const width = charWidth.calculate(currentChar, font);\r\n currentLineWidthTillNow += width;\r\n words[index] = words[index].slice(1);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n currentLine = currentChar;\r\n currentLineWidthTillNow = width;\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n else {\r\n currentLine += currentChar;\r\n }\r\n }\r\n // push current line if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n else {\r\n // space needs to be appended before next word\r\n // as currentLine contains chars which couldn't be appended\r\n // to previous line\r\n currentLine += \" \";\r\n currentLineWidthTillNow += spaceWidth;\r\n }\r\n index++;\r\n }\r\n else {\r\n // Start appending words in a line till max width reached\r\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\r\n const word = words[index];\r\n currentLineWidthTillNow = getTextWidth(currentLine + word, font);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLineWidthTillNow = 0;\r\n currentLine = \"\";\r\n break;\r\n }\r\n index++;\r\n currentLine += `${word} `;\r\n // Push the word if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine.slice(0, -1));\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n break;\r\n }\r\n }\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n }\r\n if (currentLine) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n }\r\n }\r\n });\r\n return lines.join(\"\\n\");\r\n};\r\nconst charWidth = (() => {\r\n const cachedCharWidth = {};\r\n const calculate = (char, font) => {\r\n const ascii = char.charCodeAt(0);\r\n if (!cachedCharWidth[font]) {\r\n cachedCharWidth[font] = [];\r\n }\r\n if (!cachedCharWidth[font][ascii]) {\r\n const width = getTextWidth(char, font);\r\n cachedCharWidth[font][ascii] = width;\r\n }\r\n return cachedCharWidth[font][ascii];\r\n };\r\n const getCache = (font) => {\r\n return cachedCharWidth[font];\r\n };\r\n return {\r\n calculate,\r\n getCache,\r\n };\r\n})();\r\nconst getApproxMinLineWidth = (font) => {\r\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\r\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\r\n};\r\nconst getApproxMinLineHeight = (font) => {\r\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n};\r\nconst getMinCharWidth = (font) => {\r\n const cache = charWidth.getCache(font);\r\n if (!cache) {\r\n return 0;\r\n }\r\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\r\n return Math.min(...cacheWithOutEmpty);\r\n};\r\nconst getApproxCharsToFitInWidth = (font, width) => {\r\n // Generally lower case is used so converting to lower case\r\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\r\n const batchLength = 6;\r\n let index = 0;\r\n let widthTillNow = 0;\r\n let str = \"\";\r\n while (widthTillNow <= width) {\r\n const batch = dummyText.substr(index, index + batchLength);\r\n str += batch;\r\n widthTillNow += getTextWidth(str, font);\r\n if (index === dummyText.length - 1) {\r\n index = 0;\r\n }\r\n index = index + batchLength;\r\n }\r\n while (widthTillNow > width) {\r\n str = str.substr(0, str.length - 1);\r\n widthTillNow = getTextWidth(str, font);\r\n }\r\n return str.length;\r\n};\r\nconst getBoundTextElementId = (container) => {\r\n var _a, _b;\r\n return (_b = (_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.type === \"text\")[0]) === null || _b === void 0 ? void 0 : _b.id;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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T0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVLLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxTQUFtQyxFQUFFLEVBQUU7O0lBQzNFLE9BQU8scUJBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxhQUFhLDBDQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDLDBDQUFFLEVBQUUsQ0FBQztBQUMvRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0RWxlbWVudC50cz80MmQyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEZvbnRTdHJpbmcsIGFycmF5VG9NYXAsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRm9udFN0cmluZyxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IEJPVU5EX1RFWFRfUEFERElORyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcblxuZXhwb3J0IGNvbnN0IHJlZHJhd1RleHRCb3VuZGluZ0JveCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGNvbnN0IG1heFdpZHRoID0gY29udGFpbmVyXG4gICAgPyBjb250YWluZXIud2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyXG4gICAgOiB1bmRlZmluZWQ7XG4gIGxldCB0ZXh0ID0gZWxlbWVudC5vcmlnaW5hbFRleHQ7XG4gIC8vIENhbGwgd3JhcFRleHQgb25seSB3aGVuIHVwZGF0aW5nIHRleHQgcHJvcGVydGllc1xuICAvLyBCeSBjbGlja2luZyBvbiB0aGUgY29udGFpbmVyXG4gIGlmIChjb250YWluZXIgJiYgIWlzVGV4dEVsZW1lbnQoYXBwU3RhdGUuZWRpdGluZ0VsZW1lbnQpKSB7XG4gICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgZWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKGVsZW1lbnQpLFxuICAgICAgY29udGFpbmVyLndpZHRoLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgIGVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgbWF4V2lkdGgsXG4gICk7XG5cbiAgbGV0IGNvb3JkWSA9IGVsZW1lbnQueTtcbiAgLy8gUmVzaXplIGNvbnRhaW5lciBhbmQgdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvb3JkWSA9IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIgLSBtZXRyaWNzLmhlaWdodCAvIDI7XG4gICAgbGV0IG5leHRIZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgIGlmIChtZXRyaWNzLmhlaWdodCA+IGNvbnRhaW5lci5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyKSB7XG4gICAgICBuZXh0SGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBuZXh0SGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICB9XG4gICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICB9XG5cbiAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgaGVpZ2h0OiBtZXRyaWNzLmhlaWdodCxcbiAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSxcbiAgICB5OiBjb29yZFksXG4gICAgdGV4dCxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiA9IChcbiAgc2NlbmVFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZElkVG9EdXBsaWNhdGVkSWQ6IE1hcDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdPixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzY2VuZUVsZW1lbnRNYXAgPSBhcnJheVRvTWFwKHNjZW5lRWxlbWVudHMpIGFzIE1hcDxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50XG4gID47XG4gIG9sZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBuZXdFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChlbGVtZW50LmlkKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuXG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgbmV3VGV4dEVsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGJvdW5kVGV4dEVsZW1lbnRJZCkhO1xuICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgc2NlbmVFbGVtZW50TWFwLmdldChuZXdFbGVtZW50SWQpIGFzIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gICAgICAgIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudHM/LmNvbmNhdCh7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIGlkOiBuZXdUZXh0RWxlbWVudElkLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoXG4gICAgICAgIHNjZW5lRWxlbWVudE1hcC5nZXQobmV3VGV4dEVsZW1lbnRJZCkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGFpbmVySWQ6IG5ld0VsZW1lbnRJZCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUsXG4pID0+IHtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5nZXRFbGVtZW50KFxuICAgICAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGlmICh0ZXh0RWxlbWVudCAmJiB0ZXh0RWxlbWVudC50ZXh0KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gICAgICAgIGxldCBuZXh0SGVpZ2h0ID0gdGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIGxldCBuZXh0QmFzZUxpbmUgPSB0ZXh0RWxlbWVudC5iYXNlbGluZTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwiblwiICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwic1wiKSB7XG4gICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IG1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICApO1xuICAgICAgICAgIG5leHRIZWlnaHQgPSBkaW1lbnNpb25zLmhlaWdodDtcbiAgICAgICAgICBuZXh0QmFzZUxpbmUgPSBkaW1lbnNpb25zLmJhc2VsaW5lO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgICAgICBpZiAobmV4dEhlaWdodCA+IGVsZW1lbnQuaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogMikge1xuICAgICAgICAgIGNvbnRhaW5lckhlaWdodCA9IG5leHRIZWlnaHQgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBjb250YWluZXJIZWlnaHQgLSBlbGVtZW50LmhlaWdodDtcbiAgICAgICAgICAvLyBmaXggdGhlIHkgY29vcmQgd2hlbiByZXNpemluZyBmcm9tIG5lL253L25cbiAgICAgICAgICBjb25zdCB1cGRhdGVkWSA9XG4gICAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuXCJcbiAgICAgICAgICAgICAgPyBlbGVtZW50LnkgLSBkaWZmXG4gICAgICAgICAgICAgIDogZWxlbWVudC55O1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQsXG4gICAgICAgICAgICB5OiB1cGRhdGVkWSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRZID0gZWxlbWVudC55ICsgY29udGFpbmVySGVpZ2h0IC8gMiAtIG5leHRIZWlnaHQgLyAyO1xuICAgICAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICAvLyBwcmVzZXJ2ZSBwYWRkaW5nIGFuZCBzZXQgd2lkdGggY29ycmVjdGx5XG4gICAgICAgICAgd2lkdGg6IGVsZW1lbnQud2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyLFxuICAgICAgICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICAgICAgICB4OiBlbGVtZW50LnggKyBCT1VORF9URVhUX1BBRERJTkcsXG4gICAgICAgICAgeTogdXBkYXRlZFksXG4gICAgICAgICAgYmFzZWxpbmU6IG5leHRCYXNlTGluZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmFzc2F0b3IvY2FudmFzLXRleHQtZWRpdG9yL2Jsb2IvbWFzdGVyL2xpYi9Gb250TWV0cmljcy5qc1xuZXhwb3J0IGNvbnN0IG1lYXN1cmVUZXh0ID0gKFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZvbnQ6IEZvbnRTdHJpbmcsXG4gIG1heFdpZHRoPzogbnVtYmVyIHwgbnVsbCxcbikgPT4ge1xuICB0ZXh0ID0gdGV4dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC8vIHJlcGxhY2UgZW1wdHkgbGluZXMgd2l0aCBzaW5nbGUgc3BhY2UgYmVjYXVzZSBsZWFkaW5nL3RyYWlsaW5nIGVtcHR5XG4gICAgLy8gbGluZXMgd291bGQgYmUgc3RyaXBwZWQgZnJvbSBjb21wdXRhdGlvblxuICAgIC5tYXAoKHgpID0+IHggfHwgXCIgXCIpXG4gICAgLmpvaW4oXCJcXG5cIik7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZVwiO1xuICBjb250YWluZXIuc3R5bGUuZm9udCA9IGZvbnQ7XG4gIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjFlbVwiO1xuXG4gIGlmIChtYXhXaWR0aCkge1xuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGZvbnQpO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke1N0cmluZyhtYXhXaWR0aCl9cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCA9IGAke1N0cmluZyhtYXhXaWR0aCl9cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gYCR7U3RyaW5nKGxpbmVIZWlnaHQpfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgfVxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5pbm5lclRleHQgPSB0ZXh0O1xuXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgc3Bhbi5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gIHNwYW4uc3R5bGUud2lkdGggPSBcIjFweFwiO1xuICBzcGFuLnN0eWxlLmhlaWdodCA9IFwiMXB4XCI7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzcGFuKTtcbiAgLy8gQmFzZWxpbmUgaXMgaW1wb3J0YW50IGZvciBwb3NpdGlvbmluZyB0ZXh0IG9uIGNhbnZhc1xuICBjb25zdCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIGNvbnN0IHdpZHRoID0gY29udGFpbmVyLm9mZnNldFdpZHRoO1xuXG4gIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcblxuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBiYXNlbGluZSB9O1xufTtcblxuY29uc3QgRFVNTVlfVEVYVCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XCIudG9Mb2NhbGVVcHBlckNhc2UoKTtcbmV4cG9ydCBjb25zdCBnZXRBcHByb3hMaW5lSGVpZ2h0ID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgcmV0dXJuIG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQsIGZvbnQsIG51bGwpLmhlaWdodDtcbn07XG5cbmxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkO1xuY29uc3QgZ2V0VGV4dFdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcblxuICBjb25zdCBtZXRyaWNzID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpO1xuICAvLyBzaW5jZSBpbiB0ZXN0IGVudiB0aGUgY2FudmFzIG1lYXN1cmVUZXh0IGFsZ29cbiAgLy8gZG9lc24ndCBtZWFzdXJlIHRleHQgYW5kIGluc3RlYWQganVzdCByZXR1cm5zIG51bWJlciBvZlxuICAvLyBjaGFyYWN0ZXJzIGhlbmNlIHdlIGFzc3VtZSB0aGF0IGVhY2ggbGV0dGVyaXMgMTBweFxuICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICByZXR1cm4gbWV0cmljcy53aWR0aCAqIDEwO1xuICB9XG5cbiAgcmV0dXJuIG1ldHJpY3Mud2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcFRleHQgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZm9udDogRm9udFN0cmluZyxcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBtYXhXaWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBjb25zdCBsaW5lczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBjb25zdCBvcmlnaW5hbExpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3Qgc3BhY2VXaWR0aCA9IGdldFRleHRXaWR0aChcIiBcIiwgZm9udCk7XG4gIG9yaWdpbmFsTGluZXMuZm9yRWFjaCgob3JpZ2luYWxMaW5lKSA9PiB7XG4gICAgY29uc3Qgd29yZHMgPSBvcmlnaW5hbExpbmUuc3BsaXQoXCIgXCIpO1xuICAgIC8vIFRoaXMgbWVhbnMgaXRzIG5ld2xpbmUgc28gcHVzaCBpdFxuICAgIGlmICh3b3Jkcy5sZW5ndGggPT09IDEgJiYgd29yZHNbMF0gPT09IFwiXCIpIHtcbiAgICAgIGxpbmVzLnB1c2god29yZHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgbGV0IGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcblxuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50V29yZFdpZHRoID0gZ2V0VGV4dFdpZHRoKHdvcmRzW2luZGV4XSwgZm9udCk7XG5cbiAgICAgICAgLy8gU3RhcnQgYnJlYWtpbmcgbG9uZ2VyIHdvcmRzIGV4Y2VlZGluZyBtYXggd2lkdGhcbiAgICAgICAgaWYgKGN1cnJlbnRXb3JkV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAvLyBwdXNoIGN1cnJlbnQgbGluZSBzaW5jZSB0aGUgY3VycmVudCB3b3JkIGV4Y2VlZHMgdGhlIG1heCB3aWR0aFxuICAgICAgICAgIC8vIHNvIHdpbGwgYmUgYXBwZW5kZWQgaW4gbmV4dCBsaW5lXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICB3aGlsZSAod29yZHNbaW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFyID0gd29yZHNbaW5kZXhdWzBdO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjaGFyV2lkdGguY2FsY3VsYXRlKGN1cnJlbnRDaGFyLCBmb250KTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHdpZHRoO1xuICAgICAgICAgICAgd29yZHNbaW5kZXhdID0gd29yZHNbaW5kZXhdLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IHdpZHRoO1xuICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPT09IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgICAvLyBhcyBjdXJyZW50TGluZSBjb250YWlucyBjaGFycyB3aGljaCBjb3VsZG4ndCBiZSBhcHBlbmRlZFxuICAgICAgICAgICAgLy8gdG8gcHJldmlvdXMgbGluZVxuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSBzcGFjZVdpZHRoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgICAgd2hpbGUgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93IDwgbWF4V2lkdGggJiYgaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSB3b3Jkc1tpbmRleF07XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldFRleHRXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAke3dvcmR9IGA7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHdvcmQgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUuc2xpY2UoMCwgLTEpKTtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPT09IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudExpbmUpIHtcbiAgICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoYXJXaWR0aCA9ICgoKSA9PiB7XG4gIGNvbnN0IGNhY2hlZENoYXJXaWR0aDogeyBba2V5OiBGb250U3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0ge307XG5cbiAgY29uc3QgY2FsY3VsYXRlID0gKGNoYXI6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIGNvbnN0IGFzY2lpID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdKSB7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGdldFRleHRXaWR0aChjaGFyLCBmb250KTtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0gPSB3aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q2FjaGUgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF07XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlLFxuICAgIGdldENhY2hlLFxuICB9O1xufSkoKTtcbmV4cG9ydCBjb25zdCBnZXRBcHByb3hNaW5MaW5lV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQuc3BsaXQoXCJcIikuam9pbihcIlxcblwiKSwgZm9udCkud2lkdGggK1xuICAgIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0ID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgcmV0dXJuIGdldEFwcHJveExpbmVIZWlnaHQoZm9udCkgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1pbkNoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuXG4gIHJldHVybiBNYXRoLm1pbiguLi5jYWNoZVdpdGhPdXRFbXB0eSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94Q2hhcnNUb0ZpdEluV2lkdGggPSAoZm9udDogRm9udFN0cmluZywgd2lkdGg6IG51bWJlcikgPT4ge1xuICAvLyBHZW5lcmFsbHkgbG93ZXIgY2FzZSBpcyB1c2VkIHNvIGNvbnZlcnRpbmcgdG8gbG93ZXIgY2FzZVxuICBjb25zdCBkdW1teVRleHQgPSBEVU1NWV9URVhULnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGJhdGNoTGVuZ3RoID0gNjtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHdpZHRoVGlsbE5vdyA9IDA7XG4gIGxldCBzdHIgPSBcIlwiO1xuICB3aGlsZSAod2lkdGhUaWxsTm93IDw9IHdpZHRoKSB7XG4gICAgY29uc3QgYmF0Y2ggPSBkdW1teVRleHQuc3Vic3RyKGluZGV4LCBpbmRleCArIGJhdGNoTGVuZ3RoKTtcbiAgICBzdHIgKz0gYmF0Y2g7XG4gICAgd2lkdGhUaWxsTm93ICs9IGdldFRleHRXaWR0aChzdHIsIGZvbnQpO1xuICAgIGlmIChpbmRleCA9PT0gZHVtbXlUZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICAgIGluZGV4ID0gMDtcbiAgICB9XG4gICAgaW5kZXggPSBpbmRleCArIGJhdGNoTGVuZ3RoO1xuICB9XG5cbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA+IHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnN1YnN0cigwLCBzdHIubGVuZ3RoIC0gMSk7XG4gICAgd2lkdGhUaWxsTm93ID0gZ2V0VGV4dFdpZHRoKHN0ciwgZm9udCk7XG4gIH1cbiAgcmV0dXJuIHN0ci5sZW5ndGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudElkID0gKGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIHJldHVybiBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/LmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJ0ZXh0XCIpWzBdPy5pZDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
2332
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n\r\n\r\n\r\n\r\nconst redrawTextBoundingBox = (element, container, appState) => {\r\n const maxWidth = container\r\n ? container.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2\r\n : undefined;\r\n let text = element.text;\r\n if (container) {\r\n text = wrapText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), container.width);\r\n }\r\n const metrics = measureText(element.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), maxWidth);\r\n let coordY = element.y;\r\n // Resize container and vertically center align the text\r\n if (container) {\r\n coordY = container.y + container.height / 2 - metrics.height / 2;\r\n let nextHeight = container.height;\r\n if (metrics.height > container.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n nextHeight = metrics.height + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\r\n }\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n width: metrics.width,\r\n height: metrics.height,\r\n baseline: metrics.baseline,\r\n y: coordY,\r\n text,\r\n });\r\n};\r\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\r\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\r\n oldElements.forEach((element) => {\r\n var _a;\r\n const newElementId = oldIdToDuplicatedId.get(element.id);\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(sceneElementMap.get(newElementId), {\r\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.concat({\r\n type: \"text\",\r\n id: newTextElementId,\r\n }),\r\n });\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(sceneElementMap.get(newTextElementId), {\r\n containerId: newElementId,\r\n });\r\n }\r\n });\r\n};\r\nconst handleBindTextResize = (elements, transformHandleType) => {\r\n elements.forEach((element) => {\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n const textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element).getElement(boundTextElementId);\r\n if (textElement && textElement.text) {\r\n if (!element) {\r\n return;\r\n }\r\n let text = textElement.text;\r\n let nextHeight = textElement.height;\r\n let containerHeight = element.height;\r\n let nextBaseLine = textElement.baseline;\r\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\r\n if (text) {\r\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n }\r\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), element.width);\r\n nextHeight = dimensions.height;\r\n nextBaseLine = dimensions.baseline;\r\n }\r\n // increase height in case text element height exceeds\r\n if (nextHeight > element.height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2) {\r\n containerHeight = nextHeight + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const diff = containerHeight - element.height;\r\n // fix the y coord when resizing from ne/nw/n\r\n const updatedY = transformHandleType === \"ne\" ||\r\n transformHandleType === \"nw\" ||\r\n transformHandleType === \"n\"\r\n ? element.y - diff\r\n : element.y;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(element, {\r\n height: containerHeight,\r\n y: updatedY,\r\n });\r\n }\r\n const updatedY = element.y + containerHeight / 2 - nextHeight / 2;\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\r\n text,\r\n // preserve padding and set width correctly\r\n width: element.width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2,\r\n height: nextHeight,\r\n x: element.x + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING,\r\n y: updatedY,\r\n baseline: nextBaseLine,\r\n });\r\n }\r\n }\r\n });\r\n};\r\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\r\nconst measureText = (text, font, maxWidth) => {\r\n text = text\r\n .split(\"\\n\")\r\n // replace empty lines with single space because leading/trailing empty\r\n // lines would be stripped from computation\r\n .map((x) => x || \" \")\r\n .join(\"\\n\");\r\n const container = document.createElement(\"div\");\r\n container.style.position = \"absolute\";\r\n container.style.whiteSpace = \"pre\";\r\n container.style.font = font;\r\n container.style.minHeight = \"1em\";\r\n if (maxWidth) {\r\n const lineHeight = getApproxLineHeight(font);\r\n container.style.width = `${String(maxWidth)}px`;\r\n container.style.maxWidth = `${String(maxWidth)}px`;\r\n container.style.overflow = \"hidden\";\r\n container.style.wordBreak = \"break-word\";\r\n container.style.lineHeight = `${String(lineHeight)}px`;\r\n container.style.whiteSpace = \"pre-wrap\";\r\n }\r\n document.body.appendChild(container);\r\n container.innerText = text;\r\n const span = document.createElement(\"span\");\r\n span.style.display = \"inline-block\";\r\n span.style.overflow = \"hidden\";\r\n span.style.width = \"1px\";\r\n span.style.height = \"1px\";\r\n container.appendChild(span);\r\n // Baseline is important for positioning text on canvas\r\n const baseline = span.offsetTop + span.offsetHeight;\r\n const width = container.offsetWidth;\r\n const height = container.offsetHeight;\r\n document.body.removeChild(container);\r\n return { width, height, baseline };\r\n};\r\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\r\nconst getApproxLineHeight = (font) => {\r\n return measureText(DUMMY_TEXT, font, null).height;\r\n};\r\nlet canvas;\r\nconst getTextWidth = (text, font) => {\r\n if (!canvas) {\r\n canvas = document.createElement(\"canvas\");\r\n }\r\n const canvas2dContext = canvas.getContext(\"2d\");\r\n canvas2dContext.font = font;\r\n const metrics = canvas2dContext.measureText(text);\r\n // since in test env the canvas measureText algo\r\n // doesn't measure text and instead just returns number of\r\n // characters hence we assume that each letteris 10px\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\r\n return metrics.width * 10;\r\n }\r\n return metrics.width;\r\n};\r\nconst wrapText = (text, font, containerWidth) => {\r\n const maxWidth = containerWidth - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n const lines = [];\r\n const originalLines = text.split(\"\\n\");\r\n const spaceWidth = getTextWidth(\" \", font);\r\n originalLines.forEach((originalLine) => {\r\n const words = originalLine.split(\" \");\r\n // This means its newline so push it\r\n if (words.length === 1 && words[0] === \"\") {\r\n lines.push(words[0]);\r\n }\r\n else {\r\n let currentLine = \"\";\r\n let currentLineWidthTillNow = 0;\r\n let index = 0;\r\n while (index < words.length) {\r\n const currentWordWidth = getTextWidth(words[index], font);\r\n // Start breaking longer words exceeding max width\r\n if (currentWordWidth >= maxWidth) {\r\n // push current line since the current word exceeds the max width\r\n // so will be appended in next line\r\n if (currentLine) {\r\n lines.push(currentLine);\r\n }\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n while (words[index].length > 0) {\r\n const currentChar = words[index][0];\r\n const width = charWidth.calculate(currentChar, font);\r\n currentLineWidthTillNow += width;\r\n words[index] = words[index].slice(1);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n currentLine = currentChar;\r\n currentLineWidthTillNow = width;\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n else {\r\n currentLine += currentChar;\r\n }\r\n }\r\n // push current line if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n else {\r\n // space needs to be appended before next word\r\n // as currentLine contains chars which couldn't be appended\r\n // to previous line\r\n currentLine += \" \";\r\n currentLineWidthTillNow += spaceWidth;\r\n }\r\n index++;\r\n }\r\n else {\r\n // Start appending words in a line till max width reached\r\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\r\n const word = words[index];\r\n currentLineWidthTillNow = getTextWidth(currentLine + word, font);\r\n if (currentLineWidthTillNow >= maxWidth) {\r\n lines.push(currentLine);\r\n currentLineWidthTillNow = 0;\r\n currentLine = \"\";\r\n break;\r\n }\r\n index++;\r\n currentLine += `${word} `;\r\n // Push the word if appending space exceeds max width\r\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\r\n lines.push(currentLine.slice(0, -1));\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n break;\r\n }\r\n }\r\n if (currentLineWidthTillNow === maxWidth) {\r\n currentLine = \"\";\r\n currentLineWidthTillNow = 0;\r\n }\r\n }\r\n }\r\n if (currentLine) {\r\n // only remove last trailing space which we have added when joining words\r\n if (currentLine.slice(-1) === \" \") {\r\n currentLine = currentLine.slice(0, -1);\r\n }\r\n lines.push(currentLine);\r\n }\r\n }\r\n });\r\n return lines.join(\"\\n\");\r\n};\r\nconst charWidth = (() => {\r\n const cachedCharWidth = {};\r\n const calculate = (char, font) => {\r\n const ascii = char.charCodeAt(0);\r\n if (!cachedCharWidth[font]) {\r\n cachedCharWidth[font] = [];\r\n }\r\n if (!cachedCharWidth[font][ascii]) {\r\n const width = getTextWidth(char, font);\r\n cachedCharWidth[font][ascii] = width;\r\n }\r\n return cachedCharWidth[font][ascii];\r\n };\r\n const getCache = (font) => {\r\n return cachedCharWidth[font];\r\n };\r\n return {\r\n calculate,\r\n getCache,\r\n };\r\n})();\r\nconst getApproxMinLineWidth = (font) => {\r\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\r\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\r\n};\r\nconst getApproxMinLineHeight = (font) => {\r\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\r\n};\r\nconst getMinCharWidth = (font) => {\r\n const cache = charWidth.getCache(font);\r\n if (!cache) {\r\n return 0;\r\n }\r\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\r\n return Math.min(...cacheWithOutEmpty);\r\n};\r\nconst getApproxCharsToFitInWidth = (font, width) => {\r\n // Generally lower case is used so converting to lower case\r\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\r\n const batchLength = 6;\r\n let index = 0;\r\n let widthTillNow = 0;\r\n let str = \"\";\r\n while (widthTillNow <= width) {\r\n const batch = dummyText.substr(index, index + batchLength);\r\n str += batch;\r\n widthTillNow += getTextWidth(str, font);\r\n if (index === dummyText.length - 1) {\r\n index = 0;\r\n }\r\n index = index + batchLength;\r\n }\r\n while (widthTillNow > width) {\r\n str = str.substr(0, str.length - 1);\r\n widthTillNow = getTextWidth(str, font);\r\n }\r\n return str.length;\r\n};\r\nconst getBoundTextElementId = (container) => {\r\n var _a, _b;\r\n return (_b = (_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.type === \"text\")[0]) === null || _b === void 0 ? void 0 : _b.id;\r\n};\r\nconst getBoundTextElement = (element) => {\r\n if (!element) {\r\n return null;\r\n }\r\n const boundTextElementId = getBoundTextElementId(element);\r\n if (boundTextElementId) {\r\n return _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element).getElement(boundTextElementId);\r\n }\r\n return null;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsRUFBRTs7SUFDM0UsT0FBTyxxQkFBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLGFBQWEsMENBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUMsMENBQUUsRUFBRSxDQUFDO0FBQy9FLENBQUMsQ0FBQztBQUVLLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFpQyxFQUFFLEVBQUU7SUFDdkUsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFELElBQUksa0JBQWtCLEVBQUU7UUFDdEIsT0FBTyw2REFBYyxDQUFDLE9BQU8sQ0FBRSxDQUFDLFVBQVUsQ0FDeEMsa0JBQWtCLENBQ21CLENBQUM7S0FDekM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRFbGVtZW50LnRzPzQyZDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgYXJyYXlUb01hcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlIH0gZnJvbSBcIi4vdHJhbnNmb3JtSGFuZGxlc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHJlZHJhd1RleHRCb3VuZGluZ0JveCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGNvbnN0IG1heFdpZHRoID0gY29udGFpbmVyXG4gICAgPyBjb250YWluZXIud2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyXG4gICAgOiB1bmRlZmluZWQ7XG4gIGxldCB0ZXh0ID0gZWxlbWVudC50ZXh0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICBlbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgICBjb250YWluZXIud2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgZWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSxcbiAgICBtYXhXaWR0aCxcbiAgKTtcblxuICBsZXQgY29vcmRZID0gZWxlbWVudC55O1xuICAvLyBSZXNpemUgY29udGFpbmVyIGFuZCB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnbiB0aGUgdGV4dFxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBjb250YWluZXIuaGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICBsZXQgbmV4dEhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgaWYgKG1ldHJpY3MuaGVpZ2h0ID4gY29udGFpbmVyLmhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIpIHtcbiAgICAgIG5leHRIZWlnaHQgPSBtZXRyaWNzLmhlaWdodCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICBjb29yZFkgPSBjb250YWluZXIueSArIG5leHRIZWlnaHQgLyAyIC0gbWV0cmljcy5oZWlnaHQgLyAyO1xuICAgIH1cbiAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5leHRIZWlnaHQgfSk7XG4gIH1cblxuICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICB3aWR0aDogbWV0cmljcy53aWR0aCxcbiAgICBoZWlnaHQ6IG1ldHJpY3MuaGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBtZXRyaWNzLmJhc2VsaW5lLFxuICAgIHk6IGNvb3JkWSxcbiAgICB0ZXh0LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uID0gKFxuICBzY2VuZUVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkSWRUb0R1cGxpY2F0ZWRJZDogTWFwPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+LFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNjZW5lRWxlbWVudE1hcCA9IGFycmF5VG9NYXAoc2NlbmVFbGVtZW50cykgYXMgTWFwPFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sXG4gICAgRXhjYWxpZHJhd0VsZW1lbnRcbiAgPjtcbiAgb2xkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGVsZW1lbnQuaWQpIGFzIHN0cmluZztcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCBuZXdUZXh0RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoYm91bmRUZXh0RWxlbWVudElkKSE7XG4gICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICBzY2VuZUVsZW1lbnRNYXAuZ2V0KG5ld0VsZW1lbnRJZCkgYXMgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgICAgICAge1xuICAgICAgICAgIGJvdW5kRWxlbWVudHM6IGVsZW1lbnQuYm91bmRFbGVtZW50cz8uY29uY2F0KHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgc2NlbmVFbGVtZW50TWFwLmdldChuZXdUZXh0RWxlbWVudElkKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgICAgIHtcbiAgICAgICAgICBjb250YWluZXJJZDogbmV3RWxlbWVudElkLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUJpbmRUZXh0UmVzaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbikgPT4ge1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkhLmdldEVsZW1lbnQoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgICAgaWYgKHRleHRFbGVtZW50ICYmIHRleHRFbGVtZW50LnRleHQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dDtcbiAgICAgICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIGxldCBjb250YWluZXJIZWlnaHQgPSBlbGVtZW50LmhlaWdodDtcbiAgICAgICAgbGV0IG5leHRCYXNlTGluZSA9IHRleHRFbGVtZW50LmJhc2VsaW5lO1xuICAgICAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJuXCIgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJzXCIpIHtcbiAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gbWVhc3VyZVRleHQoXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgbmV4dEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0O1xuICAgICAgICAgIG5leHRCYXNlTGluZSA9IGRpbWVuc2lvbnMuYmFzZWxpbmU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW5jcmVhc2UgaGVpZ2h0IGluIGNhc2UgdGV4dCBlbGVtZW50IGhlaWdodCBleGNlZWRzXG4gICAgICAgIGlmIChuZXh0SGVpZ2h0ID4gZWxlbWVudC5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyKSB7XG4gICAgICAgICAgY29udGFpbmVySGVpZ2h0ID0gbmV4dEhlaWdodCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IGNvbnRhaW5lckhlaWdodCAtIGVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICAgIC8vIGZpeCB0aGUgeSBjb29yZCB3aGVuIHJlc2l6aW5nIGZyb20gbmUvbncvblxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRZID1cbiAgICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJud1wiIHx8XG4gICAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5cIlxuICAgICAgICAgICAgICA/IGVsZW1lbnQueSAtIGRpZmZcbiAgICAgICAgICAgICAgOiBlbGVtZW50Lnk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgICAgIHk6IHVwZGF0ZWRZLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZFkgPSBlbGVtZW50LnkgKyBjb250YWluZXJIZWlnaHQgLyAyIC0gbmV4dEhlaWdodCAvIDI7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIC8vIHByZXNlcnZlIHBhZGRpbmcgYW5kIHNldCB3aWR0aCBjb3JyZWN0bHlcbiAgICAgICAgICB3aWR0aDogZWxlbWVudC53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDIsXG4gICAgICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgICAgICAgIHg6IGVsZW1lbnQueCArIEJPVU5EX1RFWFRfUEFERElORyxcbiAgICAgICAgICB5OiB1cGRhdGVkWSxcbiAgICAgICAgICBiYXNlbGluZTogbmV4dEJhc2VMaW5lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dyYXNzYXRvci9jYW52YXMtdGV4dC1lZGl0b3IvYmxvYi9tYXN0ZXIvbGliL0ZvbnRNZXRyaWNzLmpzXG5leHBvcnQgY29uc3QgbWVhc3VyZVRleHQgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZm9udDogRm9udFN0cmluZyxcbiAgbWF4V2lkdGg/OiBudW1iZXIgfCBudWxsLFxuKSA9PiB7XG4gIHRleHQgPSB0ZXh0XG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLy8gcmVwbGFjZSBlbXB0eSBsaW5lcyB3aXRoIHNpbmdsZSBzcGFjZSBiZWNhdXNlIGxlYWRpbmcvdHJhaWxpbmcgZW1wdHlcbiAgICAvLyBsaW5lcyB3b3VsZCBiZSBzdHJpcHBlZCBmcm9tIGNvbXB1dGF0aW9uXG4gICAgLm1hcCgoeCkgPT4geCB8fCBcIiBcIilcbiAgICAuam9pbihcIlxcblwiKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlXCI7XG4gIGNvbnRhaW5lci5zdHlsZS5mb250ID0gZm9udDtcbiAgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IFwiMWVtXCI7XG5cbiAgaWYgKG1heFdpZHRoKSB7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IGdldEFwcHJveExpbmVIZWlnaHQoZm9udCk7XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7U3RyaW5nKG1heFdpZHRoKX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gYCR7U3RyaW5nKG1heFdpZHRoKX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb250YWluZXIuc3R5bGUud29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLmxpbmVIZWlnaHQgPSBgJHtTdHJpbmcobGluZUhlaWdodCl9cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJwcmUtd3JhcFwiO1xuICB9XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgY29udGFpbmVyLmlubmVyVGV4dCA9IHRleHQ7XG5cbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICBzcGFuLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgc3Bhbi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG4gIHNwYW4uc3R5bGUuaGVpZ2h0ID0gXCIxcHhcIjtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNwYW4pO1xuICAvLyBCYXNlbGluZSBpcyBpbXBvcnRhbnQgZm9yIHBvc2l0aW9uaW5nIHRleHQgb24gY2FudmFzXG4gIGNvbnN0IGJhc2VsaW5lID0gc3Bhbi5vZmZzZXRUb3AgKyBzcGFuLm9mZnNldEhlaWdodDtcbiAgY29uc3Qgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG5cbiAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLm9mZnNldEhlaWdodDtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuXG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH07XG59O1xuXG5jb25zdCBEVU1NWV9URVhUID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlcIi50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuZXhwb3J0IGNvbnN0IGdldEFwcHJveExpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gbWVhc3VyZVRleHQoRFVNTVlfVEVYVCwgZm9udCwgbnVsbCkuaGVpZ2h0O1xufTtcblxubGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5jb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgfVxuICBjb25zdCBjYW52YXMyZENvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcbiAgY2FudmFzMmRDb250ZXh0LmZvbnQgPSBmb250O1xuXG4gIGNvbnN0IG1ldHJpY3MgPSBjYW52YXMyZENvbnRleHQubWVhc3VyZVRleHQodGV4dCk7XG4gIC8vIHNpbmNlIGluIHRlc3QgZW52IHRoZSBjYW52YXMgbWVhc3VyZVRleHQgYWxnb1xuICAvLyBkb2Vzbid0IG1lYXN1cmUgdGV4dCBhbmQgaW5zdGVhZCBqdXN0IHJldHVybnMgbnVtYmVyIG9mXG4gIC8vIGNoYXJhY3RlcnMgaGVuY2Ugd2UgYXNzdW1lIHRoYXQgZWFjaCBsZXR0ZXJpcyAxMHB4XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiBtZXRyaWNzLndpZHRoICogMTA7XG4gIH1cblxuICByZXR1cm4gbWV0cmljcy53aWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCB3cmFwVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBjb250YWluZXJXaWR0aDogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IG1heFdpZHRoID0gY29udGFpbmVyV2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuXG4gIGNvbnN0IGxpbmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbnN0IG9yaWdpbmFsTGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBzcGFjZVdpZHRoID0gZ2V0VGV4dFdpZHRoKFwiIFwiLCBmb250KTtcbiAgb3JpZ2luYWxMaW5lcy5mb3JFYWNoKChvcmlnaW5hbExpbmUpID0+IHtcbiAgICBjb25zdCB3b3JkcyA9IG9yaWdpbmFsTGluZS5zcGxpdChcIiBcIik7XG4gICAgLy8gVGhpcyBtZWFucyBpdHMgbmV3bGluZSBzbyBwdXNoIGl0XG4gICAgaWYgKHdvcmRzLmxlbmd0aCA9PT0gMSAmJiB3b3Jkc1swXSA9PT0gXCJcIikge1xuICAgICAgbGluZXMucHVzaCh3b3Jkc1swXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICBsZXQgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuXG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXb3JkV2lkdGggPSBnZXRUZXh0V2lkdGgod29yZHNbaW5kZXhdLCBmb250KTtcblxuICAgICAgICAvLyBTdGFydCBicmVha2luZyBsb25nZXIgd29yZHMgZXhjZWVkaW5nIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudFdvcmRXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIHNpbmNlIHRoZSBjdXJyZW50IHdvcmQgZXhjZWVkcyB0aGUgbWF4IHdpZHRoXG4gICAgICAgICAgLy8gc28gd2lsbCBiZSBhcHBlbmRlZCBpbiBuZXh0IGxpbmVcbiAgICAgICAgICBpZiAoY3VycmVudExpbmUpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIHdoaWxlICh3b3Jkc1tpbmRleF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENoYXIgPSB3b3Jkc1tpbmRleF1bMF07XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNoYXJXaWR0aC5jYWxjdWxhdGUoY3VycmVudENoYXIsIGZvbnQpO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gd2lkdGg7XG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0gPSB3b3Jkc1tpbmRleF0uc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudENoYXI7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gd2lkdGg7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSArPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNwYWNlIG5lZWRzIHRvIGJlIGFwcGVuZGVkIGJlZm9yZSBuZXh0IHdvcmRcbiAgICAgICAgICAgIC8vIGFzIGN1cnJlbnRMaW5lIGNvbnRhaW5zIGNoYXJzIHdoaWNoIGNvdWxkbid0IGJlIGFwcGVuZGVkXG4gICAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lXG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHNwYWNlV2lkdGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdGFydCBhcHBlbmRpbmcgd29yZHMgaW4gYSBsaW5lIHRpbGwgbWF4IHdpZHRoIHJlYWNoZWRcbiAgICAgICAgICB3aGlsZSAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPCBtYXhXaWR0aCAmJiBpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gZ2V0VGV4dFdpZHRoKGN1cnJlbnRMaW5lICsgd29yZCwgZm9udCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gYCR7d29yZH0gYDtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgd29yZCBpZiBhcHBlbmRpbmcgc3BhY2UgZXhjZWVkcyBtYXggd2lkdGhcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS5zbGljZSgwLCAtMSkpO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50TGluZSkge1xuICAgICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgY2hhcldpZHRoID0gKCgpID0+IHtcbiAgY29uc3QgY2FjaGVkQ2hhcldpZHRoOiB7IFtrZXk6IEZvbnRTdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB7fTtcblxuICBjb25zdCBjYWxjdWxhdGUgPSAoY2hhcjogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXNjaWkgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF0pIHtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0pIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gZ2V0VGV4dFdpZHRoKGNoYXIsIGZvbnQpO1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSA9IHdpZHRoO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXTtcbiAgfTtcblxuICBjb25zdCBnZXRDYWNoZSA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjYWxjdWxhdGUsXG4gICAgZ2V0Q2FjaGUsXG4gIH07XG59KSgpO1xuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIHJldHVybiAoXG4gICAgbWVhc3VyZVRleHQoRFVNTVlfVEVYVC5zcGxpdChcIlwiKS5qb2luKFwiXFxuXCIpLCBmb250KS53aWR0aCArXG4gICAgQk9VTkRfVEVYVF9QQURESU5HICogMlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gZ2V0QXBwcm94TGluZUhlaWdodChmb250KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluQ2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIE1hdGgubWluKC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hDaGFyc1RvRml0SW5XaWR0aCA9IChmb250OiBGb250U3RyaW5nLCB3aWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIEdlbmVyYWxseSBsb3dlciBjYXNlIGlzIHVzZWQgc28gY29udmVydGluZyB0byBsb3dlciBjYXNlXG4gIGNvbnN0IGR1bW15VGV4dCA9IERVTU1ZX1RFWFQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgYmF0Y2hMZW5ndGggPSA2O1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgd2lkdGhUaWxsTm93ID0gMDtcbiAgbGV0IHN0ciA9IFwiXCI7XG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPD0gd2lkdGgpIHtcbiAgICBjb25zdCBiYXRjaCA9IGR1bW15VGV4dC5zdWJzdHIoaW5kZXgsIGluZGV4ICsgYmF0Y2hMZW5ndGgpO1xuICAgIHN0ciArPSBiYXRjaDtcbiAgICB3aWR0aFRpbGxOb3cgKz0gZ2V0VGV4dFdpZHRoKHN0ciwgZm9udCk7XG4gICAgaWYgKGluZGV4ID09PSBkdW1teVRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICBpbmRleCA9IGluZGV4ICsgYmF0Y2hMZW5ndGg7XG4gIH1cblxuICB3aGlsZSAod2lkdGhUaWxsTm93ID4gd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB3aWR0aFRpbGxOb3cgPSBnZXRUZXh0V2lkdGgoc3RyLCBmb250KTtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50SWQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgcmV0dXJuIGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybiBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
2333
2333
 
2334
2334
  /***/ }),
2335
2335
 
@@ -2340,7 +2340,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2340
2340
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2341
2341
 
2342
2342
  "use strict";
2343
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst normalizeText = (text) => {\r\n return (text\r\n // replace tabs with spaces so they render and measure correctly\r\n .replace(/\\t/g, \" \")\r\n // normalize newlines\r\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\r\n};\r\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\r\n const { zoom, offsetTop, offsetLeft } = appState;\r\n const degree = (180 * angle) / Math.PI;\r\n // offsets must be multiplied by 2 to account for the division by 2 of\r\n // the whole expression afterwards\r\n let translateX = ((width - offsetLeft * 2) * (zoom.value - 1)) / 2;\r\n let translateY = ((height - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n if (width > maxWidth && zoom.value !== 1) {\r\n translateX = (maxWidth / 2) * (zoom.value - 1);\r\n }\r\n if (height > maxHeight && zoom.value !== 1) {\r\n translateY = ((maxHeight - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n }\r\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\r\n};\r\nconst textWysiwyg = ({ id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, }) => {\r\n const textPropertiesUpdated = (updatedElement, editable) => {\r\n const currentFont = editable.style.fontFamily.replaceAll('\"', \"\");\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedElement.fontFamily }) !==\r\n currentFont) {\r\n return true;\r\n }\r\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n let originalContainerHeight;\r\n let approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element))\r\n : 0;\r\n const updateWysiwygStyle = () => {\r\n var _a;\r\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\r\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\r\n let coordX = updatedElement.x;\r\n let coordY = updatedElement.y;\r\n const container = (updatedElement === null || updatedElement === void 0 ? void 0 : updatedElement.containerId)\r\n ? _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updatedElement).getElement(updatedElement.containerId)\r\n : null;\r\n let maxWidth = updatedElement.width;\r\n let maxHeight = updatedElement.height;\r\n let width = updatedElement.width;\r\n // Set to element height by default since thats\r\n // what is going to be used for unbounded text\r\n let height = updatedElement.height;\r\n if (container && updatedElement.containerId) {\r\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable);\r\n // using editor.style.height to get the accurate height of text editor\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editorHeight > 0) {\r\n height = editorHeight;\r\n }\r\n if (propertiesUpdated) {\r\n approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement))\r\n : 0;\r\n originalContainerHeight = container.height;\r\n // update height of the editor after properties updated\r\n height = updatedElement.height;\r\n }\r\n if (!originalContainerHeight) {\r\n originalContainerHeight = container.height;\r\n }\r\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n width = maxWidth;\r\n // The coordinates of text box set a distance of\r\n // 30px to preserve padding\r\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING;\r\n // autogrow container height if text exceeds\r\n if (height > maxHeight) {\r\n const diff = Math.min(height - maxHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height + diff });\r\n return;\r\n }\r\n else if (\r\n // autoshrink container height until original container height\r\n // is reached when text is removed\r\n container.height > originalContainerHeight &&\r\n height < maxHeight) {\r\n const diff = Math.min(maxHeight - height, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height - diff });\r\n }\r\n // Start pushing text upward until a diff of 30px (padding)\r\n // is reached\r\n else {\r\n // vertically center align the text\r\n coordY = container.y + container.height / 2 - height / 2;\r\n }\r\n }\r\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\r\n const { textAlign, angle } = updatedElement;\r\n editable.value = updatedElement.originalText || updatedElement.text;\r\n const lines = updatedElement.originalText.split(\"\\n\");\r\n const lineHeight = updatedElement.containerId\r\n ? approxLineHeight\r\n : updatedElement.height / lines.length;\r\n if (!container) {\r\n maxWidth =\r\n (appState.offsetLeft + appState.width - viewportX - 8) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\r\n }\r\n // Make sure text editor height doesn't go beyond viewport\r\n const editorMaxHeight = (appState.height -\r\n viewportY -\r\n // There is a ~14px difference which keeps on increasing\r\n // with every zoom step when offset present hence I am subtracting it here\r\n // However this is not the best fix and breaks in\r\n // few scenarios\r\n (appState.offsetTop\r\n ? ((appState.zoom.value * 100 - 100) / 10) * 14\r\n : 0)) /\r\n appState.zoom.value;\r\n Object.assign(editable.style, {\r\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\r\n // must be defined *after* font ¯\\_(ツ)_/¯\r\n lineHeight: `${lineHeight}px`,\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${viewportX}px`,\r\n top: `${viewportY}px`,\r\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\r\n textAlign,\r\n color: updatedElement.strokeColor,\r\n opacity: updatedElement.opacity / 100,\r\n filter: \"var(--theme-filter)\",\r\n maxWidth: `${maxWidth}px`,\r\n maxHeight: `${editorMaxHeight}px`,\r\n });\r\n }\r\n };\r\n const editable = document.createElement(\"textarea\");\r\n editable.dir = \"auto\";\r\n editable.tabIndex = 0;\r\n editable.dataset.type = \"wysiwyg\";\r\n // prevent line wrapping on Safari\r\n editable.wrap = \"off\";\r\n editable.classList.add(\"excalidraw-wysiwyg\");\r\n let whiteSpace = \"pre\";\r\n let wordBreak = \"normal\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\r\n whiteSpace = \"pre-wrap\";\r\n wordBreak = \"break-word\";\r\n }\r\n Object.assign(editable.style, {\r\n position: \"absolute\",\r\n display: \"inline-block\",\r\n minHeight: \"1em\",\r\n backfaceVisibility: \"hidden\",\r\n margin: 0,\r\n padding: 0,\r\n border: 0,\r\n outline: 0,\r\n resize: \"none\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n // must be specified because in dark mode canvas creates a stacking context\r\n zIndex: \"var(--zIndex-wysiwyg)\",\r\n wordBreak,\r\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\r\n whiteSpace,\r\n overflowWrap: \"break-word\",\r\n });\r\n updateWysiwygStyle();\r\n if (onChange) {\r\n editable.oninput = () => {\r\n // using scrollHeight here since we need to calculate\r\n // number of lines so cannot use editable.style.height\r\n // as that gets updated below\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n // auto increase height only when lines > 1 so its\r\n // measured correctly and vertically alignes for\r\n // first line as well as setting height to \"auto\"\r\n // doubles the height as soon as user starts typing\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\r\n let height = \"auto\";\r\n if (lines === 2) {\r\n const container = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).getElement(element.containerId);\r\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\"\\n\").length;\r\n // This is browser behaviour when setting height to \"auto\"\r\n // It sets the height needed for 2 lines even if actual\r\n // line count is 1 as mentioned above as well\r\n // hence reducing the height by half if actual line count is 1\r\n // so single line aligns vertically when deleting\r\n if (actualLineCount === 1) {\r\n height = `${editable.scrollHeight / 2}px`;\r\n }\r\n }\r\n editable.style.height = height;\r\n editable.style.height = `${editable.scrollHeight}px`;\r\n }\r\n onChange(normalizeText(editable.value));\r\n };\r\n }\r\n editable.onkeydown = (event) => {\r\n event.stopPropagation();\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\r\n event.preventDefault();\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\r\n event.preventDefault();\r\n if (event.isComposing || event.keyCode === 229) {\r\n return;\r\n }\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\r\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\r\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\r\n event.preventDefault();\r\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\r\n outdent();\r\n }\r\n else {\r\n indent();\r\n }\r\n // We must send an input event to resize the element\r\n editable.dispatchEvent(new Event(\"input\"));\r\n }\r\n };\r\n const TAB_SIZE = 4;\r\n const TAB = \" \".repeat(TAB_SIZE);\r\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\r\n const indent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex);\r\n value = `${startValue}${TAB}${endValue}`;\r\n });\r\n editable.value = value;\r\n editable.selectionStart = selectionStart + TAB_SIZE;\r\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\r\n };\r\n const outdent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n const removedTabs = [];\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const tabMatch = value\r\n .slice(startIndex, startIndex + TAB_SIZE)\r\n .match(RE_LEADING_TAB);\r\n if (tabMatch) {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex + tabMatch[0].length);\r\n // Delete a tab from the line\r\n value = `${startValue}${endValue}`;\r\n removedTabs.push(startIndex);\r\n }\r\n });\r\n editable.value = value;\r\n if (removedTabs.length) {\r\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\r\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\r\n }\r\n else {\r\n // If the cursor is before the first tab removed, ex:\r\n // Line| #1\r\n // Line #2\r\n // Lin|e #3\r\n // we should reset the selectionStart to his initial value.\r\n editable.selectionStart = selectionStart;\r\n }\r\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\r\n }\r\n };\r\n /**\r\n * @returns indeces of start positions of selected lines, in reverse order\r\n */\r\n const getSelectedLinesStartIndices = () => {\r\n let { selectionStart, selectionEnd, value } = editable;\r\n // chars before selectionStart on the same line\r\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\r\n .length;\r\n // put caret at the start of the line\r\n selectionStart = selectionStart - startOffset;\r\n const selected = value.slice(selectionStart, selectionEnd);\r\n return selected\r\n .split(\"\\n\")\r\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\r\n ? // curr line index is prev line's start + prev line's length + \\n\r\n startIndices[idx - 1] + lines[idx - 1].length + 1\r\n : // first selected line\r\n selectionStart), [])\r\n .reverse();\r\n };\r\n const stopEvent = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n // using a state variable instead of passing it to the handleSubmit callback\r\n // so that we don't need to create separate a callback for event handlers\r\n let submittedViaKeyboard = false;\r\n const handleSubmit = () => {\r\n var _a, _b;\r\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\r\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\r\n // wysiwyg on update\r\n cleanup();\r\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\r\n if (!updateElement) {\r\n return;\r\n }\r\n let wrappedText = \"\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && (updateElement === null || updateElement === void 0 ? void 0 : updateElement.containerId)) {\r\n const container = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updateElement).getElement(updateElement.containerId);\r\n if (container) {\r\n wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updateElement), container.width);\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && updateElement.containerId) {\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editable.value) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updateElement, {\r\n // vertically center align\r\n y: container.y + container.height / 2 - editorHeight / 2,\r\n height: editorHeight,\r\n width: Number(editable.style.width.slice(0, -2)),\r\n // preserve padding\r\n x: container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING,\r\n });\r\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\r\n if (!boundTextElementId || boundTextElementId !== element.id) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (container.boundElements || []).concat({\r\n type: \"text\",\r\n id: element.id,\r\n }),\r\n });\r\n }\r\n }\r\n else {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type !== \"text\"),\r\n });\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n wrappedText = editable.value;\r\n }\r\n onSubmit({\r\n text: normalizeText(wrappedText),\r\n viaKeyboard: submittedViaKeyboard,\r\n originalText: editable.value,\r\n });\r\n };\r\n const cleanup = () => {\r\n if (isDestroyed) {\r\n return;\r\n }\r\n isDestroyed = true;\r\n // remove events to ensure they don't late-fire\r\n editable.onblur = null;\r\n editable.oninput = null;\r\n editable.onkeydown = null;\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n window.removeEventListener(\"resize\", updateWysiwygStyle);\r\n window.removeEventListener(\"wheel\", stopEvent, true);\r\n window.removeEventListener(\"pointerdown\", onPointerDown);\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n window.removeEventListener(\"blur\", handleSubmit);\r\n unbindUpdate();\r\n editable.remove();\r\n };\r\n const bindBlurEvent = (event) => {\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\r\n // trigger the blur on ensuing pointerup.\r\n // Also to handle cases such as picking a color which would trigger a blur\r\n // in that same tick.\r\n const target = event === null || event === void 0 ? void 0 : event.target;\r\n const isTargetColorPicker = target instanceof HTMLInputElement &&\r\n target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\r\n setTimeout(() => {\r\n editable.onblur = handleSubmit;\r\n if (target && isTargetColorPicker) {\r\n target.onblur = () => {\r\n editable.focus();\r\n };\r\n }\r\n // case: clicking on the same property → no change → no update → no focus\r\n if (!isTargetColorPicker) {\r\n editable.focus();\r\n }\r\n });\r\n };\r\n // prevent blur when changing properties from the menu\r\n const onPointerDown = (event) => {\r\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\r\n event.target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\r\n if (((event.target instanceof HTMLElement ||\r\n event.target instanceof SVGElement) &&\r\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\r\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\r\n isTargetColorPicker) {\r\n editable.onblur = null;\r\n window.addEventListener(\"pointerup\", bindBlurEvent);\r\n // handle edge-case where pointerup doesn't fire e.g. due to user\r\n // alt-tabbing away\r\n window.addEventListener(\"blur\", handleSubmit);\r\n }\r\n };\r\n // handle updates of textElement properties of editing element\r\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\r\n var _a;\r\n updateWysiwygStyle();\r\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\r\n if (!isColorPickerActive) {\r\n editable.focus();\r\n }\r\n });\r\n // ---------------------------------------------------------------------------\r\n let isDestroyed = false;\r\n // select on init (focusing is done separately inside the bindBlurEvent()\r\n // because we need it to happen *after* the blur event from `pointerdown`)\r\n editable.select();\r\n bindBlurEvent();\r\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\r\n // is preferred so we catch changes from host, where window may not resize.\r\n let observer = null;\r\n if (canvas && \"ResizeObserver\" in window) {\r\n observer = new window.ResizeObserver(() => {\r\n updateWysiwygStyle();\r\n });\r\n observer.observe(canvas);\r\n }\r\n else {\r\n window.addEventListener(\"resize\", updateWysiwygStyle);\r\n }\r\n window.addEventListener(\"pointerdown\", onPointerDown);\r\n window.addEventListener(\"wheel\", stopEvent, {\r\n passive: false,\r\n capture: true,\r\n });\r\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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ZW1lbnQvdGV4dFd5c2l3eWcudHN4PzhmNGQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHtcbiAgaXNXcml0YWJsZUVsZW1lbnQsXG4gIGdldEZvbnRTdHJpbmcsXG4gIGdldEZvbnRGYW1pbHlTdHJpbmcsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgQk9VTkRfVEVYVF9QQURESU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0QXBwcm94TGluZUhlaWdodCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudElkLFxuICB3cmFwVGV4dCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcblxuY29uc3Qgbm9ybWFsaXplVGV4dCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0ZXh0XG4gICAgICAvLyByZXBsYWNlIHRhYnMgd2l0aCBzcGFjZXMgc28gdGhleSByZW5kZXIgYW5kIG1lYXN1cmUgY29ycmVjdGx5XG4gICAgICAucmVwbGFjZSgvXFx0L2csIFwiICAgICAgICBcIilcbiAgICAgIC8vIG5vcm1hbGl6ZSBuZXdsaW5lc1xuICAgICAgLnJlcGxhY2UoL1xccj9cXG58XFxyL2csIFwiXFxuXCIpXG4gICk7XG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSAoXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIG1heFdpZHRoOiBudW1iZXIsXG4gIG1heEhlaWdodDogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IHsgem9vbSwgb2Zmc2V0VG9wLCBvZmZzZXRMZWZ0IH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGFuZ2xlKSAvIE1hdGguUEk7XG4gIC8vIG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IDIgdG8gYWNjb3VudCBmb3IgdGhlIGRpdmlzaW9uIGJ5IDIgb2ZcbiAgLy8gdGhlIHdob2xlIGV4cHJlc3Npb24gYWZ0ZXJ3YXJkc1xuICBsZXQgdHJhbnNsYXRlWCA9ICgod2lkdGggLSBvZmZzZXRMZWZ0ICogMikgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGxldCB0cmFuc2xhdGVZID0gKChoZWlnaHQgLSBvZmZzZXRUb3AgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgaWYgKHdpZHRoID4gbWF4V2lkdGggJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVggPSAobWF4V2lkdGggLyAyKSAqICh6b29tLnZhbHVlIC0gMSk7XG4gIH1cbiAgaWYgKGhlaWdodCA+IG1heEhlaWdodCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWSA9ICgobWF4SGVpZ2h0IC0gb2Zmc2V0VG9wICogMikgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgcmV0dXJuIGB0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfXB4LCAke3RyYW5zbGF0ZVl9cHgpIHNjYWxlKCR7em9vbS52YWx1ZX0pIHJvdGF0ZSgke2RlZ3JlZX1kZWcpYDtcbn07XG5cbmV4cG9ydCBjb25zdCB0ZXh0V3lzaXd5ZyA9ICh7XG4gIGlkLFxuICBhcHBTdGF0ZSxcbiAgb25DaGFuZ2UsXG4gIG9uU3VibWl0LFxuICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgZWxlbWVudCxcbiAgY2FudmFzLFxuICBleGNhbGlkcmF3Q29udGFpbmVyLFxufToge1xuICBpZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXTtcbiAgYXBwU3RhdGU6IEFwcFN0YXRlO1xuICBvbkNoYW5nZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uU3VibWl0OiAoZGF0YToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB2aWFLZXlib2FyZDogYm9vbGVhbjtcbiAgICBvcmlnaW5hbFRleHQ6IHN0cmluZztcbiAgfSkgPT4gdm9pZDtcbiAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBleGNhbGlkcmF3Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG59KSA9PiB7XG4gIGNvbnN0IHRleHRQcm9wZXJ0aWVzVXBkYXRlZCA9IChcbiAgICB1cGRhdGVkRWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIGVkaXRhYmxlOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICApID0+IHtcbiAgICBjb25zdCBjdXJyZW50Rm9udCA9IGVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkucmVwbGFjZUFsbCgnXCInLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZEVsZW1lbnQuZm9udEZhbWlseSB9KSAhPT1cbiAgICAgIGN1cnJlbnRGb250XG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGAke3VwZGF0ZWRFbGVtZW50LmZvbnRTaXplfXB4YCAhPT0gZWRpdGFibGUuc3R5bGUuZm9udFNpemUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGxldCBvcmlnaW5hbENvbnRhaW5lckhlaWdodDogbnVtYmVyO1xuICBsZXQgYXBwcm94TGluZUhlaWdodCA9IGlzVGV4dEVsZW1lbnQoZWxlbWVudClcbiAgICA/IGdldEFwcHJveExpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhlbGVtZW50KSlcbiAgICA6IDA7XG5cbiAgY29uc3QgdXBkYXRlV3lzaXd5Z1N0eWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICh1cGRhdGVkRWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHVwZGF0ZWRFbGVtZW50Py5jb250YWluZXJJZFxuICAgICAgICA/IFNjZW5lLmdldFNjZW5lKHVwZGF0ZWRFbGVtZW50KSEuZ2V0RWxlbWVudCh1cGRhdGVkRWxlbWVudC5jb250YWluZXJJZClcbiAgICAgICAgOiBudWxsO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7XG5cbiAgICAgIGxldCBtYXhIZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG4gICAgICBsZXQgd2lkdGggPSB1cGRhdGVkRWxlbWVudC53aWR0aDtcbiAgICAgIC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXRzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG4gICAgICBsZXQgaGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgaWYgKGNvbnRhaW5lciAmJiB1cGRhdGVkRWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkRWxlbWVudCxcbiAgICAgICAgICBlZGl0YWJsZSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXNpbmcgZWRpdG9yLnN0eWxlLmhlaWdodCB0byBnZXQgdGhlIGFjY3VyYXRlIGhlaWdodCBvZiB0ZXh0IGVkaXRvclxuICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBOdW1iZXIoZWRpdGFibGUuc3R5bGUuaGVpZ2h0LnNsaWNlKDAsIC0yKSk7XG4gICAgICAgIGlmIChlZGl0b3JIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgaGVpZ2h0ID0gZWRpdG9ySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQgPSBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KVxuICAgICAgICAgICAgPyBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpKVxuICAgICAgICAgICAgOiAwO1xuXG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJIZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0O1xuXG4gICAgICAgICAgLy8gdXBkYXRlIGhlaWdodCBvZiB0aGUgZWRpdG9yIGFmdGVyIHByb3BlcnRpZXMgdXBkYXRlZFxuICAgICAgICAgIGhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9yaWdpbmFsQ29udGFpbmVySGVpZ2h0KSB7XG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJIZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIG1heFdpZHRoID0gY29udGFpbmVyLndpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgICAgICAgbWF4SGVpZ2h0ID0gY29udGFpbmVyLmhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIHdpZHRoID0gbWF4V2lkdGg7XG4gICAgICAgIC8vIFRoZSBjb29yZGluYXRlcyBvZiB0ZXh0IGJveCBzZXQgYSBkaXN0YW5jZSBvZlxuICAgICAgICAvLyAzMHB4IHRvIHByZXNlcnZlIHBhZGRpbmdcbiAgICAgICAgY29vcmRYID0gY29udGFpbmVyLnggKyBCT1VORF9URVhUX1BBRERJTkc7XG4gICAgICAgIC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG4gICAgICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oaGVpZ2h0IC0gbWF4SGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgKyBkaWZmIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBhdXRvc2hyaW5rIGNvbnRhaW5lciBoZWlnaHQgdW50aWwgb3JpZ2luYWwgY29udGFpbmVyIGhlaWdodFxuICAgICAgICAgIC8vIGlzIHJlYWNoZWQgd2hlbiB0ZXh0IGlzIHJlbW92ZWRcbiAgICAgICAgICBjb250YWluZXIuaGVpZ2h0ID4gb3JpZ2luYWxDb250YWluZXJIZWlnaHQgJiZcbiAgICAgICAgICBoZWlnaHQgPCBtYXhIZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKG1heEhlaWdodCAtIGhlaWdodCwgYXBwcm94TGluZUhlaWdodCk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0IC0gZGlmZiB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFydCBwdXNoaW5nIHRleHQgdXB3YXJkIHVudGlsIGEgZGlmZiBvZiAzMHB4IChwYWRkaW5nKVxuICAgICAgICAvLyBpcyByZWFjaGVkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gICAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBjb250YWluZXIuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFt2aWV3cG9ydFgsIHZpZXdwb3J0WV0gPSBnZXRWaWV3cG9ydENvb3Jkcyhjb29yZFgsIGNvb3JkWSk7XG4gICAgICBjb25zdCB7IHRleHRBbGlnbiwgYW5nbGUgfSA9IHVwZGF0ZWRFbGVtZW50O1xuXG4gICAgICBlZGl0YWJsZS52YWx1ZSA9IHVwZGF0ZWRFbGVtZW50Lm9yaWdpbmFsVGV4dCB8fCB1cGRhdGVkRWxlbWVudC50ZXh0O1xuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkRWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgPyBhcHByb3hMaW5lSGVpZ2h0XG4gICAgICAgIDogdXBkYXRlZEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgbWF4V2lkdGggPVxuICAgICAgICAgIChhcHBTdGF0ZS5vZmZzZXRMZWZ0ICsgYXBwU3RhdGUud2lkdGggLSB2aWV3cG9ydFggLSA4KSAvXG4gICAgICAgICAgICBhcHBTdGF0ZS56b29tLnZhbHVlIC1cbiAgICAgICAgICAvLyBtYXJnaW4tcmlnaHQgb2YgcGFyZW50IGlmIGFueVxuICAgICAgICAgIE51bWJlcihcbiAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI/LnBhcmVudE5vZGUgYXMgRWxlbWVudCxcbiAgICAgICAgICAgICkubWFyZ2luUmlnaHQuc2xpY2UoMCwgLTIpLFxuICAgICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBoZWlnaHQgZG9lc24ndCBnbyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGNvbnN0IGVkaXRvck1heEhlaWdodCA9XG4gICAgICAgIChhcHBTdGF0ZS5oZWlnaHQgLVxuICAgICAgICAgIHZpZXdwb3J0WSAtXG4gICAgICAgICAgLy8gVGhlcmUgaXMgYSB+MTRweCBkaWZmZXJlbmNlIHdoaWNoIGtlZXBzIG9uIGluY3JlYXNpbmdcbiAgICAgICAgICAvLyB3aXRoIGV2ZXJ5IHpvb20gc3RlcCB3aGVuIG9mZnNldCBwcmVzZW50IGhlbmNlIEkgYW0gc3VidHJhY3RpbmcgaXQgaGVyZVxuICAgICAgICAgIC8vIEhvd2V2ZXIgdGhpcyBpcyBub3QgdGhlIGJlc3QgZml4IGFuZCBicmVha3MgaW5cbiAgICAgICAgICAvLyBmZXcgc2NlbmFyaW9zXG4gICAgICAgICAgKGFwcFN0YXRlLm9mZnNldFRvcFxuICAgICAgICAgICAgPyAoKGFwcFN0YXRlLnpvb20udmFsdWUgKiAxMDAgLSAxMDApIC8gMTApICogMTRcbiAgICAgICAgICAgIDogMCkpIC9cbiAgICAgICAgYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICAgICAgZm9udDogZ2V0Rm9udFN0cmluZyh1cGRhdGVkRWxlbWVudCksXG4gICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCAqYWZ0ZXIqIGZvbnQgwq9cXF8o44OEKV8vwq9cbiAgICAgICAgbGluZUhlaWdodDogYCR7bGluZUhlaWdodH1weGAsXG4gICAgICAgIHdpZHRoOiBgJHt3aWR0aH1weGAsXG4gICAgICAgIGhlaWdodDogYCR7aGVpZ2h0fXB4YCxcbiAgICAgICAgbGVmdDogYCR7dmlld3BvcnRYfXB4YCxcbiAgICAgICAgdG9wOiBgJHt2aWV3cG9ydFl9cHhgLFxuICAgICAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybShcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgYW5nbGUsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgZWRpdG9yTWF4SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgIGNvbG9yOiB1cGRhdGVkRWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgb3BhY2l0eTogdXBkYXRlZEVsZW1lbnQub3BhY2l0eSAvIDEwMCxcbiAgICAgICAgZmlsdGVyOiBcInZhcigtLXRoZW1lLWZpbHRlcilcIixcbiAgICAgICAgbWF4V2lkdGg6IGAke21heFdpZHRofXB4YCxcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtlZGl0b3JNYXhIZWlnaHR9cHhgLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGVkaXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiO1xuICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG4gIGVkaXRhYmxlLndyYXAgPSBcIm9mZlwiO1xuICBlZGl0YWJsZS5jbGFzc0xpc3QuYWRkKFwiZXhjYWxpZHJhdy13eXNpd3lnXCIpO1xuXG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBtaW5IZWlnaHQ6IFwiMWVtXCIsXG4gICAgYmFja2ZhY2VWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIHJlc2l6ZTogXCJub25lXCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIC8vIG11c3QgYmUgc3BlY2lmaWVkIGJlY2F1c2UgaW4gZGFyayBtb2RlIGNhbnZhcyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dFxuICAgIHpJbmRleDogXCJ2YXIoLS16SW5kZXgtd3lzaXd5ZylcIixcbiAgICB3b3JkQnJlYWssXG4gICAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIChgd2hpdGVzcGFjZTogbm93cmFwYCBkb2Vzbid0IHdvcmsgb24gRkYpXG4gICAgd2hpdGVTcGFjZSxcbiAgICBvdmVyZmxvd1dyYXA6IFwiYnJlYWstd29yZFwiLFxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIC8vIHVzaW5nIHNjcm9sbEhlaWdodCBoZXJlIHNpbmNlIHdlIG5lZWQgdG8gY2FsY3VsYXRlXG4gICAgICAvLyBudW1iZXIgb2YgbGluZXMgc28gY2Fubm90IHVzZSBlZGl0YWJsZS5zdHlsZS5oZWlnaHRcbiAgICAgIC8vIGFzIHRoYXQgZ2V0cyB1cGRhdGVkIGJlbG93XG4gICAgICBjb25zdCBsaW5lcyA9IGVkaXRhYmxlLnNjcm9sbEhlaWdodCAvIGFwcHJveExpbmVIZWlnaHQ7XG4gICAgICAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbmVzIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcbiAgICAgIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkgJiYgbGluZXMgPiAxKSB7XG4gICAgICAgIGxldCBoZWlnaHQgPSBcImF1dG9cIjtcblxuICAgICAgICBpZiAobGluZXMgPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChcbiAgICAgICAgICAgIGVsZW1lbnQuY29udGFpbmVySWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxMaW5lQ291bnQgPSB3cmFwVGV4dChcbiAgICAgICAgICAgIGVkaXRhYmxlLnZhbHVlLFxuICAgICAgICAgICAgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSxcbiAgICAgICAgICAgIGNvbnRhaW5lciEud2lkdGgsXG4gICAgICAgICAgKS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGJyb3dzZXIgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgICAgICAvLyBJdCBzZXRzIHRoZSBoZWlnaHQgbmVlZGVkIGZvciAyIGxpbmVzIGV2ZW4gaWYgYWN0dWFsXG4gICAgICAgICAgLy8gbGluZSBjb3VudCBpcyAxIGFzIG1lbnRpb25lZCBhYm92ZSBhcyB3ZWxsXG4gICAgICAgICAgLy8gaGVuY2UgcmVkdWNpbmcgdGhlIGhlaWdodCBieSBoYWxmIGlmIGFjdHVhbCBsaW5lIGNvdW50IGlzIDFcbiAgICAgICAgICAvLyBzbyBzaW5nbGUgbGluZSBhbGlnbnMgdmVydGljYWxseSB3aGVuIGRlbGV0aW5nXG4gICAgICAgICAgaWYgKGFjdHVhbExpbmVDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gMn1weGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUiAmJiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZyB8fCBldmVudC5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5UQUIgfHxcbiAgICAgIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJlxuICAgICAgICAoZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUIHx8XG4gICAgICAgICAgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9SSUdIVCkpXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG11c3Qgc2VuZCBhbiBpbnB1dCBldmVudCB0byByZXNpemUgdGhlIGVsZW1lbnRcbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcbiAgY29uc3QgaW5kZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCk7XG5cbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCArIFRBQl9TSVpFO1xuICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZCArIFRBQl9TSVpFICogbGluZXNTdGFydEluZGljZXMubGVuZ3RoO1xuICB9O1xuXG4gIGNvbnN0IG91dGRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFiczogbnVtYmVyW10gPSBbXTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWVcbiAgICAgICAgLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBUQUJfU0laRSlcbiAgICAgICAgLm1hdGNoKFJFX0xFQURJTkdfVEFCKTtcblxuICAgICAgaWYgKHRhYk1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4ICsgdGFiTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgICAgICAvLyBEZWxldGUgYSB0YWIgZnJvbSB0aGUgbGluZVxuICAgICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtlbmRWYWx1ZX1gO1xuICAgICAgICByZW1vdmVkVGFicy5wdXNoKHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChyZW1vdmVkVGFicy5sZW5ndGgpIHtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgLSBUQUJfU0laRSxcbiAgICAgICAgICByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgYmVmb3JlIHRoZSBmaXJzdCB0YWIgcmVtb3ZlZCwgZXg6XG4gICAgICAgIC8vIExpbmV8ICMxXG4gICAgICAgIC8vICAgICBMaW5lICMyXG4gICAgICAgIC8vIExpbnxlICMzXG4gICAgICAgIC8vIHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0aW9uU3RhcnQgdG8gaGlzIGluaXRpYWwgdmFsdWUuXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICB9XG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNlbGVjdGlvbkVuZCAtIFRBQl9TSVpFICogcmVtb3ZlZFRhYnMubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGVjZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuICBjb25zdCBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzID0gKCkgPT4ge1xuICAgIGxldCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQsIHZhbHVlIH0gPSBlZGl0YWJsZTtcblxuICAgIC8vIGNoYXJzIGJlZm9yZSBzZWxlY3Rpb25TdGFydCBvbiB0aGUgc2FtZSBsaW5lXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSB2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1teXFxuXSokLykhWzBdXG4gICAgICAubGVuZ3RoO1xuICAgIC8vIHB1dCBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmVcbiAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0IC0gc3RhcnRPZmZzZXQ7XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChzdGFydEluZGljZXMsIGxpbmUsIGlkeCwgbGluZXMpID0+XG4gICAgICAgICAgc3RhcnRJbmRpY2VzLmNvbmNhdChcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgICAgICA/IC8vIGN1cnIgbGluZSBpbmRleCBpcyBwcmV2IGxpbmUncyBzdGFydCArIHByZXYgbGluZSdzIGxlbmd0aCArIFxcblxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApXG4gICAgICAucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BFdmVudCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIC8vIHVzaW5nIGEgc3RhdGUgdmFyaWFibGUgaW5zdGVhZCBvZiBwYXNzaW5nIGl0IHRvIHRoZSBoYW5kbGVTdWJtaXQgY2FsbGJhY2tcbiAgLy8gc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBzZXBhcmF0ZSBhIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGVyc1xuICBsZXQgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICAgIC8vIGNsZWFudXAgbXVzdCBiZSBydW4gYmVmb3JlIG9uU3VibWl0IG90aGVyd2lzZSB3aGVuIGFwcCBibHVycyB0aGUgd3lzaXd5Z1xuICAgIC8vIGl0J2QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agb2YgYmx1cuKGkm9uU3VibWl0IGFmdGVyIHdlIHJlLWZvY3VzIHRoZVxuICAgIC8vIHd5c2l3eWcgb24gdXBkYXRlXG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmlkKTtcbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHdyYXBwZWRUZXh0ID0gXCJcIjtcbiAgICBpZiAoaXNUZXh0RWxlbWVudCh1cGRhdGVFbGVtZW50KSAmJiB1cGRhdGVFbGVtZW50Py5jb250YWluZXJJZCkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gU2NlbmUuZ2V0U2NlbmUodXBkYXRlRWxlbWVudCkhLmdldEVsZW1lbnQoXG4gICAgICAgIHVwZGF0ZUVsZW1lbnQuY29udGFpbmVySWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ7XG5cbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgd3JhcHBlZFRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICBlZGl0YWJsZS52YWx1ZSxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHVwZGF0ZUVsZW1lbnQpLFxuICAgICAgICAgIGNvbnRhaW5lci53aWR0aCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQodXBkYXRlRWxlbWVudCkgJiYgdXBkYXRlRWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcbiAgICAgICAgICBpZiAoZWRpdGFibGUudmFsdWUpIHtcbiAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQodXBkYXRlRWxlbWVudCwge1xuICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnblxuICAgICAgICAgICAgICB5OiBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gZWRpdG9ySGVpZ2h0IC8gMixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBlZGl0b3JIZWlnaHQsXG4gICAgICAgICAgICAgIHdpZHRoOiBOdW1iZXIoZWRpdGFibGUuc3R5bGUud2lkdGguc2xpY2UoMCwgLTIpKSxcbiAgICAgICAgICAgICAgLy8gcHJlc2VydmUgcGFkZGluZ1xuICAgICAgICAgICAgICB4OiBjb250YWluZXIueCArIEJPVU5EX1RFWFRfUEFERElORyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZWxlKSA9PiBlbGUudHlwZSAhPT0gXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd3JhcHBlZFRleHQgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0OiBub3JtYWxpemVUZXh0KHdyYXBwZWRUZXh0KSxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBldmVudHMgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgbGF0ZS1maXJlXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcblxuICAgIHVuYmluZFVwZGF0ZSgpO1xuXG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IChldmVudD86IE1vdXNlRXZlbnQpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2U6IGNsaWNraW5nIG9uIHRoZSBzYW1lIHByb3BlcnR5IOKGkiBubyBjaGFuZ2Ug4oaSIG5vIHVwZGF0ZSDihpIgbm8gZm9jdXNcbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKFxuICAgICAgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fFxuICAgICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiZcbiAgICAgICAgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHx8XG4gICAgICBpc1RhcmdldENvbG9yUGlja2VyXG4gICAgKSB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgICAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG4gIGNvbnN0IHVuYmluZFVwZGF0ZSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5hZGRDYWxsYmFjaygoKSA9PiB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcbiAgICAgIFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiLFxuICAgICk7XG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2VsZWN0IG9uIGluaXQgKGZvY3VzaW5nIGlzIGRvbmUgc2VwYXJhdGVseSBpbnNpZGUgdGhlIGJpbmRCbHVyRXZlbnQoKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gaGFwcGVuICphZnRlciogdGhlIGJsdXIgZXZlbnQgZnJvbSBgcG9pbnRlcmRvd25gKVxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpO1xuXG4gIC8vIHJlcG9zaXRpb24gd3lzaXd5ZyBpbiBjYXNlIG9mIGNhbnZhcyBpcyByZXNpemVkLiBVc2luZyBSZXNpemVPYnNlcnZlclxuICAvLyBpcyBwcmVmZXJyZWQgc28gd2UgY2F0Y2ggY2hhbmdlcyBmcm9tIGhvc3QsIHdoZXJlIHdpbmRvdyBtYXkgbm90IHJlc2l6ZS5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWUsXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyXG4gICAgPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKSFcbiAgICAuYXBwZW5kQ2hpbGQoZWRpdGFibGUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
2343
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst normalizeText = (text) => {\r\n return (text\r\n // replace tabs with spaces so they render and measure correctly\r\n .replace(/\\t/g, \" \")\r\n // normalize newlines\r\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\r\n};\r\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\r\n const { zoom, offsetTop, offsetLeft } = appState;\r\n const degree = (180 * angle) / Math.PI;\r\n // offsets must be multiplied by 2 to account for the division by 2 of\r\n // the whole expression afterwards\r\n let translateX = ((width - offsetLeft * 2) * (zoom.value - 1)) / 2;\r\n let translateY = ((height - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n if (width > maxWidth && zoom.value !== 1) {\r\n translateX = (maxWidth / 2) * (zoom.value - 1);\r\n }\r\n if (height > maxHeight && zoom.value !== 1) {\r\n translateY = ((maxHeight - offsetTop * 2) * (zoom.value - 1)) / 2;\r\n }\r\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\r\n};\r\nconst textWysiwyg = ({ id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, }) => {\r\n const textPropertiesUpdated = (updatedElement, editable) => {\r\n const currentFont = editable.style.fontFamily.replaceAll('\"', \"\");\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedElement.fontFamily }) !==\r\n currentFont) {\r\n return true;\r\n }\r\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n let originalContainerHeight;\r\n let approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element))\r\n : 0;\r\n const updateWysiwygStyle = () => {\r\n var _a;\r\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\r\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\r\n let coordX = updatedElement.x;\r\n let coordY = updatedElement.y;\r\n const container = (updatedElement === null || updatedElement === void 0 ? void 0 : updatedElement.containerId)\r\n ? _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updatedElement).getElement(updatedElement.containerId)\r\n : null;\r\n let maxWidth = updatedElement.width;\r\n let maxHeight = updatedElement.height;\r\n let width = updatedElement.width;\r\n // Set to element height by default since thats\r\n // what is going to be used for unbounded text\r\n let height = updatedElement.height;\r\n if (container && updatedElement.containerId) {\r\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable);\r\n // using editor.style.height to get the accurate height of text editor\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editorHeight > 0) {\r\n height = editorHeight;\r\n }\r\n if (propertiesUpdated) {\r\n approxLineHeight = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)\r\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement))\r\n : 0;\r\n originalContainerHeight = container.height;\r\n // update height of the editor after properties updated\r\n height = updatedElement.height;\r\n }\r\n if (!originalContainerHeight) {\r\n originalContainerHeight = container.height;\r\n }\r\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\r\n width = maxWidth;\r\n // The coordinates of text box set a distance of\r\n // 30px to preserve padding\r\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING;\r\n // autogrow container height if text exceeds\r\n if (height > maxHeight) {\r\n const diff = Math.min(height - maxHeight, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height + diff });\r\n return;\r\n }\r\n else if (\r\n // autoshrink container height until original container height\r\n // is reached when text is removed\r\n container.height > originalContainerHeight &&\r\n height < maxHeight) {\r\n const diff = Math.min(maxHeight - height, approxLineHeight);\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: container.height - diff });\r\n }\r\n // Start pushing text upward until a diff of 30px (padding)\r\n // is reached\r\n else {\r\n // vertically center align the text\r\n coordY = container.y + container.height / 2 - height / 2;\r\n }\r\n }\r\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\r\n const { textAlign } = updatedElement;\r\n editable.value = updatedElement.originalText || updatedElement.text;\r\n const lines = updatedElement.originalText.split(\"\\n\");\r\n const lineHeight = updatedElement.containerId\r\n ? approxLineHeight\r\n : updatedElement.height / lines.length;\r\n if (!container) {\r\n maxWidth =\r\n (appState.offsetLeft + appState.width - viewportX - 8) /\r\n appState.zoom.value -\r\n // margin-right of parent if any\r\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\r\n }\r\n // Make sure text editor height doesn't go beyond viewport\r\n const editorMaxHeight = (appState.height -\r\n viewportY -\r\n // There is a ~14px difference which keeps on increasing\r\n // with every zoom step when offset present hence I am subtracting it here\r\n // However this is not the best fix and breaks in\r\n // few scenarios\r\n (appState.offsetTop\r\n ? ((appState.zoom.value * 100 - 100) / 10) * 14\r\n : 0)) /\r\n appState.zoom.value;\r\n const angle = container ? container.angle : updatedElement.angle;\r\n Object.assign(editable.style, {\r\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\r\n // must be defined *after* font ¯\\_(ツ)_/¯\r\n lineHeight: `${lineHeight}px`,\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${viewportX}px`,\r\n top: `${viewportY}px`,\r\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\r\n textAlign,\r\n color: updatedElement.strokeColor,\r\n opacity: updatedElement.opacity / 100,\r\n filter: \"var(--theme-filter)\",\r\n maxWidth: `${maxWidth}px`,\r\n maxHeight: `${editorMaxHeight}px`,\r\n });\r\n }\r\n };\r\n const editable = document.createElement(\"textarea\");\r\n editable.dir = \"auto\";\r\n editable.tabIndex = 0;\r\n editable.dataset.type = \"wysiwyg\";\r\n // prevent line wrapping on Safari\r\n editable.wrap = \"off\";\r\n editable.classList.add(\"excalidraw-wysiwyg\");\r\n let whiteSpace = \"pre\";\r\n let wordBreak = \"normal\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\r\n whiteSpace = \"pre-wrap\";\r\n wordBreak = \"break-word\";\r\n }\r\n Object.assign(editable.style, {\r\n position: \"absolute\",\r\n display: \"inline-block\",\r\n minHeight: \"1em\",\r\n backfaceVisibility: \"hidden\",\r\n margin: 0,\r\n padding: 0,\r\n border: 0,\r\n outline: 0,\r\n resize: \"none\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n // must be specified because in dark mode canvas creates a stacking context\r\n zIndex: \"var(--zIndex-wysiwyg)\",\r\n wordBreak,\r\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\r\n whiteSpace,\r\n overflowWrap: \"break-word\",\r\n });\r\n updateWysiwygStyle();\r\n if (onChange) {\r\n editable.oninput = () => {\r\n // using scrollHeight here since we need to calculate\r\n // number of lines so cannot use editable.style.height\r\n // as that gets updated below\r\n const lines = editable.scrollHeight / approxLineHeight;\r\n // auto increase height only when lines > 1 so its\r\n // measured correctly and vertically alignes for\r\n // first line as well as setting height to \"auto\"\r\n // doubles the height as soon as user starts typing\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\r\n let height = \"auto\";\r\n if (lines === 2) {\r\n const container = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).getElement(element.containerId);\r\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\"\\n\").length;\r\n // This is browser behaviour when setting height to \"auto\"\r\n // It sets the height needed for 2 lines even if actual\r\n // line count is 1 as mentioned above as well\r\n // hence reducing the height by half if actual line count is 1\r\n // so single line aligns vertically when deleting\r\n if (actualLineCount === 1) {\r\n height = `${editable.scrollHeight / 2}px`;\r\n }\r\n }\r\n editable.style.height = height;\r\n editable.style.height = `${editable.scrollHeight}px`;\r\n }\r\n onChange(normalizeText(editable.value));\r\n };\r\n }\r\n editable.onkeydown = (event) => {\r\n event.stopPropagation();\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\r\n event.preventDefault();\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\r\n event.preventDefault();\r\n if (event.isComposing || event.keyCode === 229) {\r\n return;\r\n }\r\n submittedViaKeyboard = true;\r\n handleSubmit();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\r\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\r\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\r\n event.preventDefault();\r\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\r\n outdent();\r\n }\r\n else {\r\n indent();\r\n }\r\n // We must send an input event to resize the element\r\n editable.dispatchEvent(new Event(\"input\"));\r\n }\r\n };\r\n const TAB_SIZE = 4;\r\n const TAB = \" \".repeat(TAB_SIZE);\r\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\r\n const indent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex);\r\n value = `${startValue}${TAB}${endValue}`;\r\n });\r\n editable.value = value;\r\n editable.selectionStart = selectionStart + TAB_SIZE;\r\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\r\n };\r\n const outdent = () => {\r\n const { selectionStart, selectionEnd } = editable;\r\n const linesStartIndices = getSelectedLinesStartIndices();\r\n const removedTabs = [];\r\n let value = editable.value;\r\n linesStartIndices.forEach((startIndex) => {\r\n const tabMatch = value\r\n .slice(startIndex, startIndex + TAB_SIZE)\r\n .match(RE_LEADING_TAB);\r\n if (tabMatch) {\r\n const startValue = value.slice(0, startIndex);\r\n const endValue = value.slice(startIndex + tabMatch[0].length);\r\n // Delete a tab from the line\r\n value = `${startValue}${endValue}`;\r\n removedTabs.push(startIndex);\r\n }\r\n });\r\n editable.value = value;\r\n if (removedTabs.length) {\r\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\r\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\r\n }\r\n else {\r\n // If the cursor is before the first tab removed, ex:\r\n // Line| #1\r\n // Line #2\r\n // Lin|e #3\r\n // we should reset the selectionStart to his initial value.\r\n editable.selectionStart = selectionStart;\r\n }\r\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\r\n }\r\n };\r\n /**\r\n * @returns indeces of start positions of selected lines, in reverse order\r\n */\r\n const getSelectedLinesStartIndices = () => {\r\n let { selectionStart, selectionEnd, value } = editable;\r\n // chars before selectionStart on the same line\r\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\r\n .length;\r\n // put caret at the start of the line\r\n selectionStart = selectionStart - startOffset;\r\n const selected = value.slice(selectionStart, selectionEnd);\r\n return selected\r\n .split(\"\\n\")\r\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\r\n ? // curr line index is prev line's start + prev line's length + \\n\r\n startIndices[idx - 1] + lines[idx - 1].length + 1\r\n : // first selected line\r\n selectionStart), [])\r\n .reverse();\r\n };\r\n const stopEvent = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n // using a state variable instead of passing it to the handleSubmit callback\r\n // so that we don't need to create separate a callback for event handlers\r\n let submittedViaKeyboard = false;\r\n const handleSubmit = () => {\r\n var _a, _b;\r\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\r\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\r\n // wysiwyg on update\r\n cleanup();\r\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\r\n if (!updateElement) {\r\n return;\r\n }\r\n let wrappedText = \"\";\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && (updateElement === null || updateElement === void 0 ? void 0 : updateElement.containerId)) {\r\n const container = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(updateElement).getElement(updateElement.containerId);\r\n if (container) {\r\n wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updateElement), container.width);\r\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && updateElement.containerId) {\r\n const editorHeight = Number(editable.style.height.slice(0, -2));\r\n if (editable.value) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updateElement, {\r\n // vertically center align\r\n y: container.y + container.height / 2 - editorHeight / 2,\r\n height: editorHeight,\r\n width: Number(editable.style.width.slice(0, -2)),\r\n // preserve padding\r\n x: container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING,\r\n angle: container.angle,\r\n });\r\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\r\n if (!boundTextElementId || boundTextElementId !== element.id) {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (container.boundElements || []).concat({\r\n type: \"text\",\r\n id: element.id,\r\n }),\r\n });\r\n }\r\n }\r\n else {\r\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\r\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type !== \"text\"),\r\n });\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n wrappedText = editable.value;\r\n }\r\n onSubmit({\r\n text: normalizeText(wrappedText),\r\n viaKeyboard: submittedViaKeyboard,\r\n originalText: editable.value,\r\n });\r\n };\r\n const cleanup = () => {\r\n if (isDestroyed) {\r\n return;\r\n }\r\n isDestroyed = true;\r\n // remove events to ensure they don't late-fire\r\n editable.onblur = null;\r\n editable.oninput = null;\r\n editable.onkeydown = null;\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n window.removeEventListener(\"resize\", updateWysiwygStyle);\r\n window.removeEventListener(\"wheel\", stopEvent, true);\r\n window.removeEventListener(\"pointerdown\", onPointerDown);\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n window.removeEventListener(\"blur\", handleSubmit);\r\n unbindUpdate();\r\n editable.remove();\r\n };\r\n const bindBlurEvent = (event) => {\r\n window.removeEventListener(\"pointerup\", bindBlurEvent);\r\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\r\n // trigger the blur on ensuing pointerup.\r\n // Also to handle cases such as picking a color which would trigger a blur\r\n // in that same tick.\r\n const target = event === null || event === void 0 ? void 0 : event.target;\r\n const isTargetColorPicker = target instanceof HTMLInputElement &&\r\n target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\r\n setTimeout(() => {\r\n editable.onblur = handleSubmit;\r\n if (target && isTargetColorPicker) {\r\n target.onblur = () => {\r\n editable.focus();\r\n };\r\n }\r\n // case: clicking on the same property → no change → no update → no focus\r\n if (!isTargetColorPicker) {\r\n editable.focus();\r\n }\r\n });\r\n };\r\n // prevent blur when changing properties from the menu\r\n const onPointerDown = (event) => {\r\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\r\n event.target.closest(\".color-picker-input\") &&\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\r\n if (((event.target instanceof HTMLElement ||\r\n event.target instanceof SVGElement) &&\r\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\r\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\r\n isTargetColorPicker) {\r\n editable.onblur = null;\r\n window.addEventListener(\"pointerup\", bindBlurEvent);\r\n // handle edge-case where pointerup doesn't fire e.g. due to user\r\n // alt-tabbing away\r\n window.addEventListener(\"blur\", handleSubmit);\r\n }\r\n };\r\n // handle updates of textElement properties of editing element\r\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\r\n var _a;\r\n updateWysiwygStyle();\r\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\r\n if (!isColorPickerActive) {\r\n editable.focus();\r\n }\r\n });\r\n // ---------------------------------------------------------------------------\r\n let isDestroyed = false;\r\n // select on init (focusing is done separately inside the bindBlurEvent()\r\n // because we need it to happen *after* the blur event from `pointerdown`)\r\n editable.select();\r\n bindBlurEvent();\r\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\r\n // is preferred so we catch changes from host, where window may not resize.\r\n let observer = null;\r\n if (canvas && \"ResizeObserver\" in window) {\r\n observer = new window.ResizeObserver(() => {\r\n updateWysiwygStyle();\r\n });\r\n observer.observe(canvas);\r\n }\r\n else {\r\n window.addEventListener(\"resize\", updateWysiwygStyle);\r\n }\r\n window.addEventListener(\"pointerdown\", onPointerDown);\r\n window.addEventListener(\"wheel\", stopEvent, {\r\n passive: false,\r\n capture: true,\r\n });\r\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFuQixtQkFBbUIsQ0FDZixhQUFhLENBQUMsaUNBQWlDLEVBQ2hELFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0V3lzaXd5Zy50c3g/OGY0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQge1xuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0Rm9udEZhbWlseVN0cmluZyxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBpc0JvdW5kVG9Db250YWluZXIsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBDTEFTU0VTLCBCT1VORF9URVhUX1BBRERJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQge1xuICBnZXRBcHByb3hMaW5lSGVpZ2h0LFxuICBnZXRCb3VuZFRleHRFbGVtZW50SWQsXG4gIHdyYXBUZXh0LFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuXG5jb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IChcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgbWF4V2lkdGg6IG51bWJlcixcbiAgbWF4SGVpZ2h0OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgeyB6b29tLCBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IGFwcFN0YXRlO1xuICBjb25zdCBkZWdyZWUgPSAoMTgwICogYW5nbGUpIC8gTWF0aC5QSTtcbiAgLy8gb2Zmc2V0cyBtdXN0IGJlIG11bHRpcGxpZWQgYnkgMiB0byBhY2NvdW50IGZvciB0aGUgZGl2aXNpb24gYnkgMiBvZlxuICAvLyB0aGUgd2hvbGUgZXhwcmVzc2lvbiBhZnRlcndhcmRzXG4gIGxldCB0cmFuc2xhdGVYID0gKCh3aWR0aCAtIG9mZnNldExlZnQgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgbGV0IHRyYW5zbGF0ZVkgPSAoKGhlaWdodCAtIG9mZnNldFRvcCAqIDIpICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBpZiAod2lkdGggPiBtYXhXaWR0aCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWCA9IChtYXhXaWR0aCAvIDIpICogKHpvb20udmFsdWUgLSAxKTtcbiAgfVxuICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0ICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVZID0gKChtYXhIZWlnaHQgLSBvZmZzZXRUb3AgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgfVxuICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9cHgsICR7dHJhbnNsYXRlWX1weCkgc2NhbGUoJHt6b29tLnZhbHVlfSkgcm90YXRlKCR7ZGVncmVlfWRlZylgO1xufTtcblxuZXhwb3J0IGNvbnN0IHRleHRXeXNpd3lnID0gKHtcbiAgaWQsXG4gIGFwcFN0YXRlLFxuICBvbkNoYW5nZSxcbiAgb25TdWJtaXQsXG4gIGdldFZpZXdwb3J0Q29vcmRzLFxuICBlbGVtZW50LFxuICBjYW52YXMsXG4gIGV4Y2FsaWRyYXdDb250YWluZXIsXG59OiB7XG4gIGlkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdO1xuICBhcHBTdGF0ZTogQXBwU3RhdGU7XG4gIG9uQ2hhbmdlPzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25TdWJtaXQ6IChkYXRhOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHZpYUtleWJvYXJkOiBib29sZWFuO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICB9KSA9PiB2b2lkO1xuICBnZXRWaWV3cG9ydENvb3JkczogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdO1xuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudDtcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGw7XG4gIGV4Y2FsaWRyYXdDb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbn0pID0+IHtcbiAgY29uc3QgdGV4dFByb3BlcnRpZXNVcGRhdGVkID0gKFxuICAgIHVwZGF0ZWRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgZWRpdGFibGU6IEhUTUxUZXh0QXJlYUVsZW1lbnQsXG4gICkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRGb250ID0gZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlQWxsKCdcIicsIFwiXCIpO1xuICAgIGlmIChcbiAgICAgIGdldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5OiB1cGRhdGVkRWxlbWVudC5mb250RmFtaWx5IH0pICE9PVxuICAgICAgY3VycmVudEZvbnRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoYCR7dXBkYXRlZEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgbGV0IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0OiBudW1iZXI7XG4gIGxldCBhcHByb3hMaW5lSGVpZ2h0ID0gaXNUZXh0RWxlbWVudChlbGVtZW50KVxuICAgID8gZ2V0QXBwcm94TGluZUhlaWdodChnZXRGb250U3RyaW5nKGVsZW1lbnQpKVxuICAgIDogMDtcblxuICBjb25zdCB1cGRhdGVXeXNpd3lnU3R5bGUgPSAoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKHVwZGF0ZWRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQodXBkYXRlZEVsZW1lbnQpKSB7XG4gICAgICBsZXQgY29vcmRYID0gdXBkYXRlZEVsZW1lbnQueDtcbiAgICAgIGxldCBjb29yZFkgPSB1cGRhdGVkRWxlbWVudC55O1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdXBkYXRlZEVsZW1lbnQ/LmNvbnRhaW5lcklkXG4gICAgICAgID8gU2NlbmUuZ2V0U2NlbmUodXBkYXRlZEVsZW1lbnQpIS5nZXRFbGVtZW50KHVwZGF0ZWRFbGVtZW50LmNvbnRhaW5lcklkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBsZXQgbWF4V2lkdGggPSB1cGRhdGVkRWxlbWVudC53aWR0aDtcblxuICAgICAgbGV0IG1heEhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgIGxldCB3aWR0aCA9IHVwZGF0ZWRFbGVtZW50LndpZHRoO1xuICAgICAgLy8gU2V0IHRvIGVsZW1lbnQgaGVpZ2h0IGJ5IGRlZmF1bHQgc2luY2UgdGhhdHNcbiAgICAgIC8vIHdoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdW5ib3VuZGVkIHRleHRcbiAgICAgIGxldCBoZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG4gICAgICBpZiAoY29udGFpbmVyICYmIHVwZGF0ZWRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXNVcGRhdGVkID0gdGV4dFByb3BlcnRpZXNVcGRhdGVkKFxuICAgICAgICAgIHVwZGF0ZWRFbGVtZW50LFxuICAgICAgICAgIGVkaXRhYmxlLFxuICAgICAgICApO1xuICAgICAgICAvLyB1c2luZyBlZGl0b3Iuc3R5bGUuaGVpZ2h0IHRvIGdldCB0aGUgYWNjdXJhdGUgaGVpZ2h0IG9mIHRleHQgZWRpdG9yXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcbiAgICAgICAgaWYgKGVkaXRvckhlaWdodCA+IDApIHtcbiAgICAgICAgICBoZWlnaHQgPSBlZGl0b3JIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnRpZXNVcGRhdGVkKSB7XG4gICAgICAgICAgYXBwcm94TGluZUhlaWdodCA9IGlzVGV4dEVsZW1lbnQodXBkYXRlZEVsZW1lbnQpXG4gICAgICAgICAgICA/IGdldEFwcHJveExpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyh1cGRhdGVkRWxlbWVudCkpXG4gICAgICAgICAgICA6IDA7XG5cbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG5cbiAgICAgICAgICAvLyB1cGRhdGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgYWZ0ZXIgcHJvcGVydGllcyB1cGRhdGVkXG4gICAgICAgICAgaGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJIZWlnaHQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgbWF4V2lkdGggPSBjb250YWluZXIud2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICBtYXhIZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgICAgICAgd2lkdGggPSBtYXhXaWR0aDtcbiAgICAgICAgLy8gVGhlIGNvb3JkaW5hdGVzIG9mIHRleHQgYm94IHNldCBhIGRpc3RhbmNlIG9mXG4gICAgICAgIC8vIDMwcHggdG8gcHJlc2VydmUgcGFkZGluZ1xuICAgICAgICBjb29yZFggPSBjb250YWluZXIueCArIEJPVU5EX1RFWFRfUEFERElORztcbiAgICAgICAgLy8gYXV0b2dyb3cgY29udGFpbmVyIGhlaWdodCBpZiB0ZXh0IGV4Y2VlZHNcbiAgICAgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihoZWlnaHQgLSBtYXhIZWlnaHQsIGFwcHJveExpbmVIZWlnaHQpO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogY29udGFpbmVyLmhlaWdodCArIGRpZmYgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIGF1dG9zaHJpbmsgY29udGFpbmVyIGhlaWdodCB1bnRpbCBvcmlnaW5hbCBjb250YWluZXIgaGVpZ2h0XG4gICAgICAgICAgLy8gaXMgcmVhY2hlZCB3aGVuIHRleHQgaXMgcmVtb3ZlZFxuICAgICAgICAgIGNvbnRhaW5lci5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckhlaWdodCAmJlxuICAgICAgICAgIGhlaWdodCA8IG1heEhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4obWF4SGVpZ2h0IC0gaGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgLSBkaWZmIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgW3ZpZXdwb3J0WCwgdmlld3BvcnRZXSA9IGdldFZpZXdwb3J0Q29vcmRzKGNvb3JkWCwgY29vcmRZKTtcbiAgICAgIGNvbnN0IHsgdGV4dEFsaWduIH0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZEVsZW1lbnQub3JpZ2luYWxUZXh0IHx8IHVwZGF0ZWRFbGVtZW50LnRleHQ7XG4gICAgICBjb25zdCBsaW5lcyA9IHVwZGF0ZWRFbGVtZW50Lm9yaWdpbmFsVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICA/IGFwcHJveExpbmVIZWlnaHRcbiAgICAgICAgOiB1cGRhdGVkRWxlbWVudC5oZWlnaHQgLyBsaW5lcy5sZW5ndGg7XG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9XG4gICAgICAgICAgKGFwcFN0YXRlLm9mZnNldExlZnQgKyBhcHBTdGF0ZS53aWR0aCAtIHZpZXdwb3J0WCAtIDgpIC9cbiAgICAgICAgICAgIGFwcFN0YXRlLnpvb20udmFsdWUgLVxuICAgICAgICAgIC8vIG1hcmdpbi1yaWdodCBvZiBwYXJlbnQgaWYgYW55XG4gICAgICAgICAgTnVtYmVyKFxuICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICAgICAgZXhjYWxpZHJhd0NvbnRhaW5lcj8ucGFyZW50Tm9kZSBhcyBFbGVtZW50LFxuICAgICAgICAgICAgKS5tYXJnaW5SaWdodC5zbGljZSgwLCAtMiksXG4gICAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRleHQgZWRpdG9yIGhlaWdodCBkb2Vzbid0IGdvIGJleW9uZCB2aWV3cG9ydFxuICAgICAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID1cbiAgICAgICAgKGFwcFN0YXRlLmhlaWdodCAtXG4gICAgICAgICAgdmlld3BvcnRZIC1cbiAgICAgICAgICAvLyBUaGVyZSBpcyBhIH4xNHB4IGRpZmZlcmVuY2Ugd2hpY2gga2VlcHMgb24gaW5jcmVhc2luZ1xuICAgICAgICAgIC8vIHdpdGggZXZlcnkgem9vbSBzdGVwIHdoZW4gb2Zmc2V0IHByZXNlbnQgaGVuY2UgSSBhbSBzdWJ0cmFjdGluZyBpdCBoZXJlXG4gICAgICAgICAgLy8gSG93ZXZlciB0aGlzIGlzIG5vdCB0aGUgYmVzdCBmaXggYW5kIGJyZWFrcyBpblxuICAgICAgICAgIC8vIGZldyBzY2VuYXJpb3NcbiAgICAgICAgICAoYXBwU3RhdGUub2Zmc2V0VG9wXG4gICAgICAgICAgICA/ICgoYXBwU3RhdGUuem9vbS52YWx1ZSAqIDEwMCAtIDEwMCkgLyAxMCkgKiAxNFxuICAgICAgICAgICAgOiAwKSkgL1xuICAgICAgICBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgY29uc3QgYW5nbGUgPSBjb250YWluZXIgPyBjb250YWluZXIuYW5nbGUgOiB1cGRhdGVkRWxlbWVudC5hbmdsZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICAgICAgZm9udDogZ2V0Rm9udFN0cmluZyh1cGRhdGVkRWxlbWVudCksXG4gICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCAqYWZ0ZXIqIGZvbnQgwq9cXF8o44OEKV8vwq9cbiAgICAgICAgbGluZUhlaWdodDogYCR7bGluZUhlaWdodH1weGAsXG4gICAgICAgIHdpZHRoOiBgJHt3aWR0aH1weGAsXG4gICAgICAgIGhlaWdodDogYCR7aGVpZ2h0fXB4YCxcbiAgICAgICAgbGVmdDogYCR7dmlld3BvcnRYfXB4YCxcbiAgICAgICAgdG9wOiBgJHt2aWV3cG9ydFl9cHhgLFxuICAgICAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybShcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgYW5nbGUsXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgZWRpdG9yTWF4SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgIGNvbG9yOiB1cGRhdGVkRWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgb3BhY2l0eTogdXBkYXRlZEVsZW1lbnQub3BhY2l0eSAvIDEwMCxcbiAgICAgICAgZmlsdGVyOiBcInZhcigtLXRoZW1lLWZpbHRlcilcIixcbiAgICAgICAgbWF4V2lkdGg6IGAke21heFdpZHRofXB4YCxcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtlZGl0b3JNYXhIZWlnaHR9cHhgLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGVkaXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiO1xuICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG4gIGVkaXRhYmxlLndyYXAgPSBcIm9mZlwiO1xuICBlZGl0YWJsZS5jbGFzc0xpc3QuYWRkKFwiZXhjYWxpZHJhdy13eXNpd3lnXCIpO1xuXG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBtaW5IZWlnaHQ6IFwiMWVtXCIsXG4gICAgYmFja2ZhY2VWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIHJlc2l6ZTogXCJub25lXCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIC8vIG11c3QgYmUgc3BlY2lmaWVkIGJlY2F1c2UgaW4gZGFyayBtb2RlIGNhbnZhcyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dFxuICAgIHpJbmRleDogXCJ2YXIoLS16SW5kZXgtd3lzaXd5ZylcIixcbiAgICB3b3JkQnJlYWssXG4gICAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIChgd2hpdGVzcGFjZTogbm93cmFwYCBkb2Vzbid0IHdvcmsgb24gRkYpXG4gICAgd2hpdGVTcGFjZSxcbiAgICBvdmVyZmxvd1dyYXA6IFwiYnJlYWstd29yZFwiLFxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIC8vIHVzaW5nIHNjcm9sbEhlaWdodCBoZXJlIHNpbmNlIHdlIG5lZWQgdG8gY2FsY3VsYXRlXG4gICAgICAvLyBudW1iZXIgb2YgbGluZXMgc28gY2Fubm90IHVzZSBlZGl0YWJsZS5zdHlsZS5oZWlnaHRcbiAgICAgIC8vIGFzIHRoYXQgZ2V0cyB1cGRhdGVkIGJlbG93XG4gICAgICBjb25zdCBsaW5lcyA9IGVkaXRhYmxlLnNjcm9sbEhlaWdodCAvIGFwcHJveExpbmVIZWlnaHQ7XG4gICAgICAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbmVzIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcbiAgICAgIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkgJiYgbGluZXMgPiAxKSB7XG4gICAgICAgIGxldCBoZWlnaHQgPSBcImF1dG9cIjtcblxuICAgICAgICBpZiAobGluZXMgPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuZ2V0RWxlbWVudChcbiAgICAgICAgICAgIGVsZW1lbnQuY29udGFpbmVySWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxMaW5lQ291bnQgPSB3cmFwVGV4dChcbiAgICAgICAgICAgIGVkaXRhYmxlLnZhbHVlLFxuICAgICAgICAgICAgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSxcbiAgICAgICAgICAgIGNvbnRhaW5lciEud2lkdGgsXG4gICAgICAgICAgKS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGJyb3dzZXIgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgICAgICAvLyBJdCBzZXRzIHRoZSBoZWlnaHQgbmVlZGVkIGZvciAyIGxpbmVzIGV2ZW4gaWYgYWN0dWFsXG4gICAgICAgICAgLy8gbGluZSBjb3VudCBpcyAxIGFzIG1lbnRpb25lZCBhYm92ZSBhcyB3ZWxsXG4gICAgICAgICAgLy8gaGVuY2UgcmVkdWNpbmcgdGhlIGhlaWdodCBieSBoYWxmIGlmIGFjdHVhbCBsaW5lIGNvdW50IGlzIDFcbiAgICAgICAgICAvLyBzbyBzaW5nbGUgbGluZSBhbGlnbnMgdmVydGljYWxseSB3aGVuIGRlbGV0aW5nXG4gICAgICAgICAgaWYgKGFjdHVhbExpbmVDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gMn1weGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUiAmJiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZyB8fCBldmVudC5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5UQUIgfHxcbiAgICAgIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJlxuICAgICAgICAoZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUIHx8XG4gICAgICAgICAgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9SSUdIVCkpXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG11c3Qgc2VuZCBhbiBpbnB1dCBldmVudCB0byByZXNpemUgdGhlIGVsZW1lbnRcbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcbiAgY29uc3QgaW5kZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCk7XG5cbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCArIFRBQl9TSVpFO1xuICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZCArIFRBQl9TSVpFICogbGluZXNTdGFydEluZGljZXMubGVuZ3RoO1xuICB9O1xuXG4gIGNvbnN0IG91dGRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFiczogbnVtYmVyW10gPSBbXTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWVcbiAgICAgICAgLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBUQUJfU0laRSlcbiAgICAgICAgLm1hdGNoKFJFX0xFQURJTkdfVEFCKTtcblxuICAgICAgaWYgKHRhYk1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4ICsgdGFiTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgICAgICAvLyBEZWxldGUgYSB0YWIgZnJvbSB0aGUgbGluZVxuICAgICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtlbmRWYWx1ZX1gO1xuICAgICAgICByZW1vdmVkVGFicy5wdXNoKHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChyZW1vdmVkVGFicy5sZW5ndGgpIHtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgLSBUQUJfU0laRSxcbiAgICAgICAgICByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgYmVmb3JlIHRoZSBmaXJzdCB0YWIgcmVtb3ZlZCwgZXg6XG4gICAgICAgIC8vIExpbmV8ICMxXG4gICAgICAgIC8vICAgICBMaW5lICMyXG4gICAgICAgIC8vIExpbnxlICMzXG4gICAgICAgIC8vIHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0aW9uU3RhcnQgdG8gaGlzIGluaXRpYWwgdmFsdWUuXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICB9XG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNlbGVjdGlvbkVuZCAtIFRBQl9TSVpFICogcmVtb3ZlZFRhYnMubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGVjZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuICBjb25zdCBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzID0gKCkgPT4ge1xuICAgIGxldCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQsIHZhbHVlIH0gPSBlZGl0YWJsZTtcblxuICAgIC8vIGNoYXJzIGJlZm9yZSBzZWxlY3Rpb25TdGFydCBvbiB0aGUgc2FtZSBsaW5lXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSB2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1teXFxuXSokLykhWzBdXG4gICAgICAubGVuZ3RoO1xuICAgIC8vIHB1dCBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmVcbiAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0IC0gc3RhcnRPZmZzZXQ7XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChzdGFydEluZGljZXMsIGxpbmUsIGlkeCwgbGluZXMpID0+XG4gICAgICAgICAgc3RhcnRJbmRpY2VzLmNvbmNhdChcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgICAgICA/IC8vIGN1cnIgbGluZSBpbmRleCBpcyBwcmV2IGxpbmUncyBzdGFydCArIHByZXYgbGluZSdzIGxlbmd0aCArIFxcblxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApXG4gICAgICAucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BFdmVudCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIC8vIHVzaW5nIGEgc3RhdGUgdmFyaWFibGUgaW5zdGVhZCBvZiBwYXNzaW5nIGl0IHRvIHRoZSBoYW5kbGVTdWJtaXQgY2FsbGJhY2tcbiAgLy8gc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBzZXBhcmF0ZSBhIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGVyc1xuICBsZXQgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICAgIC8vIGNsZWFudXAgbXVzdCBiZSBydW4gYmVmb3JlIG9uU3VibWl0IG90aGVyd2lzZSB3aGVuIGFwcCBibHVycyB0aGUgd3lzaXd5Z1xuICAgIC8vIGl0J2QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agb2YgYmx1cuKGkm9uU3VibWl0IGFmdGVyIHdlIHJlLWZvY3VzIHRoZVxuICAgIC8vIHd5c2l3eWcgb24gdXBkYXRlXG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmlkKTtcbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHdyYXBwZWRUZXh0ID0gXCJcIjtcbiAgICBpZiAoaXNUZXh0RWxlbWVudCh1cGRhdGVFbGVtZW50KSAmJiB1cGRhdGVFbGVtZW50Py5jb250YWluZXJJZCkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gU2NlbmUuZ2V0U2NlbmUodXBkYXRlRWxlbWVudCkhLmdldEVsZW1lbnQoXG4gICAgICAgIHVwZGF0ZUVsZW1lbnQuY29udGFpbmVySWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ7XG5cbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgd3JhcHBlZFRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICBlZGl0YWJsZS52YWx1ZSxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHVwZGF0ZUVsZW1lbnQpLFxuICAgICAgICAgIGNvbnRhaW5lci53aWR0aCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGlzVGV4dEVsZW1lbnQodXBkYXRlRWxlbWVudCkgJiYgdXBkYXRlRWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcbiAgICAgICAgICBpZiAoZWRpdGFibGUudmFsdWUpIHtcbiAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQodXBkYXRlRWxlbWVudCwge1xuICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnblxuICAgICAgICAgICAgICB5OiBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gZWRpdG9ySGVpZ2h0IC8gMixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBlZGl0b3JIZWlnaHQsXG4gICAgICAgICAgICAgIHdpZHRoOiBOdW1iZXIoZWRpdGFibGUuc3R5bGUud2lkdGguc2xpY2UoMCwgLTIpKSxcbiAgICAgICAgICAgICAgLy8gcHJlc2VydmUgcGFkZGluZ1xuICAgICAgICAgICAgICB4OiBjb250YWluZXIueCArIEJPVU5EX1RFWFRfUEFERElORyxcbiAgICAgICAgICAgICAgYW5nbGU6IGNvbnRhaW5lci5hbmdsZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZWxlKSA9PiBlbGUudHlwZSAhPT0gXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd3JhcHBlZFRleHQgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0OiBub3JtYWxpemVUZXh0KHdyYXBwZWRUZXh0KSxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBldmVudHMgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgbGF0ZS1maXJlXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcblxuICAgIHVuYmluZFVwZGF0ZSgpO1xuXG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IChldmVudD86IE1vdXNlRXZlbnQpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2U6IGNsaWNraW5nIG9uIHRoZSBzYW1lIHByb3BlcnR5IOKGkiBubyBjaGFuZ2Ug4oaSIG5vIHVwZGF0ZSDihpIgbm8gZm9jdXNcbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKFxuICAgICAgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fFxuICAgICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiZcbiAgICAgICAgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHx8XG4gICAgICBpc1RhcmdldENvbG9yUGlja2VyXG4gICAgKSB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgICAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG4gIGNvbnN0IHVuYmluZFVwZGF0ZSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5hZGRDYWxsYmFjaygoKSA9PiB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcbiAgICAgIFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiLFxuICAgICk7XG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2VsZWN0IG9uIGluaXQgKGZvY3VzaW5nIGlzIGRvbmUgc2VwYXJhdGVseSBpbnNpZGUgdGhlIGJpbmRCbHVyRXZlbnQoKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gaGFwcGVuICphZnRlciogdGhlIGJsdXIgZXZlbnQgZnJvbSBgcG9pbnRlcmRvd25gKVxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpO1xuXG4gIC8vIHJlcG9zaXRpb24gd3lzaXd5ZyBpbiBjYXNlIG9mIGNhbnZhcyBpcyByZXNpemVkLiBVc2luZyBSZXNpemVPYnNlcnZlclxuICAvLyBpcyBwcmVmZXJyZWQgc28gd2UgY2F0Y2ggY2hhbmdlcyBmcm9tIGhvc3QsIHdoZXJlIHdpbmRvdyBtYXkgbm90IHJlc2l6ZS5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWUsXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyXG4gICAgPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKSFcbiAgICAuYXBwZW5kQ2hpbGQoZWRpdGFibGUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
2344
2344
 
2345
2345
  /***/ }),
2346
2346
 
@@ -2901,7 +2901,7 @@ module.exports = JSON.parse('{"ar-SA":86,"bg-BG":59,"bn-BD":0,"ca-ES":78,"cs-CZ"
2901
2901
  /***/ ((module) => {
2902
2902
 
2903
2903
  "use strict";
2904
- module.exports = JSON.parse('{"name":"@dwelle/excalidraw","version":"0.3.34","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","license":"MIT","keywords":[],"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.16.0","@babel/plugin-transform-arrow-functions":"7.16.7","@babel/plugin-transform-async-to-generator":"7.16.0","@babel/plugin-transform-runtime":"7.16.4","@babel/plugin-transform-typescript":"7.16.1","@babel/preset-env":"7.16.7","@babel/preset-react":"7.16.7","@babel/preset-typescript":"7.16.7","autoprefixer":"10.4.0","babel-loader":"8.2.3","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"6.5.1","mini-css-extract-plugin":"2.4.5","postcss-loader":"6.2.1","sass-loader":"12.4.0","terser-webpack-plugin":"5.3.0","ts-loader":"9.2.6","typescript":"4.5.3","webpack":"5.65.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1","webpack-dev-server":"4.7.1","webpack-merge":"5.8.0"},"repository":"https://github.com/dwelle/excalidraw","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"rm -rf dist && 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","start":"webpack serve --config webpack.dev-server.config.js "},"dependencies":{"dotenv":"10.0.0"}}');
2904
+ module.exports = JSON.parse('{"name":"@dwelle/excalidraw","version":"0.3.35","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","license":"MIT","keywords":[],"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.16.0","@babel/plugin-transform-arrow-functions":"7.16.7","@babel/plugin-transform-async-to-generator":"7.16.0","@babel/plugin-transform-runtime":"7.16.4","@babel/plugin-transform-typescript":"7.16.1","@babel/preset-env":"7.16.7","@babel/preset-react":"7.16.7","@babel/preset-typescript":"7.16.7","autoprefixer":"10.4.0","babel-loader":"8.2.3","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"6.5.1","mini-css-extract-plugin":"2.4.5","postcss-loader":"6.2.1","sass-loader":"12.4.0","terser-webpack-plugin":"5.3.0","ts-loader":"9.2.6","typescript":"4.5.3","webpack":"5.65.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1","webpack-dev-server":"4.7.1","webpack-merge":"5.8.0"},"repository":"https://github.com/dwelle/excalidraw","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"rm -rf dist && 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","start":"webpack serve --config webpack.dev-server.config.js "},"dependencies":{"dotenv":"10.0.0"}}');
2905
2905
 
2906
2906
  /***/ })
2907
2907