@zsviczian/excalidraw 0.10.0-obsidian-10 → 0.10.0-obsidian-11
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.
|
@@ -1399,7 +1399,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1399
1399
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1400
1400
|
|
|
1401
1401
|
"use strict";
|
|
1402
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionChangeViewBackgroundColor\": () => (/* binding */ actionChangeViewBackgroundColor),\n/* harmony export */ \"actionClearCanvas\": () => (/* binding */ actionClearCanvas),\n/* harmony export */ \"actionZoomIn\": () => (/* binding */ actionZoomIn),\n/* harmony export */ \"actionZoomOut\": () => (/* binding */ actionZoomOut),\n/* harmony export */ \"actionResetZoom\": () => (/* binding */ actionResetZoom),\n/* harmony export */ \"zoomToFitElements\": () => (/* binding */ zoomToFitElements),\n/* harmony export */ \"actionZoomToSelected\": () => (/* binding */ actionZoomToSelected),\n/* harmony export */ \"actionZoomToFit\": () => (/* binding */ actionZoomToFit),\n/* harmony export */ \"actionToggleTheme\": () => (/* binding */ actionToggleTheme)\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_ColorPicker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ColorPicker */ \"../../components/ColorPicker.tsx\");\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _components_ToolButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _components_DarkModeToggle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/DarkModeToggle */ \"../../components/DarkModeToggle.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 _i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_scroll__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../scene/scroll */ \"../../scene/scroll.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n/* harmony import */ var _components_Tooltip__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/Tooltip */ \"../../components/Tooltip.tsx\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _components_ClearCanvas__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../components/ClearCanvas */ \"../../components/ClearCanvas.tsx\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst actionChangeViewBackgroundColor = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"changeViewBackgroundColor\",\r\n perform: (_, appState, value) => {\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), value),\r\n commitToHistory: !!value.viewBackgroundColor,\r\n };\r\n },\r\n PanelComponent: ({ appState, updateData }) => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: { position: \"relative\" } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_1__.ColorPicker, { label: (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"labels.canvasBackground\"), type: \"canvasBackground\", color: appState.viewBackgroundColor, onChange: (color) => updateData({ viewBackgroundColor: color }), isActive: appState.openPopup === \"canvasColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"canvasColorPicker\" : null }), \"data-testid\": \"canvas-background-picker\" }, void 0) }), void 0));\r\n },\r\n});\r\nconst actionClearCanvas = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"clearCanvas\",\r\n perform: (elements, appState, _, app) => {\r\n app.imageCache.clear();\r\n return {\r\n elements: elements.map((element) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.newElementWith)(element, { isDeleted: true })),\r\n appState: Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_16__.getDefaultAppState)()), { files: {}, theme: appState.theme, elementLocked: appState.elementLocked, exportBackground: appState.exportBackground, exportEmbedScene: appState.exportEmbedScene, gridSize: appState.gridSize, showStats: appState.showStats, pasteDialog: appState.pasteDialog }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ updateData }) => (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ClearCanvas__WEBPACK_IMPORTED_MODULE_17__[\"default\"], { onConfirm: updateData }, void 0),\r\n});\r\nconst actionZoomIn = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomIn\",\r\n perform: (_elements, appState) => {\r\n const zoom = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_9__.getNormalizedZoom)(appState.zoom.value + _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP), appState.zoom, { left: appState.offsetLeft, top: appState.offsetTop }, { x: appState.width / 2, y: appState.height / 2 });\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { zoom }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_3__.ToolButton, { type: \"button\", icon: _components_icons__WEBPACK_IMPORTED_MODULE_2__.zoomIn, title: `${(0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomIn\")} — ${(0,_utils__WEBPACK_IMPORTED_MODULE_12__.getShortcutKey)(\"CtrlOrCmd++\")}`, \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomIn\"), onClick: () => {\r\n updateData(null);\r\n }, size: \"small\" }, void 0)),\r\n keyTest: (event) => (event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.EQUAL || event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.NUM_ADD) &&\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD] || event.shiftKey),\r\n});\r\nconst actionZoomOut = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomOut\",\r\n perform: (_elements, appState) => {\r\n const zoom = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_9__.getNormalizedZoom)(appState.zoom.value - _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP), appState.zoom, { left: appState.offsetLeft, top: appState.offsetTop }, { x: appState.width / 2, y: appState.height / 2 });\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { zoom }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_3__.ToolButton, { type: \"button\", icon: _components_icons__WEBPACK_IMPORTED_MODULE_2__.zoomOut, title: `${(0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomOut\")} — ${(0,_utils__WEBPACK_IMPORTED_MODULE_12__.getShortcutKey)(\"CtrlOrCmd+-\")}`, \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomOut\"), onClick: () => {\r\n updateData(null);\r\n }, size: \"small\" }, void 0)),\r\n keyTest: (event) => (event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.MINUS || event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.NUM_SUBTRACT) &&\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD] || event.shiftKey),\r\n});\r\nconst actionResetZoom = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"resetZoom\",\r\n perform: (_elements, appState) => {\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)(1, appState.zoom, { left: appState.offsetLeft, top: appState.offsetTop }, {\r\n x: appState.width / 2,\r\n y: appState.height / 2,\r\n }) }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ updateData, appState }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Tooltip__WEBPACK_IMPORTED_MODULE_14__.Tooltip, Object.assign({ label: (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.resetZoom\") }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_3__.ToolButton, Object.assign({ type: \"button\", className: \"reset-zoom-button\", title: (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.resetZoom\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.resetZoom\"), onClick: () => {\r\n updateData(null);\r\n }, size: \"small\" }, { children: [(appState.zoom.value * 100).toFixed(0), \"%\"] }), void 0) }), void 0)),\r\n keyTest: (event) => (event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.ZERO || event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.NUM_ZERO) &&\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD] || event.shiftKey),\r\n});\r\nconst zoomValueToFitBoundsOnViewport = (bounds, viewportDimensions, maxZoom = 1) => {\r\n const [x1, y1, x2, y2] = bounds;\r\n const commonBoundsWidth = x2 - x1;\r\n const zoomValueForWidth = viewportDimensions.width / commonBoundsWidth;\r\n const commonBoundsHeight = y2 - y1;\r\n const zoomValueForHeight = viewportDimensions.height / commonBoundsHeight;\r\n const smallestZoomValue = Math.min(zoomValueForWidth, zoomValueForHeight);\r\n const zoomAdjustedToSteps = Math.floor(smallestZoomValue / _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP) * _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP;\r\n const clampedZoomValueToFitElements = Math.min(Math.max(zoomAdjustedToSteps, _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP), maxZoom);\r\n return clampedZoomValueToFitElements;\r\n};\r\nconst zoomToFitElements = (elements, appState, zoomToSelection, maxZoom = 1, margin = 0) => {\r\n const nonDeletedElements = (0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_9__.getSelectedElements)(nonDeletedElements, appState);\r\n const commonBounds = zoomToSelection && selectedElements.length > 0\r\n ? (0,_element__WEBPACK_IMPORTED_MODULE_6__.getCommonBounds)(selectedElements)\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_6__.getCommonBounds)(nonDeletedElements);\r\n const zoomValue = zoomValueToFitBoundsOnViewport(commonBounds, {\r\n width: appState.width - appState.width * margin,\r\n height: appState.height - appState.height * margin,\r\n }, maxZoom);\r\n const newZoom = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)(zoomValue, appState.zoom, {\r\n left: appState.offsetLeft,\r\n top: appState.offsetTop,\r\n });\r\n const [x1, y1, x2, y2] = commonBounds;\r\n const centerX = (x1 + x2) / 2;\r\n const centerY = (y1 + y2) / 2;\r\n return {\r\n appState: Object.assign(Object.assign(Object.assign({}, appState), (0,_scene_scroll__WEBPACK_IMPORTED_MODULE_10__.centerScrollOn)({\r\n scenePoint: { x: centerX, y: centerY },\r\n viewportDimensions: {\r\n width: appState.width,\r\n height: appState.height,\r\n },\r\n zoom: newZoom,\r\n })), { zoom: newZoom }),\r\n commitToHistory: false,\r\n };\r\n};\r\nconst actionZoomToSelected = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomToSelection\",\r\n perform: (elements, appState) => zoomToFitElements(elements, appState, true),\r\n keyTest: (event) => event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.TWO &&\r\n event.shiftKey &&\r\n !event.altKey &&\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD],\r\n});\r\nconst actionZoomToFit = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomToFit\",\r\n perform: (elements, appState) => zoomToFitElements(elements, appState, false),\r\n keyTest: (event) => event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.ONE &&\r\n event.shiftKey &&\r\n !event.altKey &&\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD],\r\n});\r\nconst actionToggleTheme = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"toggleTheme\",\r\n perform: (_, appState, value) => {\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { theme: value || (appState.theme === _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.LIGHT ? _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.DARK : _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.LIGHT) }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: { marginInlineStart: \"0.25rem\" } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_DarkModeToggle__WEBPACK_IMPORTED_MODULE_4__.DarkModeToggle, { value: appState.theme, onChange: (theme) => {\r\n updateData(theme);\r\n } }, void 0) }), void 0)),\r\n keyTest: (event) => event.altKey && event.shiftKey && event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.D,\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxLQUFLLEtBQUssbURBQVcsQ0FBQyxDQUFDLENBQUMsa0RBQVUsQ0FBQyxDQUFDLENBQUMsbURBQVcsQ0FBQyxHQUN2RTtZQUNELGVBQWUsRUFBRSxLQUFLO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0lBQ0QsY0FBYyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQzVDLDhFQUFLLEtBQUssRUFBRSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxnQkFDMUMsdURBQUMsc0VBQWMsSUFDYixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFDckIsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixDQUFDLFdBQ0QsWUFDRSxDQUNQO0lBQ0QsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSywwQ0FBTztDQUM3RSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYWN0aW9ucy9hY3Rpb25DYW52YXMudHN4PzVkODQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sb3JQaWNrZXIgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Db2xvclBpY2tlclwiO1xuaW1wb3J0IHsgem9vbUluLCB6b29tT3V0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvaWNvbnNcIjtcbmltcG9ydCB7IFRvb2xCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Ub29sQnV0dG9uXCI7XG5pbXBvcnQgeyBEYXJrTW9kZVRvZ2dsZSB9IGZyb20gXCIuLi9jb21wb25lbnRzL0RhcmtNb2RlVG9nZ2xlXCI7XG5pbXBvcnQgeyBUSEVNRSwgWk9PTV9TVEVQIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uQm91bmRzLCBnZXROb25EZWxldGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgRXhjYWxpZHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyBnZXROb3JtYWxpemVkWm9vbSwgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgY2VudGVyU2Nyb2xsT24gfSBmcm9tIFwiLi4vc2NlbmUvc2Nyb2xsXCI7XG5pbXBvcnQgeyBnZXROZXdab29tIH0gZnJvbSBcIi4uL3NjZW5lL3pvb21cIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBOb3JtYWxpemVkWm9vbVZhbHVlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTaG9ydGN1dEtleSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gXCIuLi9jb21wb25lbnRzL1Rvb2x0aXBcIjtcbmltcG9ydCB7IG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgQ2xlYXJDYW52YXMgZnJvbSBcIi4uL2NvbXBvbmVudHMvQ2xlYXJDYW52YXNcIjtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNoYW5nZVZpZXdCYWNrZ3JvdW5kQ29sb3IgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2hhbmdlVmlld0JhY2tncm91bmRDb2xvclwiLFxuICBwZXJmb3JtOiAoXywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCAuLi52YWx1ZSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiAhIXZhbHVlLnZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IGFwcFN0YXRlLCB1cGRhdGVEYXRhIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17eyBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiIH19PlxuICAgICAgICA8Q29sb3JQaWNrZXJcbiAgICAgICAgICBsYWJlbD17dChcImxhYmVscy5jYW52YXNCYWNrZ3JvdW5kXCIpfVxuICAgICAgICAgIHR5cGU9XCJjYW52YXNCYWNrZ3JvdW5kXCJcbiAgICAgICAgICBjb2xvcj17YXBwU3RhdGUudmlld0JhY2tncm91bmRDb2xvcn1cbiAgICAgICAgICBvbkNoYW5nZT17KGNvbG9yKSA9PiB1cGRhdGVEYXRhKHsgdmlld0JhY2tncm91bmRDb2xvcjogY29sb3IgfSl9XG4gICAgICAgICAgaXNBY3RpdmU9e2FwcFN0YXRlLm9wZW5Qb3B1cCA9PT0gXCJjYW52YXNDb2xvclBpY2tlclwifVxuICAgICAgICAgIHNldEFjdGl2ZT17KGFjdGl2ZSkgPT5cbiAgICAgICAgICAgIHVwZGF0ZURhdGEoeyBvcGVuUG9wdXA6IGFjdGl2ZSA/IFwiY2FudmFzQ29sb3JQaWNrZXJcIiA6IG51bGwgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJjYW52YXMtYmFja2dyb3VuZC1waWNrZXJcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2xlYXJDYW52YXMgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY2xlYXJDYW52YXNcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSwgXywgYXBwKSA9PiB7XG4gICAgYXBwLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT5cbiAgICAgICAgbmV3RWxlbWVudFdpdGgoZWxlbWVudCwgeyBpc0RlbGV0ZWQ6IHRydWUgfSksXG4gICAgICApLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uZ2V0RGVmYXVsdEFwcFN0YXRlKCksXG4gICAgICAgIGZpbGVzOiB7fSxcbiAgICAgICAgdGhlbWU6IGFwcFN0YXRlLnRoZW1lLFxuICAgICAgICBlbGVtZW50TG9ja2VkOiBhcHBTdGF0ZS5lbGVtZW50TG9ja2VkLFxuICAgICAgICBleHBvcnRCYWNrZ3JvdW5kOiBhcHBTdGF0ZS5leHBvcnRCYWNrZ3JvdW5kLFxuICAgICAgICBleHBvcnRFbWJlZFNjZW5lOiBhcHBTdGF0ZS5leHBvcnRFbWJlZFNjZW5lLFxuICAgICAgICBncmlkU2l6ZTogYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgICAgIHNob3dTdGF0czogYXBwU3RhdGUuc2hvd1N0YXRzLFxuICAgICAgICBwYXN0ZURpYWxvZzogYXBwU3RhdGUucGFzdGVEaWFsb2csXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG5cbiAgUGFuZWxDb21wb25lbnQ6ICh7IHVwZGF0ZURhdGEgfSkgPT4gPENsZWFyQ2FudmFzIG9uQ29uZmlybT17dXBkYXRlRGF0YX0gLz4sXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvblpvb21JbiA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJ6b29tSW5cIixcbiAgcGVyZm9ybTogKF9lbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCB6b29tID0gZ2V0TmV3Wm9vbShcbiAgICAgIGdldE5vcm1hbGl6ZWRab29tKGFwcFN0YXRlLnpvb20udmFsdWUgKyBaT09NX1NURVApLFxuICAgICAgYXBwU3RhdGUuem9vbSxcbiAgICAgIHsgbGVmdDogYXBwU3RhdGUub2Zmc2V0TGVmdCwgdG9wOiBhcHBTdGF0ZS5vZmZzZXRUb3AgfSxcbiAgICAgIHsgeDogYXBwU3RhdGUud2lkdGggLyAyLCB5OiBhcHBTdGF0ZS5oZWlnaHQgLyAyIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIHpvb20sXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPFRvb2xCdXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgaWNvbj17em9vbUlufVxuICAgICAgdGl0bGU9e2Ake3QoXCJidXR0b25zLnpvb21JblwiKX0g4oCUICR7Z2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrK1wiKX1gfVxuICAgICAgYXJpYS1sYWJlbD17dChcImJ1dHRvbnMuem9vbUluXCIpfVxuICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICB1cGRhdGVEYXRhKG51bGwpO1xuICAgICAgfX1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgLz5cbiAgKSxcbiAga2V5VGVzdDogKGV2ZW50KSA9PlxuICAgIChldmVudC5jb2RlID09PSBDT0RFUy5FUVVBTCB8fCBldmVudC5jb2RlID09PSBDT0RFUy5OVU1fQUREKSAmJlxuICAgIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSB8fCBldmVudC5zaGlmdEtleSksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvblpvb21PdXQgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiem9vbU91dFwiLFxuICBwZXJmb3JtOiAoX2VsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHpvb20gPSBnZXROZXdab29tKFxuICAgICAgZ2V0Tm9ybWFsaXplZFpvb20oYXBwU3RhdGUuem9vbS52YWx1ZSAtIFpPT01fU1RFUCksXG4gICAgICBhcHBTdGF0ZS56b29tLFxuICAgICAgeyBsZWZ0OiBhcHBTdGF0ZS5vZmZzZXRMZWZ0LCB0b3A6IGFwcFN0YXRlLm9mZnNldFRvcCB9LFxuICAgICAgeyB4OiBhcHBTdGF0ZS53aWR0aCAvIDIsIHk6IGFwcFN0YXRlLmhlaWdodCAvIDIgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICB6b29tLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IHVwZGF0ZURhdGEgfSkgPT4gKFxuICAgIDxUb29sQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGljb249e3pvb21PdXR9XG4gICAgICB0aXRsZT17YCR7dChcImJ1dHRvbnMuem9vbU91dFwiKX0g4oCUICR7Z2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrLVwiKX1gfVxuICAgICAgYXJpYS1sYWJlbD17dChcImJ1dHRvbnMuem9vbU91dFwiKX1cbiAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgdXBkYXRlRGF0YShudWxsKTtcbiAgICAgIH19XG4gICAgICBzaXplPVwic21hbGxcIlxuICAgIC8+XG4gICksXG4gIGtleVRlc3Q6IChldmVudCkgPT5cbiAgICAoZXZlbnQuY29kZSA9PT0gQ09ERVMuTUlOVVMgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuTlVNX1NVQlRSQUNUKSAmJlxuICAgIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSB8fCBldmVudC5zaGlmdEtleSksXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvblJlc2V0Wm9vbSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJyZXNldFpvb21cIixcbiAgcGVyZm9ybTogKF9lbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIHpvb206IGdldE5ld1pvb20oXG4gICAgICAgICAgMSBhcyBOb3JtYWxpemVkWm9vbVZhbHVlLFxuICAgICAgICAgIGFwcFN0YXRlLnpvb20sXG4gICAgICAgICAgeyBsZWZ0OiBhcHBTdGF0ZS5vZmZzZXRMZWZ0LCB0b3A6IGFwcFN0YXRlLm9mZnNldFRvcCB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHg6IGFwcFN0YXRlLndpZHRoIC8gMixcbiAgICAgICAgICAgIHk6IGFwcFN0YXRlLmhlaWdodCAvIDIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyB1cGRhdGVEYXRhLCBhcHBTdGF0ZSB9KSA9PiAoXG4gICAgPFRvb2x0aXAgbGFiZWw9e3QoXCJidXR0b25zLnJlc2V0Wm9vbVwiKX0+XG4gICAgICA8VG9vbEJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3NOYW1lPVwicmVzZXQtem9vbS1idXR0b25cIlxuICAgICAgICB0aXRsZT17dChcImJ1dHRvbnMucmVzZXRab29tXCIpfVxuICAgICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5yZXNldFpvb21cIil9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICB1cGRhdGVEYXRhKG51bGwpO1xuICAgICAgICB9fVxuICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgPlxuICAgICAgICB7KGFwcFN0YXRlLnpvb20udmFsdWUgKiAxMDApLnRvRml4ZWQoMCl9JVxuICAgICAgPC9Ub29sQnV0dG9uPlxuICAgIDwvVG9vbHRpcD5cbiAgKSxcbiAga2V5VGVzdDogKGV2ZW50KSA9PlxuICAgIChldmVudC5jb2RlID09PSBDT0RFUy5aRVJPIHx8IGV2ZW50LmNvZGUgPT09IENPREVTLk5VTV9aRVJPKSAmJlxuICAgIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSB8fCBldmVudC5zaGlmdEtleSksXG59KTtcblxuY29uc3Qgem9vbVZhbHVlVG9GaXRCb3VuZHNPblZpZXdwb3J0ID0gKFxuICBib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICB2aWV3cG9ydERpbWVuc2lvbnM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgbWF4Wm9vbTogbnVtYmVyID0gMSxcbikgPT4ge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gYm91bmRzO1xuICBjb25zdCBjb21tb25Cb3VuZHNXaWR0aCA9IHgyIC0geDE7XG4gIGNvbnN0IHpvb21WYWx1ZUZvcldpZHRoID0gdmlld3BvcnREaW1lbnNpb25zLndpZHRoIC8gY29tbW9uQm91bmRzV2lkdGg7XG4gIGNvbnN0IGNvbW1vbkJvdW5kc0hlaWdodCA9IHkyIC0geTE7XG4gIGNvbnN0IHpvb21WYWx1ZUZvckhlaWdodCA9IHZpZXdwb3J0RGltZW5zaW9ucy5oZWlnaHQgLyBjb21tb25Cb3VuZHNIZWlnaHQ7XG4gIGNvbnN0IHNtYWxsZXN0Wm9vbVZhbHVlID0gTWF0aC5taW4oem9vbVZhbHVlRm9yV2lkdGgsIHpvb21WYWx1ZUZvckhlaWdodCk7XG4gIGNvbnN0IHpvb21BZGp1c3RlZFRvU3RlcHMgPVxuICAgIE1hdGguZmxvb3Ioc21hbGxlc3Rab29tVmFsdWUgLyBaT09NX1NURVApICogWk9PTV9TVEVQO1xuICBjb25zdCBjbGFtcGVkWm9vbVZhbHVlVG9GaXRFbGVtZW50cyA9IE1hdGgubWluKFxuICAgIE1hdGgubWF4KHpvb21BZGp1c3RlZFRvU3RlcHMsIFpPT01fU1RFUCksXG4gICAgbWF4Wm9vbSxcbiAgKTtcbiAgcmV0dXJuIGNsYW1wZWRab29tVmFsdWVUb0ZpdEVsZW1lbnRzIGFzIE5vcm1hbGl6ZWRab29tVmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3Qgem9vbVRvRml0RWxlbWVudHMgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogUmVhZG9ubHk8QXBwU3RhdGU+LFxuICB6b29tVG9TZWxlY3Rpb246IGJvb2xlYW4sXG4gIG1heFpvb206IG51bWJlciA9IDEsXG4gIG1hcmdpbjogbnVtYmVyID0gMCxcbikgPT4ge1xuICBjb25zdCBub25EZWxldGVkRWxlbWVudHMgPSBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpO1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhub25EZWxldGVkRWxlbWVudHMsIGFwcFN0YXRlKTtcblxuICBjb25zdCBjb21tb25Cb3VuZHMgPVxuICAgIHpvb21Ub1NlbGVjdGlvbiAmJiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgID8gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpXG4gICAgICA6IGdldENvbW1vbkJvdW5kcyhub25EZWxldGVkRWxlbWVudHMpO1xuXG4gIGNvbnN0IHpvb21WYWx1ZSA9IHpvb21WYWx1ZVRvRml0Qm91bmRzT25WaWV3cG9ydChcbiAgICBjb21tb25Cb3VuZHMsXG4gICAge1xuICAgICAgd2lkdGg6IGFwcFN0YXRlLndpZHRoIC0gYXBwU3RhdGUud2lkdGggKiBtYXJnaW4sXG4gICAgICBoZWlnaHQ6IGFwcFN0YXRlLmhlaWdodCAtIGFwcFN0YXRlLmhlaWdodCAqIG1hcmdpbixcbiAgICB9LFxuICAgIG1heFpvb20sXG4gICk7XG4gIGNvbnN0IG5ld1pvb20gPSBnZXROZXdab29tKHpvb21WYWx1ZSwgYXBwU3RhdGUuem9vbSwge1xuICAgIGxlZnQ6IGFwcFN0YXRlLm9mZnNldExlZnQsXG4gICAgdG9wOiBhcHBTdGF0ZS5vZmZzZXRUb3AsXG4gIH0pO1xuXG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBjb21tb25Cb3VuZHM7XG4gIGNvbnN0IGNlbnRlclggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBjZW50ZXJZID0gKHkxICsgeTIpIC8gMjtcbiAgcmV0dXJuIHtcbiAgICBhcHBTdGF0ZToge1xuICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAuLi5jZW50ZXJTY3JvbGxPbih7XG4gICAgICAgIHNjZW5lUG9pbnQ6IHsgeDogY2VudGVyWCwgeTogY2VudGVyWSB9LFxuICAgICAgICB2aWV3cG9ydERpbWVuc2lvbnM6IHtcbiAgICAgICAgICB3aWR0aDogYXBwU3RhdGUud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBhcHBTdGF0ZS5oZWlnaHQsXG4gICAgICAgIH0sXG4gICAgICAgIHpvb206IG5ld1pvb20sXG4gICAgICB9KSxcbiAgICAgIHpvb206IG5ld1pvb20sXG4gICAgfSxcbiAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvblpvb21Ub1NlbGVjdGVkID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcInpvb21Ub1NlbGVjdGlvblwiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB6b29tVG9GaXRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUsIHRydWUpLFxuICBrZXlUZXN0OiAoZXZlbnQpID0+XG4gICAgZXZlbnQuY29kZSA9PT0gQ09ERVMuVFdPICYmXG4gICAgZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25ab29tVG9GaXQgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiem9vbVRvRml0XCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHpvb21Ub0ZpdEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmFsc2UpLFxuICBrZXlUZXN0OiAoZXZlbnQpID0+XG4gICAgZXZlbnQuY29kZSA9PT0gQ09ERVMuT05FICYmXG4gICAgZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdLFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25Ub2dnbGVUaGVtZSA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJ0b2dnbGVUaGVtZVwiLFxuICBwZXJmb3JtOiAoXywgYXBwU3RhdGUsIHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICB0aGVtZTpcbiAgICAgICAgICB2YWx1ZSB8fCAoYXBwU3RhdGUudGhlbWUgPT09IFRIRU1FLkxJR0hUID8gVEhFTUUuREFSSyA6IFRIRU1FLkxJR0hUKSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGRpdiBzdHlsZT17eyBtYXJnaW5JbmxpbmVTdGFydDogXCIwLjI1cmVtXCIgfX0+XG4gICAgICA8RGFya01vZGVUb2dnbGVcbiAgICAgICAgdmFsdWU9e2FwcFN0YXRlLnRoZW1lfVxuICAgICAgICBvbkNoYW5nZT17KHRoZW1lKSA9PiB7XG4gICAgICAgICAgdXBkYXRlRGF0YSh0aGVtZSk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApLFxuICBrZXlUZXN0OiAoZXZlbnQpID0+IGV2ZW50LmFsdEtleSAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5jb2RlID09PSBDT0RFUy5ELFxufSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../actions/actionCanvas.tsx\n");
|
|
1402
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionChangeViewBackgroundColor\": () => (/* binding */ actionChangeViewBackgroundColor),\n/* harmony export */ \"actionClearCanvas\": () => (/* binding */ actionClearCanvas),\n/* harmony export */ \"actionZoomIn\": () => (/* binding */ actionZoomIn),\n/* harmony export */ \"actionZoomOut\": () => (/* binding */ actionZoomOut),\n/* harmony export */ \"actionResetZoom\": () => (/* binding */ actionResetZoom),\n/* harmony export */ \"zoomToFitElements\": () => (/* binding */ zoomToFitElements),\n/* harmony export */ \"actionZoomToSelected\": () => (/* binding */ actionZoomToSelected),\n/* harmony export */ \"actionZoomToFit\": () => (/* binding */ actionZoomToFit),\n/* harmony export */ \"actionToggleTheme\": () => (/* binding */ actionToggleTheme)\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_ColorPicker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ColorPicker */ \"../../components/ColorPicker.tsx\");\n/* harmony import */ var _components_icons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _components_ToolButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _components_DarkModeToggle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/DarkModeToggle */ \"../../components/DarkModeToggle.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 _i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_scroll__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../scene/scroll */ \"../../scene/scroll.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n/* harmony import */ var _components_Tooltip__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/Tooltip */ \"../../components/Tooltip.tsx\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _components_ClearCanvas__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../components/ClearCanvas */ \"../../components/ClearCanvas.tsx\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst actionChangeViewBackgroundColor = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"changeViewBackgroundColor\",\r\n perform: (_, appState, value) => {\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), value),\r\n commitToHistory: !!value.viewBackgroundColor,\r\n };\r\n },\r\n PanelComponent: ({ appState, updateData }) => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: { position: \"relative\" } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ColorPicker__WEBPACK_IMPORTED_MODULE_1__.ColorPicker, { label: (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"labels.canvasBackground\"), type: \"canvasBackground\", color: appState.viewBackgroundColor, onChange: (color) => updateData({ viewBackgroundColor: color }), isActive: appState.openPopup === \"canvasColorPicker\", setActive: (active) => updateData({ openPopup: active ? \"canvasColorPicker\" : null }), \"data-testid\": \"canvas-background-picker\" }, void 0) }), void 0));\r\n },\r\n});\r\nconst actionClearCanvas = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"clearCanvas\",\r\n perform: (elements, appState, _, app) => {\r\n app.imageCache.clear();\r\n return {\r\n elements: elements.map((element) => (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.newElementWith)(element, { isDeleted: true })),\r\n appState: Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_16__.getDefaultAppState)()), { files: {}, theme: appState.theme, elementLocked: appState.elementLocked, exportBackground: appState.exportBackground, exportEmbedScene: appState.exportEmbedScene, gridSize: appState.gridSize, showStats: appState.showStats, pasteDialog: appState.pasteDialog }),\r\n commitToHistory: true,\r\n };\r\n },\r\n PanelComponent: ({ updateData }) => (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ClearCanvas__WEBPACK_IMPORTED_MODULE_17__[\"default\"], { onConfirm: updateData }, void 0),\r\n});\r\nconst actionZoomIn = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomIn\",\r\n perform: (_elements, appState) => {\r\n const zoom = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_9__.getNormalizedZoom)(appState.zoom.value + _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP), appState.zoom, { left: appState.offsetLeft, top: appState.offsetTop }, { x: appState.width / 2, y: appState.height / 2 });\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { zoom }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_3__.ToolButton, { type: \"button\", icon: _components_icons__WEBPACK_IMPORTED_MODULE_2__.zoomIn, title: `${(0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomIn\")} — ${(0,_utils__WEBPACK_IMPORTED_MODULE_12__.getShortcutKey)(\"CtrlOrCmd++\")}`, \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomIn\"), onClick: () => {\r\n updateData(null);\r\n }, size: \"small\" }, void 0)),\r\n keyTest: (event) => (event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.EQUAL || event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.NUM_ADD) &&\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD] || event.shiftKey),\r\n});\r\nconst actionZoomOut = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomOut\",\r\n perform: (_elements, appState) => {\r\n const zoom = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_9__.getNormalizedZoom)(appState.zoom.value - _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP), appState.zoom, { left: appState.offsetLeft, top: appState.offsetTop }, { x: appState.width / 2, y: appState.height / 2 });\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { zoom }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_3__.ToolButton, { type: \"button\", icon: _components_icons__WEBPACK_IMPORTED_MODULE_2__.zoomOut, title: `${(0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomOut\")} — ${(0,_utils__WEBPACK_IMPORTED_MODULE_12__.getShortcutKey)(\"CtrlOrCmd+-\")}`, \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.zoomOut\"), onClick: () => {\r\n updateData(null);\r\n }, size: \"small\" }, void 0)),\r\n keyTest: (event) => (event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.MINUS || event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.NUM_SUBTRACT) &&\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD] || event.shiftKey),\r\n});\r\nconst actionResetZoom = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"resetZoom\",\r\n perform: (_elements, appState) => {\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)(1, appState.zoom, { left: appState.offsetLeft, top: appState.offsetTop }, {\r\n x: appState.width / 2,\r\n y: appState.height / 2,\r\n }) }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ updateData, appState }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_Tooltip__WEBPACK_IMPORTED_MODULE_14__.Tooltip, Object.assign({ label: (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.resetZoom\") }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ToolButton__WEBPACK_IMPORTED_MODULE_3__.ToolButton, Object.assign({ type: \"button\", className: \"reset-zoom-button\", title: (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.resetZoom\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_7__.t)(\"buttons.resetZoom\"), onClick: () => {\r\n updateData(null);\r\n }, size: \"small\" }, { children: [(appState.zoom.value * 100).toFixed(0), \"%\"] }), void 0) }), void 0)),\r\n keyTest: (event) => (event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.ZERO || event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.NUM_ZERO) &&\r\n (event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD] || event.shiftKey),\r\n});\r\nconst zoomValueToFitBoundsOnViewport = (bounds, viewportDimensions, maxZoom = 1) => {\r\n const [x1, y1, x2, y2] = bounds;\r\n const commonBoundsWidth = x2 - x1;\r\n const zoomValueForWidth = viewportDimensions.width / commonBoundsWidth;\r\n const commonBoundsHeight = y2 - y1;\r\n const zoomValueForHeight = viewportDimensions.height / commonBoundsHeight;\r\n const smallestZoomValue = Math.min(zoomValueForWidth, zoomValueForHeight);\r\n const zoomAdjustedToSteps = Math.floor(smallestZoomValue / _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP) * _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP;\r\n const clampedZoomValueToFitElements = Math.min(Math.max(zoomAdjustedToSteps, _constants__WEBPACK_IMPORTED_MODULE_5__.ZOOM_STEP), maxZoom);\r\n return clampedZoomValueToFitElements;\r\n};\r\nconst zoomToFitElements = (elements, appState, zoomToSelection, maxZoom = 1, margin = 0) => {\r\n const nonDeletedElements = (0,_element__WEBPACK_IMPORTED_MODULE_6__.getNonDeletedElements)(elements);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_9__.getSelectedElements)(nonDeletedElements, appState);\r\n const commonBounds = zoomToSelection && selectedElements.length > 0\r\n ? (0,_element__WEBPACK_IMPORTED_MODULE_6__.getCommonBounds)(selectedElements)\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_6__.getCommonBounds)(nonDeletedElements);\r\n const zoomValue = zoomValueToFitBoundsOnViewport(commonBounds, {\r\n width: appState.width - appState.width * margin,\r\n height: appState.height - appState.height * margin,\r\n }, maxZoom);\r\n const newZoom = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_11__.getNewZoom)(zoomValue, appState.zoom, {\r\n left: appState.offsetLeft,\r\n top: appState.offsetTop,\r\n });\r\n const [x1, y1, x2, y2] = commonBounds;\r\n const centerX = (x1 + x2) / 2;\r\n const centerY = (y1 + y2) / 2;\r\n return {\r\n appState: Object.assign(Object.assign(Object.assign({}, appState), (0,_scene_scroll__WEBPACK_IMPORTED_MODULE_10__.centerScrollOn)({\r\n scenePoint: { x: centerX, y: centerY },\r\n viewportDimensions: {\r\n width: appState.width,\r\n height: appState.height,\r\n },\r\n zoom: newZoom,\r\n })), { zoom: newZoom }),\r\n commitToHistory: false,\r\n };\r\n};\r\nconst actionZoomToSelected = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomToSelection\",\r\n perform: (elements, appState) => zoomToFitElements(elements, appState, true),\r\n keyTest: (event) => event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.TWO &&\r\n event.shiftKey &&\r\n !event.altKey &&\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD],\r\n});\r\nconst actionZoomToFit = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"zoomToFit\",\r\n perform: (elements, appState) => zoomToFitElements(elements, appState, false),\r\n keyTest: (event) => event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.ONE &&\r\n event.shiftKey &&\r\n !event.altKey &&\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_8__.KEYS.CTRL_OR_CMD],\r\n});\r\nconst actionToggleTheme = (0,_register__WEBPACK_IMPORTED_MODULE_13__.register)({\r\n name: \"toggleTheme\",\r\n perform: (_, appState, value, app) => {\r\n if (app.props.onThemeChange) {\r\n app.props.onThemeChange(value || (appState.theme === _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.LIGHT ? _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.DARK : _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.LIGHT));\r\n }\r\n return {\r\n appState: Object.assign(Object.assign({}, appState), { theme: value || (appState.theme === _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.LIGHT ? _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.DARK : _constants__WEBPACK_IMPORTED_MODULE_5__.THEME.LIGHT) }),\r\n commitToHistory: false,\r\n };\r\n },\r\n PanelComponent: ({ appState, updateData }) => ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: { marginInlineStart: \"0.25rem\" } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_DarkModeToggle__WEBPACK_IMPORTED_MODULE_4__.DarkModeToggle, { value: appState.theme, onChange: (theme) => {\r\n updateData(theme);\r\n } }, void 0) }), void 0)),\r\n keyTest: (event) => event.altKey && event.shiftKey && event.code === _keys__WEBPACK_IMPORTED_MODULE_8__.CODES.D,\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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S0FBSyxDQUFDLGFBQWEsQ0FDckIsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxtREFBVyxDQUFDLENBQUMsQ0FBQyxrREFBVSxDQUFDLENBQUMsQ0FBQyxtREFBVyxDQUFDLENBQ3JFLENBQUM7U0FDSDtRQUNELE9BQU87WUFDTCxRQUFRLGtDQUNILFFBQVEsS0FDWCxLQUFLLEVBQ0gsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxtREFBVyxDQUFDLENBQUMsQ0FBQyxrREFBVSxDQUFDLENBQUMsQ0FBQyxtREFBVyxDQUFDLEdBQ3ZFO1lBQ0QsZUFBZSxFQUFFLEtBQUs7U0FDdkIsQ0FBQztJQUNKLENBQUM7SUFDRCxjQUFjLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FDNUMsOEVBQUssS0FBSyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGdCQUMxQyx1REFBQyxzRUFBYyxJQUNiLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUNyQixRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLENBQUMsV0FDRCxZQUNFLENBQ1A7SUFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLDBDQUFPO0NBQzdFLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL2FjdGlvbkNhbnZhcy50c3g/NWQ4NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2xvclBpY2tlciB9IGZyb20gXCIuLi9jb21wb25lbnRzL0NvbG9yUGlja2VyXCI7XG5pbXBvcnQgeyB6b29tSW4sIHpvb21PdXQgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9pY29uc1wiO1xuaW1wb3J0IHsgVG9vbEJ1dHRvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL1Rvb2xCdXR0b25cIjtcbmltcG9ydCB7IERhcmtNb2RlVG9nZ2xlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvRGFya01vZGVUb2dnbGVcIjtcbmltcG9ydCB7IFRIRU1FLCBaT09NX1NURVAgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMsIGdldE5vbkRlbGV0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7IENPREVTLCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGdldE5vcm1hbGl6ZWRab29tLCBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgeyBjZW50ZXJTY3JvbGxPbiB9IGZyb20gXCIuLi9zY2VuZS9zY3JvbGxcIjtcbmltcG9ydCB7IGdldE5ld1pvb20gfSBmcm9tIFwiLi4vc2NlbmUvem9vbVwiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIE5vcm1hbGl6ZWRab29tVmFsdWUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFNob3J0Y3V0S2V5IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gXCIuL3JlZ2lzdGVyXCI7XG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvVG9vbHRpcFwiO1xuaW1wb3J0IHsgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCBDbGVhckNhbnZhcyBmcm9tIFwiLi4vY29tcG9uZW50cy9DbGVhckNhbnZhc1wiO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ2hhbmdlVmlld0JhY2tncm91bmRDb2xvciA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjaGFuZ2VWaWV3QmFja2dyb3VuZENvbG9yXCIsXG4gIHBlcmZvcm06IChfLCBhcHBTdGF0ZSwgdmFsdWUpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIC4uLnZhbHVlIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6ICEhdmFsdWUudmlld0JhY2tncm91bmRDb2xvcixcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgYXBwU3RhdGUsIHVwZGF0ZURhdGEgfSkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXt7IHBvc2l0aW9uOiBcInJlbGF0aXZlXCIgfX0+XG4gICAgICAgIDxDb2xvclBpY2tlclxuICAgICAgICAgIGxhYmVsPXt0KFwibGFiZWxzLmNhbnZhc0JhY2tncm91bmRcIil9XG4gICAgICAgICAgdHlwZT1cImNhbnZhc0JhY2tncm91bmRcIlxuICAgICAgICAgIGNvbG9yPXthcHBTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yfVxuICAgICAgICAgIG9uQ2hhbmdlPXsoY29sb3IpID0+IHVwZGF0ZURhdGEoeyB2aWV3QmFja2dyb3VuZENvbG9yOiBjb2xvciB9KX1cbiAgICAgICAgICBpc0FjdGl2ZT17YXBwU3RhdGUub3BlblBvcHVwID09PSBcImNhbnZhc0NvbG9yUGlja2VyXCJ9XG4gICAgICAgICAgc2V0QWN0aXZlPXsoYWN0aXZlKSA9PlxuICAgICAgICAgICAgdXBkYXRlRGF0YSh7IG9wZW5Qb3B1cDogYWN0aXZlID8gXCJjYW52YXNDb2xvclBpY2tlclwiIDogbnVsbCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImNhbnZhcy1iYWNrZ3JvdW5kLXBpY2tlclwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25DbGVhckNhbnZhcyA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJjbGVhckNhbnZhc1wiLFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlLCBfLCBhcHApID0+IHtcbiAgICBhcHAuaW1hZ2VDYWNoZS5jbGVhcigpO1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogZWxlbWVudHMubWFwKChlbGVtZW50KSA9PlxuICAgICAgICBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7IGlzRGVsZXRlZDogdHJ1ZSB9KSxcbiAgICAgICksXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5nZXREZWZhdWx0QXBwU3RhdGUoKSxcbiAgICAgICAgZmlsZXM6IHt9LFxuICAgICAgICB0aGVtZTogYXBwU3RhdGUudGhlbWUsXG4gICAgICAgIGVsZW1lbnRMb2NrZWQ6IGFwcFN0YXRlLmVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGV4cG9ydEJhY2tncm91bmQ6IGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQsXG4gICAgICAgIGV4cG9ydEVtYmVkU2NlbmU6IGFwcFN0YXRlLmV4cG9ydEVtYmVkU2NlbmUsXG4gICAgICAgIGdyaWRTaXplOiBhcHBTdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgc2hvd1N0YXRzOiBhcHBTdGF0ZS5zaG93U3RhdHMsXG4gICAgICAgIHBhc3RlRGlhbG9nOiBhcHBTdGF0ZS5wYXN0ZURpYWxvZyxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICBQYW5lbENvbXBvbmVudDogKHsgdXBkYXRlRGF0YSB9KSA9PiA8Q2xlYXJDYW52YXMgb25Db25maXJtPXt1cGRhdGVEYXRhfSAvPixcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uWm9vbUluID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcInpvb21JblwiLFxuICBwZXJmb3JtOiAoX2VsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHpvb20gPSBnZXROZXdab29tKFxuICAgICAgZ2V0Tm9ybWFsaXplZFpvb20oYXBwU3RhdGUuem9vbS52YWx1ZSArIFpPT01fU1RFUCksXG4gICAgICBhcHBTdGF0ZS56b29tLFxuICAgICAgeyBsZWZ0OiBhcHBTdGF0ZS5vZmZzZXRMZWZ0LCB0b3A6IGFwcFN0YXRlLm9mZnNldFRvcCB9LFxuICAgICAgeyB4OiBhcHBTdGF0ZS53aWR0aCAvIDIsIHk6IGFwcFN0YXRlLmhlaWdodCAvIDIgfSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgem9vbSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyB1cGRhdGVEYXRhIH0pID0+IChcbiAgICA8VG9vbEJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBpY29uPXt6b29tSW59XG4gICAgICB0aXRsZT17YCR7dChcImJ1dHRvbnMuem9vbUluXCIpfSDigJQgJHtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCsrXCIpfWB9XG4gICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy56b29tSW5cIil9XG4gICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgIHVwZGF0ZURhdGEobnVsbCk7XG4gICAgICB9fVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAvPlxuICApLFxuICBrZXlUZXN0OiAoZXZlbnQpID0+XG4gICAgKGV2ZW50LmNvZGUgPT09IENPREVTLkVRVUFMIHx8IGV2ZW50LmNvZGUgPT09IENPREVTLk5VTV9BREQpICYmXG4gICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdIHx8IGV2ZW50LnNoaWZ0S2V5KSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uWm9vbU91dCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJ6b29tT3V0XCIsXG4gIHBlcmZvcm06IChfZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgem9vbSA9IGdldE5ld1pvb20oXG4gICAgICBnZXROb3JtYWxpemVkWm9vbShhcHBTdGF0ZS56b29tLnZhbHVlIC0gWk9PTV9TVEVQKSxcbiAgICAgIGFwcFN0YXRlLnpvb20sXG4gICAgICB7IGxlZnQ6IGFwcFN0YXRlLm9mZnNldExlZnQsIHRvcDogYXBwU3RhdGUub2Zmc2V0VG9wIH0sXG4gICAgICB7IHg6IGFwcFN0YXRlLndpZHRoIC8gMiwgeTogYXBwU3RhdGUuaGVpZ2h0IC8gMiB9LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIHpvb20sXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiBmYWxzZSxcbiAgICB9O1xuICB9LFxuICBQYW5lbENvbXBvbmVudDogKHsgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPFRvb2xCdXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgaWNvbj17em9vbU91dH1cbiAgICAgIHRpdGxlPXtgJHt0KFwiYnV0dG9ucy56b29tT3V0XCIpfSDigJQgJHtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCstXCIpfWB9XG4gICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy56b29tT3V0XCIpfVxuICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICB1cGRhdGVEYXRhKG51bGwpO1xuICAgICAgfX1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgLz5cbiAgKSxcbiAga2V5VGVzdDogKGV2ZW50KSA9PlxuICAgIChldmVudC5jb2RlID09PSBDT0RFUy5NSU5VUyB8fCBldmVudC5jb2RlID09PSBDT0RFUy5OVU1fU1VCVFJBQ1QpICYmXG4gICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdIHx8IGV2ZW50LnNoaWZ0S2V5KSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uUmVzZXRab29tID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcInJlc2V0Wm9vbVwiLFxuICBwZXJmb3JtOiAoX2VsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgem9vbTogZ2V0TmV3Wm9vbShcbiAgICAgICAgICAxIGFzIE5vcm1hbGl6ZWRab29tVmFsdWUsXG4gICAgICAgICAgYXBwU3RhdGUuem9vbSxcbiAgICAgICAgICB7IGxlZnQ6IGFwcFN0YXRlLm9mZnNldExlZnQsIHRvcDogYXBwU3RhdGUub2Zmc2V0VG9wIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgeDogYXBwU3RhdGUud2lkdGggLyAyLFxuICAgICAgICAgICAgeTogYXBwU3RhdGUuaGVpZ2h0IC8gMixcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgfTtcbiAgfSxcbiAgUGFuZWxDb21wb25lbnQ6ICh7IHVwZGF0ZURhdGEsIGFwcFN0YXRlIH0pID0+IChcbiAgICA8VG9vbHRpcCBsYWJlbD17dChcImJ1dHRvbnMucmVzZXRab29tXCIpfT5cbiAgICAgIDxUb29sQnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzc05hbWU9XCJyZXNldC16b29tLWJ1dHRvblwiXG4gICAgICAgIHRpdGxlPXt0KFwiYnV0dG9ucy5yZXNldFpvb21cIil9XG4gICAgICAgIGFyaWEtbGFiZWw9e3QoXCJidXR0b25zLnJlc2V0Wm9vbVwiKX1cbiAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZURhdGEobnVsbCk7XG4gICAgICAgIH19XG4gICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICA+XG4gICAgICAgIHsoYXBwU3RhdGUuem9vbS52YWx1ZSAqIDEwMCkudG9GaXhlZCgwKX0lXG4gICAgICA8L1Rvb2xCdXR0b24+XG4gICAgPC9Ub29sdGlwPlxuICApLFxuICBrZXlUZXN0OiAoZXZlbnQpID0+XG4gICAgKGV2ZW50LmNvZGUgPT09IENPREVTLlpFUk8gfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuTlVNX1pFUk8pICYmXG4gICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdIHx8IGV2ZW50LnNoaWZ0S2V5KSxcbn0pO1xuXG5jb25zdCB6b29tVmFsdWVUb0ZpdEJvdW5kc09uVmlld3BvcnQgPSAoXG4gIGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gIHZpZXdwb3J0RGltZW5zaW9uczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuICBtYXhab29tOiBudW1iZXIgPSAxLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBib3VuZHM7XG4gIGNvbnN0IGNvbW1vbkJvdW5kc1dpZHRoID0geDIgLSB4MTtcbiAgY29uc3Qgem9vbVZhbHVlRm9yV2lkdGggPSB2aWV3cG9ydERpbWVuc2lvbnMud2lkdGggLyBjb21tb25Cb3VuZHNXaWR0aDtcbiAgY29uc3QgY29tbW9uQm91bmRzSGVpZ2h0ID0geTIgLSB5MTtcbiAgY29uc3Qgem9vbVZhbHVlRm9ySGVpZ2h0ID0gdmlld3BvcnREaW1lbnNpb25zLmhlaWdodCAvIGNvbW1vbkJvdW5kc0hlaWdodDtcbiAgY29uc3Qgc21hbGxlc3Rab29tVmFsdWUgPSBNYXRoLm1pbih6b29tVmFsdWVGb3JXaWR0aCwgem9vbVZhbHVlRm9ySGVpZ2h0KTtcbiAgY29uc3Qgem9vbUFkanVzdGVkVG9TdGVwcyA9XG4gICAgTWF0aC5mbG9vcihzbWFsbGVzdFpvb21WYWx1ZSAvIFpPT01fU1RFUCkgKiBaT09NX1NURVA7XG4gIGNvbnN0IGNsYW1wZWRab29tVmFsdWVUb0ZpdEVsZW1lbnRzID0gTWF0aC5taW4oXG4gICAgTWF0aC5tYXgoem9vbUFkanVzdGVkVG9TdGVwcywgWk9PTV9TVEVQKSxcbiAgICBtYXhab29tLFxuICApO1xuICByZXR1cm4gY2xhbXBlZFpvb21WYWx1ZVRvRml0RWxlbWVudHMgYXMgTm9ybWFsaXplZFpvb21WYWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCB6b29tVG9GaXRFbGVtZW50cyA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBSZWFkb25seTxBcHBTdGF0ZT4sXG4gIHpvb21Ub1NlbGVjdGlvbjogYm9vbGVhbixcbiAgbWF4Wm9vbTogbnVtYmVyID0gMSxcbiAgbWFyZ2luOiBudW1iZXIgPSAwLFxuKSA9PiB7XG4gIGNvbnN0IG5vbkRlbGV0ZWRFbGVtZW50cyA9IGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyk7XG4gIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKG5vbkRlbGV0ZWRFbGVtZW50cywgYXBwU3RhdGUpO1xuXG4gIGNvbnN0IGNvbW1vbkJvdW5kcyA9XG4gICAgem9vbVRvU2VsZWN0aW9uICYmIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgPyBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cylcbiAgICAgIDogZ2V0Q29tbW9uQm91bmRzKG5vbkRlbGV0ZWRFbGVtZW50cyk7XG5cbiAgY29uc3Qgem9vbVZhbHVlID0gem9vbVZhbHVlVG9GaXRCb3VuZHNPblZpZXdwb3J0KFxuICAgIGNvbW1vbkJvdW5kcyxcbiAgICB7XG4gICAgICB3aWR0aDogYXBwU3RhdGUud2lkdGggLSBhcHBTdGF0ZS53aWR0aCAqIG1hcmdpbixcbiAgICAgIGhlaWdodDogYXBwU3RhdGUuaGVpZ2h0IC0gYXBwU3RhdGUuaGVpZ2h0ICogbWFyZ2luLFxuICAgIH0sXG4gICAgbWF4Wm9vbSxcbiAgKTtcbiAgY29uc3QgbmV3Wm9vbSA9IGdldE5ld1pvb20oem9vbVZhbHVlLCBhcHBTdGF0ZS56b29tLCB7XG4gICAgbGVmdDogYXBwU3RhdGUub2Zmc2V0TGVmdCxcbiAgICB0b3A6IGFwcFN0YXRlLm9mZnNldFRvcCxcbiAgfSk7XG5cbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGNvbW1vbkJvdW5kcztcbiAgY29uc3QgY2VudGVyWCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGNlbnRlclkgPSAoeTEgKyB5MikgLyAyO1xuICByZXR1cm4ge1xuICAgIGFwcFN0YXRlOiB7XG4gICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgIC4uLmNlbnRlclNjcm9sbE9uKHtcbiAgICAgICAgc2NlbmVQb2ludDogeyB4OiBjZW50ZXJYLCB5OiBjZW50ZXJZIH0sXG4gICAgICAgIHZpZXdwb3J0RGltZW5zaW9uczoge1xuICAgICAgICAgIHdpZHRoOiBhcHBTdGF0ZS53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGFwcFN0YXRlLmhlaWdodCxcbiAgICAgICAgfSxcbiAgICAgICAgem9vbTogbmV3Wm9vbSxcbiAgICAgIH0pLFxuICAgICAgem9vbTogbmV3Wm9vbSxcbiAgICB9LFxuICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgYWN0aW9uWm9vbVRvU2VsZWN0ZWQgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiem9vbVRvU2VsZWN0aW9uXCIsXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHpvb21Ub0ZpdEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSwgdHJ1ZSksXG4gIGtleVRlc3Q6IChldmVudCkgPT5cbiAgICBldmVudC5jb2RlID09PSBDT0RFUy5UV08gJiZcbiAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAhZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvblpvb21Ub0ZpdCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJ6b29tVG9GaXRcIixcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4gem9vbVRvRml0RWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlLCBmYWxzZSksXG4gIGtleVRlc3Q6IChldmVudCkgPT5cbiAgICBldmVudC5jb2RlID09PSBDT0RFUy5PTkUgJiZcbiAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAhZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvblRvZ2dsZVRoZW1lID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcInRvZ2dsZVRoZW1lXCIsXG4gIHBlcmZvcm06IChfLCBhcHBTdGF0ZSwgdmFsdWUsIGFwcCkgPT4ge1xuICAgIGlmIChhcHAucHJvcHMub25UaGVtZUNoYW5nZSkge1xuICAgICAgYXBwLnByb3BzLm9uVGhlbWVDaGFuZ2UoXG4gICAgICAgIHZhbHVlIHx8IChhcHBTdGF0ZS50aGVtZSA9PT0gVEhFTUUuTElHSFQgPyBUSEVNRS5EQVJLIDogVEhFTUUuTElHSFQpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICB0aGVtZTpcbiAgICAgICAgICB2YWx1ZSB8fCAoYXBwU3RhdGUudGhlbWUgPT09IFRIRU1FLkxJR0hUID8gVEhFTUUuREFSSyA6IFRIRU1FLkxJR0hUKSxcbiAgICAgIH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgIH07XG4gIH0sXG4gIFBhbmVsQ29tcG9uZW50OiAoeyBhcHBTdGF0ZSwgdXBkYXRlRGF0YSB9KSA9PiAoXG4gICAgPGRpdiBzdHlsZT17eyBtYXJnaW5JbmxpbmVTdGFydDogXCIwLjI1cmVtXCIgfX0+XG4gICAgICA8RGFya01vZGVUb2dnbGVcbiAgICAgICAgdmFsdWU9e2FwcFN0YXRlLnRoZW1lfVxuICAgICAgICBvbkNoYW5nZT17KHRoZW1lKSA9PiB7XG4gICAgICAgICAgdXBkYXRlRGF0YSh0aGVtZSk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApLFxuICBrZXlUZXN0OiAoZXZlbnQpID0+IGV2ZW50LmFsdEtleSAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5jb2RlID09PSBDT0RFUy5ELFxufSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../actions/actionCanvas.tsx\n");
|
|
1403
1403
|
|
|
1404
1404
|
/***/ }),
|
|
1405
1405
|
|
|
@@ -2708,7 +2708,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2708
2708
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2709
2709
|
|
|
2710
2710
|
"use strict";
|
|
2711
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"getSceneVersion\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.getSceneVersion),\n/* harmony export */ \"getElementMap\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.getElementMap),\n/* harmony export */ \"isInvisiblySmallElement\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.isInvisiblySmallElement),\n/* harmony export */ \"getNonDeletedElements\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.getNonDeletedElements),\n/* harmony export */ \"defaultLang\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang),\n/* harmony export */ \"languages\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.languages),\n/* harmony export */ \"restore\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_10__.restore),\n/* harmony export */ \"restoreAppState\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_10__.restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_10__.restoreElements),\n/* harmony export */ \"exportToCanvas\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.exportToCanvas),\n/* harmony export */ \"exportToBlob\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.exportToBlob),\n/* harmony export */ \"exportToSvg\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.exportToSvg),\n/* harmony export */ \"serializeAsJSON\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.serializeAsJSON),\n/* harmony export */ \"loadLibraryFromBlob\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.loadLibraryFromBlob),\n/* harmony export */ \"loadFromBlob\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.loadFromBlob),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.getFreeDrawSvgPath),\n/* harmony export */ \"isLinearElement\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_12__.isLinearElement),\n/* harmony export */ \"FONT_FAMILY\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.FONT_FAMILY),\n/* harmony export */ \"THEME\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.THEME),\n/* harmony export */ \"mutateElement\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__.mutateElement),\n/* harmony export */ \"newElementWith\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__.newElementWith),\n/* harmony export */ \"bumpVersion\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__.bumpVersion)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _publicPath__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./publicPath */ \"./publicPath.js\");\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/InitializeApp */ \"../../components/InitializeApp.tsx\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../css/app.scss */ \"../../css/app.scss\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/styles.scss */ \"../../css/styles.scss\");\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../element */ \"../../element/index.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../packages/utils */ \"../utils.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../element/mutateElement */ \"../../element/mutateElement.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst Excalidraw = (props) => {\r\n var _a, _b, _c;\r\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, onBeforeTextSubmit, generateIdForFile, } = props;\r\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\r\n const UIOptions = {\r\n canvasActions: Object.assign(Object.assign({}, _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions),\r\n };\r\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\r\n UIOptions.canvasActions.export.saveFileToDisk =\r\n (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions[\"export\"].saveFileToDisk;\r\n }\r\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\r\n // Block pinch-zooming on iOS outside of the content area\r\n const handleTouchMove = (event) => {\r\n // @ts-ignore\r\n if (typeof event.scale === \"number\" && event.scale !== 1) {\r\n event.preventDefault();\r\n }\r\n };\r\n document.addEventListener(\"touchmove\", handleTouchMove, {\r\n passive: false,\r\n });\r\n return () => {\r\n document.removeEventListener(\"touchmove\", handleTouchMove);\r\n };\r\n }, []);\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__.InitializeApp, Object.assign({ langCode: langCode }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_4__[\"default\"], { onChange: onChange, initialData: initialData, excalidrawRef: excalidrawRef, onCollabButtonClick: onCollabButtonClick, isCollaborating: isCollaborating, onPointerUpdate: onPointerUpdate, renderTopRightUI: renderTopRightUI, renderFooter: renderFooter, langCode: langCode, viewModeEnabled: viewModeEnabled, zenModeEnabled: zenModeEnabled, gridModeEnabled: gridModeEnabled, libraryReturnUrl: libraryReturnUrl, theme: theme, name: name, renderCustomStats: renderCustomStats, UIOptions: UIOptions, onPaste: onPaste, onDrop: onDrop, detectScroll: detectScroll, handleKeyboardGlobally: handleKeyboardGlobally, onLibraryChange: onLibraryChange, autoFocus: autoFocus, onBeforeTextEdit: onBeforeTextEdit, onBeforeTextSubmit: onBeforeTextSubmit, generateIdForFile: generateIdForFile }, void 0) }), void 0));\r\n};\r\nconst areEqual = (prevProps, nextProps) => {\r\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = __rest(prevProps, [\"initialData\", \"UIOptions\"]);\r\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = __rest(nextProps, [\"initialData\", \"UIOptions\"]);\r\n // comparing UIOptions\r\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\r\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\r\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\r\n return false;\r\n }\r\n const isUIOptionsSame = prevUIOptionsKeys.every((key) => {\r\n if (key === \"canvasActions\") {\r\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\r\n canvasOptionKeys.every((key) => {\r\n var _a, _b, _c, _d;\r\n if (key === \"export\" &&\r\n ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) &&\r\n ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\r\n return (prevUIOptions.canvasActions.export.saveFileToDisk ===\r\n nextUIOptions.canvasActions.export.saveFileToDisk);\r\n }\r\n return (((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) ===\r\n ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]));\r\n });\r\n }\r\n return true;\r\n });\r\n const prevKeys = Object.keys(prevProps);\r\n const nextKeys = Object.keys(nextProps);\r\n return (isUIOptionsSame &&\r\n prevKeys.length === nextKeys.length &&\r\n prevKeys.every((key) => prev[key] === next[key]));\r\n};\r\nconst forwardedRefComp = (0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)((props, ref) => (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Excalidraw, Object.assign({}, props, { excalidrawRef: ref }), void 0));\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (react__WEBPACK_IMPORTED_MODULE_1___default().memo(forwardedRefComp, areEqual));\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Olsid2VicGFjazovLy8uL2luZGV4LnRzeD9mZTFiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4vcHVibGljUGF0aFwiO1xuXG5pbXBvcnQgeyBJbml0aWFsaXplQXBwIH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvSW5pdGlhbGl6ZUFwcFwiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9BcHBcIjtcblxuaW1wb3J0IFwiLi4vLi4vY3NzL2FwcC5zY3NzXCI7XG5pbXBvcnQgXCIuLi8uLi9jc3Mvc3R5bGVzLnNjc3NcIjtcblxuaW1wb3J0IHsgQXBwUHJvcHMsIEV4Y2FsaWRyYXdBUElSZWZWYWx1ZSwgRXhjYWxpZHJhd1Byb3BzIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBkZWZhdWx0TGFuZyB9IGZyb20gXCIuLi8uLi9pMThuXCI7XG5pbXBvcnQgeyBERUZBVUxUX1VJX09QVElPTlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmNvbnN0IEV4Y2FsaWRyYXcgPSAocHJvcHM6IEV4Y2FsaWRyYXdQcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgb25DaGFuZ2UsXG4gICAgaW5pdGlhbERhdGEsXG4gICAgZXhjYWxpZHJhd1JlZixcbiAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgIGlzQ29sbGFib3JhdGluZyxcbiAgICBvblBvaW50ZXJVcGRhdGUsXG4gICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICByZW5kZXJGb290ZXIsXG4gICAgbGFuZ0NvZGUgPSBkZWZhdWx0TGFuZy5jb2RlLFxuICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICBncmlkTW9kZUVuYWJsZWQsXG4gICAgbGlicmFyeVJldHVyblVybCxcbiAgICB0aGVtZSxcbiAgICBuYW1lLFxuICAgIHJlbmRlckN1c3RvbVN0YXRzLFxuICAgIG9uUGFzdGUsXG4gICAgb25Ecm9wLFxuICAgIGRldGVjdFNjcm9sbCA9IHRydWUsXG4gICAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA9IGZhbHNlLFxuICAgIG9uTGlicmFyeUNoYW5nZSxcbiAgICBhdXRvRm9jdXMgPSBmYWxzZSxcbiAgICBvbkJlZm9yZVRleHRFZGl0LFxuICAgIG9uQmVmb3JlVGV4dFN1Ym1pdCxcbiAgICBnZW5lcmF0ZUlkRm9yRmlsZSxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IGNhbnZhc0FjdGlvbnMgPSBwcm9wcy5VSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM7XG5cbiAgY29uc3QgVUlPcHRpb25zOiBBcHBQcm9wc1tcIlVJT3B0aW9uc1wiXSA9IHtcbiAgICBjYW52YXNBY3Rpb25zOiB7XG4gICAgICAuLi5ERUZBVUxUX1VJX09QVElPTlMuY2FudmFzQWN0aW9ucyxcbiAgICAgIC4uLmNhbnZhc0FjdGlvbnMsXG4gICAgfSxcbiAgfTtcblxuICBpZiAoY2FudmFzQWN0aW9ucz8uZXhwb3J0KSB7XG4gICAgVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrID1cbiAgICAgIGNhbnZhc0FjdGlvbnMuZXhwb3J0Py5zYXZlRmlsZVRvRGlzayA/P1xuICAgICAgREVGQVVMVF9VSV9PUFRJT05TLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrO1xuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBCbG9jayBwaW5jaC16b29taW5nIG9uIGlPUyBvdXRzaWRlIG9mIHRoZSBjb250ZW50IGFyZWFcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0eXBlb2YgZXZlbnQuc2NhbGUgPT09IFwibnVtYmVyXCIgJiYgZXZlbnQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8SW5pdGlhbGl6ZUFwcCBsYW5nQ29kZT17bGFuZ0NvZGV9PlxuICAgICAgPEFwcFxuICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIGluaXRpYWxEYXRhPXtpbml0aWFsRGF0YX1cbiAgICAgICAgZXhjYWxpZHJhd1JlZj17ZXhjYWxpZHJhd1JlZn1cbiAgICAgICAgb25Db2xsYWJCdXR0b25DbGljaz17b25Db2xsYWJCdXR0b25DbGlja31cbiAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXtpc0NvbGxhYm9yYXRpbmd9XG4gICAgICAgIG9uUG9pbnRlclVwZGF0ZT17b25Qb2ludGVyVXBkYXRlfVxuICAgICAgICByZW5kZXJUb3BSaWdodFVJPXtyZW5kZXJUb3BSaWdodFVJfVxuICAgICAgICByZW5kZXJGb290ZXI9e3JlbmRlckZvb3Rlcn1cbiAgICAgICAgbGFuZ0NvZGU9e2xhbmdDb2RlfVxuICAgICAgICB2aWV3TW9kZUVuYWJsZWQ9e3ZpZXdNb2RlRW5hYmxlZH1cbiAgICAgICAgemVuTW9kZUVuYWJsZWQ9e3plbk1vZGVFbmFibGVkfVxuICAgICAgICBncmlkTW9kZUVuYWJsZWQ9e2dyaWRNb2RlRW5hYmxlZH1cbiAgICAgICAgbGlicmFyeVJldHVyblVybD17bGlicmFyeVJldHVyblVybH1cbiAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICByZW5kZXJDdXN0b21TdGF0cz17cmVuZGVyQ3VzdG9tU3RhdHN9XG4gICAgICAgIFVJT3B0aW9ucz17VUlPcHRpb25zfVxuICAgICAgICBvblBhc3RlPXtvblBhc3RlfVxuICAgICAgICBvbkRyb3A9e29uRHJvcH1cbiAgICAgICAgZGV0ZWN0U2Nyb2xsPXtkZXRlY3RTY3JvbGx9XG4gICAgICAgIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk9e2hhbmRsZUtleWJvYXJkR2xvYmFsbHl9XG4gICAgICAgIG9uTGlicmFyeUNoYW5nZT17b25MaWJyYXJ5Q2hhbmdlfVxuICAgICAgICBhdXRvRm9jdXM9e2F1dG9Gb2N1c31cbiAgICAgICAgb25CZWZvcmVUZXh0RWRpdD17b25CZWZvcmVUZXh0RWRpdH1cbiAgICAgICAgb25CZWZvcmVUZXh0U3VibWl0PXtvbkJlZm9yZVRleHRTdWJtaXR9XG4gICAgICAgIGdlbmVyYXRlSWRGb3JGaWxlPXtnZW5lcmF0ZUlkRm9yRmlsZX1cbiAgICAgIC8+XG4gICAgPC9Jbml0aWFsaXplQXBwPlxuICApO1xufTtcblxudHlwZSBQdWJsaWNFeGNhbGlkcmF3UHJvcHMgPSBPbWl0PEV4Y2FsaWRyYXdQcm9wcywgXCJmb3J3YXJkZWRSZWZcIj47XG5cbmNvbnN0IGFyZUVxdWFsID0gKFxuICBwcmV2UHJvcHM6IFB1YmxpY0V4Y2FsaWRyYXdQcm9wcyxcbiAgbmV4dFByb3BzOiBQdWJsaWNFeGNhbGlkcmF3UHJvcHMsXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGluaXRpYWxEYXRhOiBwcmV2SW5pdGlhbERhdGEsXG4gICAgVUlPcHRpb25zOiBwcmV2VUlPcHRpb25zID0ge30sXG4gICAgLi4ucHJldlxuICB9ID0gcHJldlByb3BzO1xuICBjb25zdCB7XG4gICAgaW5pdGlhbERhdGE6IG5leHRJbml0aWFsRGF0YSxcbiAgICBVSU9wdGlvbnM6IG5leHRVSU9wdGlvbnMgPSB7fSxcbiAgICAuLi5uZXh0XG4gIH0gPSBuZXh0UHJvcHM7XG5cbiAgLy8gY29tcGFyaW5nIFVJT3B0aW9uc1xuICBjb25zdCBwcmV2VUlPcHRpb25zS2V5cyA9IE9iamVjdC5rZXlzKHByZXZVSU9wdGlvbnMpIGFzIChrZXlvZiBQYXJ0aWFsPFxuICAgIHR5cGVvZiBERUZBVUxUX1VJX09QVElPTlNcbiAgPilbXTtcbiAgY29uc3QgbmV4dFVJT3B0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhuZXh0VUlPcHRpb25zKSBhcyAoa2V5b2YgUGFydGlhbDxcbiAgICB0eXBlb2YgREVGQVVMVF9VSV9PUFRJT05TXG4gID4pW107XG5cbiAgaWYgKHByZXZVSU9wdGlvbnNLZXlzLmxlbmd0aCAhPT0gbmV4dFVJT3B0aW9uc0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXNVSU9wdGlvbnNTYW1lID0gcHJldlVJT3B0aW9uc0tleXMuZXZlcnkoKGtleSkgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiY2FudmFzQWN0aW9uc1wiKSB7XG4gICAgICBjb25zdCBjYW52YXNPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoXG4gICAgICAgIHByZXZVSU9wdGlvbnMuY2FudmFzQWN0aW9ucyEsXG4gICAgICApIGFzIChrZXlvZiBQYXJ0aWFsPHR5cGVvZiBERUZBVUxUX1VJX09QVElPTlMuY2FudmFzQWN0aW9ucz4pW107XG4gICAgICBjYW52YXNPcHRpb25LZXlzLmV2ZXJ5KChrZXkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gXCJleHBvcnRcIiAmJlxuICAgICAgICAgIHByZXZVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydCAmJlxuICAgICAgICAgIG5leHRVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcHJldlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzayA9PT1cbiAgICAgICAgICAgIG5leHRVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2tcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcHJldlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV0gPT09XG4gICAgICAgICAgbmV4dFVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgY29uc3QgcHJldktleXMgPSBPYmplY3Qua2V5cyhwcmV2UHJvcHMpIGFzIChrZXlvZiB0eXBlb2YgcHJldilbXTtcbiAgY29uc3QgbmV4dEtleXMgPSBPYmplY3Qua2V5cyhuZXh0UHJvcHMpIGFzIChrZXlvZiB0eXBlb2YgbmV4dClbXTtcbiAgcmV0dXJuIChcbiAgICBpc1VJT3B0aW9uc1NhbWUgJiZcbiAgICBwcmV2S2V5cy5sZW5ndGggPT09IG5leHRLZXlzLmxlbmd0aCAmJlxuICAgIHByZXZLZXlzLmV2ZXJ5KChrZXkpID0+IHByZXZba2V5XSA9PT0gbmV4dFtrZXldKVxuICApO1xufTtcblxuY29uc3QgZm9yd2FyZGVkUmVmQ29tcCA9IGZvcndhcmRSZWY8XG4gIEV4Y2FsaWRyYXdBUElSZWZWYWx1ZSxcbiAgUHVibGljRXhjYWxpZHJhd1Byb3BzXG4+KChwcm9wcywgcmVmKSA9PiA8RXhjYWxpZHJhdyB7Li4ucHJvcHN9IGV4Y2FsaWRyYXdSZWY9e3JlZn0gLz4pO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhmb3J3YXJkZWRSZWZDb21wLCBhcmVFcXVhbCk7XG5leHBvcnQge1xuICBnZXRTY2VuZVZlcnNpb24sXG4gIGdldEVsZW1lbnRNYXAsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxuICBnZXROb25EZWxldGVkRWxlbWVudHMsXG59IGZyb20gXCIuLi8uLi9lbGVtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0TGFuZywgbGFuZ3VhZ2VzIH0gZnJvbSBcIi4uLy4uL2kxOG5cIjtcbmV4cG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVBcHBTdGF0ZSwgcmVzdG9yZUVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2RhdGEvcmVzdG9yZVwiO1xuZXhwb3J0IHtcbiAgZXhwb3J0VG9DYW52YXMsXG4gIGV4cG9ydFRvQmxvYixcbiAgZXhwb3J0VG9TdmcsXG4gIHNlcmlhbGl6ZUFzSlNPTixcbiAgbG9hZExpYnJhcnlGcm9tQmxvYixcbiAgbG9hZEZyb21CbG9iLFxuICBnZXRGcmVlRHJhd1N2Z1BhdGgsXG59IGZyb20gXCIuLi8uLi9wYWNrYWdlcy91dGlsc1wiO1xuZXhwb3J0IHsgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuXG5leHBvcnQgeyBGT05UX0ZBTUlMWSwgVEhFTUUgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCB7XG4gIG11dGF0ZUVsZW1lbnQsXG4gIG5ld0VsZW1lbnRXaXRoLFxuICBidW1wVmVyc2lvbixcbn0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./index.tsx\n");
|
|
2711
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"getSceneVersion\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.getSceneVersion),\n/* harmony export */ \"getElementMap\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.getElementMap),\n/* harmony export */ \"isInvisiblySmallElement\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.isInvisiblySmallElement),\n/* harmony export */ \"getNonDeletedElements\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_9__.getNonDeletedElements),\n/* harmony export */ \"defaultLang\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang),\n/* harmony export */ \"languages\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_7__.languages),\n/* harmony export */ \"restore\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_10__.restore),\n/* harmony export */ \"restoreAppState\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_10__.restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_10__.restoreElements),\n/* harmony export */ \"exportToCanvas\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.exportToCanvas),\n/* harmony export */ \"exportToBlob\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.exportToBlob),\n/* harmony export */ \"exportToSvg\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.exportToSvg),\n/* harmony export */ \"serializeAsJSON\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.serializeAsJSON),\n/* harmony export */ \"loadLibraryFromBlob\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.loadLibraryFromBlob),\n/* harmony export */ \"loadFromBlob\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.loadFromBlob),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_11__.getFreeDrawSvgPath),\n/* harmony export */ \"isLinearElement\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_12__.isLinearElement),\n/* harmony export */ \"FONT_FAMILY\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.FONT_FAMILY),\n/* harmony export */ \"THEME\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_8__.THEME),\n/* harmony export */ \"mutateElement\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__.mutateElement),\n/* harmony export */ \"newElementWith\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__.newElementWith),\n/* harmony export */ \"bumpVersion\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__.bumpVersion)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _publicPath__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./publicPath */ \"./publicPath.js\");\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/InitializeApp */ \"../../components/InitializeApp.tsx\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../css/app.scss */ \"../../css/app.scss\");\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/styles.scss */ \"../../css/styles.scss\");\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../element */ \"../../element/index.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../packages/utils */ \"../utils.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../element/mutateElement */ \"../../element/mutateElement.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst Excalidraw = (props) => {\r\n var _a, _b, _c;\r\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_7__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, onBeforeTextSubmit, generateIdForFile, onThemeChange, } = props;\r\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\r\n const UIOptions = {\r\n canvasActions: Object.assign(Object.assign({}, _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions),\r\n };\r\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\r\n UIOptions.canvasActions.export.saveFileToDisk =\r\n (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_UI_OPTIONS.canvasActions[\"export\"].saveFileToDisk;\r\n }\r\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\r\n // Block pinch-zooming on iOS outside of the content area\r\n const handleTouchMove = (event) => {\r\n // @ts-ignore\r\n if (typeof event.scale === \"number\" && event.scale !== 1) {\r\n event.preventDefault();\r\n }\r\n };\r\n document.addEventListener(\"touchmove\", handleTouchMove, {\r\n passive: false,\r\n });\r\n return () => {\r\n document.removeEventListener(\"touchmove\", handleTouchMove);\r\n };\r\n }, []);\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_3__.InitializeApp, Object.assign({ langCode: langCode }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_4__[\"default\"], { onChange: onChange, initialData: initialData, excalidrawRef: excalidrawRef, onCollabButtonClick: onCollabButtonClick, isCollaborating: isCollaborating, onPointerUpdate: onPointerUpdate, renderTopRightUI: renderTopRightUI, renderFooter: renderFooter, langCode: langCode, viewModeEnabled: viewModeEnabled, zenModeEnabled: zenModeEnabled, gridModeEnabled: gridModeEnabled, libraryReturnUrl: libraryReturnUrl, theme: theme, name: name, renderCustomStats: renderCustomStats, UIOptions: UIOptions, onPaste: onPaste, onDrop: onDrop, detectScroll: detectScroll, handleKeyboardGlobally: handleKeyboardGlobally, onLibraryChange: onLibraryChange, autoFocus: autoFocus, onBeforeTextEdit: onBeforeTextEdit, onBeforeTextSubmit: onBeforeTextSubmit, generateIdForFile: generateIdForFile, onThemeChange: onThemeChange }, void 0) }), void 0));\r\n};\r\nconst areEqual = (prevProps, nextProps) => {\r\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = __rest(prevProps, [\"initialData\", \"UIOptions\"]);\r\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = __rest(nextProps, [\"initialData\", \"UIOptions\"]);\r\n // comparing UIOptions\r\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\r\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\r\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\r\n return false;\r\n }\r\n const isUIOptionsSame = prevUIOptionsKeys.every((key) => {\r\n if (key === \"canvasActions\") {\r\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\r\n canvasOptionKeys.every((key) => {\r\n var _a, _b, _c, _d;\r\n if (key === \"export\" &&\r\n ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) &&\r\n ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\r\n return (prevUIOptions.canvasActions.export.saveFileToDisk ===\r\n nextUIOptions.canvasActions.export.saveFileToDisk);\r\n }\r\n return (((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) ===\r\n ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]));\r\n });\r\n }\r\n return true;\r\n });\r\n const prevKeys = Object.keys(prevProps);\r\n const nextKeys = Object.keys(nextProps);\r\n return (isUIOptionsSame &&\r\n prevKeys.length === nextKeys.length &&\r\n prevKeys.every((key) => prev[key] === next[key]));\r\n};\r\nconst forwardedRefComp = (0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)((props, ref) => (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(Excalidraw, Object.assign({}, props, { excalidrawRef: ref }), void 0));\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (react__WEBPACK_IMPORTED_MODULE_1___default().memo(forwardedRefComp, areEqual));\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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U2pEO0FBQzZCO0FBRU47QUFNaEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbmRleC50c3g/ZmUxYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCBmb3J3YXJkUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgXCIuL3B1YmxpY1BhdGhcIjtcblxuaW1wb3J0IHsgSW5pdGlhbGl6ZUFwcCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL0luaXRpYWxpemVBcHBcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvQXBwXCI7XG5cbmltcG9ydCBcIi4uLy4uL2Nzcy9hcHAuc2Nzc1wiO1xuaW1wb3J0IFwiLi4vLi4vY3NzL3N0eWxlcy5zY3NzXCI7XG5cbmltcG9ydCB7IEFwcFByb3BzLCBFeGNhbGlkcmF3QVBJUmVmVmFsdWUsIEV4Y2FsaWRyYXdQcm9wcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcgfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuaW1wb3J0IHsgREVGQVVMVF9VSV9PUFRJT05TIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBFeGNhbGlkcmF3ID0gKHByb3BzOiBFeGNhbGlkcmF3UHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIG9uQ2hhbmdlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICBpc0NvbGxhYm9yYXRpbmcsXG4gICAgb25Qb2ludGVyVXBkYXRlLFxuICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgcmVuZGVyRm9vdGVyLFxuICAgIGxhbmdDb2RlID0gZGVmYXVsdExhbmcuY29kZSxcbiAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgemVuTW9kZUVuYWJsZWQsXG4gICAgZ3JpZE1vZGVFbmFibGVkLFxuICAgIGxpYnJhcnlSZXR1cm5VcmwsXG4gICAgdGhlbWUsXG4gICAgbmFtZSxcbiAgICByZW5kZXJDdXN0b21TdGF0cyxcbiAgICBvblBhc3RlLFxuICAgIG9uRHJvcCxcbiAgICBkZXRlY3RTY3JvbGwgPSB0cnVlLFxuICAgIGhhbmRsZUtleWJvYXJkR2xvYmFsbHkgPSBmYWxzZSxcbiAgICBvbkxpYnJhcnlDaGFuZ2UsXG4gICAgYXV0b0ZvY3VzID0gZmFsc2UsXG4gICAgb25CZWZvcmVUZXh0RWRpdCxcbiAgICBvbkJlZm9yZVRleHRTdWJtaXQsXG4gICAgZ2VuZXJhdGVJZEZvckZpbGUsXG4gICAgb25UaGVtZUNoYW5nZSxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IGNhbnZhc0FjdGlvbnMgPSBwcm9wcy5VSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM7XG5cbiAgY29uc3QgVUlPcHRpb25zOiBBcHBQcm9wc1tcIlVJT3B0aW9uc1wiXSA9IHtcbiAgICBjYW52YXNBY3Rpb25zOiB7XG4gICAgICAuLi5ERUZBVUxUX1VJX09QVElPTlMuY2FudmFzQWN0aW9ucyxcbiAgICAgIC4uLmNhbnZhc0FjdGlvbnMsXG4gICAgfSxcbiAgfTtcblxuICBpZiAoY2FudmFzQWN0aW9ucz8uZXhwb3J0KSB7XG4gICAgVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrID1cbiAgICAgIGNhbnZhc0FjdGlvbnMuZXhwb3J0Py5zYXZlRmlsZVRvRGlzayA/P1xuICAgICAgREVGQVVMVF9VSV9PUFRJT05TLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrO1xuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBCbG9jayBwaW5jaC16b29taW5nIG9uIGlPUyBvdXRzaWRlIG9mIHRoZSBjb250ZW50IGFyZWFcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0eXBlb2YgZXZlbnQuc2NhbGUgPT09IFwibnVtYmVyXCIgJiYgZXZlbnQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8SW5pdGlhbGl6ZUFwcCBsYW5nQ29kZT17bGFuZ0NvZGV9PlxuICAgICAgPEFwcFxuICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIGluaXRpYWxEYXRhPXtpbml0aWFsRGF0YX1cbiAgICAgICAgZXhjYWxpZHJhd1JlZj17ZXhjYWxpZHJhd1JlZn1cbiAgICAgICAgb25Db2xsYWJCdXR0b25DbGljaz17b25Db2xsYWJCdXR0b25DbGlja31cbiAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXtpc0NvbGxhYm9yYXRpbmd9XG4gICAgICAgIG9uUG9pbnRlclVwZGF0ZT17b25Qb2ludGVyVXBkYXRlfVxuICAgICAgICByZW5kZXJUb3BSaWdodFVJPXtyZW5kZXJUb3BSaWdodFVJfVxuICAgICAgICByZW5kZXJGb290ZXI9e3JlbmRlckZvb3Rlcn1cbiAgICAgICAgbGFuZ0NvZGU9e2xhbmdDb2RlfVxuICAgICAgICB2aWV3TW9kZUVuYWJsZWQ9e3ZpZXdNb2RlRW5hYmxlZH1cbiAgICAgICAgemVuTW9kZUVuYWJsZWQ9e3plbk1vZGVFbmFibGVkfVxuICAgICAgICBncmlkTW9kZUVuYWJsZWQ9e2dyaWRNb2RlRW5hYmxlZH1cbiAgICAgICAgbGlicmFyeVJldHVyblVybD17bGlicmFyeVJldHVyblVybH1cbiAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICByZW5kZXJDdXN0b21TdGF0cz17cmVuZGVyQ3VzdG9tU3RhdHN9XG4gICAgICAgIFVJT3B0aW9ucz17VUlPcHRpb25zfVxuICAgICAgICBvblBhc3RlPXtvblBhc3RlfVxuICAgICAgICBvbkRyb3A9e29uRHJvcH1cbiAgICAgICAgZGV0ZWN0U2Nyb2xsPXtkZXRlY3RTY3JvbGx9XG4gICAgICAgIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk9e2hhbmRsZUtleWJvYXJkR2xvYmFsbHl9XG4gICAgICAgIG9uTGlicmFyeUNoYW5nZT17b25MaWJyYXJ5Q2hhbmdlfVxuICAgICAgICBhdXRvRm9jdXM9e2F1dG9Gb2N1c31cbiAgICAgICAgb25CZWZvcmVUZXh0RWRpdD17b25CZWZvcmVUZXh0RWRpdH1cbiAgICAgICAgb25CZWZvcmVUZXh0U3VibWl0PXtvbkJlZm9yZVRleHRTdWJtaXR9XG4gICAgICAgIGdlbmVyYXRlSWRGb3JGaWxlPXtnZW5lcmF0ZUlkRm9yRmlsZX1cbiAgICAgICAgb25UaGVtZUNoYW5nZT17b25UaGVtZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgPC9Jbml0aWFsaXplQXBwPlxuICApO1xufTtcblxudHlwZSBQdWJsaWNFeGNhbGlkcmF3UHJvcHMgPSBPbWl0PEV4Y2FsaWRyYXdQcm9wcywgXCJmb3J3YXJkZWRSZWZcIj47XG5cbmNvbnN0IGFyZUVxdWFsID0gKFxuICBwcmV2UHJvcHM6IFB1YmxpY0V4Y2FsaWRyYXdQcm9wcyxcbiAgbmV4dFByb3BzOiBQdWJsaWNFeGNhbGlkcmF3UHJvcHMsXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGluaXRpYWxEYXRhOiBwcmV2SW5pdGlhbERhdGEsXG4gICAgVUlPcHRpb25zOiBwcmV2VUlPcHRpb25zID0ge30sXG4gICAgLi4ucHJldlxuICB9ID0gcHJldlByb3BzO1xuICBjb25zdCB7XG4gICAgaW5pdGlhbERhdGE6IG5leHRJbml0aWFsRGF0YSxcbiAgICBVSU9wdGlvbnM6IG5leHRVSU9wdGlvbnMgPSB7fSxcbiAgICAuLi5uZXh0XG4gIH0gPSBuZXh0UHJvcHM7XG5cbiAgLy8gY29tcGFyaW5nIFVJT3B0aW9uc1xuICBjb25zdCBwcmV2VUlPcHRpb25zS2V5cyA9IE9iamVjdC5rZXlzKHByZXZVSU9wdGlvbnMpIGFzIChrZXlvZiBQYXJ0aWFsPFxuICAgIHR5cGVvZiBERUZBVUxUX1VJX09QVElPTlNcbiAgPilbXTtcbiAgY29uc3QgbmV4dFVJT3B0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhuZXh0VUlPcHRpb25zKSBhcyAoa2V5b2YgUGFydGlhbDxcbiAgICB0eXBlb2YgREVGQVVMVF9VSV9PUFRJT05TXG4gID4pW107XG5cbiAgaWYgKHByZXZVSU9wdGlvbnNLZXlzLmxlbmd0aCAhPT0gbmV4dFVJT3B0aW9uc0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXNVSU9wdGlvbnNTYW1lID0gcHJldlVJT3B0aW9uc0tleXMuZXZlcnkoKGtleSkgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiY2FudmFzQWN0aW9uc1wiKSB7XG4gICAgICBjb25zdCBjYW52YXNPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoXG4gICAgICAgIHByZXZVSU9wdGlvbnMuY2FudmFzQWN0aW9ucyEsXG4gICAgICApIGFzIChrZXlvZiBQYXJ0aWFsPHR5cGVvZiBERUZBVUxUX1VJX09QVElPTlMuY2FudmFzQWN0aW9ucz4pW107XG4gICAgICBjYW52YXNPcHRpb25LZXlzLmV2ZXJ5KChrZXkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gXCJleHBvcnRcIiAmJlxuICAgICAgICAgIHByZXZVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydCAmJlxuICAgICAgICAgIG5leHRVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcHJldlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzayA9PT1cbiAgICAgICAgICAgIG5leHRVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2tcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcHJldlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV0gPT09XG4gICAgICAgICAgbmV4dFVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgY29uc3QgcHJldktleXMgPSBPYmplY3Qua2V5cyhwcmV2UHJvcHMpIGFzIChrZXlvZiB0eXBlb2YgcHJldilbXTtcbiAgY29uc3QgbmV4dEtleXMgPSBPYmplY3Qua2V5cyhuZXh0UHJvcHMpIGFzIChrZXlvZiB0eXBlb2YgbmV4dClbXTtcbiAgcmV0dXJuIChcbiAgICBpc1VJT3B0aW9uc1NhbWUgJiZcbiAgICBwcmV2S2V5cy5sZW5ndGggPT09IG5leHRLZXlzLmxlbmd0aCAmJlxuICAgIHByZXZLZXlzLmV2ZXJ5KChrZXkpID0+IHByZXZba2V5XSA9PT0gbmV4dFtrZXldKVxuICApO1xufTtcblxuY29uc3QgZm9yd2FyZGVkUmVmQ29tcCA9IGZvcndhcmRSZWY8XG4gIEV4Y2FsaWRyYXdBUElSZWZWYWx1ZSxcbiAgUHVibGljRXhjYWxpZHJhd1Byb3BzXG4+KChwcm9wcywgcmVmKSA9PiA8RXhjYWxpZHJhdyB7Li4ucHJvcHN9IGV4Y2FsaWRyYXdSZWY9e3JlZn0gLz4pO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QubWVtbyhmb3J3YXJkZWRSZWZDb21wLCBhcmVFcXVhbCk7XG5leHBvcnQge1xuICBnZXRTY2VuZVZlcnNpb24sXG4gIGdldEVsZW1lbnRNYXAsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxuICBnZXROb25EZWxldGVkRWxlbWVudHMsXG59IGZyb20gXCIuLi8uLi9lbGVtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0TGFuZywgbGFuZ3VhZ2VzIH0gZnJvbSBcIi4uLy4uL2kxOG5cIjtcbmV4cG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVBcHBTdGF0ZSwgcmVzdG9yZUVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2RhdGEvcmVzdG9yZVwiO1xuZXhwb3J0IHtcbiAgZXhwb3J0VG9DYW52YXMsXG4gIGV4cG9ydFRvQmxvYixcbiAgZXhwb3J0VG9TdmcsXG4gIHNlcmlhbGl6ZUFzSlNPTixcbiAgbG9hZExpYnJhcnlGcm9tQmxvYixcbiAgbG9hZEZyb21CbG9iLFxuICBnZXRGcmVlRHJhd1N2Z1BhdGgsXG59IGZyb20gXCIuLi8uLi9wYWNrYWdlcy91dGlsc1wiO1xuZXhwb3J0IHsgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuXG5leHBvcnQgeyBGT05UX0ZBTUlMWSwgVEhFTUUgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCB7XG4gIG11dGF0ZUVsZW1lbnQsXG4gIG5ld0VsZW1lbnRXaXRoLFxuICBidW1wVmVyc2lvbixcbn0gZnJvbSBcIi4uLy4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./index.tsx\n");
|
|
2712
2712
|
|
|
2713
2713
|
/***/ }),
|
|
2714
2714
|
|
|
@@ -2774,7 +2774,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2774
2774
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2775
2775
|
|
|
2776
2776
|
"use strict";
|
|
2777
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getShapeForElement\": () => (/* binding */ getShapeForElement),\n/* harmony export */ \"invalidateShapeForElement\": () => (/* binding */ invalidateShapeForElement),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions),\n/* harmony export */ \"renderElement\": () => (/* binding */ renderElement),\n/* harmony export */ \"renderElementToSvg\": () => (/* binding */ renderElementToSvg),\n/* harmony export */ \"pathsCache\": () => (/* binding */ pathsCache),\n/* harmony export */ \"generateFreeDrawShape\": () => (/* binding */ generateFreeDrawShape),\n/* harmony export */ \"getFreeDrawPath2D\": () => (/* binding */ getFreeDrawPath2D),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* binding */ getFreeDrawSvgPath)\n/* harmony export */ });\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var perfect_freehand__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! perfect-freehand */ \"../../../node_modules/perfect-freehand/dist/esm/index.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\r\nconst isPendingImageElement = (element, sceneState) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\r\n !sceneState.imageCache.has(element.fileId);\r\nconst getDashArrayDashed = (strokeWidth) => [8, 8 + strokeWidth];\r\nconst getDashArrayDotted = (strokeWidth) => [1.5, 6 + strokeWidth];\r\nconst getCanvasPadding = (element) => element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\r\nconst generateElementCanvas = (element, zoom, sceneState) => {\r\n var _a;\r\n const canvas = document.createElement(\"canvas\");\r\n const context = canvas.getContext(\"2d\");\r\n const padding = getCanvasPadding(element);\r\n let canvasOffsetX = 0;\r\n let canvasOffsetY = 0;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n canvas.width =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvasOffsetX =\r\n element.x > x1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.x, x1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n canvasOffsetY =\r\n element.y > y1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.y, y1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n context.translate(canvasOffsetX, canvasOffsetY);\r\n }\r\n else {\r\n canvas.width =\r\n element.width * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n element.height * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n }\r\n context.save();\r\n context.translate(padding * zoom.value, padding * zoom.value);\r\n context.scale(window.devicePixelRatio * zoom.value, window.devicePixelRatio * zoom.value);\r\n const rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\"default\"].canvas(canvas);\r\n if (sceneState.theme === \"dark\" &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\r\n !isPendingImageElement(element, sceneState) &&\r\n ((_a = sceneState.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.mimeType) !== _constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg) {\r\n // using a stronger invert (100% vs our regular 93%) and saturate\r\n // as a temp hack to make images in dark theme look closer to original\r\n // color scheme (it's still not quite there and the clors look slightly\r\n // desaturing/black is not as black, but...)\r\n context.filter = \"invert(100%) hue-rotate(180deg) saturate(1.25)\";\r\n }\r\n drawElementOnCanvas(element, rc, context, sceneState);\r\n context.restore();\r\n return {\r\n element,\r\n canvas,\r\n theme: sceneState.theme,\r\n canvasZoom: zoom.value,\r\n canvasOffsetX,\r\n canvasOffsetY,\r\n };\r\n};\r\nconst IMAGE_PLACEHOLDER_IMG = document.createElement(\"img\");\r\nIMAGE_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"image\" class=\"svg-inline--fa fa-image fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"#888\" d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"></path></svg>`)}`;\r\nconst IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement(\"img\");\r\nIMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg viewBox=\"0 0 668 668\" xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2\"><path d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48ZM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56ZM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.81709 0 0 .81709 124.825 145.825)\"/><path d=\"M256 8C119.034 8 8 119.033 8 256c0 136.967 111.034 248 248 248s248-111.034 248-248S392.967 8 256 8Zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676ZM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.30366 0 0 .30366 506.822 60.065)\"/></svg>`)}`;\r\nconst drawImagePlaceholder = (element, context, zoomValue) => {\r\n context.fillStyle = \"#E7E7E7\";\r\n context.fillRect(0, 0, element.width, element.height);\r\n const imageMinWidthOrHeight = Math.min(element.width, element.height);\r\n const size = Math.min(imageMinWidthOrHeight, Math.min(imageMinWidthOrHeight * 0.4, 100));\r\n context.drawImage(element.status === \"error\"\r\n ? IMAGE_ERROR_PLACEHOLDER_IMG\r\n : IMAGE_PLACEHOLDER_IMG, element.width / 2 - size / 2, element.height / 2 - size / 2, size, size);\r\n};\r\nconst drawElementOnCanvas = (element, rc, context, sceneState) => {\r\n var _a;\r\n context.globalAlpha = element.opacity / 100;\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n rc.draw(getShapeForElement(element));\r\n break;\r\n }\r\n case \"arrow\":\r\n case \"line\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n getShapeForElement(element).forEach((shape) => {\r\n rc.draw(shape);\r\n });\r\n break;\r\n }\r\n case \"freedraw\": {\r\n // Draw directly to canvas\r\n context.save();\r\n context.fillStyle = element.strokeColor;\r\n const path = getFreeDrawPath2D(element);\r\n context.fillStyle = element.strokeColor;\r\n context.fill(path);\r\n context.restore();\r\n break;\r\n }\r\n case \"image\": {\r\n const img = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element)\r\n ? (_a = sceneState.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.image\r\n : undefined;\r\n if (img != null && !(img instanceof Promise)) {\r\n context.drawImage(img, 0 /* hardcoded for the selection box*/, 0, element.width, element.height);\r\n }\r\n else {\r\n drawImagePlaceholder(element, context, sceneState.zoom.value);\r\n }\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const rtl = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text);\r\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\r\n if (shouldTemporarilyAttach) {\r\n // to correctly render RTL text mixed with LTR, we have to append it\r\n // to the DOM\r\n document.body.appendChild(context.canvas);\r\n }\r\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\r\n context.save();\r\n context.font = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element);\r\n context.fillStyle = element.strokeColor;\r\n context.textAlign = element.textAlign;\r\n // Canvas does not support multiline text by default\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n for (let index = 0; index < lines.length; index++) {\r\n context.fillText(lines[index], horizontalOffset, (index + 1) * lineHeight - verticalOffset);\r\n }\r\n context.restore();\r\n if (shouldTemporarilyAttach) {\r\n context.canvas.remove();\r\n }\r\n }\r\n else {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n context.globalAlpha = 1;\r\n};\r\nconst elementWithCanvasCache = new WeakMap();\r\nconst shapeCache = new WeakMap();\r\nconst getShapeForElement = (element) => shapeCache.get(element);\r\nconst invalidateShapeForElement = (element) => shapeCache.delete(element);\r\nconst generateRoughOptions = (element, continuousPath = false) => {\r\n const options = {\r\n seed: element.seed,\r\n strokeLineDash: element.strokeStyle === \"dashed\"\r\n ? getDashArrayDashed(element.strokeWidth)\r\n : element.strokeStyle === \"dotted\"\r\n ? getDashArrayDotted(element.strokeWidth)\r\n : undefined,\r\n // for non-solid strokes, disable multiStroke because it tends to make\r\n // dashes/dots overlay each other\r\n disableMultiStroke: element.strokeStyle !== \"solid\",\r\n // for non-solid strokes, increase the width a bit to make it visually\r\n // similar to solid strokes, because we're also disabling multiStroke\r\n strokeWidth: element.strokeStyle !== \"solid\"\r\n ? element.strokeWidth + 0.5\r\n : element.strokeWidth,\r\n // when increasing strokeWidth, we must explicitly set fillWeight and\r\n // hachureGap because if not specified, roughjs uses strokeWidth to\r\n // calculate them (and we don't want the fills to be modified)\r\n fillWeight: element.strokeWidth / 2,\r\n hachureGap: element.strokeWidth * 4,\r\n roughness: element.roughness,\r\n stroke: element.strokeColor,\r\n preserveVertices: continuousPath,\r\n // disable decimals to fix Skia rendering issues #4046\r\n fixedDecimalPlaceDigits: 0,\r\n };\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n if (element.type === \"ellipse\") {\r\n options.curveFitting = 1;\r\n }\r\n return options;\r\n }\r\n case \"line\": {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n }\r\n return options;\r\n }\r\n case \"freedraw\":\r\n case \"arrow\":\r\n return options;\r\n default: {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\n/**\r\n * Generates the element's shape and puts it into the cache.\r\n * @param element\r\n * @param generator\r\n */\r\nconst generateElementShape = (element, generator) => {\r\n let shape = shapeCache.get(element) || null;\r\n if (!shape) {\r\n elementWithCanvasCache.delete(element);\r\n switch (element.type) {\r\n case \"rectangle\":\r\n if (element.strokeSharpness === \"round\") {\r\n const w = element.width;\r\n const h = element.height;\r\n const r = Math.min(w, h) * 0.25;\r\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(element, true));\r\n }\r\n else {\r\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(element));\r\n }\r\n break;\r\n case \"diamond\": {\r\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getDiamondPoints)(element);\r\n shape = generator.polygon([\r\n [topX, topY],\r\n [rightX, rightY],\r\n [bottomX, bottomY],\r\n [leftX, leftY],\r\n ], generateRoughOptions(element));\r\n break;\r\n }\r\n case \"ellipse\":\r\n shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\r\n break;\r\n case \"line\":\r\n case \"arrow\": {\r\n const options = generateRoughOptions(element);\r\n // points array can be empty in the beginning, so it is important to add\r\n // initial position to it\r\n const points = element.points.length ? element.points : [[0, 0]];\r\n // curve is always the first element\r\n // this simplifies finding the curve for an element\r\n if (element.strokeSharpness === \"sharp\") {\r\n if (options.fill) {\r\n shape = [generator.polygon(points, options)];\r\n }\r\n else {\r\n shape = [\r\n generator.linearPath(points, options),\r\n ];\r\n }\r\n }\r\n else {\r\n shape = [generator.curve(points, options)];\r\n }\r\n // add lines only in arrow\r\n if (element.type === \"arrow\") {\r\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\r\n const getArrowheadShapes = (element, shape, position, arrowhead) => {\r\n const arrowheadPoints = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getArrowheadPoints)(element, shape, position, arrowhead);\r\n if (arrowheadPoints === null) {\r\n return [];\r\n }\r\n // Other arrowheads here...\r\n if (arrowhead === \"dot\") {\r\n const [x, y, r] = arrowheadPoints;\r\n return [\r\n generator.circle(x, y, r, Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\", stroke: \"none\" })),\r\n ];\r\n }\r\n if (arrowhead === \"triangle\") {\r\n const [x, y, x2, y2, x3, y3] = arrowheadPoints;\r\n // always use solid stroke for triangle arrowhead\r\n delete options.strokeLineDash;\r\n return [\r\n generator.polygon([\r\n [x, y],\r\n [x2, y2],\r\n [x3, y3],\r\n [x, y],\r\n ], Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\" })),\r\n ];\r\n }\r\n // Arrow arrowheads\r\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\r\n if (element.strokeStyle === \"dotted\") {\r\n // for dotted arrows caps, reduce gap to make it more legible\r\n const dash = getDashArrayDotted(element.strokeWidth - 1);\r\n options.strokeLineDash = [dash[0], dash[1] - 1];\r\n }\r\n else {\r\n // for solid/dashed, keep solid arrow cap\r\n delete options.strokeLineDash;\r\n }\r\n return [\r\n generator.line(x3, y3, x2, y2, options),\r\n generator.line(x4, y4, x2, y2, options),\r\n ];\r\n };\r\n if (startArrowhead !== null) {\r\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead);\r\n shape.push(...shapes);\r\n }\r\n if (endArrowhead !== null) {\r\n if (endArrowhead === undefined) {\r\n // Hey, we have an old arrow here!\r\n }\r\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead);\r\n shape.push(...shapes);\r\n }\r\n }\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n shape = [];\r\n break;\r\n }\r\n case \"text\":\r\n case \"image\": {\r\n // just to ensure we don't regenerate element.canvas on rerenders\r\n shape = [];\r\n break;\r\n }\r\n }\r\n shapeCache.set(element, shape);\r\n }\r\n};\r\nconst generateElementWithCanvas = (element, sceneState) => {\r\n const zoom = sceneState ? sceneState.zoom : defaultAppState.zoom;\r\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\r\n const shouldRegenerateBecauseZoom = prevElementWithCanvas &&\r\n prevElementWithCanvas.canvasZoom !== zoom.value &&\r\n !(sceneState === null || sceneState === void 0 ? void 0 : sceneState.shouldCacheIgnoreZoom);\r\n if (!prevElementWithCanvas ||\r\n shouldRegenerateBecauseZoom ||\r\n prevElementWithCanvas.theme !== sceneState.theme) {\r\n const elementWithCanvas = generateElementCanvas(element, zoom, sceneState);\r\n elementWithCanvasCache.set(element, elementWithCanvas);\r\n return elementWithCanvas;\r\n }\r\n return prevElementWithCanvas;\r\n};\r\nconst drawElementFromCanvas = (elementWithCanvas, rc, context, sceneState) => {\r\n const element = elementWithCanvas.element;\r\n const padding = getCanvasPadding(element);\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n }\r\n const cx = ((x1 + x2) / 2 + sceneState.scrollX) * window.devicePixelRatio;\r\n const cy = ((y1 + y2) / 2 + sceneState.scrollY) * window.devicePixelRatio;\r\n const _isPendingImageElement = isPendingImageElement(element, sceneState);\r\n const scaleXFactor = \"scale\" in elementWithCanvas.element && !_isPendingImageElement\r\n ? elementWithCanvas.element.scale[0]\r\n : 1;\r\n const scaleYFactor = \"scale\" in elementWithCanvas.element && !_isPendingImageElement\r\n ? elementWithCanvas.element.scale[1]\r\n : 1;\r\n context.save();\r\n context.scale((1 / window.devicePixelRatio) * scaleXFactor, (1 / window.devicePixelRatio) * scaleYFactor);\r\n context.translate(cx * scaleXFactor, cy * scaleYFactor);\r\n context.rotate(element.angle * scaleXFactor * scaleYFactor);\r\n context.drawImage(elementWithCanvas.canvas, (-(x2 - x1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, (-(y2 - y1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.width / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.height / elementWithCanvas.canvasZoom);\r\n context.restore();\r\n // Clear the nested element we appended to the DOM\r\n};\r\nconst renderElement = (element, rc, context, renderOptimizations, sceneState) => {\r\n const generator = rc.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n context.save();\r\n context.translate(element.x + sceneState.scrollX, element.y + sceneState.scrollY);\r\n context.fillStyle = \"rgba(0, 0, 255, 0.10)\";\r\n context.fillRect(0, 0, element.width, element.height);\r\n context.restore();\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context, sceneState);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\":\r\n case \"line\":\r\n case \"arrow\":\r\n case \"image\":\r\n case \"text\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context, sceneState);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n default: {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\nconst roughSVGDrawWithPrecision = (rsvg, drawable, precision) => {\r\n if (typeof precision === \"undefined\") {\r\n return rsvg.draw(drawable);\r\n }\r\n const pshape = {\r\n sets: drawable.sets,\r\n shape: drawable.shape,\r\n options: Object.assign(Object.assign({}, drawable.options), { fixedDecimalPlaceDigits: precision }),\r\n };\r\n return rsvg.draw(pshape);\r\n};\r\nconst renderElementToSvg = (element, rsvg, svgRoot, files, offsetX, offsetY) => {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x2 - x1) / 2 - (element.x - x1);\r\n const cy = (y2 - y1) / 2 - (element.y - y1);\r\n const degree = (180 * element.angle) / Math.PI;\r\n const generator = rsvg.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n // Since this is used only during editing experience, which is canvas based,\r\n // this should not happen\r\n throw new Error(\"Selection rendering is not supported for SVG\");\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n generateElementShape(element, generator);\r\n const node = roughSVGDrawWithPrecision(rsvg, getShapeForElement(element), _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n const opacity = element.opacity / 100;\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"stroke-linecap\", \"round\");\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n case \"line\":\r\n case \"arrow\": {\r\n generateElementShape(element, generator);\r\n const group = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\r\n const opacity = element.opacity / 100;\r\n group.setAttribute(\"stroke-linecap\", \"round\");\r\n getShapeForElement(element).forEach((shape) => {\r\n const node = roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n if (element.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points) &&\r\n element.backgroundColor !== \"transparent\") {\r\n node.setAttribute(\"fill-rule\", \"evenodd\");\r\n }\r\n group.appendChild(node);\r\n });\r\n svgRoot.appendChild(group);\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const path = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"path\");\r\n node.setAttribute(\"stroke\", \"none\");\r\n node.setAttribute(\"fill\", element.strokeColor);\r\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\r\n node.appendChild(path);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n case \"image\": {\r\n const filter = svgRoot.getAttribute(\"filter\");\r\n const fileData = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) && files[element.fileId];\r\n if (fileData) {\r\n const symbolId = `image-${fileData.id}`;\r\n let symbol = svgRoot.querySelector(`#${symbolId}`);\r\n if (!symbol) {\r\n symbol = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"symbol\");\r\n symbol.id = symbolId;\r\n const image = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"image\");\r\n image.setAttribute(\"width\", \"100%\");\r\n image.setAttribute(\"height\", \"100%\");\r\n image.setAttribute(\"href\", fileData.dataURL);\r\n symbol.appendChild(image);\r\n svgRoot.prepend(symbol);\r\n }\r\n const use = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"use\");\r\n use.setAttribute(\"href\", `#${symbolId}`);\r\n //svgRoot filter causes bitmap image to be inverted\r\n //same filter needs to be added to revert the inversion\r\n //https://stackoverflow.com/questions/51154171/remove-css-filter-on-child-elements\r\n if (filter && fileData.mimeType !== \"image/svg+xml\") {\r\n use.setAttribute(\"filter\", filter);\r\n }\r\n use.setAttribute(\"width\", `${Math.round(element.width)}`);\r\n use.setAttribute(\"height\", `${Math.round(element.height)}`);\r\n use.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n svgRoot.appendChild(use);\r\n }\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n const direction = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text) ? \"rtl\" : \"ltr\";\r\n const textAnchor = element.textAlign === \"center\"\r\n ? \"middle\"\r\n : element.textAlign === \"right\" || direction === \"rtl\"\r\n ? \"end\"\r\n : \"start\";\r\n for (let i = 0; i < lines.length; i++) {\r\n const text = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"text\");\r\n text.textContent = lines[i];\r\n text.setAttribute(\"x\", `${horizontalOffset}`);\r\n text.setAttribute(\"y\", `${(i + 1) * lineHeight - verticalOffset}`);\r\n text.setAttribute(\"font-family\", (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontFamilyString)(element));\r\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\r\n text.setAttribute(\"fill\", element.strokeColor);\r\n text.setAttribute(\"text-anchor\", textAnchor);\r\n text.setAttribute(\"style\", \"white-space: pre;\");\r\n text.setAttribute(\"direction\", direction);\r\n node.appendChild(text);\r\n }\r\n svgRoot.appendChild(node);\r\n }\r\n else {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n};\r\nconst pathsCache = new WeakMap([]);\r\nfunction generateFreeDrawShape(element) {\r\n const svgPathData = getFreeDrawSvgPath(element);\r\n const path = new Path2D(svgPathData);\r\n pathsCache.set(element, path);\r\n return path;\r\n}\r\nfunction getFreeDrawPath2D(element) {\r\n return pathsCache.get(element);\r\n}\r\nfunction getFreeDrawSvgPath(element) {\r\n // If input points are empty (should they ever be?) return a dot\r\n const inputPoints = element.simulatePressure\r\n ? element.points\r\n : element.points.length\r\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\r\n : [[0, 0, 0.5]];\r\n // Consider changing the options for simulated pressure vs real pressure\r\n const options = {\r\n simulatePressure: element.simulatePressure,\r\n size: element.strokeWidth * 4.25,\r\n thinning: 0.6,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n easing: (t) => Math.sin((t * Math.PI) / 2),\r\n last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup\r\n };\r\n return getSvgPathFromStroke((0,perfect_freehand__WEBPACK_IMPORTED_MODULE_7__.getStroke)(inputPoints, options));\r\n}\r\nfunction med(A, B) {\r\n return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\r\n}\r\n// Trim SVG path data so number are each two decimal points. This\r\n// improves SVG exports, and prevents rendering errors on points\r\n// with long decimals.\r\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\r\nfunction getSvgPathFromStroke(points) {\r\n if (!points.length) {\r\n return \"\";\r\n }\r\n const max = points.length - 1;\r\n return points\r\n .reduce((acc, point, i, arr) => {\r\n if (i === max) {\r\n acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\r\n }\r\n else {\r\n acc.push(point, med(point, arr[i + 1]));\r\n }\r\n return acc;\r\n }, [\"M\", points[0], \"Q\"])\r\n .join(\" \")\r\n .replace(TO_FIXED_PRECISION, \"$1\");\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUN0QjtTQUNBLElBQUksQ0FBQyxHQUFHLENBQUM7U0FDVCxPQUFPLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50LnRzP2E2ZGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEFycm93aGVhZCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNUZXh0RWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50LFxuICBpc0ZyZWVEcmF3RWxlbWVudCxcbiAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RGlhbW9uZFBvaW50cyxcbiAgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLFxuICBnZXRBcnJvd2hlYWRQb2ludHMsXG59IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgUm91Z2hDYW52YXMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY2FudmFzXCI7XG5pbXBvcnQgeyBEcmF3YWJsZSwgT3B0aW9ucyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jb3JlXCI7XG5pbXBvcnQgeyBSb3VnaFNWRyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9zdmdcIjtcbmltcG9ydCB7IFJvdWdoR2VuZXJhdG9yIH0gZnJvbSBcInJvdWdoanMvYmluL2dlbmVyYXRvclwiO1xuaW1wb3J0IHsgU2NlbmVTdGF0ZSB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UsIGdldEZvbnRTdHJpbmcsIGdldEZvbnRGYW1pbHlTdHJpbmcsIGlzUlRMIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBpc1BhdGhBTG9vcCB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMsIFpvb20gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgTUFYX0RFQ0lNQUxTX0ZPUl9TVkdfRVhQT1JULCBNSU1FX1RZUEVTLCBTVkdfTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRTdHJva2UsIFN0cm9rZU9wdGlvbnMgfSBmcm9tIFwicGVyZmVjdC1mcmVlaGFuZFwiO1xuXG5jb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuY29uc3QgaXNQZW5kaW5nSW1hZ2VFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT5cbiAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAhc2NlbmVTdGF0ZS5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCk7XG5cbmNvbnN0IGdldERhc2hBcnJheURhc2hlZCA9IChzdHJva2VXaWR0aDogbnVtYmVyKSA9PiBbOCwgOCArIHN0cm9rZVdpZHRoXTtcblxuY29uc3QgZ2V0RGFzaEFycmF5RG90dGVkID0gKHN0cm9rZVdpZHRoOiBudW1iZXIpID0+IFsxLjUsIDYgKyBzdHJva2VXaWR0aF07XG5cbmNvbnN0IGdldENhbnZhc1BhZGRpbmcgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+XG4gIGVsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiID8gZWxlbWVudC5zdHJva2VXaWR0aCAqIDEyIDogMjA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjYWxpZHJhd0VsZW1lbnRXaXRoQ2FudmFzIHtcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHRoZW1lOiBTY2VuZVN0YXRlW1widGhlbWVcIl07XG4gIGNhbnZhc1pvb206IFpvb21bXCJ2YWx1ZVwiXTtcbiAgY2FudmFzT2Zmc2V0WDogbnVtYmVyO1xuICBjYW52YXNPZmZzZXRZOiBudW1iZXI7XG59XG5cbmNvbnN0IGdlbmVyYXRlRWxlbWVudENhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB6b29tOiBab29tLFxuICBzY2VuZVN0YXRlOiBTY2VuZVN0YXRlLFxuKTogRXhjYWxpZHJhd0VsZW1lbnRXaXRoQ2FudmFzID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcblxuICBsZXQgY2FudmFzT2Zmc2V0WCA9IDA7XG4gIGxldCBjYW52YXNPZmZzZXRZID0gMDtcblxuICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgbGV0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgICB4MSA9IE1hdGguZmxvb3IoeDEpO1xuICAgIHgyID0gTWF0aC5jZWlsKHgyKTtcbiAgICB5MSA9IE1hdGguZmxvb3IoeTEpO1xuICAgIHkyID0gTWF0aC5jZWlsKHkyKTtcblxuICAgIGNhbnZhcy53aWR0aCA9XG4gICAgICBkaXN0YW5jZSh4MSwgeDIpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlICtcbiAgICAgIHBhZGRpbmcgKiB6b29tLnZhbHVlICogMjtcbiAgICBjYW52YXMuaGVpZ2h0ID1cbiAgICAgIGRpc3RhbmNlKHkxLCB5MikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuXG4gICAgY2FudmFzT2Zmc2V0WCA9XG4gICAgICBlbGVtZW50LnggPiB4MVxuICAgICAgICA/IE1hdGguZmxvb3IoZGlzdGFuY2UoZWxlbWVudC54LCB4MSkpICpcbiAgICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqXG4gICAgICAgICAgem9vbS52YWx1ZVxuICAgICAgICA6IDA7XG5cbiAgICBjYW52YXNPZmZzZXRZID1cbiAgICAgIGVsZW1lbnQueSA+IHkxXG4gICAgICAgID8gTWF0aC5mbG9vcihkaXN0YW5jZShlbGVtZW50LnksIHkxKSkgKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICpcbiAgICAgICAgICB6b29tLnZhbHVlXG4gICAgICAgIDogMDtcblxuICAgIGNvbnRleHQudHJhbnNsYXRlKGNhbnZhc09mZnNldFgsIGNhbnZhc09mZnNldFkpO1xuICB9IGVsc2Uge1xuICAgIGNhbnZhcy53aWR0aCA9XG4gICAgICBlbGVtZW50LndpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlICtcbiAgICAgIHBhZGRpbmcgKiB6b29tLnZhbHVlICogMjtcbiAgICBjYW52YXMuaGVpZ2h0ID1cbiAgICAgIGVsZW1lbnQuaGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlICtcbiAgICAgIHBhZGRpbmcgKiB6b29tLnZhbHVlICogMjtcbiAgfVxuXG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnRyYW5zbGF0ZShwYWRkaW5nICogem9vbS52YWx1ZSwgcGFkZGluZyAqIHpvb20udmFsdWUpO1xuICBjb250ZXh0LnNjYWxlKFxuICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogem9vbS52YWx1ZSxcbiAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUsXG4gICk7XG5cbiAgY29uc3QgcmMgPSByb3VnaC5jYW52YXMoY2FudmFzKTtcblxuICBpZiAoXG4gICAgc2NlbmVTdGF0ZS50aGVtZSA9PT0gXCJkYXJrXCIgJiZcbiAgICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmXG4gICAgIWlzUGVuZGluZ0ltYWdlRWxlbWVudChlbGVtZW50LCBzY2VuZVN0YXRlKSAmJlxuICAgIHNjZW5lU3RhdGUuaW1hZ2VDYWNoZS5nZXQoZWxlbWVudC5maWxlSWQpPy5taW1lVHlwZSAhPT0gTUlNRV9UWVBFUy5zdmdcbiAgKSB7XG4gICAgLy8gdXNpbmcgYSBzdHJvbmdlciBpbnZlcnQgKDEwMCUgdnMgb3VyIHJlZ3VsYXIgOTMlKSBhbmQgc2F0dXJhdGVcbiAgICAvLyBhcyBhIHRlbXAgaGFjayB0byBtYWtlIGltYWdlcyBpbiBkYXJrIHRoZW1lIGxvb2sgY2xvc2VyIHRvIG9yaWdpbmFsXG4gICAgLy8gY29sb3Igc2NoZW1lIChpdCdzIHN0aWxsIG5vdCBxdWl0ZSB0aGVyZSBhbmQgdGhlIGNsb3JzIGxvb2sgc2xpZ2h0bHlcbiAgICAvLyBkZXNhdHVyaW5nL2JsYWNrIGlzIG5vdCBhcyBibGFjaywgYnV0Li4uKVxuICAgIGNvbnRleHQuZmlsdGVyID0gXCJpbnZlcnQoMTAwJSkgaHVlLXJvdGF0ZSgxODBkZWcpIHNhdHVyYXRlKDEuMjUpXCI7XG4gIH1cblxuICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICB0aGVtZTogc2NlbmVTdGF0ZS50aGVtZSxcbiAgICBjYW52YXNab29tOiB6b29tLnZhbHVlLFxuICAgIGNhbnZhc09mZnNldFgsXG4gICAgY2FudmFzT2Zmc2V0WSxcbiAgfTtcbn07XG5cbmNvbnN0IElNQUdFX1BMQUNFSE9MREVSX0lNRyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5JTUFHRV9QTEFDRUhPTERFUl9JTUcuc3JjID0gYGRhdGE6JHtNSU1FX1RZUEVTLnN2Z30sJHtlbmNvZGVVUklDb21wb25lbnQoXG4gIGA8c3ZnIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZvY3VzYWJsZT1cImZhbHNlXCIgZGF0YS1wcmVmaXg9XCJmYXNcIiBkYXRhLWljb249XCJpbWFnZVwiIGNsYXNzPVwic3ZnLWlubGluZS0tZmEgZmEtaW1hZ2UgZmEtdy0xNlwiIHJvbGU9XCJpbWdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+PHBhdGggZmlsbD1cIiM4ODhcIiBkPVwiTTQ2NCA0NDhINDhjLTI2LjUxIDAtNDgtMjEuNDktNDgtNDhWMTEyYzAtMjYuNTEgMjEuNDktNDggNDgtNDhoNDE2YzI2LjUxIDAgNDggMjEuNDkgNDggNDh2Mjg4YzAgMjYuNTEtMjEuNDkgNDgtNDggNDh6TTExMiAxMjBjLTMwLjkyOCAwLTU2IDI1LjA3Mi01NiA1NnMyNS4wNzIgNTYgNTYgNTYgNTYtMjUuMDcyIDU2LTU2LTI1LjA3Mi01Ni01Ni01NnpNNjQgMzg0aDM4NFYyNzJsLTg3LjUxNS04Ny41MTVjLTQuNjg2LTQuNjg2LTEyLjI4NC00LjY4Ni0xNi45NzEgMEwyMDggMzIwbC01NS41MTUtNTUuNTE1Yy00LjY4Ni00LjY4Ni0xMi4yODQtNC42ODYtMTYuOTcxIDBMNjQgMzM2djQ4elwiPjwvcGF0aD48L3N2Zz5gLFxuKX1gO1xuXG5jb25zdCBJTUFHRV9FUlJPUl9QTEFDRUhPTERFUl9JTUcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuSU1BR0VfRVJST1JfUExBQ0VIT0xERVJfSU1HLnNyYyA9IGBkYXRhOiR7TUlNRV9UWVBFUy5zdmd9LCR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICBgPHN2ZyB2aWV3Qm94PVwiMCAwIDY2OCA2NjhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBzdHlsZT1cImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoyXCI+PHBhdGggZD1cIk00NjQgNDQ4SDQ4Yy0yNi41MSAwLTQ4LTIxLjQ5LTQ4LTQ4VjExMmMwLTI2LjUxIDIxLjQ5LTQ4IDQ4LTQ4aDQxNmMyNi41MSAwIDQ4IDIxLjQ5IDQ4IDQ4djI4OGMwIDI2LjUxLTIxLjQ5IDQ4LTQ4IDQ4Wk0xMTIgMTIwYy0zMC45MjggMC01NiAyNS4wNzItNTYgNTZzMjUuMDcyIDU2IDU2IDU2IDU2LTI1LjA3MiA1Ni01Ni0yNS4wNzItNTYtNTYtNTZaTTY0IDM4NGgzODRWMjcybC04Ny41MTUtODcuNTE1Yy00LjY4Ni00LjY4Ni0xMi4yODQtNC42ODYtMTYuOTcxIDBMMjA4IDMyMGwtNTUuNTE1LTU1LjUxNWMtNC42ODYtNC42ODYtMTIuMjg0LTQuNjg2LTE2Ljk3MSAwTDY0IDMzNnY0OFpcIiBzdHlsZT1cImZpbGw6Izg4ODtmaWxsLXJ1bGU6bm9uemVyb1wiIHRyYW5zZm9ybT1cIm1hdHJpeCguODE3MDkgMCAwIC44MTcwOSAxMjQuODI1IDE0NS44MjUpXCIvPjxwYXRoIGQ9XCJNMjU2IDhDMTE5LjAzNCA4IDggMTE5LjAzMyA4IDI1NmMwIDEzNi45NjcgMTExLjAzNCAyNDggMjQ4IDI0OHMyNDgtMTExLjAzNCAyNDgtMjQ4UzM5Mi45NjcgOCAyNTYgOFptMTMwLjEwOCAxMTcuODkyYzY1LjQ0OCA2NS40NDggNzAgMTY1LjQ4MSAyMC42NzcgMjM1LjYzN0wxNTAuNDcgMTA1LjIxNmM3MC4yMDQtNDkuMzU2IDE3MC4yMjYtNDQuNzM1IDIzNS42MzggMjAuNjc2Wk0xMjUuODkyIDM4Ni4xMDhjLTY1LjQ0OC02NS40NDgtNzAtMTY1LjQ4MS0yMC42NzctMjM1LjYzN0wzNjEuNTMgNDA2Ljc4NGMtNzAuMjAzIDQ5LjM1Ni0xNzAuMjI2IDQ0LjczNi0yMzUuNjM4LTIwLjY3NlpcIiBzdHlsZT1cImZpbGw6Izg4ODtmaWxsLXJ1bGU6bm9uemVyb1wiIHRyYW5zZm9ybT1cIm1hdHJpeCguMzAzNjYgMCAwIC4zMDM2NiA1MDYuODIyIDYwLjA2NSlcIi8+PC9zdmc+YCxcbil9YDtcblxuY29uc3QgZHJhd0ltYWdlUGxhY2Vob2xkZXIgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgem9vbVZhbHVlOiBBcHBTdGF0ZVtcInpvb21cIl1bXCJ2YWx1ZVwiXSxcbikgPT4ge1xuICBjb250ZXh0LmZpbGxTdHlsZSA9IFwiI0U3RTdFN1wiO1xuICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcblxuICBjb25zdCBpbWFnZU1pbldpZHRoT3JIZWlnaHQgPSBNYXRoLm1pbihlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG5cbiAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKFxuICAgIGltYWdlTWluV2lkdGhPckhlaWdodCxcbiAgICBNYXRoLm1pbihpbWFnZU1pbldpZHRoT3JIZWlnaHQgKiAwLjQsIDEwMCksXG4gICk7XG5cbiAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgZWxlbWVudC5zdGF0dXMgPT09IFwiZXJyb3JcIlxuICAgICAgPyBJTUFHRV9FUlJPUl9QTEFDRUhPTERFUl9JTUdcbiAgICAgIDogSU1BR0VfUExBQ0VIT0xERVJfSU1HLFxuICAgIGVsZW1lbnQud2lkdGggLyAyIC0gc2l6ZSAvIDIsXG4gICAgZWxlbWVudC5oZWlnaHQgLyAyIC0gc2l6ZSAvIDIsXG4gICAgc2l6ZSxcbiAgICBzaXplLFxuICApO1xufTtcblxuY29uc3QgZHJhd0VsZW1lbnRPbkNhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gZWxlbWVudC5vcGFjaXR5IC8gMTAwO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6IHtcbiAgICAgIGNvbnRleHQubGluZUpvaW4gPSBcInJvdW5kXCI7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSBcInJvdW5kXCI7XG4gICAgICByYy5kcmF3KGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSBhcyBEcmF3YWJsZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgY2FzZSBcImxpbmVcIjoge1xuICAgICAgY29udGV4dC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9IFwicm91bmRcIjtcblxuICAgICAgKGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSBhcyBEcmF3YWJsZVtdKS5mb3JFYWNoKChzaGFwZSkgPT4ge1xuICAgICAgICByYy5kcmF3KHNoYXBlKTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICAvLyBEcmF3IGRpcmVjdGx5IHRvIGNhbnZhc1xuICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGVsZW1lbnQuc3Ryb2tlQ29sb3I7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBnZXRGcmVlRHJhd1BhdGgyRChlbGVtZW50KSBhcyBQYXRoMkQ7XG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcblxuICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImltYWdlXCI6IHtcbiAgICAgIGNvbnN0IGltZyA9IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudClcbiAgICAgICAgPyBzY2VuZVN0YXRlLmltYWdlQ2FjaGUuZ2V0KGVsZW1lbnQuZmlsZUlkKT8uaW1hZ2VcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoaW1nICE9IG51bGwgJiYgIShpbWcgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgICBpbWcsXG4gICAgICAgICAgMCAvKiBoYXJkY29kZWQgZm9yIHRoZSBzZWxlY3Rpb24gYm94Ki8sXG4gICAgICAgICAgMCxcbiAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhd0ltYWdlUGxhY2Vob2xkZXIoZWxlbWVudCwgY29udGV4dCwgc2NlbmVTdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBydGwgPSBpc1JUTChlbGVtZW50LnRleHQpO1xuICAgICAgICBjb25zdCBzaG91bGRUZW1wb3JhcmlseUF0dGFjaCA9IHJ0bCAmJiAhY29udGV4dC5jYW52YXMuaXNDb25uZWN0ZWQ7XG4gICAgICAgIGlmIChzaG91bGRUZW1wb3JhcmlseUF0dGFjaCkge1xuICAgICAgICAgIC8vIHRvIGNvcnJlY3RseSByZW5kZXIgUlRMIHRleHQgbWl4ZWQgd2l0aCBMVFIsIHdlIGhhdmUgdG8gYXBwZW5kIGl0XG4gICAgICAgICAgLy8gdG8gdGhlIERPTVxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGV4dC5jYW52YXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY2FudmFzLnNldEF0dHJpYnV0ZShcImRpclwiLCBydGwgPyBcInJ0bFwiIDogXCJsdHJcIik7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LmZvbnQgPSBnZXRGb250U3RyaW5nKGVsZW1lbnQpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGVsZW1lbnQuc3Ryb2tlQ29sb3I7XG4gICAgICAgIGNvbnRleHQudGV4dEFsaWduID0gZWxlbWVudC50ZXh0QWxpZ24gYXMgQ2FudmFzVGV4dEFsaWduO1xuXG4gICAgICAgIC8vIENhbnZhcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpbGluZSB0ZXh0IGJ5IGRlZmF1bHRcbiAgICAgICAgY29uc3QgbGluZXMgPSBlbGVtZW50LnRleHQucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldCA9IGVsZW1lbnQuaGVpZ2h0IC0gZWxlbWVudC5iYXNlbGluZTtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9XG4gICAgICAgICAgZWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aCAvIDJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgICAgbGluZXNbaW5kZXhdLFxuICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgICAgICAgIChpbmRleCArIDEpICogbGluZUhlaWdodCAtIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIGlmIChzaG91bGRUZW1wb3JhcmlseUF0dGFjaCkge1xuICAgICAgICAgIGNvbnRleHQuY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQgdHlwZSAke2VsZW1lbnQudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG59O1xuXG5jb25zdCBlbGVtZW50V2l0aENhbnZhc0NhY2hlID0gbmV3IFdlYWtNYXA8XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXNcbj4oKTtcblxuY29uc3Qgc2hhcGVDYWNoZSA9IG5ldyBXZWFrTWFwPFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRHJhd2FibGUgfCBEcmF3YWJsZVtdIHwgbnVsbFxuPigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hhcGVGb3JFbGVtZW50ID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PlxuICBzaGFwZUNhY2hlLmdldChlbGVtZW50KTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+XG4gIHNoYXBlQ2FjaGUuZGVsZXRlKGVsZW1lbnQpO1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3VnaE9wdGlvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBjb250aW51b3VzUGF0aCA9IGZhbHNlLFxuKTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgc2VlZDogZWxlbWVudC5zZWVkLFxuICAgIHN0cm9rZUxpbmVEYXNoOlxuICAgICAgZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkYXNoZWRcIlxuICAgICAgICA/IGdldERhc2hBcnJheURhc2hlZChlbGVtZW50LnN0cm9rZVdpZHRoKVxuICAgICAgICA6IGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFwiZG90dGVkXCJcbiAgICAgICAgPyBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgLy8gZm9yIG5vbi1zb2xpZCBzdHJva2VzLCBkaXNhYmxlIG11bHRpU3Ryb2tlIGJlY2F1c2UgaXQgdGVuZHMgdG8gbWFrZVxuICAgIC8vIGRhc2hlcy9kb3RzIG92ZXJsYXkgZWFjaCBvdGhlclxuICAgIGRpc2FibGVNdWx0aVN0cm9rZTogZWxlbWVudC5zdHJva2VTdHlsZSAhPT0gXCJzb2xpZFwiLFxuICAgIC8vIGZvciBub24tc29saWQgc3Ryb2tlcywgaW5jcmVhc2UgdGhlIHdpZHRoIGEgYml0IHRvIG1ha2UgaXQgdmlzdWFsbHlcbiAgICAvLyBzaW1pbGFyIHRvIHNvbGlkIHN0cm9rZXMsIGJlY2F1c2Ugd2UncmUgYWxzbyBkaXNhYmxpbmcgbXVsdGlTdHJva2VcbiAgICBzdHJva2VXaWR0aDpcbiAgICAgIGVsZW1lbnQuc3Ryb2tlU3R5bGUgIT09IFwic29saWRcIlxuICAgICAgICA/IGVsZW1lbnQuc3Ryb2tlV2lkdGggKyAwLjVcbiAgICAgICAgOiBlbGVtZW50LnN0cm9rZVdpZHRoLFxuICAgIC8vIHdoZW4gaW5jcmVhc2luZyBzdHJva2VXaWR0aCwgd2UgbXVzdCBleHBsaWNpdGx5IHNldCBmaWxsV2VpZ2h0IGFuZFxuICAgIC8vIGhhY2h1cmVHYXAgYmVjYXVzZSBpZiBub3Qgc3BlY2lmaWVkLCByb3VnaGpzIHVzZXMgc3Ryb2tlV2lkdGggdG9cbiAgICAvLyBjYWxjdWxhdGUgdGhlbSAoYW5kIHdlIGRvbid0IHdhbnQgdGhlIGZpbGxzIHRvIGJlIG1vZGlmaWVkKVxuICAgIGZpbGxXZWlnaHQ6IGVsZW1lbnQuc3Ryb2tlV2lkdGggLyAyLFxuICAgIGhhY2h1cmVHYXA6IGVsZW1lbnQuc3Ryb2tlV2lkdGggKiA0LFxuICAgIHJvdWdobmVzczogZWxlbWVudC5yb3VnaG5lc3MsXG4gICAgc3Ryb2tlOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgIHByZXNlcnZlVmVydGljZXM6IGNvbnRpbnVvdXNQYXRoLFxuICAgIC8vIGRpc2FibGUgZGVjaW1hbHMgdG8gZml4IFNraWEgcmVuZGVyaW5nIGlzc3VlcyAjNDA0NlxuICAgIGZpeGVkRGVjaW1hbFBsYWNlRGlnaXRzOiAwLFxuICB9O1xuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgb3B0aW9ucy5maWxsU3R5bGUgPSBlbGVtZW50LmZpbGxTdHlsZTtcbiAgICAgIG9wdGlvbnMuZmlsbCA9XG4gICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgICAgICBvcHRpb25zLmN1cnZlRml0dGluZyA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgY2FzZSBcImxpbmVcIjoge1xuICAgICAgaWYgKGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSkge1xuICAgICAgICBvcHRpb25zLmZpbGxTdHlsZSA9IGVsZW1lbnQuZmlsbFN0eWxlO1xuICAgICAgICBvcHRpb25zLmZpbGwgPVxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOlxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZWxlbWVudCdzIHNoYXBlIGFuZCBwdXRzIGl0IGludG8gdGhlIGNhY2hlLlxuICogQHBhcmFtIGVsZW1lbnRcbiAqIEBwYXJhbSBnZW5lcmF0b3JcbiAqL1xuY29uc3QgZ2VuZXJhdGVFbGVtZW50U2hhcGUgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgZ2VuZXJhdG9yOiBSb3VnaEdlbmVyYXRvcixcbikgPT4ge1xuICBsZXQgc2hhcGUgPSBzaGFwZUNhY2hlLmdldChlbGVtZW50KSB8fCBudWxsO1xuXG4gIGlmICghc2hhcGUpIHtcbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLmRlbGV0ZShlbGVtZW50KTtcblxuICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgICAgIGlmIChlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJyb3VuZFwiKSB7XG4gICAgICAgICAgY29uc3QgdyA9IGVsZW1lbnQud2lkdGg7XG4gICAgICAgICAgY29uc3QgaCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLm1pbih3LCBoKSAqIDAuMjU7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucGF0aChcbiAgICAgICAgICAgIGBNICR7cn0gMCBMICR7dyAtIHJ9IDAgUSAke3d9IDAsICR7d30gJHtyfSBMICR7d30gJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gUSAke3d9ICR7aH0sICR7dyAtIHJ9ICR7aH0gTCAke3J9ICR7aH0gUSAwICR7aH0sIDAgJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gTCAwICR7cn0gUSAwIDAsICR7cn0gMGAsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50LCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnJlY3RhbmdsZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkaWFtb25kXCI6IHtcbiAgICAgICAgY29uc3QgW3RvcFgsIHRvcFksIHJpZ2h0WCwgcmlnaHRZLCBib3R0b21YLCBib3R0b21ZLCBsZWZ0WCwgbGVmdFldID1cbiAgICAgICAgICBnZXREaWFtb25kUG9pbnRzKGVsZW1lbnQpO1xuICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wb2x5Z29uKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFt0b3BYLCB0b3BZXSxcbiAgICAgICAgICAgIFtyaWdodFgsIHJpZ2h0WV0sXG4gICAgICAgICAgICBbYm90dG9tWCwgYm90dG9tWV0sXG4gICAgICAgICAgICBbbGVmdFgsIGxlZnRZXSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLmVsbGlwc2UoXG4gICAgICAgICAgZWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgZWxlbWVudC5oZWlnaHQgLyAyLFxuICAgICAgICAgIGVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgZWxlbWVudC5oZWlnaHQsXG4gICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgIGNhc2UgXCJhcnJvd1wiOiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KTtcblxuICAgICAgICAvLyBwb2ludHMgYXJyYXkgY2FuIGJlIGVtcHR5IGluIHRoZSBiZWdpbm5pbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0byBhZGRcbiAgICAgICAgLy8gaW5pdGlhbCBwb3NpdGlvbiB0byBpdFxuICAgICAgICBjb25zdCBwb2ludHMgPSBlbGVtZW50LnBvaW50cy5sZW5ndGggPyBlbGVtZW50LnBvaW50cyA6IFtbMCwgMF1dO1xuXG4gICAgICAgIC8vIGN1cnZlIGlzIGFsd2F5cyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAvLyB0aGlzIHNpbXBsaWZpZXMgZmluZGluZyB0aGUgY3VydmUgZm9yIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKGVsZW1lbnQuc3Ryb2tlU2hhcnBuZXNzID09PSBcInNoYXJwXCIpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5maWxsKSB7XG4gICAgICAgICAgICBzaGFwZSA9IFtnZW5lcmF0b3IucG9seWdvbihwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBvcHRpb25zKV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlID0gW1xuICAgICAgICAgICAgICBnZW5lcmF0b3IubGluZWFyUGF0aChwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBvcHRpb25zKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gW2dlbmVyYXRvci5jdXJ2ZShwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBvcHRpb25zKV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbGluZXMgb25seSBpbiBhcnJvd1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImFycm93XCIpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXJ0QXJyb3doZWFkID0gbnVsbCwgZW5kQXJyb3doZWFkID0gXCJhcnJvd1wiIH0gPSBlbGVtZW50O1xuXG4gICAgICAgICAgY29uc3QgZ2V0QXJyb3doZWFkU2hhcGVzID0gKFxuICAgICAgICAgICAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICBzaGFwZTogRHJhd2FibGVbXSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiLFxuICAgICAgICAgICAgYXJyb3doZWFkOiBBcnJvd2hlYWQsXG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcnJvd2hlYWRQb2ludHMgPSBnZXRBcnJvd2hlYWRQb2ludHMoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHNoYXBlLFxuICAgICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgICAgYXJyb3doZWFkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGFycm93aGVhZFBvaW50cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE90aGVyIGFycm93aGVhZHMgaGVyZS4uLlxuICAgICAgICAgICAgaWYgKGFycm93aGVhZCA9PT0gXCJkb3RcIikge1xuICAgICAgICAgICAgICBjb25zdCBbeCwgeSwgcl0gPSBhcnJvd2hlYWRQb2ludHM7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3IuY2lyY2xlKHgsIHksIHIsIHtcbiAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICBmaWxsOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCIsXG4gICAgICAgICAgICAgICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkID09PSBcInRyaWFuZ2xlXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgW3gsIHksIHgyLCB5MiwgeDMsIHkzXSA9IGFycm93aGVhZFBvaW50cztcblxuICAgICAgICAgICAgICAvLyBhbHdheXMgdXNlIHNvbGlkIHN0cm9rZSBmb3IgdHJpYW5nbGUgYXJyb3doZWFkXG4gICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnN0cm9rZUxpbmVEYXNoO1xuXG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yLnBvbHlnb24oXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIFt4LCB5XSxcbiAgICAgICAgICAgICAgICAgICAgW3gyLCB5Ml0sXG4gICAgICAgICAgICAgICAgICAgIFt4MywgeTNdLFxuICAgICAgICAgICAgICAgICAgICBbeCwgeV0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXJyb3cgYXJyb3doZWFkc1xuICAgICAgICAgICAgY29uc3QgW3gyLCB5MiwgeDMsIHkzLCB4NCwgeTRdID0gYXJyb3doZWFkUG9pbnRzO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkb3R0ZWRcIikge1xuICAgICAgICAgICAgICAvLyBmb3IgZG90dGVkIGFycm93cyBjYXBzLCByZWR1Y2UgZ2FwIHRvIG1ha2UgaXQgbW9yZSBsZWdpYmxlXG4gICAgICAgICAgICAgIGNvbnN0IGRhc2ggPSBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICBvcHRpb25zLnN0cm9rZUxpbmVEYXNoID0gW2Rhc2hbMF0sIGRhc2hbMV0gLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciBzb2xpZC9kYXNoZWQsIGtlZXAgc29saWQgYXJyb3cgY2FwXG4gICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnN0cm9rZUxpbmVEYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yLmxpbmUoeDMsIHkzLCB4MiwgeTIsIG9wdGlvbnMpLFxuICAgICAgICAgICAgICBnZW5lcmF0b3IubGluZSh4NCwgeTQsIHgyLCB5Miwgb3B0aW9ucyksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoc3RhcnRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIFwic3RhcnRcIixcbiAgICAgICAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2hhcGUucHVzaCguLi5zaGFwZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBIZXksIHdlIGhhdmUgYW4gb2xkIGFycm93IGhlcmUhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIFwiZW5kXCIsXG4gICAgICAgICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaGFwZS5wdXNoKC4uLnNoYXBlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgICBnZW5lcmF0ZUZyZWVEcmF3U2hhcGUoZWxlbWVudCk7XG4gICAgICAgIHNoYXBlID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgIGNhc2UgXCJpbWFnZVwiOiB7XG4gICAgICAgIC8vIGp1c3QgdG8gZW5zdXJlIHdlIGRvbid0IHJlZ2VuZXJhdGUgZWxlbWVudC5jYW52YXMgb24gcmVyZW5kZXJzXG4gICAgICAgIHNoYXBlID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBzaGFwZUNhY2hlLnNldChlbGVtZW50LCBzaGFwZSk7XG4gIH1cbn07XG5cbmNvbnN0IGdlbmVyYXRlRWxlbWVudFdpdGhDYW52YXMgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb25zdCB6b29tOiBab29tID0gc2NlbmVTdGF0ZSA/IHNjZW5lU3RhdGUuem9vbSA6IGRlZmF1bHRBcHBTdGF0ZS56b29tO1xuICBjb25zdCBwcmV2RWxlbWVudFdpdGhDYW52YXMgPSBlbGVtZW50V2l0aENhbnZhc0NhY2hlLmdldChlbGVtZW50KTtcbiAgY29uc3Qgc2hvdWxkUmVnZW5lcmF0ZUJlY2F1c2Vab29tID1cbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMgJiZcbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSAhPT0gem9vbS52YWx1ZSAmJlxuICAgICFzY2VuZVN0YXRlPy5zaG91bGRDYWNoZUlnbm9yZVpvb207XG5cbiAgaWYgKFxuICAgICFwcmV2RWxlbWVudFdpdGhDYW52YXMgfHxcbiAgICBzaG91bGRSZWdlbmVyYXRlQmVjYXVzZVpvb20gfHxcbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMudGhlbWUgIT09IHNjZW5lU3RhdGUudGhlbWVcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRDYW52YXMoZWxlbWVudCwgem9vbSwgc2NlbmVTdGF0ZSk7XG5cbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLnNldChlbGVtZW50LCBlbGVtZW50V2l0aENhbnZhcyk7XG5cbiAgICByZXR1cm4gZWxlbWVudFdpdGhDYW52YXM7XG4gIH1cbiAgcmV0dXJuIHByZXZFbGVtZW50V2l0aENhbnZhcztcbn07XG5cbmNvbnN0IGRyYXdFbGVtZW50RnJvbUNhbnZhcyA9IChcbiAgZWxlbWVudFdpdGhDYW52YXM6IEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhcyxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4pID0+IHtcbiAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRXaXRoQ2FudmFzLmVsZW1lbnQ7XG4gIGNvbnN0IHBhZGRpbmcgPSBnZXRDYW52YXNQYWRkaW5nKGVsZW1lbnQpO1xuICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAvLyBGcmVlIGRyYXcgZWxlbWVudHMgd2lsbCBvdGhlcndpc2UgXCJzaHVmZmxlXCIgYXMgdGhlIG1pbiB4IGFuZCB5IGNoYW5nZVxuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICB4MSA9IE1hdGguZmxvb3IoeDEpO1xuICAgIHgyID0gTWF0aC5jZWlsKHgyKTtcbiAgICB5MSA9IE1hdGguZmxvb3IoeTEpO1xuICAgIHkyID0gTWF0aC5jZWlsKHkyKTtcbiAgfVxuXG4gIGNvbnN0IGN4ID0gKCh4MSArIHgyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFgpICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gIGNvbnN0IGN5ID0gKCh5MSArIHkyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFkpICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG5cbiAgY29uc3QgX2lzUGVuZGluZ0ltYWdlRWxlbWVudCA9IGlzUGVuZGluZ0ltYWdlRWxlbWVudChlbGVtZW50LCBzY2VuZVN0YXRlKTtcblxuICBjb25zdCBzY2FsZVhGYWN0b3IgPVxuICAgIFwic2NhbGVcIiBpbiBlbGVtZW50V2l0aENhbnZhcy5lbGVtZW50ICYmICFfaXNQZW5kaW5nSW1hZ2VFbGVtZW50XG4gICAgICA/IGVsZW1lbnRXaXRoQ2FudmFzLmVsZW1lbnQuc2NhbGVbMF1cbiAgICAgIDogMTtcbiAgY29uc3Qgc2NhbGVZRmFjdG9yID1cbiAgICBcInNjYWxlXCIgaW4gZWxlbWVudFdpdGhDYW52YXMuZWxlbWVudCAmJiAhX2lzUGVuZGluZ0ltYWdlRWxlbWVudFxuICAgICAgPyBlbGVtZW50V2l0aENhbnZhcy5lbGVtZW50LnNjYWxlWzFdXG4gICAgICA6IDE7XG5cbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc2NhbGUoXG4gICAgKDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKiBzY2FsZVhGYWN0b3IsXG4gICAgKDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKiBzY2FsZVlGYWN0b3IsXG4gICk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4ICogc2NhbGVYRmFjdG9yLCBjeSAqIHNjYWxlWUZhY3Rvcik7XG4gIGNvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUgKiBzY2FsZVhGYWN0b3IgKiBzY2FsZVlGYWN0b3IpO1xuXG4gIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEsXG4gICAgKC0oeDIgLSB4MSkgLyAyKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgIChwYWRkaW5nICogZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSkgLyBlbGVtZW50V2l0aENhbnZhcy5jYW52YXNab29tLFxuICAgICgtKHkyIC0geTEpIC8gMikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtXG4gICAgICAocGFkZGluZyAqIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhc1pvb20pIC8gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSxcbiAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLndpZHRoIC8gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSxcbiAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLmhlaWdodCAvIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhc1pvb20sXG4gICk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xuXG4gIC8vIENsZWFyIHRoZSBuZXN0ZWQgZWxlbWVudCB3ZSBhcHBlbmRlZCB0byB0aGUgRE9NXG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVuZGVyT3B0aW1pemF0aW9uczogYm9vbGVhbixcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSByYy5nZW5lcmF0b3I7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKFxuICAgICAgICBlbGVtZW50LnggKyBzY2VuZVN0YXRlLnNjcm9sbFgsXG4gICAgICAgIGVsZW1lbnQueSArIHNjZW5lU3RhdGUuc2Nyb2xsWSxcbiAgICAgICk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwicmdiYSgwLCAwLCAyNTUsIDAuMTApXCI7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuXG4gICAgICBpZiAocmVuZGVyT3B0aW1pemF0aW9ucykge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aENhbnZhcyA9IGdlbmVyYXRlRWxlbWVudFdpdGhDYW52YXMoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBzY2VuZVN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBkcmF3RWxlbWVudEZyb21DYW52YXMoZWxlbWVudFdpdGhDYW52YXMsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMiArIHNjZW5lU3RhdGUuc2Nyb2xsWDtcbiAgICAgICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyICsgc2NlbmVTdGF0ZS5zY3JvbGxZO1xuICAgICAgICBjb25zdCBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgY29uc3Qgc2hpZnRZID0gKHkyIC0geTEpIC8gMiAtIChlbGVtZW50LnkgLSB5MSk7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgICBjb250ZXh0LnJvdGF0ZShlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoLXNoaWZ0WCwgLXNoaWZ0WSk7XG4gICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgcmMsIGNvbnRleHQsIHNjZW5lU3RhdGUpO1xuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuICAgICAgaWYgKHJlbmRlck9wdGltaXphdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRXaXRoQ2FudmFzKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgc2NlbmVTdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgZHJhd0VsZW1lbnRGcm9tQ2FudmFzKGVsZW1lbnRXaXRoQ2FudmFzLCByYywgY29udGV4dCwgc2NlbmVTdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFg7XG4gICAgICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMiArIHNjZW5lU3RhdGUuc2Nyb2xsWTtcbiAgICAgICAgY29uc3Qgc2hpZnRYID0gKHgyIC0geDEpIC8gMiAtIChlbGVtZW50LnggLSB4MSk7XG4gICAgICAgIGNvbnN0IHNoaWZ0WSA9ICh5MiAtIHkxKSAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuICAgICAgICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uID0gKFxuICByc3ZnOiBSb3VnaFNWRyxcbiAgZHJhd2FibGU6IERyYXdhYmxlLFxuICBwcmVjaXNpb24/OiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBwcmVjaXNpb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gcnN2Zy5kcmF3KGRyYXdhYmxlKTtcbiAgfVxuICBjb25zdCBwc2hhcGU6IERyYXdhYmxlID0ge1xuICAgIHNldHM6IGRyYXdhYmxlLnNldHMsXG4gICAgc2hhcGU6IGRyYXdhYmxlLnNoYXBlLFxuICAgIG9wdGlvbnM6IHsgLi4uZHJhd2FibGUub3B0aW9ucywgZml4ZWREZWNpbWFsUGxhY2VEaWdpdHM6IHByZWNpc2lvbiB9LFxuICB9O1xuICByZXR1cm4gcnN2Zy5kcmF3KHBzaGFwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudFRvU3ZnID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJzdmc6IFJvdWdoU1ZHLFxuICBzdmdSb290OiBTVkdFbGVtZW50LFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIG9mZnNldFg/OiBudW1iZXIsXG4gIG9mZnNldFk/OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgY3ggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgY29uc3QgY3kgPSAoeTIgLSB5MSkgLyAyIC0gKGVsZW1lbnQueSAtIHkxKTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGVsZW1lbnQuYW5nbGUpIC8gTWF0aC5QSTtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcnN2Zy5nZW5lcmF0b3I7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGlzIHVzZWQgb25seSBkdXJpbmcgZWRpdGluZyBleHBlcmllbmNlLCB3aGljaCBpcyBjYW52YXMgYmFzZWQsXG4gICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3Rpb24gcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNWR1wiKTtcbiAgICB9XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGNvbnN0IG5vZGUgPSByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uKFxuICAgICAgICByc3ZnLFxuICAgICAgICBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGUsXG4gICAgICAgIE1BWF9ERUNJTUFMU19GT1JfU1ZHX0VYUE9SVCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gZWxlbWVudC5vcGFjaXR5IC8gMTAwO1xuICAgICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgfVxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtbGluZWNhcFwiLCBcInJvdW5kXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgIGB0cmFuc2xhdGUoJHtvZmZzZXRYIHx8IDB9ICR7XG4gICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICk7XG4gICAgICBzdmdSb290LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgIGdlbmVyYXRlRWxlbWVudFNoYXBlKGVsZW1lbnQsIGdlbmVyYXRvcik7XG4gICAgICBjb25zdCBncm91cCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJnXCIpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcInN0cm9rZS1saW5lY2FwXCIsIFwicm91bmRcIik7XG5cbiAgICAgIChnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGVbXSkuZm9yRWFjaCgoc2hhcGUpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24oXG4gICAgICAgICAgcnN2ZyxcbiAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgICAgfSkgcm90YXRlKCR7ZGVncmVlfSAke2N4fSAke2N5fSlgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICAgIGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSAmJlxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICBzdmdSb290LmFwcGVuZENoaWxkKGdyb3VwKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgY29uc3QgcGF0aCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJwYXRoXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJub25lXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGVsZW1lbnQuc3Ryb2tlQ29sb3IpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGdldEZyZWVEcmF3U3ZnUGF0aChlbGVtZW50KSk7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiaW1hZ2VcIjoge1xuICAgICAgY29uc3QgZmlsdGVyID0gc3ZnUm9vdC5nZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIik7XG4gICAgICBjb25zdCBmaWxlRGF0YSA9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZmlsZXNbZWxlbWVudC5maWxlSWRdO1xuICAgICAgaWYgKGZpbGVEYXRhKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbElkID0gYGltYWdlLSR7ZmlsZURhdGEuaWR9YDtcbiAgICAgICAgbGV0IHN5bWJvbCA9IHN2Z1Jvb3QucXVlcnlTZWxlY3RvcihgIyR7c3ltYm9sSWR9YCk7XG4gICAgICAgIGlmICghc3ltYm9sKSB7XG4gICAgICAgICAgc3ltYm9sID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN5bWJvbFwiKTtcbiAgICAgICAgICBzeW1ib2wuaWQgPSBzeW1ib2xJZDtcblxuICAgICAgICAgIGNvbnN0IGltYWdlID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImltYWdlXCIpO1xuXG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjEwMCVcIik7XG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBmaWxlRGF0YS5kYXRhVVJMKTtcblxuICAgICAgICAgIHN5bWJvbC5hcHBlbmRDaGlsZChpbWFnZSk7XG5cbiAgICAgICAgICBzdmdSb290LnByZXBlbmQoc3ltYm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZSA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJ1c2VcIik7XG4gICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtzeW1ib2xJZH1gKTtcblxuICAgICAgICAvL3N2Z1Jvb3QgZmlsdGVyIGNhdXNlcyBiaXRtYXAgaW1hZ2UgdG8gYmUgaW52ZXJ0ZWRcbiAgICAgICAgLy9zYW1lIGZpbHRlciBuZWVkcyB0byBiZSBhZGRlZCB0byByZXZlcnQgdGhlIGludmVyc2lvblxuICAgICAgICAvL2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUxMTU0MTcxL3JlbW92ZS1jc3MtZmlsdGVyLW9uLWNoaWxkLWVsZW1lbnRzXG4gICAgICAgIGlmIChmaWx0ZXIgJiYgZmlsZURhdGEubWltZVR5cGUgIT09IFwiaW1hZ2Uvc3ZnK3htbFwiKSB7XG4gICAgICAgICAgdXNlLnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBmaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke01hdGgucm91bmQoZWxlbWVudC53aWR0aCl9YCk7XG4gICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7TWF0aC5yb3VuZChlbGVtZW50LmhlaWdodCl9YCk7XG5cbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgIGB0cmFuc2xhdGUoJHtvZmZzZXRYIHx8IDB9ICR7XG4gICAgICAgICAgICBvZmZzZXRZIHx8IDBcbiAgICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICAgICk7XG5cbiAgICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZCh1c2UpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcInN0cm9rZS1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgIGB0cmFuc2xhdGUoJHtvZmZzZXRYIHx8IDB9ICR7XG4gICAgICAgICAgICBvZmZzZXRZIHx8IDBcbiAgICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZWxlbWVudC50ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBlbGVtZW50LmhlaWdodCAvIGxpbmVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmVydGljYWxPZmZzZXQgPSBlbGVtZW50LmhlaWdodCAtIGVsZW1lbnQuYmFzZWxpbmU7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IGVsZW1lbnQud2lkdGggLyAyXG4gICAgICAgICAgICA6IGVsZW1lbnQudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aFxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1JUTChlbGVtZW50LnRleHQpID8gXCJydGxcIiA6IFwibHRyXCI7XG4gICAgICAgIGNvbnN0IHRleHRBbmNob3IgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IFwibWlkZGxlXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIiB8fCBkaXJlY3Rpb24gPT09IFwicnRsXCJcbiAgICAgICAgICAgID8gXCJlbmRcIlxuICAgICAgICAgICAgOiBcInN0YXJ0XCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInRleHRcIik7XG4gICAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IGxpbmVzW2ldO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieFwiLCBgJHtob3Jpem9udGFsT2Zmc2V0fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieVwiLCBgJHsoaSArIDEpICogbGluZUhlaWdodCAtIHZlcnRpY2FsT2Zmc2V0fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZm9udC1mYW1pbHlcIiwgZ2V0Rm9udEZhbWlseVN0cmluZyhlbGVtZW50KSk7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJmb250LXNpemVcIiwgYCR7ZWxlbWVudC5mb250U2l6ZX1weGApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBlbGVtZW50LnN0cm9rZUNvbG9yKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcInRleHQtYW5jaG9yXCIsIHRleHRBbmNob3IpO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJ3aGl0ZS1zcGFjZTogcHJlO1wiKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcImRpcmVjdGlvblwiLCBkaXJlY3Rpb24pO1xuICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcGF0aHNDYWNoZSA9IG5ldyBXZWFrTWFwPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsIFBhdGgyRD4oW10pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgY29uc3Qgc3ZnUGF0aERhdGEgPSBnZXRGcmVlRHJhd1N2Z1BhdGgoZWxlbWVudCk7XG4gIGNvbnN0IHBhdGggPSBuZXcgUGF0aDJEKHN2Z1BhdGhEYXRhKTtcbiAgcGF0aHNDYWNoZS5zZXQoZWxlbWVudCwgcGF0aCk7XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJlZURyYXdQYXRoMkQoZWxlbWVudDogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCkge1xuICByZXR1cm4gcGF0aHNDYWNoZS5nZXQoZWxlbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcmVlRHJhd1N2Z1BhdGgoZWxlbWVudDogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCkge1xuICAvLyBJZiBpbnB1dCBwb2ludHMgYXJlIGVtcHR5IChzaG91bGQgdGhleSBldmVyIGJlPykgcmV0dXJuIGEgZG90XG4gIGNvbnN0IGlucHV0UG9pbnRzID0gZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgPyBlbGVtZW50LnBvaW50c1xuICAgIDogZWxlbWVudC5wb2ludHMubGVuZ3RoXG4gICAgPyBlbGVtZW50LnBvaW50cy5tYXAoKFt4LCB5XSwgaSkgPT4gW3gsIHksIGVsZW1lbnQucHJlc3N1cmVzW2ldXSlcbiAgICA6IFtbMCwgMCwgMC41XV07XG5cbiAgLy8gQ29uc2lkZXIgY2hhbmdpbmcgdGhlIG9wdGlvbnMgZm9yIHNpbXVsYXRlZCBwcmVzc3VyZSB2cyByZWFsIHByZXNzdXJlXG4gIGNvbnN0IG9wdGlvbnM6IFN0cm9rZU9wdGlvbnMgPSB7XG4gICAgc2ltdWxhdGVQcmVzc3VyZTogZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlLFxuICAgIHNpemU6IGVsZW1lbnQuc3Ryb2tlV2lkdGggKiA0LjI1LFxuICAgIHRoaW5uaW5nOiAwLjYsXG4gICAgc21vb3RoaW5nOiAwLjUsXG4gICAgc3RyZWFtbGluZTogMC41LFxuICAgIGVhc2luZzogKHQpID0+IE1hdGguc2luKCh0ICogTWF0aC5QSSkgLyAyKSwgLy8gaHR0cHM6Ly9lYXNpbmdzLm5ldC8jZWFzZU91dFNpbmVcbiAgICBsYXN0OiAhIWVsZW1lbnQubGFzdENvbW1pdHRlZFBvaW50LCAvLyBMYXN0Q29tbWl0dGVkUG9pbnQgaXMgYWRkZWQgb24gcG9pbnRlcnVwXG4gIH07XG5cbiAgcmV0dXJuIGdldFN2Z1BhdGhGcm9tU3Ryb2tlKGdldFN0cm9rZShpbnB1dFBvaW50cyBhcyBudW1iZXJbXVtdLCBvcHRpb25zKSk7XG59XG5cbmZ1bmN0aW9uIG1lZChBOiBudW1iZXJbXSwgQjogbnVtYmVyW10pIHtcbiAgcmV0dXJuIFsoQVswXSArIEJbMF0pIC8gMiwgKEFbMV0gKyBCWzFdKSAvIDJdO1xufVxuXG4vLyBUcmltIFNWRyBwYXRoIGRhdGEgc28gbnVtYmVyIGFyZSBlYWNoIHR3byBkZWNpbWFsIHBvaW50cy4gVGhpc1xuLy8gaW1wcm92ZXMgU1ZHIGV4cG9ydHMsIGFuZCBwcmV2ZW50cyByZW5kZXJpbmcgZXJyb3JzIG9uIHBvaW50c1xuLy8gd2l0aCBsb25nIGRlY2ltYWxzLlxuY29uc3QgVE9fRklYRURfUFJFQ0lTSU9OID0gLyhcXHM/W0EtWl0/LD8tP1swLTldKlxcLlswLTldezAsMn0pKChbMC05XXxlfC0pKikvZztcblxuZnVuY3Rpb24gZ2V0U3ZnUGF0aEZyb21TdHJva2UocG9pbnRzOiBudW1iZXJbXVtdKTogc3RyaW5nIHtcbiAgaWYgKCFwb2ludHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBjb25zdCBtYXggPSBwb2ludHMubGVuZ3RoIC0gMTtcblxuICByZXR1cm4gcG9pbnRzXG4gICAgLnJlZHVjZShcbiAgICAgIChhY2MsIHBvaW50LCBpLCBhcnIpID0+IHtcbiAgICAgICAgaWYgKGkgPT09IG1heCkge1xuICAgICAgICAgIGFjYy5wdXNoKHBvaW50LCBtZWQocG9pbnQsIGFyclswXSksIFwiTFwiLCBhcnJbMF0sIFwiWlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MucHVzaChwb2ludCwgbWVkKHBvaW50LCBhcnJbaSArIDFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXCJNXCIsIHBvaW50c1swXSwgXCJRXCJdLFxuICAgIClcbiAgICAuam9pbihcIiBcIilcbiAgICAucmVwbGFjZShUT19GSVhFRF9QUkVDSVNJT04sIFwiJDFcIik7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../renderer/renderElement.ts\n");
|
|
2777
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getShapeForElement\": () => (/* binding */ getShapeForElement),\n/* harmony export */ \"invalidateShapeForElement\": () => (/* binding */ invalidateShapeForElement),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions),\n/* harmony export */ \"renderElement\": () => (/* binding */ renderElement),\n/* harmony export */ \"renderElementToSvg\": () => (/* binding */ renderElementToSvg),\n/* harmony export */ \"pathsCache\": () => (/* binding */ pathsCache),\n/* harmony export */ \"generateFreeDrawShape\": () => (/* binding */ generateFreeDrawShape),\n/* harmony export */ \"getFreeDrawPath2D\": () => (/* binding */ getFreeDrawPath2D),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* binding */ getFreeDrawSvgPath)\n/* harmony export */ });\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var perfect_freehand__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! perfect-freehand */ \"../../../node_modules/perfect-freehand/dist/esm/index.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// using a stronger invert (100% vs our regular 93%) and saturate\r\n// as a temp hack to make images in dark theme look closer to original\r\n// color scheme (it's still not quite there and the colors look slightly\r\n// desatured, alas...)\r\nconst IMAGE_INVERT_FILTER = \"invert(100%) hue-rotate(180deg) saturate(1.25)\";\r\nconst defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\r\nconst isPendingImageElement = (element, sceneState) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\r\n !sceneState.imageCache.has(element.fileId);\r\nconst getDashArrayDashed = (strokeWidth) => [8, 8 + strokeWidth];\r\nconst getDashArrayDotted = (strokeWidth) => [1.5, 6 + strokeWidth];\r\nconst getCanvasPadding = (element) => element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\r\nconst generateElementCanvas = (element, zoom, sceneState) => {\r\n var _a;\r\n const canvas = document.createElement(\"canvas\");\r\n const context = canvas.getContext(\"2d\");\r\n const padding = getCanvasPadding(element);\r\n let canvasOffsetX = 0;\r\n let canvasOffsetY = 0;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n canvas.width =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvasOffsetX =\r\n element.x > x1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.x, x1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n canvasOffsetY =\r\n element.y > y1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.y, y1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n context.translate(canvasOffsetX, canvasOffsetY);\r\n }\r\n else {\r\n canvas.width =\r\n element.width * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n element.height * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n }\r\n context.save();\r\n context.translate(padding * zoom.value, padding * zoom.value);\r\n context.scale(window.devicePixelRatio * zoom.value, window.devicePixelRatio * zoom.value);\r\n const rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\"default\"].canvas(canvas);\r\n // in dark theme, revert the image color filter\r\n if (sceneState.theme === \"dark\" &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\r\n !isPendingImageElement(element, sceneState) &&\r\n ((_a = sceneState.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.mimeType) !== _constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg) {\r\n context.filter = IMAGE_INVERT_FILTER;\r\n }\r\n drawElementOnCanvas(element, rc, context, sceneState);\r\n context.restore();\r\n return {\r\n element,\r\n canvas,\r\n theme: sceneState.theme,\r\n canvasZoom: zoom.value,\r\n canvasOffsetX,\r\n canvasOffsetY,\r\n };\r\n};\r\nconst IMAGE_PLACEHOLDER_IMG = document.createElement(\"img\");\r\nIMAGE_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"image\" class=\"svg-inline--fa fa-image fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"#888\" d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"></path></svg>`)}`;\r\nconst IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement(\"img\");\r\nIMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg viewBox=\"0 0 668 668\" xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2\"><path d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48ZM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56ZM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.81709 0 0 .81709 124.825 145.825)\"/><path d=\"M256 8C119.034 8 8 119.033 8 256c0 136.967 111.034 248 248 248s248-111.034 248-248S392.967 8 256 8Zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676ZM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.30366 0 0 .30366 506.822 60.065)\"/></svg>`)}`;\r\nconst drawImagePlaceholder = (element, context, zoomValue) => {\r\n context.fillStyle = \"#E7E7E7\";\r\n context.fillRect(0, 0, element.width, element.height);\r\n const imageMinWidthOrHeight = Math.min(element.width, element.height);\r\n const size = Math.min(imageMinWidthOrHeight, Math.min(imageMinWidthOrHeight * 0.4, 100));\r\n context.drawImage(element.status === \"error\"\r\n ? IMAGE_ERROR_PLACEHOLDER_IMG\r\n : IMAGE_PLACEHOLDER_IMG, element.width / 2 - size / 2, element.height / 2 - size / 2, size, size);\r\n};\r\nconst drawElementOnCanvas = (element, rc, context, sceneState) => {\r\n var _a;\r\n context.globalAlpha = element.opacity / 100;\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n rc.draw(getShapeForElement(element));\r\n break;\r\n }\r\n case \"arrow\":\r\n case \"line\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n getShapeForElement(element).forEach((shape) => {\r\n rc.draw(shape);\r\n });\r\n break;\r\n }\r\n case \"freedraw\": {\r\n // Draw directly to canvas\r\n context.save();\r\n context.fillStyle = element.strokeColor;\r\n const path = getFreeDrawPath2D(element);\r\n context.fillStyle = element.strokeColor;\r\n context.fill(path);\r\n context.restore();\r\n break;\r\n }\r\n case \"image\": {\r\n const img = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element)\r\n ? (_a = sceneState.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.image\r\n : undefined;\r\n if (img != null && !(img instanceof Promise)) {\r\n context.drawImage(img, 0 /* hardcoded for the selection box*/, 0, element.width, element.height);\r\n }\r\n else {\r\n drawImagePlaceholder(element, context, sceneState.zoom.value);\r\n }\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const rtl = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text);\r\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\r\n if (shouldTemporarilyAttach) {\r\n // to correctly render RTL text mixed with LTR, we have to append it\r\n // to the DOM\r\n document.body.appendChild(context.canvas);\r\n }\r\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\r\n context.save();\r\n context.font = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element);\r\n context.fillStyle = element.strokeColor;\r\n context.textAlign = element.textAlign;\r\n // Canvas does not support multiline text by default\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n for (let index = 0; index < lines.length; index++) {\r\n context.fillText(lines[index], horizontalOffset, (index + 1) * lineHeight - verticalOffset);\r\n }\r\n context.restore();\r\n if (shouldTemporarilyAttach) {\r\n context.canvas.remove();\r\n }\r\n }\r\n else {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n context.globalAlpha = 1;\r\n};\r\nconst elementWithCanvasCache = new WeakMap();\r\nconst shapeCache = new WeakMap();\r\nconst getShapeForElement = (element) => shapeCache.get(element);\r\nconst invalidateShapeForElement = (element) => shapeCache.delete(element);\r\nconst generateRoughOptions = (element, continuousPath = false) => {\r\n const options = {\r\n seed: element.seed,\r\n strokeLineDash: element.strokeStyle === \"dashed\"\r\n ? getDashArrayDashed(element.strokeWidth)\r\n : element.strokeStyle === \"dotted\"\r\n ? getDashArrayDotted(element.strokeWidth)\r\n : undefined,\r\n // for non-solid strokes, disable multiStroke because it tends to make\r\n // dashes/dots overlay each other\r\n disableMultiStroke: element.strokeStyle !== \"solid\",\r\n // for non-solid strokes, increase the width a bit to make it visually\r\n // similar to solid strokes, because we're also disabling multiStroke\r\n strokeWidth: element.strokeStyle !== \"solid\"\r\n ? element.strokeWidth + 0.5\r\n : element.strokeWidth,\r\n // when increasing strokeWidth, we must explicitly set fillWeight and\r\n // hachureGap because if not specified, roughjs uses strokeWidth to\r\n // calculate them (and we don't want the fills to be modified)\r\n fillWeight: element.strokeWidth / 2,\r\n hachureGap: element.strokeWidth * 4,\r\n roughness: element.roughness,\r\n stroke: element.strokeColor,\r\n preserveVertices: continuousPath,\r\n // disable decimals to fix Skia rendering issues #4046\r\n fixedDecimalPlaceDigits: 0,\r\n };\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n if (element.type === \"ellipse\") {\r\n options.curveFitting = 1;\r\n }\r\n return options;\r\n }\r\n case \"line\": {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n }\r\n return options;\r\n }\r\n case \"freedraw\":\r\n case \"arrow\":\r\n return options;\r\n default: {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\n/**\r\n * Generates the element's shape and puts it into the cache.\r\n * @param element\r\n * @param generator\r\n */\r\nconst generateElementShape = (element, generator) => {\r\n let shape = shapeCache.get(element) || null;\r\n if (!shape) {\r\n elementWithCanvasCache.delete(element);\r\n switch (element.type) {\r\n case \"rectangle\":\r\n if (element.strokeSharpness === \"round\") {\r\n const w = element.width;\r\n const h = element.height;\r\n const r = Math.min(w, h) * 0.25;\r\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(element, true));\r\n }\r\n else {\r\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(element));\r\n }\r\n break;\r\n case \"diamond\": {\r\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getDiamondPoints)(element);\r\n shape = generator.polygon([\r\n [topX, topY],\r\n [rightX, rightY],\r\n [bottomX, bottomY],\r\n [leftX, leftY],\r\n ], generateRoughOptions(element));\r\n break;\r\n }\r\n case \"ellipse\":\r\n shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\r\n break;\r\n case \"line\":\r\n case \"arrow\": {\r\n const options = generateRoughOptions(element);\r\n // points array can be empty in the beginning, so it is important to add\r\n // initial position to it\r\n const points = element.points.length ? element.points : [[0, 0]];\r\n // curve is always the first element\r\n // this simplifies finding the curve for an element\r\n if (element.strokeSharpness === \"sharp\") {\r\n if (options.fill) {\r\n shape = [generator.polygon(points, options)];\r\n }\r\n else {\r\n shape = [\r\n generator.linearPath(points, options),\r\n ];\r\n }\r\n }\r\n else {\r\n shape = [generator.curve(points, options)];\r\n }\r\n // add lines only in arrow\r\n if (element.type === \"arrow\") {\r\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\r\n const getArrowheadShapes = (element, shape, position, arrowhead) => {\r\n const arrowheadPoints = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getArrowheadPoints)(element, shape, position, arrowhead);\r\n if (arrowheadPoints === null) {\r\n return [];\r\n }\r\n // Other arrowheads here...\r\n if (arrowhead === \"dot\") {\r\n const [x, y, r] = arrowheadPoints;\r\n return [\r\n generator.circle(x, y, r, Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\", stroke: \"none\" })),\r\n ];\r\n }\r\n if (arrowhead === \"triangle\") {\r\n const [x, y, x2, y2, x3, y3] = arrowheadPoints;\r\n // always use solid stroke for triangle arrowhead\r\n delete options.strokeLineDash;\r\n return [\r\n generator.polygon([\r\n [x, y],\r\n [x2, y2],\r\n [x3, y3],\r\n [x, y],\r\n ], Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\" })),\r\n ];\r\n }\r\n // Arrow arrowheads\r\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\r\n if (element.strokeStyle === \"dotted\") {\r\n // for dotted arrows caps, reduce gap to make it more legible\r\n const dash = getDashArrayDotted(element.strokeWidth - 1);\r\n options.strokeLineDash = [dash[0], dash[1] - 1];\r\n }\r\n else {\r\n // for solid/dashed, keep solid arrow cap\r\n delete options.strokeLineDash;\r\n }\r\n return [\r\n generator.line(x3, y3, x2, y2, options),\r\n generator.line(x4, y4, x2, y2, options),\r\n ];\r\n };\r\n if (startArrowhead !== null) {\r\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead);\r\n shape.push(...shapes);\r\n }\r\n if (endArrowhead !== null) {\r\n if (endArrowhead === undefined) {\r\n // Hey, we have an old arrow here!\r\n }\r\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead);\r\n shape.push(...shapes);\r\n }\r\n }\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n shape = [];\r\n break;\r\n }\r\n case \"text\":\r\n case \"image\": {\r\n // just to ensure we don't regenerate element.canvas on rerenders\r\n shape = [];\r\n break;\r\n }\r\n }\r\n shapeCache.set(element, shape);\r\n }\r\n};\r\nconst generateElementWithCanvas = (element, sceneState) => {\r\n const zoom = sceneState ? sceneState.zoom : defaultAppState.zoom;\r\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\r\n const shouldRegenerateBecauseZoom = prevElementWithCanvas &&\r\n prevElementWithCanvas.canvasZoom !== zoom.value &&\r\n !(sceneState === null || sceneState === void 0 ? void 0 : sceneState.shouldCacheIgnoreZoom);\r\n if (!prevElementWithCanvas ||\r\n shouldRegenerateBecauseZoom ||\r\n prevElementWithCanvas.theme !== sceneState.theme) {\r\n const elementWithCanvas = generateElementCanvas(element, zoom, sceneState);\r\n elementWithCanvasCache.set(element, elementWithCanvas);\r\n return elementWithCanvas;\r\n }\r\n return prevElementWithCanvas;\r\n};\r\nconst drawElementFromCanvas = (elementWithCanvas, rc, context, sceneState) => {\r\n const element = elementWithCanvas.element;\r\n const padding = getCanvasPadding(element);\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n }\r\n const cx = ((x1 + x2) / 2 + sceneState.scrollX) * window.devicePixelRatio;\r\n const cy = ((y1 + y2) / 2 + sceneState.scrollY) * window.devicePixelRatio;\r\n const _isPendingImageElement = isPendingImageElement(element, sceneState);\r\n const scaleXFactor = \"scale\" in elementWithCanvas.element && !_isPendingImageElement\r\n ? elementWithCanvas.element.scale[0]\r\n : 1;\r\n const scaleYFactor = \"scale\" in elementWithCanvas.element && !_isPendingImageElement\r\n ? elementWithCanvas.element.scale[1]\r\n : 1;\r\n context.save();\r\n context.scale((1 / window.devicePixelRatio) * scaleXFactor, (1 / window.devicePixelRatio) * scaleYFactor);\r\n context.translate(cx * scaleXFactor, cy * scaleYFactor);\r\n context.rotate(element.angle * scaleXFactor * scaleYFactor);\r\n context.drawImage(elementWithCanvas.canvas, (-(x2 - x1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, (-(y2 - y1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.width / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.height / elementWithCanvas.canvasZoom);\r\n context.restore();\r\n // Clear the nested element we appended to the DOM\r\n};\r\nconst renderElement = (element, rc, context, renderOptimizations, sceneState) => {\r\n const generator = rc.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n context.save();\r\n context.translate(element.x + sceneState.scrollX, element.y + sceneState.scrollY);\r\n context.fillStyle = \"rgba(0, 0, 255, 0.10)\";\r\n context.fillRect(0, 0, element.width, element.height);\r\n context.restore();\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context, sceneState);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\":\r\n case \"line\":\r\n case \"arrow\":\r\n case \"image\":\r\n case \"text\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context, sceneState);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n default: {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\nconst roughSVGDrawWithPrecision = (rsvg, drawable, precision) => {\r\n if (typeof precision === \"undefined\") {\r\n return rsvg.draw(drawable);\r\n }\r\n const pshape = {\r\n sets: drawable.sets,\r\n shape: drawable.shape,\r\n options: Object.assign(Object.assign({}, drawable.options), { fixedDecimalPlaceDigits: precision }),\r\n };\r\n return rsvg.draw(pshape);\r\n};\r\nconst renderElementToSvg = (element, rsvg, svgRoot, files, offsetX, offsetY, exportWithDarkMode) => {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x2 - x1) / 2 - (element.x - x1);\r\n const cy = (y2 - y1) / 2 - (element.y - y1);\r\n const degree = (180 * element.angle) / Math.PI;\r\n const generator = rsvg.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n // Since this is used only during editing experience, which is canvas based,\r\n // this should not happen\r\n throw new Error(\"Selection rendering is not supported for SVG\");\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n generateElementShape(element, generator);\r\n const node = roughSVGDrawWithPrecision(rsvg, getShapeForElement(element), _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n const opacity = element.opacity / 100;\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"stroke-linecap\", \"round\");\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n case \"line\":\r\n case \"arrow\": {\r\n generateElementShape(element, generator);\r\n const group = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\r\n const opacity = element.opacity / 100;\r\n group.setAttribute(\"stroke-linecap\", \"round\");\r\n getShapeForElement(element).forEach((shape) => {\r\n const node = roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n if (element.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points) &&\r\n element.backgroundColor !== \"transparent\") {\r\n node.setAttribute(\"fill-rule\", \"evenodd\");\r\n }\r\n group.appendChild(node);\r\n });\r\n svgRoot.appendChild(group);\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const path = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"path\");\r\n node.setAttribute(\"stroke\", \"none\");\r\n node.setAttribute(\"fill\", element.strokeColor);\r\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\r\n node.appendChild(path);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n case \"image\": {\r\n const fileData = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) && files[element.fileId];\r\n if (fileData) {\r\n const symbolId = `image-${fileData.id}`;\r\n let symbol = svgRoot.querySelector(`#${symbolId}`);\r\n if (!symbol) {\r\n symbol = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"symbol\");\r\n symbol.id = symbolId;\r\n const image = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"image\");\r\n image.setAttribute(\"width\", \"100%\");\r\n image.setAttribute(\"height\", \"100%\");\r\n image.setAttribute(\"href\", fileData.dataURL);\r\n symbol.appendChild(image);\r\n svgRoot.prepend(symbol);\r\n }\r\n const use = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"use\");\r\n use.setAttribute(\"href\", `#${symbolId}`);\r\n // in dark theme, revert the image color filter\r\n if (exportWithDarkMode && fileData.mimeType !== _constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg) {\r\n use.setAttribute(\"filter\", IMAGE_INVERT_FILTER);\r\n }\r\n use.setAttribute(\"width\", `${Math.round(element.width)}`);\r\n use.setAttribute(\"height\", `${Math.round(element.height)}`);\r\n use.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n svgRoot.appendChild(use);\r\n }\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n const direction = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text) ? \"rtl\" : \"ltr\";\r\n const textAnchor = element.textAlign === \"center\"\r\n ? \"middle\"\r\n : element.textAlign === \"right\" || direction === \"rtl\"\r\n ? \"end\"\r\n : \"start\";\r\n for (let i = 0; i < lines.length; i++) {\r\n const text = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"text\");\r\n text.textContent = lines[i];\r\n text.setAttribute(\"x\", `${horizontalOffset}`);\r\n text.setAttribute(\"y\", `${(i + 1) * lineHeight - verticalOffset}`);\r\n text.setAttribute(\"font-family\", (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontFamilyString)(element));\r\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\r\n text.setAttribute(\"fill\", element.strokeColor);\r\n text.setAttribute(\"text-anchor\", textAnchor);\r\n text.setAttribute(\"style\", \"white-space: pre;\");\r\n text.setAttribute(\"direction\", direction);\r\n node.appendChild(text);\r\n }\r\n svgRoot.appendChild(node);\r\n }\r\n else {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n};\r\nconst pathsCache = new WeakMap([]);\r\nfunction generateFreeDrawShape(element) {\r\n const svgPathData = getFreeDrawSvgPath(element);\r\n const path = new Path2D(svgPathData);\r\n pathsCache.set(element, path);\r\n return path;\r\n}\r\nfunction getFreeDrawPath2D(element) {\r\n return pathsCache.get(element);\r\n}\r\nfunction getFreeDrawSvgPath(element) {\r\n // If input points are empty (should they ever be?) return a dot\r\n const inputPoints = element.simulatePressure\r\n ? element.points\r\n : element.points.length\r\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\r\n : [[0, 0, 0.5]];\r\n // Consider changing the options for simulated pressure vs real pressure\r\n const options = {\r\n simulatePressure: element.simulatePressure,\r\n size: element.strokeWidth * 4.25,\r\n thinning: 0.6,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n easing: (t) => Math.sin((t * Math.PI) / 2),\r\n last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup\r\n };\r\n return getSvgPathFromStroke((0,perfect_freehand__WEBPACK_IMPORTED_MODULE_7__.getStroke)(inputPoints, options));\r\n}\r\nfunction med(A, B) {\r\n return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\r\n}\r\n// Trim SVG path data so number are each two decimal points. This\r\n// improves SVG exports, and prevents rendering errors on points\r\n// with long decimals.\r\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\r\nfunction getSvgPathFromStroke(points) {\r\n if (!points.length) {\r\n return \"\";\r\n }\r\n const max = points.length - 1;\r\n return points\r\n .reduce((acc, point, i, arr) => {\r\n if (i === max) {\r\n acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\r\n }\r\n else {\r\n acc.push(point, med(point, arr[i + 1]));\r\n }\r\n return acc;\r\n }, [\"M\", points[0], \"Q\"])\r\n .join(\" \")\r\n .replace(TO_FIXED_PRECISION, \"$1\");\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUN0QjtTQUNBLElBQUksQ0FBQyxHQUFHLENBQUM7U0FDVCxPQUFPLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50LnRzP2E2ZGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEFycm93aGVhZCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNUZXh0RWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50LFxuICBpc0ZyZWVEcmF3RWxlbWVudCxcbiAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RGlhbW9uZFBvaW50cyxcbiAgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLFxuICBnZXRBcnJvd2hlYWRQb2ludHMsXG59IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgUm91Z2hDYW52YXMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY2FudmFzXCI7XG5pbXBvcnQgeyBEcmF3YWJsZSwgT3B0aW9ucyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jb3JlXCI7XG5pbXBvcnQgeyBSb3VnaFNWRyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9zdmdcIjtcbmltcG9ydCB7IFJvdWdoR2VuZXJhdG9yIH0gZnJvbSBcInJvdWdoanMvYmluL2dlbmVyYXRvclwiO1xuaW1wb3J0IHsgU2NlbmVTdGF0ZSB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UsIGdldEZvbnRTdHJpbmcsIGdldEZvbnRGYW1pbHlTdHJpbmcsIGlzUlRMIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBpc1BhdGhBTG9vcCB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMsIFpvb20gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgTUFYX0RFQ0lNQUxTX0ZPUl9TVkdfRVhQT1JULCBNSU1FX1RZUEVTLCBTVkdfTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRTdHJva2UsIFN0cm9rZU9wdGlvbnMgfSBmcm9tIFwicGVyZmVjdC1mcmVlaGFuZFwiO1xuXG4vLyB1c2luZyBhIHN0cm9uZ2VyIGludmVydCAoMTAwJSB2cyBvdXIgcmVndWxhciA5MyUpIGFuZCBzYXR1cmF0ZVxuLy8gYXMgYSB0ZW1wIGhhY2sgdG8gbWFrZSBpbWFnZXMgaW4gZGFyayB0aGVtZSBsb29rIGNsb3NlciB0byBvcmlnaW5hbFxuLy8gY29sb3Igc2NoZW1lIChpdCdzIHN0aWxsIG5vdCBxdWl0ZSB0aGVyZSBhbmQgdGhlIGNvbG9ycyBsb29rIHNsaWdodGx5XG4vLyBkZXNhdHVyZWQsIGFsYXMuLi4pXG5jb25zdCBJTUFHRV9JTlZFUlRfRklMVEVSID0gXCJpbnZlcnQoMTAwJSkgaHVlLXJvdGF0ZSgxODBkZWcpIHNhdHVyYXRlKDEuMjUpXCI7XG5cbmNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG5jb25zdCBpc1BlbmRpbmdJbWFnZUVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBzY2VuZVN0YXRlOiBTY2VuZVN0YXRlLFxuKSA9PlxuICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmXG4gICFzY2VuZVN0YXRlLmltYWdlQ2FjaGUuaGFzKGVsZW1lbnQuZmlsZUlkKTtcblxuY29uc3QgZ2V0RGFzaEFycmF5RGFzaGVkID0gKHN0cm9rZVdpZHRoOiBudW1iZXIpID0+IFs4LCA4ICsgc3Ryb2tlV2lkdGhdO1xuXG5jb25zdCBnZXREYXNoQXJyYXlEb3R0ZWQgPSAoc3Ryb2tlV2lkdGg6IG51bWJlcikgPT4gWzEuNSwgNiArIHN0cm9rZVdpZHRoXTtcblxuY29uc3QgZ2V0Q2FudmFzUGFkZGluZyA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgZWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIgPyBlbGVtZW50LnN0cm9rZVdpZHRoICogMTIgOiAyMDtcblxuZXhwb3J0IGludGVyZmFjZSBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXMge1xuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgdGhlbWU6IFNjZW5lU3RhdGVbXCJ0aGVtZVwiXTtcbiAgY2FudmFzWm9vbTogWm9vbVtcInZhbHVlXCJdO1xuICBjYW52YXNPZmZzZXRYOiBudW1iZXI7XG4gIGNhbnZhc09mZnNldFk6IG51bWJlcjtcbn1cblxuY29uc3QgZ2VuZXJhdGVFbGVtZW50Q2FudmFzID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHpvb206IFpvb20sXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4pOiBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXMgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNvbnN0IHBhZGRpbmcgPSBnZXRDYW52YXNQYWRkaW5nKGVsZW1lbnQpO1xuXG4gIGxldCBjYW52YXNPZmZzZXRYID0gMDtcbiAgbGV0IGNhbnZhc09mZnNldFkgPSAwO1xuXG4gIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAgIHgxID0gTWF0aC5mbG9vcih4MSk7XG4gICAgeDIgPSBNYXRoLmNlaWwoeDIpO1xuICAgIHkxID0gTWF0aC5mbG9vcih5MSk7XG4gICAgeTIgPSBNYXRoLmNlaWwoeTIpO1xuXG4gICAgY2FudmFzLndpZHRoID1cbiAgICAgIGRpc3RhbmNlKHgxLCB4MikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuICAgIGNhbnZhcy5oZWlnaHQgPVxuICAgICAgZGlzdGFuY2UoeTEsIHkyKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogem9vbS52YWx1ZSArXG4gICAgICBwYWRkaW5nICogem9vbS52YWx1ZSAqIDI7XG5cbiAgICBjYW52YXNPZmZzZXRYID1cbiAgICAgIGVsZW1lbnQueCA+IHgxXG4gICAgICAgID8gTWF0aC5mbG9vcihkaXN0YW5jZShlbGVtZW50LngsIHgxKSkgKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICpcbiAgICAgICAgICB6b29tLnZhbHVlXG4gICAgICAgIDogMDtcblxuICAgIGNhbnZhc09mZnNldFkgPVxuICAgICAgZWxlbWVudC55ID4geTFcbiAgICAgICAgPyBNYXRoLmZsb29yKGRpc3RhbmNlKGVsZW1lbnQueSwgeTEpKSAqXG4gICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICAgIHpvb20udmFsdWVcbiAgICAgICAgOiAwO1xuXG4gICAgY29udGV4dC50cmFuc2xhdGUoY2FudmFzT2Zmc2V0WCwgY2FudmFzT2Zmc2V0WSk7XG4gIH0gZWxzZSB7XG4gICAgY2FudmFzLndpZHRoID1cbiAgICAgIGVsZW1lbnQud2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuICAgIGNhbnZhcy5oZWlnaHQgPVxuICAgICAgZWxlbWVudC5oZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuICB9XG5cbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHBhZGRpbmcgKiB6b29tLnZhbHVlLCBwYWRkaW5nICogem9vbS52YWx1ZSk7XG4gIGNvbnRleHQuc2NhbGUoXG4gICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlLFxuICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogem9vbS52YWx1ZSxcbiAgKTtcblxuICBjb25zdCByYyA9IHJvdWdoLmNhbnZhcyhjYW52YXMpO1xuXG4gIC8vIGluIGRhcmsgdGhlbWUsIHJldmVydCB0aGUgaW1hZ2UgY29sb3IgZmlsdGVyXG4gIGlmIChcbiAgICBzY2VuZVN0YXRlLnRoZW1lID09PSBcImRhcmtcIiAmJlxuICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAhaXNQZW5kaW5nSW1hZ2VFbGVtZW50KGVsZW1lbnQsIHNjZW5lU3RhdGUpICYmXG4gICAgc2NlbmVTdGF0ZS5pbWFnZUNhY2hlLmdldChlbGVtZW50LmZpbGVJZCk/Lm1pbWVUeXBlICE9PSBNSU1FX1RZUEVTLnN2Z1xuICApIHtcbiAgICBjb250ZXh0LmZpbHRlciA9IElNQUdFX0lOVkVSVF9GSUxURVI7XG4gIH1cblxuICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICB0aGVtZTogc2NlbmVTdGF0ZS50aGVtZSxcbiAgICBjYW52YXNab29tOiB6b29tLnZhbHVlLFxuICAgIGNhbnZhc09mZnNldFgsXG4gICAgY2FudmFzT2Zmc2V0WSxcbiAgfTtcbn07XG5cbmNvbnN0IElNQUdFX1BMQUNFSE9MREVSX0lNRyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5JTUFHRV9QTEFDRUhPTERFUl9JTUcuc3JjID0gYGRhdGE6JHtNSU1FX1RZUEVTLnN2Z30sJHtlbmNvZGVVUklDb21wb25lbnQoXG4gIGA8c3ZnIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZvY3VzYWJsZT1cImZhbHNlXCIgZGF0YS1wcmVmaXg9XCJmYXNcIiBkYXRhLWljb249XCJpbWFnZVwiIGNsYXNzPVwic3ZnLWlubGluZS0tZmEgZmEtaW1hZ2UgZmEtdy0xNlwiIHJvbGU9XCJpbWdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+PHBhdGggZmlsbD1cIiM4ODhcIiBkPVwiTTQ2NCA0NDhINDhjLTI2LjUxIDAtNDgtMjEuNDktNDgtNDhWMTEyYzAtMjYuNTEgMjEuNDktNDggNDgtNDhoNDE2YzI2LjUxIDAgNDggMjEuNDkgNDggNDh2Mjg4YzAgMjYuNTEtMjEuNDkgNDgtNDggNDh6TTExMiAxMjBjLTMwLjkyOCAwLTU2IDI1LjA3Mi01NiA1NnMyNS4wNzIgNTYgNTYgNTYgNTYtMjUuMDcyIDU2LTU2LTI1LjA3Mi01Ni01Ni01NnpNNjQgMzg0aDM4NFYyNzJsLTg3LjUxNS04Ny41MTVjLTQuNjg2LTQuNjg2LTEyLjI4NC00LjY4Ni0xNi45NzEgMEwyMDggMzIwbC01NS41MTUtNTUuNTE1Yy00LjY4Ni00LjY4Ni0xMi4yODQtNC42ODYtMTYuOTcxIDBMNjQgMzM2djQ4elwiPjwvcGF0aD48L3N2Zz5gLFxuKX1gO1xuXG5jb25zdCBJTUFHRV9FUlJPUl9QTEFDRUhPTERFUl9JTUcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuSU1BR0VfRVJST1JfUExBQ0VIT0xERVJfSU1HLnNyYyA9IGBkYXRhOiR7TUlNRV9UWVBFUy5zdmd9LCR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICBgPHN2ZyB2aWV3Qm94PVwiMCAwIDY2OCA2NjhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBzdHlsZT1cImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoyXCI+PHBhdGggZD1cIk00NjQgNDQ4SDQ4Yy0yNi41MSAwLTQ4LTIxLjQ5LTQ4LTQ4VjExMmMwLTI2LjUxIDIxLjQ5LTQ4IDQ4LTQ4aDQxNmMyNi41MSAwIDQ4IDIxLjQ5IDQ4IDQ4djI4OGMwIDI2LjUxLTIxLjQ5IDQ4LTQ4IDQ4Wk0xMTIgMTIwYy0zMC45MjggMC01NiAyNS4wNzItNTYgNTZzMjUuMDcyIDU2IDU2IDU2IDU2LTI1LjA3MiA1Ni01Ni0yNS4wNzItNTYtNTYtNTZaTTY0IDM4NGgzODRWMjcybC04Ny41MTUtODcuNTE1Yy00LjY4Ni00LjY4Ni0xMi4yODQtNC42ODYtMTYuOTcxIDBMMjA4IDMyMGwtNTUuNTE1LTU1LjUxNWMtNC42ODYtNC42ODYtMTIuMjg0LTQuNjg2LTE2Ljk3MSAwTDY0IDMzNnY0OFpcIiBzdHlsZT1cImZpbGw6Izg4ODtmaWxsLXJ1bGU6bm9uemVyb1wiIHRyYW5zZm9ybT1cIm1hdHJpeCguODE3MDkgMCAwIC44MTcwOSAxMjQuODI1IDE0NS44MjUpXCIvPjxwYXRoIGQ9XCJNMjU2IDhDMTE5LjAzNCA4IDggMTE5LjAzMyA4IDI1NmMwIDEzNi45NjcgMTExLjAzNCAyNDggMjQ4IDI0OHMyNDgtMTExLjAzNCAyNDgtMjQ4UzM5Mi45NjcgOCAyNTYgOFptMTMwLjEwOCAxMTcuODkyYzY1LjQ0OCA2NS40NDggNzAgMTY1LjQ4MSAyMC42NzcgMjM1LjYzN0wxNTAuNDcgMTA1LjIxNmM3MC4yMDQtNDkuMzU2IDE3MC4yMjYtNDQuNzM1IDIzNS42MzggMjAuNjc2Wk0xMjUuODkyIDM4Ni4xMDhjLTY1LjQ0OC02NS40NDgtNzAtMTY1LjQ4MS0yMC42NzctMjM1LjYzN0wzNjEuNTMgNDA2Ljc4NGMtNzAuMjAzIDQ5LjM1Ni0xNzAuMjI2IDQ0LjczNi0yMzUuNjM4LTIwLjY3NlpcIiBzdHlsZT1cImZpbGw6Izg4ODtmaWxsLXJ1bGU6bm9uemVyb1wiIHRyYW5zZm9ybT1cIm1hdHJpeCguMzAzNjYgMCAwIC4zMDM2NiA1MDYuODIyIDYwLjA2NSlcIi8+PC9zdmc+YCxcbil9YDtcblxuY29uc3QgZHJhd0ltYWdlUGxhY2Vob2xkZXIgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgem9vbVZhbHVlOiBBcHBTdGF0ZVtcInpvb21cIl1bXCJ2YWx1ZVwiXSxcbikgPT4ge1xuICBjb250ZXh0LmZpbGxTdHlsZSA9IFwiI0U3RTdFN1wiO1xuICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcblxuICBjb25zdCBpbWFnZU1pbldpZHRoT3JIZWlnaHQgPSBNYXRoLm1pbihlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG5cbiAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKFxuICAgIGltYWdlTWluV2lkdGhPckhlaWdodCxcbiAgICBNYXRoLm1pbihpbWFnZU1pbldpZHRoT3JIZWlnaHQgKiAwLjQsIDEwMCksXG4gICk7XG5cbiAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgZWxlbWVudC5zdGF0dXMgPT09IFwiZXJyb3JcIlxuICAgICAgPyBJTUFHRV9FUlJPUl9QTEFDRUhPTERFUl9JTUdcbiAgICAgIDogSU1BR0VfUExBQ0VIT0xERVJfSU1HLFxuICAgIGVsZW1lbnQud2lkdGggLyAyIC0gc2l6ZSAvIDIsXG4gICAgZWxlbWVudC5oZWlnaHQgLyAyIC0gc2l6ZSAvIDIsXG4gICAgc2l6ZSxcbiAgICBzaXplLFxuICApO1xufTtcblxuY29uc3QgZHJhd0VsZW1lbnRPbkNhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gZWxlbWVudC5vcGFjaXR5IC8gMTAwO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6IHtcbiAgICAgIGNvbnRleHQubGluZUpvaW4gPSBcInJvdW5kXCI7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSBcInJvdW5kXCI7XG4gICAgICByYy5kcmF3KGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSBhcyBEcmF3YWJsZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgY2FzZSBcImxpbmVcIjoge1xuICAgICAgY29udGV4dC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9IFwicm91bmRcIjtcblxuICAgICAgKGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSBhcyBEcmF3YWJsZVtdKS5mb3JFYWNoKChzaGFwZSkgPT4ge1xuICAgICAgICByYy5kcmF3KHNoYXBlKTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICAvLyBEcmF3IGRpcmVjdGx5IHRvIGNhbnZhc1xuICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGVsZW1lbnQuc3Ryb2tlQ29sb3I7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBnZXRGcmVlRHJhd1BhdGgyRChlbGVtZW50KSBhcyBQYXRoMkQ7XG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcblxuICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImltYWdlXCI6IHtcbiAgICAgIGNvbnN0IGltZyA9IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudClcbiAgICAgICAgPyBzY2VuZVN0YXRlLmltYWdlQ2FjaGUuZ2V0KGVsZW1lbnQuZmlsZUlkKT8uaW1hZ2VcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoaW1nICE9IG51bGwgJiYgIShpbWcgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgICBpbWcsXG4gICAgICAgICAgMCAvKiBoYXJkY29kZWQgZm9yIHRoZSBzZWxlY3Rpb24gYm94Ki8sXG4gICAgICAgICAgMCxcbiAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhd0ltYWdlUGxhY2Vob2xkZXIoZWxlbWVudCwgY29udGV4dCwgc2NlbmVTdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBydGwgPSBpc1JUTChlbGVtZW50LnRleHQpO1xuICAgICAgICBjb25zdCBzaG91bGRUZW1wb3JhcmlseUF0dGFjaCA9IHJ0bCAmJiAhY29udGV4dC5jYW52YXMuaXNDb25uZWN0ZWQ7XG4gICAgICAgIGlmIChzaG91bGRUZW1wb3JhcmlseUF0dGFjaCkge1xuICAgICAgICAgIC8vIHRvIGNvcnJlY3RseSByZW5kZXIgUlRMIHRleHQgbWl4ZWQgd2l0aCBMVFIsIHdlIGhhdmUgdG8gYXBwZW5kIGl0XG4gICAgICAgICAgLy8gdG8gdGhlIERPTVxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGV4dC5jYW52YXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY2FudmFzLnNldEF0dHJpYnV0ZShcImRpclwiLCBydGwgPyBcInJ0bFwiIDogXCJsdHJcIik7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LmZvbnQgPSBnZXRGb250U3RyaW5nKGVsZW1lbnQpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGVsZW1lbnQuc3Ryb2tlQ29sb3I7XG4gICAgICAgIGNvbnRleHQudGV4dEFsaWduID0gZWxlbWVudC50ZXh0QWxpZ24gYXMgQ2FudmFzVGV4dEFsaWduO1xuXG4gICAgICAgIC8vIENhbnZhcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpbGluZSB0ZXh0IGJ5IGRlZmF1bHRcbiAgICAgICAgY29uc3QgbGluZXMgPSBlbGVtZW50LnRleHQucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldCA9IGVsZW1lbnQuaGVpZ2h0IC0gZWxlbWVudC5iYXNlbGluZTtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9XG4gICAgICAgICAgZWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aCAvIDJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgICAgbGluZXNbaW5kZXhdLFxuICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgICAgICAgIChpbmRleCArIDEpICogbGluZUhlaWdodCAtIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIGlmIChzaG91bGRUZW1wb3JhcmlseUF0dGFjaCkge1xuICAgICAgICAgIGNvbnRleHQuY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQgdHlwZSAke2VsZW1lbnQudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG59O1xuXG5jb25zdCBlbGVtZW50V2l0aENhbnZhc0NhY2hlID0gbmV3IFdlYWtNYXA8XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXNcbj4oKTtcblxuY29uc3Qgc2hhcGVDYWNoZSA9IG5ldyBXZWFrTWFwPFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRHJhd2FibGUgfCBEcmF3YWJsZVtdIHwgbnVsbFxuPigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hhcGVGb3JFbGVtZW50ID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PlxuICBzaGFwZUNhY2hlLmdldChlbGVtZW50KTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+XG4gIHNoYXBlQ2FjaGUuZGVsZXRlKGVsZW1lbnQpO1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3VnaE9wdGlvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBjb250aW51b3VzUGF0aCA9IGZhbHNlLFxuKTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgc2VlZDogZWxlbWVudC5zZWVkLFxuICAgIHN0cm9rZUxpbmVEYXNoOlxuICAgICAgZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkYXNoZWRcIlxuICAgICAgICA/IGdldERhc2hBcnJheURhc2hlZChlbGVtZW50LnN0cm9rZVdpZHRoKVxuICAgICAgICA6IGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFwiZG90dGVkXCJcbiAgICAgICAgPyBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgLy8gZm9yIG5vbi1zb2xpZCBzdHJva2VzLCBkaXNhYmxlIG11bHRpU3Ryb2tlIGJlY2F1c2UgaXQgdGVuZHMgdG8gbWFrZVxuICAgIC8vIGRhc2hlcy9kb3RzIG92ZXJsYXkgZWFjaCBvdGhlclxuICAgIGRpc2FibGVNdWx0aVN0cm9rZTogZWxlbWVudC5zdHJva2VTdHlsZSAhPT0gXCJzb2xpZFwiLFxuICAgIC8vIGZvciBub24tc29saWQgc3Ryb2tlcywgaW5jcmVhc2UgdGhlIHdpZHRoIGEgYml0IHRvIG1ha2UgaXQgdmlzdWFsbHlcbiAgICAvLyBzaW1pbGFyIHRvIHNvbGlkIHN0cm9rZXMsIGJlY2F1c2Ugd2UncmUgYWxzbyBkaXNhYmxpbmcgbXVsdGlTdHJva2VcbiAgICBzdHJva2VXaWR0aDpcbiAgICAgIGVsZW1lbnQuc3Ryb2tlU3R5bGUgIT09IFwic29saWRcIlxuICAgICAgICA/IGVsZW1lbnQuc3Ryb2tlV2lkdGggKyAwLjVcbiAgICAgICAgOiBlbGVtZW50LnN0cm9rZVdpZHRoLFxuICAgIC8vIHdoZW4gaW5jcmVhc2luZyBzdHJva2VXaWR0aCwgd2UgbXVzdCBleHBsaWNpdGx5IHNldCBmaWxsV2VpZ2h0IGFuZFxuICAgIC8vIGhhY2h1cmVHYXAgYmVjYXVzZSBpZiBub3Qgc3BlY2lmaWVkLCByb3VnaGpzIHVzZXMgc3Ryb2tlV2lkdGggdG9cbiAgICAvLyBjYWxjdWxhdGUgdGhlbSAoYW5kIHdlIGRvbid0IHdhbnQgdGhlIGZpbGxzIHRvIGJlIG1vZGlmaWVkKVxuICAgIGZpbGxXZWlnaHQ6IGVsZW1lbnQuc3Ryb2tlV2lkdGggLyAyLFxuICAgIGhhY2h1cmVHYXA6IGVsZW1lbnQuc3Ryb2tlV2lkdGggKiA0LFxuICAgIHJvdWdobmVzczogZWxlbWVudC5yb3VnaG5lc3MsXG4gICAgc3Ryb2tlOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgIHByZXNlcnZlVmVydGljZXM6IGNvbnRpbnVvdXNQYXRoLFxuICAgIC8vIGRpc2FibGUgZGVjaW1hbHMgdG8gZml4IFNraWEgcmVuZGVyaW5nIGlzc3VlcyAjNDA0NlxuICAgIGZpeGVkRGVjaW1hbFBsYWNlRGlnaXRzOiAwLFxuICB9O1xuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgb3B0aW9ucy5maWxsU3R5bGUgPSBlbGVtZW50LmZpbGxTdHlsZTtcbiAgICAgIG9wdGlvbnMuZmlsbCA9XG4gICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgICAgICBvcHRpb25zLmN1cnZlRml0dGluZyA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgY2FzZSBcImxpbmVcIjoge1xuICAgICAgaWYgKGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSkge1xuICAgICAgICBvcHRpb25zLmZpbGxTdHlsZSA9IGVsZW1lbnQuZmlsbFN0eWxlO1xuICAgICAgICBvcHRpb25zLmZpbGwgPVxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOlxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZWxlbWVudCdzIHNoYXBlIGFuZCBwdXRzIGl0IGludG8gdGhlIGNhY2hlLlxuICogQHBhcmFtIGVsZW1lbnRcbiAqIEBwYXJhbSBnZW5lcmF0b3JcbiAqL1xuY29uc3QgZ2VuZXJhdGVFbGVtZW50U2hhcGUgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgZ2VuZXJhdG9yOiBSb3VnaEdlbmVyYXRvcixcbikgPT4ge1xuICBsZXQgc2hhcGUgPSBzaGFwZUNhY2hlLmdldChlbGVtZW50KSB8fCBudWxsO1xuXG4gIGlmICghc2hhcGUpIHtcbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLmRlbGV0ZShlbGVtZW50KTtcblxuICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgICAgIGlmIChlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJyb3VuZFwiKSB7XG4gICAgICAgICAgY29uc3QgdyA9IGVsZW1lbnQud2lkdGg7XG4gICAgICAgICAgY29uc3QgaCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLm1pbih3LCBoKSAqIDAuMjU7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucGF0aChcbiAgICAgICAgICAgIGBNICR7cn0gMCBMICR7dyAtIHJ9IDAgUSAke3d9IDAsICR7d30gJHtyfSBMICR7d30gJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gUSAke3d9ICR7aH0sICR7dyAtIHJ9ICR7aH0gTCAke3J9ICR7aH0gUSAwICR7aH0sIDAgJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gTCAwICR7cn0gUSAwIDAsICR7cn0gMGAsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50LCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnJlY3RhbmdsZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkaWFtb25kXCI6IHtcbiAgICAgICAgY29uc3QgW3RvcFgsIHRvcFksIHJpZ2h0WCwgcmlnaHRZLCBib3R0b21YLCBib3R0b21ZLCBsZWZ0WCwgbGVmdFldID1cbiAgICAgICAgICBnZXREaWFtb25kUG9pbnRzKGVsZW1lbnQpO1xuICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wb2x5Z29uKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFt0b3BYLCB0b3BZXSxcbiAgICAgICAgICAgIFtyaWdodFgsIHJpZ2h0WV0sXG4gICAgICAgICAgICBbYm90dG9tWCwgYm90dG9tWV0sXG4gICAgICAgICAgICBbbGVmdFgsIGxlZnRZXSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLmVsbGlwc2UoXG4gICAgICAgICAgZWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgZWxlbWVudC5oZWlnaHQgLyAyLFxuICAgICAgICAgIGVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgZWxlbWVudC5oZWlnaHQsXG4gICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgIGNhc2UgXCJhcnJvd1wiOiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KTtcblxuICAgICAgICAvLyBwb2ludHMgYXJyYXkgY2FuIGJlIGVtcHR5IGluIHRoZSBiZWdpbm5pbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0byBhZGRcbiAgICAgICAgLy8gaW5pdGlhbCBwb3NpdGlvbiB0byBpdFxuICAgICAgICBjb25zdCBwb2ludHMgPSBlbGVtZW50LnBvaW50cy5sZW5ndGggPyBlbGVtZW50LnBvaW50cyA6IFtbMCwgMF1dO1xuXG4gICAgICAgIC8vIGN1cnZlIGlzIGFsd2F5cyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAvLyB0aGlzIHNpbXBsaWZpZXMgZmluZGluZyB0aGUgY3VydmUgZm9yIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKGVsZW1lbnQuc3Ryb2tlU2hhcnBuZXNzID09PSBcInNoYXJwXCIpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5maWxsKSB7XG4gICAgICAgICAgICBzaGFwZSA9IFtnZW5lcmF0b3IucG9seWdvbihwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBvcHRpb25zKV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlID0gW1xuICAgICAgICAgICAgICBnZW5lcmF0b3IubGluZWFyUGF0aChwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBvcHRpb25zKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gW2dlbmVyYXRvci5jdXJ2ZShwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBvcHRpb25zKV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbGluZXMgb25seSBpbiBhcnJvd1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImFycm93XCIpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXJ0QXJyb3doZWFkID0gbnVsbCwgZW5kQXJyb3doZWFkID0gXCJhcnJvd1wiIH0gPSBlbGVtZW50O1xuXG4gICAgICAgICAgY29uc3QgZ2V0QXJyb3doZWFkU2hhcGVzID0gKFxuICAgICAgICAgICAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICBzaGFwZTogRHJhd2FibGVbXSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiLFxuICAgICAgICAgICAgYXJyb3doZWFkOiBBcnJvd2hlYWQsXG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcnJvd2hlYWRQb2ludHMgPSBnZXRBcnJvd2hlYWRQb2ludHMoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHNoYXBlLFxuICAgICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgICAgYXJyb3doZWFkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGFycm93aGVhZFBvaW50cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE90aGVyIGFycm93aGVhZHMgaGVyZS4uLlxuICAgICAgICAgICAgaWYgKGFycm93aGVhZCA9PT0gXCJkb3RcIikge1xuICAgICAgICAgICAgICBjb25zdCBbeCwgeSwgcl0gPSBhcnJvd2hlYWRQb2ludHM7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3IuY2lyY2xlKHgsIHksIHIsIHtcbiAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICBmaWxsOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCIsXG4gICAgICAgICAgICAgICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkID09PSBcInRyaWFuZ2xlXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgW3gsIHksIHgyLCB5MiwgeDMsIHkzXSA9IGFycm93aGVhZFBvaW50cztcblxuICAgICAgICAgICAgICAvLyBhbHdheXMgdXNlIHNvbGlkIHN0cm9rZSBmb3IgdHJpYW5nbGUgYXJyb3doZWFkXG4gICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnN0cm9rZUxpbmVEYXNoO1xuXG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yLnBvbHlnb24oXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIFt4LCB5XSxcbiAgICAgICAgICAgICAgICAgICAgW3gyLCB5Ml0sXG4gICAgICAgICAgICAgICAgICAgIFt4MywgeTNdLFxuICAgICAgICAgICAgICAgICAgICBbeCwgeV0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXJyb3cgYXJyb3doZWFkc1xuICAgICAgICAgICAgY29uc3QgW3gyLCB5MiwgeDMsIHkzLCB4NCwgeTRdID0gYXJyb3doZWFkUG9pbnRzO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkb3R0ZWRcIikge1xuICAgICAgICAgICAgICAvLyBmb3IgZG90dGVkIGFycm93cyBjYXBzLCByZWR1Y2UgZ2FwIHRvIG1ha2UgaXQgbW9yZSBsZWdpYmxlXG4gICAgICAgICAgICAgIGNvbnN0IGRhc2ggPSBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICBvcHRpb25zLnN0cm9rZUxpbmVEYXNoID0gW2Rhc2hbMF0sIGRhc2hbMV0gLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciBzb2xpZC9kYXNoZWQsIGtlZXAgc29saWQgYXJyb3cgY2FwXG4gICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnN0cm9rZUxpbmVEYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yLmxpbmUoeDMsIHkzLCB4MiwgeTIsIG9wdGlvbnMpLFxuICAgICAgICAgICAgICBnZW5lcmF0b3IubGluZSh4NCwgeTQsIHgyLCB5Miwgb3B0aW9ucyksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoc3RhcnRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIFwic3RhcnRcIixcbiAgICAgICAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2hhcGUucHVzaCguLi5zaGFwZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBIZXksIHdlIGhhdmUgYW4gb2xkIGFycm93IGhlcmUhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIFwiZW5kXCIsXG4gICAgICAgICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaGFwZS5wdXNoKC4uLnNoYXBlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgICBnZW5lcmF0ZUZyZWVEcmF3U2hhcGUoZWxlbWVudCk7XG4gICAgICAgIHNoYXBlID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgIGNhc2UgXCJpbWFnZVwiOiB7XG4gICAgICAgIC8vIGp1c3QgdG8gZW5zdXJlIHdlIGRvbid0IHJlZ2VuZXJhdGUgZWxlbWVudC5jYW52YXMgb24gcmVyZW5kZXJzXG4gICAgICAgIHNoYXBlID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBzaGFwZUNhY2hlLnNldChlbGVtZW50LCBzaGFwZSk7XG4gIH1cbn07XG5cbmNvbnN0IGdlbmVyYXRlRWxlbWVudFdpdGhDYW52YXMgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb25zdCB6b29tOiBab29tID0gc2NlbmVTdGF0ZSA/IHNjZW5lU3RhdGUuem9vbSA6IGRlZmF1bHRBcHBTdGF0ZS56b29tO1xuICBjb25zdCBwcmV2RWxlbWVudFdpdGhDYW52YXMgPSBlbGVtZW50V2l0aENhbnZhc0NhY2hlLmdldChlbGVtZW50KTtcbiAgY29uc3Qgc2hvdWxkUmVnZW5lcmF0ZUJlY2F1c2Vab29tID1cbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMgJiZcbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSAhPT0gem9vbS52YWx1ZSAmJlxuICAgICFzY2VuZVN0YXRlPy5zaG91bGRDYWNoZUlnbm9yZVpvb207XG5cbiAgaWYgKFxuICAgICFwcmV2RWxlbWVudFdpdGhDYW52YXMgfHxcbiAgICBzaG91bGRSZWdlbmVyYXRlQmVjYXVzZVpvb20gfHxcbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMudGhlbWUgIT09IHNjZW5lU3RhdGUudGhlbWVcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRDYW52YXMoZWxlbWVudCwgem9vbSwgc2NlbmVTdGF0ZSk7XG5cbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLnNldChlbGVtZW50LCBlbGVtZW50V2l0aENhbnZhcyk7XG5cbiAgICByZXR1cm4gZWxlbWVudFdpdGhDYW52YXM7XG4gIH1cbiAgcmV0dXJuIHByZXZFbGVtZW50V2l0aENhbnZhcztcbn07XG5cbmNvbnN0IGRyYXdFbGVtZW50RnJvbUNhbnZhcyA9IChcbiAgZWxlbWVudFdpdGhDYW52YXM6IEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhcyxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4pID0+IHtcbiAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRXaXRoQ2FudmFzLmVsZW1lbnQ7XG4gIGNvbnN0IHBhZGRpbmcgPSBnZXRDYW52YXNQYWRkaW5nKGVsZW1lbnQpO1xuICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAvLyBGcmVlIGRyYXcgZWxlbWVudHMgd2lsbCBvdGhlcndpc2UgXCJzaHVmZmxlXCIgYXMgdGhlIG1pbiB4IGFuZCB5IGNoYW5nZVxuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICB4MSA9IE1hdGguZmxvb3IoeDEpO1xuICAgIHgyID0gTWF0aC5jZWlsKHgyKTtcbiAgICB5MSA9IE1hdGguZmxvb3IoeTEpO1xuICAgIHkyID0gTWF0aC5jZWlsKHkyKTtcbiAgfVxuXG4gIGNvbnN0IGN4ID0gKCh4MSArIHgyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFgpICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gIGNvbnN0IGN5ID0gKCh5MSArIHkyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFkpICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG5cbiAgY29uc3QgX2lzUGVuZGluZ0ltYWdlRWxlbWVudCA9IGlzUGVuZGluZ0ltYWdlRWxlbWVudChlbGVtZW50LCBzY2VuZVN0YXRlKTtcblxuICBjb25zdCBzY2FsZVhGYWN0b3IgPVxuICAgIFwic2NhbGVcIiBpbiBlbGVtZW50V2l0aENhbnZhcy5lbGVtZW50ICYmICFfaXNQZW5kaW5nSW1hZ2VFbGVtZW50XG4gICAgICA/IGVsZW1lbnRXaXRoQ2FudmFzLmVsZW1lbnQuc2NhbGVbMF1cbiAgICAgIDogMTtcbiAgY29uc3Qgc2NhbGVZRmFjdG9yID1cbiAgICBcInNjYWxlXCIgaW4gZWxlbWVudFdpdGhDYW52YXMuZWxlbWVudCAmJiAhX2lzUGVuZGluZ0ltYWdlRWxlbWVudFxuICAgICAgPyBlbGVtZW50V2l0aENhbnZhcy5lbGVtZW50LnNjYWxlWzFdXG4gICAgICA6IDE7XG5cbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc2NhbGUoXG4gICAgKDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKiBzY2FsZVhGYWN0b3IsXG4gICAgKDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgKiBzY2FsZVlGYWN0b3IsXG4gICk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4ICogc2NhbGVYRmFjdG9yLCBjeSAqIHNjYWxlWUZhY3Rvcik7XG4gIGNvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUgKiBzY2FsZVhGYWN0b3IgKiBzY2FsZVlGYWN0b3IpO1xuXG4gIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEsXG4gICAgKC0oeDIgLSB4MSkgLyAyKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgIChwYWRkaW5nICogZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSkgLyBlbGVtZW50V2l0aENhbnZhcy5jYW52YXNab29tLFxuICAgICgtKHkyIC0geTEpIC8gMikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtXG4gICAgICAocGFkZGluZyAqIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhc1pvb20pIC8gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSxcbiAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLndpZHRoIC8gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSxcbiAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLmhlaWdodCAvIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhc1pvb20sXG4gICk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xuXG4gIC8vIENsZWFyIHRoZSBuZXN0ZWQgZWxlbWVudCB3ZSBhcHBlbmRlZCB0byB0aGUgRE9NXG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVuZGVyT3B0aW1pemF0aW9uczogYm9vbGVhbixcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSByYy5nZW5lcmF0b3I7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKFxuICAgICAgICBlbGVtZW50LnggKyBzY2VuZVN0YXRlLnNjcm9sbFgsXG4gICAgICAgIGVsZW1lbnQueSArIHNjZW5lU3RhdGUuc2Nyb2xsWSxcbiAgICAgICk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwicmdiYSgwLCAwLCAyNTUsIDAuMTApXCI7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuXG4gICAgICBpZiAocmVuZGVyT3B0aW1pemF0aW9ucykge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aENhbnZhcyA9IGdlbmVyYXRlRWxlbWVudFdpdGhDYW52YXMoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBzY2VuZVN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBkcmF3RWxlbWVudEZyb21DYW52YXMoZWxlbWVudFdpdGhDYW52YXMsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMiArIHNjZW5lU3RhdGUuc2Nyb2xsWDtcbiAgICAgICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyICsgc2NlbmVTdGF0ZS5zY3JvbGxZO1xuICAgICAgICBjb25zdCBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgY29uc3Qgc2hpZnRZID0gKHkyIC0geTEpIC8gMiAtIChlbGVtZW50LnkgLSB5MSk7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgICBjb250ZXh0LnJvdGF0ZShlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoLXNoaWZ0WCwgLXNoaWZ0WSk7XG4gICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgcmMsIGNvbnRleHQsIHNjZW5lU3RhdGUpO1xuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuICAgICAgaWYgKHJlbmRlck9wdGltaXphdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRXaXRoQ2FudmFzKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgc2NlbmVTdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgZHJhd0VsZW1lbnRGcm9tQ2FudmFzKGVsZW1lbnRXaXRoQ2FudmFzLCByYywgY29udGV4dCwgc2NlbmVTdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFg7XG4gICAgICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMiArIHNjZW5lU3RhdGUuc2Nyb2xsWTtcbiAgICAgICAgY29uc3Qgc2hpZnRYID0gKHgyIC0geDEpIC8gMiAtIChlbGVtZW50LnggLSB4MSk7XG4gICAgICAgIGNvbnN0IHNoaWZ0WSA9ICh5MiAtIHkxKSAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuICAgICAgICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uID0gKFxuICByc3ZnOiBSb3VnaFNWRyxcbiAgZHJhd2FibGU6IERyYXdhYmxlLFxuICBwcmVjaXNpb24/OiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBwcmVjaXNpb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gcnN2Zy5kcmF3KGRyYXdhYmxlKTtcbiAgfVxuICBjb25zdCBwc2hhcGU6IERyYXdhYmxlID0ge1xuICAgIHNldHM6IGRyYXdhYmxlLnNldHMsXG4gICAgc2hhcGU6IGRyYXdhYmxlLnNoYXBlLFxuICAgIG9wdGlvbnM6IHsgLi4uZHJhd2FibGUub3B0aW9ucywgZml4ZWREZWNpbWFsUGxhY2VEaWdpdHM6IHByZWNpc2lvbiB9LFxuICB9O1xuICByZXR1cm4gcnN2Zy5kcmF3KHBzaGFwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudFRvU3ZnID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJzdmc6IFJvdWdoU1ZHLFxuICBzdmdSb290OiBTVkdFbGVtZW50LFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIG9mZnNldFg/OiBudW1iZXIsXG4gIG9mZnNldFk/OiBudW1iZXIsXG4gIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW4sXG4pID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgY3ggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgY29uc3QgY3kgPSAoeTIgLSB5MSkgLyAyIC0gKGVsZW1lbnQueSAtIHkxKTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGVsZW1lbnQuYW5nbGUpIC8gTWF0aC5QSTtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcnN2Zy5nZW5lcmF0b3I7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGlzIHVzZWQgb25seSBkdXJpbmcgZWRpdGluZyBleHBlcmllbmNlLCB3aGljaCBpcyBjYW52YXMgYmFzZWQsXG4gICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3Rpb24gcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNWR1wiKTtcbiAgICB9XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGNvbnN0IG5vZGUgPSByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uKFxuICAgICAgICByc3ZnLFxuICAgICAgICBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGUsXG4gICAgICAgIE1BWF9ERUNJTUFMU19GT1JfU1ZHX0VYUE9SVCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gZWxlbWVudC5vcGFjaXR5IC8gMTAwO1xuICAgICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgfVxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtbGluZWNhcFwiLCBcInJvdW5kXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgIGB0cmFuc2xhdGUoJHtvZmZzZXRYIHx8IDB9ICR7XG4gICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICk7XG4gICAgICBzdmdSb290LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgIGdlbmVyYXRlRWxlbWVudFNoYXBlKGVsZW1lbnQsIGdlbmVyYXRvcik7XG4gICAgICBjb25zdCBncm91cCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJnXCIpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcInN0cm9rZS1saW5lY2FwXCIsIFwicm91bmRcIik7XG5cbiAgICAgIChnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGVbXSkuZm9yRWFjaCgoc2hhcGUpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24oXG4gICAgICAgICAgcnN2ZyxcbiAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgICAgfSkgcm90YXRlKCR7ZGVncmVlfSAke2N4fSAke2N5fSlgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICAgIGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSAmJlxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICBzdmdSb290LmFwcGVuZENoaWxkKGdyb3VwKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgY29uc3QgcGF0aCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJwYXRoXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJub25lXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGVsZW1lbnQuc3Ryb2tlQ29sb3IpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGdldEZyZWVEcmF3U3ZnUGF0aChlbGVtZW50KSk7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiaW1hZ2VcIjoge1xuICAgICAgY29uc3QgZmlsZURhdGEgPVxuICAgICAgICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmIGZpbGVzW2VsZW1lbnQuZmlsZUlkXTtcbiAgICAgIGlmIChmaWxlRGF0YSkge1xuICAgICAgICBjb25zdCBzeW1ib2xJZCA9IGBpbWFnZS0ke2ZpbGVEYXRhLmlkfWA7XG4gICAgICAgIGxldCBzeW1ib2wgPSBzdmdSb290LnF1ZXJ5U2VsZWN0b3IoYCMke3N5bWJvbElkfWApO1xuICAgICAgICBpZiAoIXN5bWJvbCkge1xuICAgICAgICAgIHN5bWJvbCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzeW1ib2xcIik7XG4gICAgICAgICAgc3ltYm9sLmlkID0gc3ltYm9sSWQ7XG5cbiAgICAgICAgICBjb25zdCBpbWFnZSA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJpbWFnZVwiKTtcblxuICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCIxMDAlXCIpO1xuICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgZmlsZURhdGEuZGF0YVVSTCk7XG5cbiAgICAgICAgICBzeW1ib2wuYXBwZW5kQ2hpbGQoaW1hZ2UpO1xuXG4gICAgICAgICAgc3ZnUm9vdC5wcmVwZW5kKHN5bWJvbCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1c2UgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwidXNlXCIpO1xuICAgICAgICB1c2Uuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBgIyR7c3ltYm9sSWR9YCk7XG5cbiAgICAgICAgLy8gaW4gZGFyayB0aGVtZSwgcmV2ZXJ0IHRoZSBpbWFnZSBjb2xvciBmaWx0ZXJcbiAgICAgICAgaWYgKGV4cG9ydFdpdGhEYXJrTW9kZSAmJiBmaWxlRGF0YS5taW1lVHlwZSAhPT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgICAgICB1c2Uuc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIElNQUdFX0lOVkVSVF9GSUxURVIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke01hdGgucm91bmQoZWxlbWVudC53aWR0aCl9YCk7XG4gICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7TWF0aC5yb3VuZChlbGVtZW50LmhlaWdodCl9YCk7XG5cbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgIGB0cmFuc2xhdGUoJHtvZmZzZXRYIHx8IDB9ICR7XG4gICAgICAgICAgICBvZmZzZXRZIHx8IDBcbiAgICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICAgICk7XG5cbiAgICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZCh1c2UpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcInN0cm9rZS1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgIGB0cmFuc2xhdGUoJHtvZmZzZXRYIHx8IDB9ICR7XG4gICAgICAgICAgICBvZmZzZXRZIHx8IDBcbiAgICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZWxlbWVudC50ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBlbGVtZW50LmhlaWdodCAvIGxpbmVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmVydGljYWxPZmZzZXQgPSBlbGVtZW50LmhlaWdodCAtIGVsZW1lbnQuYmFzZWxpbmU7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IGVsZW1lbnQud2lkdGggLyAyXG4gICAgICAgICAgICA6IGVsZW1lbnQudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aFxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1JUTChlbGVtZW50LnRleHQpID8gXCJydGxcIiA6IFwibHRyXCI7XG4gICAgICAgIGNvbnN0IHRleHRBbmNob3IgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IFwibWlkZGxlXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIiB8fCBkaXJlY3Rpb24gPT09IFwicnRsXCJcbiAgICAgICAgICAgID8gXCJlbmRcIlxuICAgICAgICAgICAgOiBcInN0YXJ0XCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInRleHRcIik7XG4gICAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IGxpbmVzW2ldO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieFwiLCBgJHtob3Jpem9udGFsT2Zmc2V0fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieVwiLCBgJHsoaSArIDEpICogbGluZUhlaWdodCAtIHZlcnRpY2FsT2Zmc2V0fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZm9udC1mYW1pbHlcIiwgZ2V0Rm9udEZhbWlseVN0cmluZyhlbGVtZW50KSk7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJmb250LXNpemVcIiwgYCR7ZWxlbWVudC5mb250U2l6ZX1weGApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBlbGVtZW50LnN0cm9rZUNvbG9yKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcInRleHQtYW5jaG9yXCIsIHRleHRBbmNob3IpO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJ3aGl0ZS1zcGFjZTogcHJlO1wiKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcImRpcmVjdGlvblwiLCBkaXJlY3Rpb24pO1xuICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcGF0aHNDYWNoZSA9IG5ldyBXZWFrTWFwPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsIFBhdGgyRD4oW10pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgY29uc3Qgc3ZnUGF0aERhdGEgPSBnZXRGcmVlRHJhd1N2Z1BhdGgoZWxlbWVudCk7XG4gIGNvbnN0IHBhdGggPSBuZXcgUGF0aDJEKHN2Z1BhdGhEYXRhKTtcbiAgcGF0aHNDYWNoZS5zZXQoZWxlbWVudCwgcGF0aCk7XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJlZURyYXdQYXRoMkQoZWxlbWVudDogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCkge1xuICByZXR1cm4gcGF0aHNDYWNoZS5nZXQoZWxlbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcmVlRHJhd1N2Z1BhdGgoZWxlbWVudDogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCkge1xuICAvLyBJZiBpbnB1dCBwb2ludHMgYXJlIGVtcHR5IChzaG91bGQgdGhleSBldmVyIGJlPykgcmV0dXJuIGEgZG90XG4gIGNvbnN0IGlucHV0UG9pbnRzID0gZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgPyBlbGVtZW50LnBvaW50c1xuICAgIDogZWxlbWVudC5wb2ludHMubGVuZ3RoXG4gICAgPyBlbGVtZW50LnBvaW50cy5tYXAoKFt4LCB5XSwgaSkgPT4gW3gsIHksIGVsZW1lbnQucHJlc3N1cmVzW2ldXSlcbiAgICA6IFtbMCwgMCwgMC41XV07XG5cbiAgLy8gQ29uc2lkZXIgY2hhbmdpbmcgdGhlIG9wdGlvbnMgZm9yIHNpbXVsYXRlZCBwcmVzc3VyZSB2cyByZWFsIHByZXNzdXJlXG4gIGNvbnN0IG9wdGlvbnM6IFN0cm9rZU9wdGlvbnMgPSB7XG4gICAgc2ltdWxhdGVQcmVzc3VyZTogZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlLFxuICAgIHNpemU6IGVsZW1lbnQuc3Ryb2tlV2lkdGggKiA0LjI1LFxuICAgIHRoaW5uaW5nOiAwLjYsXG4gICAgc21vb3RoaW5nOiAwLjUsXG4gICAgc3RyZWFtbGluZTogMC41LFxuICAgIGVhc2luZzogKHQpID0+IE1hdGguc2luKCh0ICogTWF0aC5QSSkgLyAyKSwgLy8gaHR0cHM6Ly9lYXNpbmdzLm5ldC8jZWFzZU91dFNpbmVcbiAgICBsYXN0OiAhIWVsZW1lbnQubGFzdENvbW1pdHRlZFBvaW50LCAvLyBMYXN0Q29tbWl0dGVkUG9pbnQgaXMgYWRkZWQgb24gcG9pbnRlcnVwXG4gIH07XG5cbiAgcmV0dXJuIGdldFN2Z1BhdGhGcm9tU3Ryb2tlKGdldFN0cm9rZShpbnB1dFBvaW50cyBhcyBudW1iZXJbXVtdLCBvcHRpb25zKSk7XG59XG5cbmZ1bmN0aW9uIG1lZChBOiBudW1iZXJbXSwgQjogbnVtYmVyW10pIHtcbiAgcmV0dXJuIFsoQVswXSArIEJbMF0pIC8gMiwgKEFbMV0gKyBCWzFdKSAvIDJdO1xufVxuXG4vLyBUcmltIFNWRyBwYXRoIGRhdGEgc28gbnVtYmVyIGFyZSBlYWNoIHR3byBkZWNpbWFsIHBvaW50cy4gVGhpc1xuLy8gaW1wcm92ZXMgU1ZHIGV4cG9ydHMsIGFuZCBwcmV2ZW50cyByZW5kZXJpbmcgZXJyb3JzIG9uIHBvaW50c1xuLy8gd2l0aCBsb25nIGRlY2ltYWxzLlxuY29uc3QgVE9fRklYRURfUFJFQ0lTSU9OID0gLyhcXHM/W0EtWl0/LD8tP1swLTldKlxcLlswLTldezAsMn0pKChbMC05XXxlfC0pKikvZztcblxuZnVuY3Rpb24gZ2V0U3ZnUGF0aEZyb21TdHJva2UocG9pbnRzOiBudW1iZXJbXVtdKTogc3RyaW5nIHtcbiAgaWYgKCFwb2ludHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBjb25zdCBtYXggPSBwb2ludHMubGVuZ3RoIC0gMTtcblxuICByZXR1cm4gcG9pbnRzXG4gICAgLnJlZHVjZShcbiAgICAgIChhY2MsIHBvaW50LCBpLCBhcnIpID0+IHtcbiAgICAgICAgaWYgKGkgPT09IG1heCkge1xuICAgICAgICAgIGFjYy5wdXNoKHBvaW50LCBtZWQocG9pbnQsIGFyclswXSksIFwiTFwiLCBhcnJbMF0sIFwiWlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MucHVzaChwb2ludCwgbWVkKHBvaW50LCBhcnJbaSArIDFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXCJNXCIsIHBvaW50c1swXSwgXCJRXCJdLFxuICAgIClcbiAgICAuam9pbihcIiBcIilcbiAgICAucmVwbGFjZShUT19GSVhFRF9QUkVDSVNJT04sIFwiJDFcIik7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../renderer/renderElement.ts\n");
|
|
2778
2778
|
|
|
2779
2779
|
/***/ }),
|
|
2780
2780
|
|
|
@@ -2785,7 +2785,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2785
2785
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2786
2786
|
|
|
2787
2787
|
"use strict";
|
|
2788
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"renderScene\": () => (/* binding */ renderScene),\n/* harmony export */ \"renderSceneToSvg\": () => (/* binding */ renderSceneToSvg)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _roundRect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./roundRect */ \"../../renderer/roundRect.ts\");\n/* harmony import */ var _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/scrollbars */ \"../../scene/scrollbars.ts\");\n/* harmony import */ var _scene_selection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../scene/selection */ \"../../scene/selection.ts\");\n/* harmony import */ var _renderElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../clients */ \"../../clients.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/collision */ \"../../element/collision.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../types */ \"../../types.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst hasEmojiSupport = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.supportsEmoji)();\r\nconst strokeRectWithRotation = (context, x, y, width, height, cx, cy, angle, fill = false) => {\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(angle);\r\n if (fill) {\r\n context.fillRect(x - cx, y - cy, width, height);\r\n }\r\n context.strokeRect(x - cx, y - cy, width, height);\r\n context.restore();\r\n};\r\nconst strokeDiamondWithRotation = (context, width, height, cx, cy, angle) => {\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(angle);\r\n context.beginPath();\r\n context.moveTo(0, height / 2);\r\n context.lineTo(width / 2, 0);\r\n context.lineTo(0, -height / 2);\r\n context.lineTo(-width / 2, 0);\r\n context.closePath();\r\n context.stroke();\r\n context.restore();\r\n};\r\nconst strokeEllipseWithRotation = (context, width, height, cx, cy, angle) => {\r\n context.beginPath();\r\n context.ellipse(cx, cy, width / 2, height / 2, angle, 0, Math.PI * 2);\r\n context.stroke();\r\n};\r\nconst fillCircle = (context, cx, cy, radius) => {\r\n context.beginPath();\r\n context.arc(cx, cy, radius, 0, Math.PI * 2);\r\n context.fill();\r\n context.stroke();\r\n};\r\nconst strokeGrid = (context, gridSize, offsetX, offsetY, width, height) => {\r\n context.save();\r\n context.strokeStyle = \"rgba(0,0,0,0.1)\";\r\n context.beginPath();\r\n for (let x = offsetX; x < offsetX + width + gridSize * 2; x += gridSize) {\r\n context.moveTo(x, offsetY - gridSize);\r\n context.lineTo(x, offsetY + height + gridSize * 2);\r\n }\r\n for (let y = offsetY; y < offsetY + height + gridSize * 2; y += gridSize) {\r\n context.moveTo(offsetX - gridSize, y);\r\n context.lineTo(offsetX + width + gridSize * 2, y);\r\n }\r\n context.stroke();\r\n context.restore();\r\n};\r\nconst renderLinearPointHandles = (context, appState, sceneState, element) => {\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointsGlobalCoordinates(element).forEach((point, idx) => {\r\n var _a;\r\n context.strokeStyle = \"red\";\r\n context.setLineDash([]);\r\n context.fillStyle =\r\n ((_a = appState.editingLinearElement) === null || _a === void 0 ? void 0 : _a.activePointIndex) === idx\r\n ? \"rgba(255, 127, 127, 0.9)\"\r\n : \"rgba(255, 255, 255, 0.9)\";\r\n const { POINT_HANDLE_SIZE } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor;\r\n fillCircle(context, point[0], point[1], POINT_HANDLE_SIZE / 2 / sceneState.zoom.value);\r\n });\r\n context.restore();\r\n};\r\nconst renderScene = (elements, appState, selectionElement, scale, rc, canvas, sceneState, \r\n// extra options passed to the renderer\r\n{ renderScrollbars = true, renderSelection = true, \r\n// Whether to employ render optimizations to improve performance.\r\n// Should not be turned on for export operations and similar, because it\r\n// doesn't guarantee pixel-perfect output.\r\nrenderOptimizations = false, renderGrid = true, \r\n/** when exporting the behavior is slightly different (e.g. we can't use\r\n CSS filters) */\r\nisExport = false, } = {}) => {\r\n if (canvas === null) {\r\n return { atLeastOneVisibleElement: false };\r\n }\r\n const context = canvas.getContext(\"2d\");\r\n context.setTransform(1, 0, 0, 1, 0, 0);\r\n context.save();\r\n context.scale(scale, scale);\r\n // When doing calculations based on canvas width we should used normalized one\r\n const normalizedCanvasWidth = canvas.width / scale;\r\n const normalizedCanvasHeight = canvas.height / scale;\r\n if (isExport && sceneState.theme === \"dark\") {\r\n context.filter = _constants__WEBPACK_IMPORTED_MODULE_13__.THEME_FILTER;\r\n }\r\n // Paint background\r\n if (typeof sceneState.viewBackgroundColor === \"string\") {\r\n const hasTransparence = sceneState.viewBackgroundColor === \"transparent\" ||\r\n sceneState.viewBackgroundColor.length === 5 || // #RGBA\r\n sceneState.viewBackgroundColor.length === 9 || // #RRGGBBA\r\n /(hsla|rgba)\\(/.test(sceneState.viewBackgroundColor);\r\n if (hasTransparence) {\r\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\r\n }\r\n context.save();\r\n context.fillStyle = sceneState.viewBackgroundColor;\r\n context.fillRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\r\n context.restore();\r\n }\r\n else {\r\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\r\n }\r\n // Apply zoom\r\n const zoomTranslationX = sceneState.zoom.translation.x;\r\n const zoomTranslationY = sceneState.zoom.translation.y;\r\n context.save();\r\n context.translate(zoomTranslationX, zoomTranslationY);\r\n context.scale(sceneState.zoom.value, sceneState.zoom.value);\r\n // Grid\r\n if (renderGrid && appState.gridSize) {\r\n strokeGrid(context, appState.gridSize, -Math.ceil(zoomTranslationX / sceneState.zoom.value / appState.gridSize) *\r\n appState.gridSize +\r\n (sceneState.scrollX % appState.gridSize), -Math.ceil(zoomTranslationY / sceneState.zoom.value / appState.gridSize) *\r\n appState.gridSize +\r\n (sceneState.scrollY % appState.gridSize), normalizedCanvasWidth / sceneState.zoom.value, normalizedCanvasHeight / sceneState.zoom.value);\r\n }\r\n // Paint visible elements\r\n const visibleElements = elements.filter((element) => isVisibleElement(element, normalizedCanvasWidth, normalizedCanvasHeight, {\r\n zoom: sceneState.zoom,\r\n offsetLeft: appState.offsetLeft,\r\n offsetTop: appState.offsetTop,\r\n scrollX: sceneState.scrollX,\r\n scrollY: sceneState.scrollY,\r\n }));\r\n visibleElements.forEach((element) => {\r\n try {\r\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(element, rc, context, renderOptimizations, sceneState);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n });\r\n if (appState.editingLinearElement) {\r\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getElement(appState.editingLinearElement.elementId);\r\n if (element) {\r\n renderLinearPointHandles(context, appState, sceneState, element);\r\n }\r\n }\r\n // Paint selection element\r\n if (selectionElement) {\r\n try {\r\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(selectionElement, rc, context, renderOptimizations, sceneState);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_10__.isBindingEnabled)(appState)) {\r\n appState.suggestedBindings\r\n .filter((binding) => binding != null)\r\n .forEach((suggestedBinding) => {\r\n renderBindingHighlight(context, sceneState, suggestedBinding);\r\n });\r\n }\r\n // Paint selected elements\r\n if (renderSelection &&\r\n !appState.multiElement &&\r\n !appState.editingLinearElement) {\r\n const selections = elements.reduce((acc, element) => {\r\n const selectionColors = [];\r\n // local user\r\n if (appState.selectedElementIds[element.id] &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_8__.isSelectedViaGroup)(appState, element)) {\r\n selectionColors.push(open_color__WEBPACK_IMPORTED_MODULE_0__.black);\r\n }\r\n // remote users\r\n if (sceneState.remoteSelectedElementIds[element.id]) {\r\n selectionColors.push(...sceneState.remoteSelectedElementIds[element.id].map((socketId) => {\r\n const { background } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(socketId, appState);\r\n return background;\r\n }));\r\n }\r\n if (selectionColors.length) {\r\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n acc.push({\r\n angle: element.angle,\r\n elementX1,\r\n elementY1,\r\n elementX2,\r\n elementY2,\r\n selectionColors,\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n const addSelectionForGroupId = (groupId) => {\r\n const groupElements = (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getElementsInGroup)(elements, groupId);\r\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(groupElements);\r\n selections.push({\r\n angle: 0,\r\n elementX1,\r\n elementX2,\r\n elementY1,\r\n elementY2,\r\n selectionColors: [open_color__WEBPACK_IMPORTED_MODULE_0__.black],\r\n });\r\n };\r\n for (const groupId of (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getSelectedGroupIds)(appState)) {\r\n // TODO: support multiplayer selected group IDs\r\n addSelectionForGroupId(groupId);\r\n }\r\n if (appState.editingGroupId) {\r\n addSelectionForGroupId(appState.editingGroupId);\r\n }\r\n selections.forEach((selection) => renderSelectionBorder(context, sceneState, selection));\r\n const locallySelectedElements = (0,_scene_selection__WEBPACK_IMPORTED_MODULE_4__.getSelectedElements)(elements, appState);\r\n // Paint resize transformHandles\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n if (locallySelectedElements.length === 1) {\r\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandles)(locallySelectedElements[0], sceneState.zoom, \"mouse\");\r\n if (!appState.viewModeEnabled) {\r\n renderTransformHandles(context, sceneState, transformHandles, locallySelectedElements[0].angle);\r\n }\r\n }\r\n else if (locallySelectedElements.length > 1 && !appState.isRotating) {\r\n const dashedLinePadding = 4 / sceneState.zoom.value;\r\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(locallySelectedElements);\r\n const initialLineDash = context.getLineDash();\r\n context.setLineDash([2 / sceneState.zoom.value]);\r\n const lineWidth = context.lineWidth;\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n strokeRectWithRotation(context, x1 - dashedLinePadding, y1 - dashedLinePadding, x2 - x1 + dashedLinePadding * 2, y2 - y1 + dashedLinePadding * 2, (x1 + x2) / 2, (y1 + y2) / 2, 0);\r\n context.lineWidth = lineWidth;\r\n context.setLineDash(initialLineDash);\r\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandlesFromCoords)([x1, y1, x2, y2], 0, sceneState.zoom, \"mouse\", _element__WEBPACK_IMPORTED_MODULE_1__.OMIT_SIDES_FOR_MULTIPLE_ELEMENTS);\r\n renderTransformHandles(context, sceneState, transformHandles, 0);\r\n }\r\n context.restore();\r\n }\r\n // Reset zoom\r\n context.restore();\r\n // Paint remote pointers\r\n for (const clientId in sceneState.remotePointerViewportCoords) {\r\n let { x, y } = sceneState.remotePointerViewportCoords[clientId];\r\n x -= appState.offsetLeft;\r\n y -= appState.offsetTop;\r\n const width = 9;\r\n const height = 14;\r\n const isOutOfBounds = x < 0 ||\r\n x > normalizedCanvasWidth - width ||\r\n y < 0 ||\r\n y > normalizedCanvasHeight - height;\r\n x = Math.max(x, 0);\r\n x = Math.min(x, normalizedCanvasWidth - width);\r\n y = Math.max(y, 0);\r\n y = Math.min(y, normalizedCanvasHeight - height);\r\n const { background, stroke } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(clientId, appState);\r\n context.save();\r\n context.strokeStyle = stroke;\r\n context.fillStyle = background;\r\n const userState = sceneState.remotePointerUserStates[clientId];\r\n if (isOutOfBounds || userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\r\n context.globalAlpha = 0.48;\r\n }\r\n if (sceneState.remotePointerButton &&\r\n sceneState.remotePointerButton[clientId] === \"down\") {\r\n context.beginPath();\r\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\r\n context.lineWidth = 3;\r\n context.strokeStyle = \"#ffffff88\";\r\n context.stroke();\r\n context.closePath();\r\n context.beginPath();\r\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\r\n context.lineWidth = 1;\r\n context.strokeStyle = stroke;\r\n context.stroke();\r\n context.closePath();\r\n }\r\n context.beginPath();\r\n context.moveTo(x, y);\r\n context.lineTo(x + 1, y + 14);\r\n context.lineTo(x + 4, y + 9);\r\n context.lineTo(x + 9, y + 10);\r\n context.lineTo(x, y);\r\n context.fill();\r\n context.stroke();\r\n const username = sceneState.remotePointerUsernames[clientId];\r\n let idleState = \"\";\r\n if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\r\n idleState = hasEmojiSupport ? \"⚫️\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY})`;\r\n }\r\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE) {\r\n idleState = hasEmojiSupport ? \"💤\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE})`;\r\n }\r\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.ACTIVE) {\r\n idleState = hasEmojiSupport ? \"🟢\" : \"\";\r\n }\r\n const usernameAndIdleState = `${username ? `${username} ` : \"\"}${idleState}`;\r\n if (!isOutOfBounds && usernameAndIdleState) {\r\n const offsetX = x + width;\r\n const offsetY = y + height;\r\n const paddingHorizontal = 4;\r\n const paddingVertical = 4;\r\n const measure = context.measureText(usernameAndIdleState);\r\n const measureHeight = measure.actualBoundingBoxDescent + measure.actualBoundingBoxAscent;\r\n // Border\r\n context.fillStyle = stroke;\r\n context.fillRect(offsetX - 1, offsetY - 1, measure.width + 2 * paddingHorizontal + 2, measureHeight + 2 * paddingVertical + 2);\r\n // Background\r\n context.fillStyle = background;\r\n context.fillRect(offsetX, offsetY, measure.width + 2 * paddingHorizontal, measureHeight + 2 * paddingVertical);\r\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n context.fillText(usernameAndIdleState, offsetX + paddingHorizontal, offsetY + paddingVertical + measure.actualBoundingBoxAscent);\r\n }\r\n context.restore();\r\n context.closePath();\r\n }\r\n // Paint scrollbars\r\n let scrollBars;\r\n if (renderScrollbars) {\r\n scrollBars = (0,_scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.getScrollBars)(elements, normalizedCanvasWidth, normalizedCanvasHeight, sceneState);\r\n context.save();\r\n context.fillStyle = _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_COLOR;\r\n context.strokeStyle = \"rgba(255,255,255,0.8)\";\r\n [scrollBars.horizontal, scrollBars.vertical].forEach((scrollBar) => {\r\n if (scrollBar) {\r\n (0,_roundRect__WEBPACK_IMPORTED_MODULE_2__.roundRect)(context, scrollBar.x, scrollBar.y, scrollBar.width, scrollBar.height, _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_WIDTH / 2);\r\n }\r\n });\r\n context.restore();\r\n }\r\n context.restore();\r\n return { atLeastOneVisibleElement: visibleElements.length > 0, scrollBars };\r\n};\r\nconst renderTransformHandles = (context, sceneState, transformHandles, angle) => {\r\n Object.keys(transformHandles).forEach((key) => {\r\n const transformHandle = transformHandles[key];\r\n if (transformHandle !== undefined) {\r\n context.save();\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n if (key === \"rotation\") {\r\n fillCircle(context, transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, transformHandle[2] / 2);\r\n }\r\n else {\r\n strokeRectWithRotation(context, transformHandle[0], transformHandle[1], transformHandle[2], transformHandle[3], transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, angle, true);\r\n }\r\n context.restore();\r\n }\r\n });\r\n};\r\nconst renderSelectionBorder = (context, sceneState, elementProperties) => {\r\n const { angle, elementX1, elementY1, elementX2, elementY2, selectionColors } = elementProperties;\r\n const elementWidth = elementX2 - elementX1;\r\n const elementHeight = elementY2 - elementY1;\r\n const dashedLinePadding = 4 / sceneState.zoom.value;\r\n const dashWidth = 8 / sceneState.zoom.value;\r\n const spaceWidth = 4 / sceneState.zoom.value;\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n const count = selectionColors.length;\r\n for (let index = 0; index < count; ++index) {\r\n context.strokeStyle = selectionColors[index];\r\n context.setLineDash([\r\n dashWidth,\r\n spaceWidth + (dashWidth + spaceWidth) * (count - 1),\r\n ]);\r\n context.lineDashOffset = (dashWidth + spaceWidth) * index;\r\n strokeRectWithRotation(context, elementX1 - dashedLinePadding, elementY1 - dashedLinePadding, elementWidth + dashedLinePadding * 2, elementHeight + dashedLinePadding * 2, elementX1 + elementWidth / 2, elementY1 + elementHeight / 2, angle);\r\n }\r\n context.restore();\r\n};\r\nconst renderBindingHighlight = (context, sceneState, suggestedBinding) => {\r\n const renderHighlight = Array.isArray(suggestedBinding)\r\n ? renderBindingHighlightForSuggestedPointBinding\r\n : renderBindingHighlightForBindableElement;\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n renderHighlight(context, suggestedBinding);\r\n context.restore();\r\n};\r\nconst renderBindingHighlightForBindableElement = (context, element) => {\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const width = x2 - x1;\r\n const height = y2 - y1;\r\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(element, width, height);\r\n // So that we don't overlap the element itself\r\n const strokeOffset = 4;\r\n context.strokeStyle = \"rgba(0,0,0,.05)\";\r\n context.lineWidth = threshold - strokeOffset;\r\n const padding = strokeOffset / 2 + threshold / 2;\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"text\":\r\n strokeRectWithRotation(context, x1 - padding, y1 - padding, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\r\n break;\r\n case \"diamond\":\r\n const side = Math.hypot(width, height);\r\n const wPadding = (padding * side) / height;\r\n const hPadding = (padding * side) / width;\r\n strokeDiamondWithRotation(context, width + wPadding * 2, height + hPadding * 2, x1 + width / 2, y1 + height / 2, element.angle);\r\n break;\r\n case \"ellipse\":\r\n strokeEllipseWithRotation(context, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\r\n break;\r\n }\r\n};\r\nconst renderBindingHighlightForSuggestedPointBinding = (context, suggestedBinding) => {\r\n const [element, startOrEnd, bindableElement] = suggestedBinding;\r\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(bindableElement, bindableElement.width, bindableElement.height);\r\n context.strokeStyle = \"rgba(0,0,0,0)\";\r\n context.fillStyle = \"rgba(0,0,0,.05)\";\r\n const pointIndices = startOrEnd === \"both\" ? [0, -1] : startOrEnd === \"start\" ? [0] : [-1];\r\n pointIndices.forEach((index) => {\r\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointAtIndexGlobalCoordinates(element, index);\r\n fillCircle(context, x, y, threshold);\r\n });\r\n};\r\nconst isVisibleElement = (element, canvasWidth, canvasHeight, viewTransformations) => {\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementBounds)(element); // scene coordinates\r\n const topLeftSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\r\n clientX: viewTransformations.offsetLeft,\r\n clientY: viewTransformations.offsetTop,\r\n }, viewTransformations);\r\n const bottomRightSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\r\n clientX: viewTransformations.offsetLeft + canvasWidth,\r\n clientY: viewTransformations.offsetTop + canvasHeight,\r\n }, viewTransformations);\r\n return (topLeftSceneCoords.x <= x2 &&\r\n topLeftSceneCoords.y <= y2 &&\r\n bottomRightSceneCoords.x >= x1 &&\r\n bottomRightSceneCoords.y >= y1);\r\n};\r\n// This should be only called for exporting purposes\r\nconst renderSceneToSvg = (elements, rsvg, svgRoot, files, { offsetX = 0, offsetY = 0, } = {}) => {\r\n if (!svgRoot) {\r\n return;\r\n }\r\n // render elements\r\n elements.forEach((element) => {\r\n if (!element.isDeleted) {\r\n try {\r\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElementToSvg)(element, rsvg, svgRoot, files, element.x + offsetX, element.y + offsetY);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n });\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFDbkIsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQ3BCLENBQUM7YUFDSDtZQUFDLE9BQU8sS0FBVSxFQUFFO2dCQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9yZW5kZXJlci9yZW5kZXJTY2VuZS50cz9lMjZmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdWdoQ2FudmFzIH0gZnJvbSBcInJvdWdoanMvYmluL2NhbnZhc1wiO1xuaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tIFwicm91Z2hqcy9iaW4vc3ZnXCI7XG5pbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcblxuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzLCBab29tIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyxcbiAgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMsXG4gIGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzLFxuICBnZXRUcmFuc2Zvcm1IYW5kbGVzLFxuICBnZXRFbGVtZW50Qm91bmRzLFxuICBnZXRDb21tb25Cb3VuZHMsXG59IGZyb20gXCIuLi9lbGVtZW50XCI7XG5cbmltcG9ydCB7IHJvdW5kUmVjdCB9IGZyb20gXCIuL3JvdW5kUmVjdFwiO1xuaW1wb3J0IHsgU2NlbmVTdGF0ZSB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0U2Nyb2xsQmFycyxcbiAgU0NST0xMQkFSX0NPTE9SLFxuICBTQ1JPTExCQVJfV0lEVEgsXG59IGZyb20gXCIuLi9zY2VuZS9zY3JvbGxiYXJzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lL3NlbGVjdGlvblwiO1xuXG5pbXBvcnQgeyByZW5kZXJFbGVtZW50LCByZW5kZXJFbGVtZW50VG9TdmcgfSBmcm9tIFwiLi9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRDbGllbnRDb2xvcnMgfSBmcm9tIFwiLi4vY2xpZW50c1wiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7XG4gIGlzU2VsZWN0ZWRWaWFHcm91cCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkcyxcbiAgZ2V0RWxlbWVudHNJbkdyb3VwLFxufSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgeyBtYXhCaW5kaW5nR2FwIH0gZnJvbSBcIi4uL2VsZW1lbnQvY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICBTdWdnZXN0ZWRCaW5kaW5nLFxuICBTdWdnZXN0ZWRQb2ludEJpbmRpbmcsXG4gIGlzQmluZGluZ0VuYWJsZWQsXG59IGZyb20gXCIuLi9lbGVtZW50L2JpbmRpbmdcIjtcbmltcG9ydCB7XG4gIFRyYW5zZm9ybUhhbmRsZXMsXG4gIFRyYW5zZm9ybUhhbmRsZVR5cGUsXG59IGZyb20gXCIuLi9lbGVtZW50L3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcywgc3VwcG9ydHNFbW9qaSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgVXNlcklkbGVTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBoYXNFbW9qaVN1cHBvcnQgPSBzdXBwb3J0c0Vtb2ppKCk7XG5cbmNvbnN0IHN0cm9rZVJlY3RXaXRoUm90YXRpb24gPSAoXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBjeDogbnVtYmVyLFxuICBjeTogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuICBmaWxsOiBib29sZWFuID0gZmFsc2UsXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgaWYgKGZpbGwpIHtcbiAgICBjb250ZXh0LmZpbGxSZWN0KHggLSBjeCwgeSAtIGN5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgfVxuICBjb250ZXh0LnN0cm9rZVJlY3QoeCAtIGN4LCB5IC0gY3ksIHdpZHRoLCBoZWlnaHQpO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmNvbnN0IHN0cm9rZURpYW1vbmRXaXRoUm90YXRpb24gPSAoXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIGN4OiBudW1iZXIsXG4gIGN5OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5tb3ZlVG8oMCwgaGVpZ2h0IC8gMik7XG4gIGNvbnRleHQubGluZVRvKHdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQubGluZVRvKDAsIC1oZWlnaHQgLyAyKTtcbiAgY29udGV4dC5saW5lVG8oLXdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3Qgc3Ryb2tlRWxsaXBzZVdpdGhSb3RhdGlvbiA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgY3g6IG51bWJlcixcbiAgY3k6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbikgPT4ge1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjb250ZXh0LmVsbGlwc2UoY3gsIGN5LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGFuZ2xlLCAwLCBNYXRoLlBJICogMik7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG59O1xuXG5jb25zdCBmaWxsQ2lyY2xlID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGN4OiBudW1iZXIsXG4gIGN5OiBudW1iZXIsXG4gIHJhZGl1czogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNvbnRleHQuYXJjKGN4LCBjeSwgcmFkaXVzLCAwLCBNYXRoLlBJICogMik7XG4gIGNvbnRleHQuZmlsbCgpO1xuICBjb250ZXh0LnN0cm9rZSgpO1xufTtcblxuY29uc3Qgc3Ryb2tlR3JpZCA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBncmlkU2l6ZTogbnVtYmVyLFxuICBvZmZzZXRYOiBudW1iZXIsXG4gIG9mZnNldFk6IG51bWJlcixcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMC4xKVwiO1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICBmb3IgKGxldCB4ID0gb2Zmc2V0WDsgeCA8IG9mZnNldFggKyB3aWR0aCArIGdyaWRTaXplICogMjsgeCArPSBncmlkU2l6ZSkge1xuICAgIGNvbnRleHQubW92ZVRvKHgsIG9mZnNldFkgLSBncmlkU2l6ZSk7XG4gICAgY29udGV4dC5saW5lVG8oeCwgb2Zmc2V0WSArIGhlaWdodCArIGdyaWRTaXplICogMik7XG4gIH1cbiAgZm9yIChsZXQgeSA9IG9mZnNldFk7IHkgPCBvZmZzZXRZICsgaGVpZ2h0ICsgZ3JpZFNpemUgKiAyOyB5ICs9IGdyaWRTaXplKSB7XG4gICAgY29udGV4dC5tb3ZlVG8ob2Zmc2V0WCAtIGdyaWRTaXplLCB5KTtcbiAgICBjb250ZXh0LmxpbmVUbyhvZmZzZXRYICsgd2lkdGggKyBncmlkU2l6ZSAqIDIsIHkpO1xuICB9XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3QgcmVuZGVyTGluZWFyUG9pbnRIYW5kbGVzID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHNjZW5lU3RhdGUuc2Nyb2xsWCwgc2NlbmVTdGF0ZS5zY3JvbGxZKTtcbiAgY29udGV4dC5saW5lV2lkdGggPSAxIC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuXG4gIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRzR2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCkuZm9yRWFjaChcbiAgICAocG9pbnQsIGlkeCkgPT4ge1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID1cbiAgICAgICAgYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ/LmFjdGl2ZVBvaW50SW5kZXggPT09IGlkeFxuICAgICAgICAgID8gXCJyZ2JhKDI1NSwgMTI3LCAxMjcsIDAuOSlcIlxuICAgICAgICAgIDogXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSlcIjtcbiAgICAgIGNvbnN0IHsgUE9JTlRfSEFORExFX1NJWkUgfSA9IExpbmVhckVsZW1lbnRFZGl0b3I7XG4gICAgICBmaWxsQ2lyY2xlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBwb2ludFswXSxcbiAgICAgICAgcG9pbnRbMV0sXG4gICAgICAgIFBPSU5UX0hBTkRMRV9TSVpFIC8gMiAvIHNjZW5lU3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyU2NlbmUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBzZWxlY3Rpb25FbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuICBzY2FsZTogbnVtYmVyLFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4gIC8vIGV4dHJhIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZW5kZXJlclxuICB7XG4gICAgcmVuZGVyU2Nyb2xsYmFycyA9IHRydWUsXG4gICAgcmVuZGVyU2VsZWN0aW9uID0gdHJ1ZSxcbiAgICAvLyBXaGV0aGVyIHRvIGVtcGxveSByZW5kZXIgb3B0aW1pemF0aW9ucyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICAgIC8vIFNob3VsZCBub3QgYmUgdHVybmVkIG9uIGZvciBleHBvcnQgb3BlcmF0aW9ucyBhbmQgc2ltaWxhciwgYmVjYXVzZSBpdFxuICAgIC8vIGRvZXNuJ3QgZ3VhcmFudGVlIHBpeGVsLXBlcmZlY3Qgb3V0cHV0LlxuICAgIHJlbmRlck9wdGltaXphdGlvbnMgPSBmYWxzZSxcbiAgICByZW5kZXJHcmlkID0gdHJ1ZSxcbiAgICAvKiogd2hlbiBleHBvcnRpbmcgdGhlIGJlaGF2aW9yIGlzIHNsaWdodGx5IGRpZmZlcmVudCAoZS5nLiB3ZSBjYW4ndCB1c2VcbiAgICAgICAgQ1NTIGZpbHRlcnMpICovXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgfToge1xuICAgIHJlbmRlclNjcm9sbGJhcnM/OiBib29sZWFuO1xuICAgIHJlbmRlclNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgcmVuZGVyT3B0aW1pemF0aW9ucz86IGJvb2xlYW47XG4gICAgcmVuZGVyR3JpZD86IGJvb2xlYW47XG4gICAgaXNFeHBvcnQ/OiBib29sZWFuO1xuICB9ID0ge30sXG4pID0+IHtcbiAgaWYgKGNhbnZhcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcblxuICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcblxuICAvLyBXaGVuIGRvaW5nIGNhbGN1bGF0aW9ucyBiYXNlZCBvbiBjYW52YXMgd2lkdGggd2Ugc2hvdWxkIHVzZWQgbm9ybWFsaXplZCBvbmVcbiAgY29uc3Qgbm9ybWFsaXplZENhbnZhc1dpZHRoID0gY2FudmFzLndpZHRoIC8gc2NhbGU7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgPSBjYW52YXMuaGVpZ2h0IC8gc2NhbGU7XG5cbiAgaWYgKGlzRXhwb3J0ICYmIHNjZW5lU3RhdGUudGhlbWUgPT09IFwiZGFya1wiKSB7XG4gICAgY29udGV4dC5maWx0ZXIgPSBUSEVNRV9GSUxURVI7XG4gIH1cblxuICAvLyBQYWludCBiYWNrZ3JvdW5kXG4gIGlmICh0eXBlb2Ygc2NlbmVTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgaGFzVHJhbnNwYXJlbmNlID1cbiAgICAgIHNjZW5lU3RhdGUudmlld0JhY2tncm91bmRDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiIHx8XG4gICAgICBzY2VuZVN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA1IHx8IC8vICNSR0JBXG4gICAgICBzY2VuZVN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA5IHx8IC8vICNSUkdHQkJBXG4gICAgICAvKGhzbGF8cmdiYSlcXCgvLnRlc3Qoc2NlbmVTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICBpZiAoaGFzVHJhbnNwYXJlbmNlKSB7XG4gICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCBub3JtYWxpemVkQ2FudmFzV2lkdGgsIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQpO1xuICAgIH1cbiAgICBjb250ZXh0LnNhdmUoKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHNjZW5lU3RhdGUudmlld0JhY2tncm91bmRDb2xvcjtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgbm9ybWFsaXplZENhbnZhc1dpZHRoLCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0KTtcbiAgfVxuXG4gIC8vIEFwcGx5IHpvb21cbiAgY29uc3Qgem9vbVRyYW5zbGF0aW9uWCA9IHNjZW5lU3RhdGUuem9vbS50cmFuc2xhdGlvbi54O1xuICBjb25zdCB6b29tVHJhbnNsYXRpb25ZID0gc2NlbmVTdGF0ZS56b29tLnRyYW5zbGF0aW9uLnk7XG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnRyYW5zbGF0ZSh6b29tVHJhbnNsYXRpb25YLCB6b29tVHJhbnNsYXRpb25ZKTtcbiAgY29udGV4dC5zY2FsZShzY2VuZVN0YXRlLnpvb20udmFsdWUsIHNjZW5lU3RhdGUuem9vbS52YWx1ZSk7XG5cbiAgLy8gR3JpZFxuICBpZiAocmVuZGVyR3JpZCAmJiBhcHBTdGF0ZS5ncmlkU2l6ZSkge1xuICAgIHN0cm9rZUdyaWQoXG4gICAgICBjb250ZXh0LFxuICAgICAgYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgICAtTWF0aC5jZWlsKHpvb21UcmFuc2xhdGlvblggLyBzY2VuZVN0YXRlLnpvb20udmFsdWUgLyBhcHBTdGF0ZS5ncmlkU2l6ZSkgKlxuICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSArXG4gICAgICAgIChzY2VuZVN0YXRlLnNjcm9sbFggJSBhcHBTdGF0ZS5ncmlkU2l6ZSksXG4gICAgICAtTWF0aC5jZWlsKHpvb21UcmFuc2xhdGlvblkgLyBzY2VuZVN0YXRlLnpvb20udmFsdWUgLyBhcHBTdGF0ZS5ncmlkU2l6ZSkgKlxuICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSArXG4gICAgICAgIChzY2VuZVN0YXRlLnNjcm9sbFkgJSBhcHBTdGF0ZS5ncmlkU2l6ZSksXG4gICAgICBub3JtYWxpemVkQ2FudmFzV2lkdGggLyBzY2VuZVN0YXRlLnpvb20udmFsdWUsXG4gICAgICBub3JtYWxpemVkQ2FudmFzSGVpZ2h0IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlLFxuICAgICk7XG4gIH1cblxuICAvLyBQYWludCB2aXNpYmxlIGVsZW1lbnRzXG4gIGNvbnN0IHZpc2libGVFbGVtZW50cyA9IGVsZW1lbnRzLmZpbHRlcigoZWxlbWVudCkgPT5cbiAgICBpc1Zpc2libGVFbGVtZW50KGVsZW1lbnQsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCwge1xuICAgICAgem9vbTogc2NlbmVTdGF0ZS56b29tLFxuICAgICAgb2Zmc2V0TGVmdDogYXBwU3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcDogYXBwU3RhdGUub2Zmc2V0VG9wLFxuICAgICAgc2Nyb2xsWDogc2NlbmVTdGF0ZS5zY3JvbGxYLFxuICAgICAgc2Nyb2xsWTogc2NlbmVTdGF0ZS5zY3JvbGxZLFxuICAgIH0pLFxuICApO1xuXG4gIHZpc2libGVFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlckVsZW1lbnQoZWxlbWVudCwgcmMsIGNvbnRleHQsIHJlbmRlck9wdGltaXphdGlvbnMsIHNjZW5lU3RhdGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChcbiAgICAgIGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCxcbiAgICApO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZW5kZXJMaW5lYXJQb2ludEhhbmRsZXMoY29udGV4dCwgYXBwU3RhdGUsIHNjZW5lU3RhdGUsIGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhaW50IHNlbGVjdGlvbiBlbGVtZW50XG4gIGlmIChzZWxlY3Rpb25FbGVtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlckVsZW1lbnQoXG4gICAgICAgIHNlbGVjdGlvbkVsZW1lbnQsXG4gICAgICAgIHJjLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICByZW5kZXJPcHRpbWl6YXRpb25zLFxuICAgICAgICBzY2VuZVN0YXRlLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNCaW5kaW5nRW5hYmxlZChhcHBTdGF0ZSkpIHtcbiAgICBhcHBTdGF0ZS5zdWdnZXN0ZWRCaW5kaW5nc1xuICAgICAgLmZpbHRlcigoYmluZGluZykgPT4gYmluZGluZyAhPSBudWxsKVxuICAgICAgLmZvckVhY2goKHN1Z2dlc3RlZEJpbmRpbmcpID0+IHtcbiAgICAgICAgcmVuZGVyQmluZGluZ0hpZ2hsaWdodChjb250ZXh0LCBzY2VuZVN0YXRlLCBzdWdnZXN0ZWRCaW5kaW5nISk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFBhaW50IHNlbGVjdGVkIGVsZW1lbnRzXG4gIGlmIChcbiAgICByZW5kZXJTZWxlY3Rpb24gJiZcbiAgICAhYXBwU3RhdGUubXVsdGlFbGVtZW50ICYmXG4gICAgIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50XG4gICkge1xuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBlbGVtZW50cy5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uQ29sb3JzID0gW107XG4gICAgICAvLyBsb2NhbCB1c2VyXG4gICAgICBpZiAoXG4gICAgICAgIGFwcFN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSAmJlxuICAgICAgICAhaXNTZWxlY3RlZFZpYUdyb3VwKGFwcFN0YXRlLCBlbGVtZW50KVxuICAgICAgKSB7XG4gICAgICAgIHNlbGVjdGlvbkNvbG9ycy5wdXNoKG9jLmJsYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW90ZSB1c2Vyc1xuICAgICAgaWYgKHNjZW5lU3RhdGUucmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgIHNlbGVjdGlvbkNvbG9ycy5wdXNoKFxuICAgICAgICAgIC4uLnNjZW5lU3RhdGUucmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdLm1hcCgoc29ja2V0SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYmFja2dyb3VuZCB9ID0gZ2V0Q2xpZW50Q29sb3JzKHNvY2tldElkLCBhcHBTdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gYmFja2dyb3VuZDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3Rpb25Db2xvcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IFtlbGVtZW50WDEsIGVsZW1lbnRZMSwgZWxlbWVudFgyLCBlbGVtZW50WTJdID1cbiAgICAgICAgICBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICBhbmdsZTogZWxlbWVudC5hbmdsZSxcbiAgICAgICAgICBlbGVtZW50WDEsXG4gICAgICAgICAgZWxlbWVudFkxLFxuICAgICAgICAgIGVsZW1lbnRYMixcbiAgICAgICAgICBlbGVtZW50WTIsXG4gICAgICAgICAgc2VsZWN0aW9uQ29sb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10gYXMgeyBhbmdsZTogbnVtYmVyOyBlbGVtZW50WDE6IG51bWJlcjsgZWxlbWVudFkxOiBudW1iZXI7IGVsZW1lbnRYMjogbnVtYmVyOyBlbGVtZW50WTI6IG51bWJlcjsgc2VsZWN0aW9uQ29sb3JzOiBzdHJpbmdbXSB9W10pO1xuXG4gICAgY29uc3QgYWRkU2VsZWN0aW9uRm9yR3JvdXBJZCA9IChncm91cElkOiBHcm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cEVsZW1lbnRzID0gZ2V0RWxlbWVudHNJbkdyb3VwKGVsZW1lbnRzLCBncm91cElkKTtcbiAgICAgIGNvbnN0IFtlbGVtZW50WDEsIGVsZW1lbnRZMSwgZWxlbWVudFgyLCBlbGVtZW50WTJdID1cbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKGdyb3VwRWxlbWVudHMpO1xuICAgICAgc2VsZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgIGVsZW1lbnRYMSxcbiAgICAgICAgZWxlbWVudFgyLFxuICAgICAgICBlbGVtZW50WTEsXG4gICAgICAgIGVsZW1lbnRZMixcbiAgICAgICAgc2VsZWN0aW9uQ29sb3JzOiBbb2MuYmxhY2tdLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBnZXRTZWxlY3RlZEdyb3VwSWRzKGFwcFN0YXRlKSkge1xuICAgICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBsYXllciBzZWxlY3RlZCBncm91cCBJRHNcbiAgICAgIGFkZFNlbGVjdGlvbkZvckdyb3VwSWQoZ3JvdXBJZCk7XG4gICAgfVxuXG4gICAgaWYgKGFwcFN0YXRlLmVkaXRpbmdHcm91cElkKSB7XG4gICAgICBhZGRTZWxlY3Rpb25Gb3JHcm91cElkKGFwcFN0YXRlLmVkaXRpbmdHcm91cElkKTtcbiAgICB9XG5cbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT5cbiAgICAgIHJlbmRlclNlbGVjdGlvbkJvcmRlcihjb250ZXh0LCBzY2VuZVN0YXRlLCBzZWxlY3Rpb24pLFxuICAgICk7XG5cbiAgICBjb25zdCBsb2NhbGx5U2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcblxuICAgIC8vIFBhaW50IHJlc2l6ZSB0cmFuc2Zvcm1IYW5kbGVzXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoc2NlbmVTdGF0ZS5zY3JvbGxYLCBzY2VuZVN0YXRlLnNjcm9sbFkpO1xuICAgIGlmIChsb2NhbGx5U2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2Mud2hpdGU7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVzID0gZ2V0VHJhbnNmb3JtSGFuZGxlcyhcbiAgICAgICAgbG9jYWxseVNlbGVjdGVkRWxlbWVudHNbMF0sXG4gICAgICAgIHNjZW5lU3RhdGUuem9vbSxcbiAgICAgICAgXCJtb3VzZVwiLCAvLyB3aGVuIHdlIHJlbmRlciB3ZSBkb24ndCBrbm93IHdoaWNoIHBvaW50ZXIgdHlwZSBzbyB1c2UgbW91c2VcbiAgICAgICk7XG4gICAgICBpZiAoIWFwcFN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICByZW5kZXJUcmFuc2Zvcm1IYW5kbGVzKFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgc2NlbmVTdGF0ZSxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVzLFxuICAgICAgICAgIGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLmFuZ2xlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobG9jYWxseVNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSAmJiAhYXBwU3RhdGUuaXNSb3RhdGluZykge1xuICAgICAgY29uc3QgZGFzaGVkTGluZVBhZGRpbmcgPSA0IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMobG9jYWxseVNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgY29uc3QgaW5pdGlhbExpbmVEYXNoID0gY29udGV4dC5nZXRMaW5lRGFzaCgpO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMiAvIHNjZW5lU3RhdGUuem9vbS52YWx1ZV0pO1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gY29udGV4dC5saW5lV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyBzY2VuZVN0YXRlLnpvb20udmFsdWU7XG4gICAgICBzdHJva2VSZWN0V2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB4MSAtIGRhc2hlZExpbmVQYWRkaW5nLFxuICAgICAgICB5MSAtIGRhc2hlZExpbmVQYWRkaW5nLFxuICAgICAgICB4MiAtIHgxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLFxuICAgICAgICB5MiAtIHkxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLFxuICAgICAgICAoeDEgKyB4MikgLyAyLFxuICAgICAgICAoeTEgKyB5MikgLyAyLFxuICAgICAgICAwLFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChpbml0aWFsTGluZURhc2gpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlcyA9IGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzKFxuICAgICAgICBbeDEsIHkxLCB4MiwgeTJdLFxuICAgICAgICAwLFxuICAgICAgICBzY2VuZVN0YXRlLnpvb20sXG4gICAgICAgIFwibW91c2VcIixcbiAgICAgICAgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMsXG4gICAgICApO1xuICAgICAgcmVuZGVyVHJhbnNmb3JtSGFuZGxlcyhjb250ZXh0LCBzY2VuZVN0YXRlLCB0cmFuc2Zvcm1IYW5kbGVzLCAwKTtcbiAgICB9XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH1cblxuICAvLyBSZXNldCB6b29tXG4gIGNvbnRleHQucmVzdG9yZSgpO1xuXG4gIC8vIFBhaW50IHJlbW90ZSBwb2ludGVyc1xuICBmb3IgKGNvbnN0IGNsaWVudElkIGluIHNjZW5lU3RhdGUucmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzKSB7XG4gICAgbGV0IHsgeCwgeSB9ID0gc2NlbmVTdGF0ZS5yZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHNbY2xpZW50SWRdO1xuXG4gICAgeCAtPSBhcHBTdGF0ZS5vZmZzZXRMZWZ0O1xuICAgIHkgLT0gYXBwU3RhdGUub2Zmc2V0VG9wO1xuXG4gICAgY29uc3Qgd2lkdGggPSA5O1xuICAgIGNvbnN0IGhlaWdodCA9IDE0O1xuXG4gICAgY29uc3QgaXNPdXRPZkJvdW5kcyA9XG4gICAgICB4IDwgMCB8fFxuICAgICAgeCA+IG5vcm1hbGl6ZWRDYW52YXNXaWR0aCAtIHdpZHRoIHx8XG4gICAgICB5IDwgMCB8fFxuICAgICAgeSA+IG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgLSBoZWlnaHQ7XG5cbiAgICB4ID0gTWF0aC5tYXgoeCwgMCk7XG4gICAgeCA9IE1hdGgubWluKHgsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCAtIHdpZHRoKTtcbiAgICB5ID0gTWF0aC5tYXgoeSwgMCk7XG4gICAgeSA9IE1hdGgubWluKHksIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgLSBoZWlnaHQpO1xuXG4gICAgY29uc3QgeyBiYWNrZ3JvdW5kLCBzdHJva2UgfSA9IGdldENsaWVudENvbG9ycyhjbGllbnRJZCwgYXBwU3RhdGUpO1xuXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGJhY2tncm91bmQ7XG5cbiAgICBjb25zdCB1c2VyU3RhdGUgPSBzY2VuZVN0YXRlLnJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzW2NsaWVudElkXTtcbiAgICBpZiAoaXNPdXRPZkJvdW5kcyB8fCB1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuQVdBWSkge1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IDAuNDg7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2NlbmVTdGF0ZS5yZW1vdGVQb2ludGVyQnV0dG9uICYmXG4gICAgICBzY2VuZVN0YXRlLnJlbW90ZVBvaW50ZXJCdXR0b25bY2xpZW50SWRdID09PSBcImRvd25cIlxuICAgICkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHgsIHksIDE1LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAzO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwiI2ZmZmZmZjg4XCI7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHgsIHksIDE1LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH1cblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5tb3ZlVG8oeCwgeSk7XG4gICAgY29udGV4dC5saW5lVG8oeCArIDEsIHkgKyAxNCk7XG4gICAgY29udGV4dC5saW5lVG8oeCArIDQsIHkgKyA5KTtcbiAgICBjb250ZXh0LmxpbmVUbyh4ICsgOSwgeSArIDEwKTtcbiAgICBjb250ZXh0LmxpbmVUbyh4LCB5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgY29uc3QgdXNlcm5hbWUgPSBzY2VuZVN0YXRlLnJlbW90ZVBvaW50ZXJVc2VybmFtZXNbY2xpZW50SWRdO1xuXG4gICAgbGV0IGlkbGVTdGF0ZSA9IFwiXCI7XG4gICAgaWYgKHVzZXJTdGF0ZSA9PT0gVXNlcklkbGVTdGF0ZS5BV0FZKSB7XG4gICAgICBpZGxlU3RhdGUgPSBoYXNFbW9qaVN1cHBvcnQgPyBcIuKaq++4j1wiIDogYCAoJHtVc2VySWRsZVN0YXRlLkFXQVl9KWA7XG4gICAgfSBlbHNlIGlmICh1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuSURMRSkge1xuICAgICAgaWRsZVN0YXRlID0gaGFzRW1vamlTdXBwb3J0ID8gXCLwn5KkXCIgOiBgICgke1VzZXJJZGxlU3RhdGUuSURMRX0pYDtcbiAgICB9IGVsc2UgaWYgKHVzZXJTdGF0ZSA9PT0gVXNlcklkbGVTdGF0ZS5BQ1RJVkUpIHtcbiAgICAgIGlkbGVTdGF0ZSA9IGhhc0Vtb2ppU3VwcG9ydCA/IFwi8J+folwiIDogXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VybmFtZUFuZElkbGVTdGF0ZSA9IGAke1xuICAgICAgdXNlcm5hbWUgPyBgJHt1c2VybmFtZX0gYCA6IFwiXCJcbiAgICB9JHtpZGxlU3RhdGV9YDtcblxuICAgIGlmICghaXNPdXRPZkJvdW5kcyAmJiB1c2VybmFtZUFuZElkbGVTdGF0ZSkge1xuICAgICAgY29uc3Qgb2Zmc2V0WCA9IHggKyB3aWR0aDtcbiAgICAgIGNvbnN0IG9mZnNldFkgPSB5ICsgaGVpZ2h0O1xuICAgICAgY29uc3QgcGFkZGluZ0hvcml6b250YWwgPSA0O1xuICAgICAgY29uc3QgcGFkZGluZ1ZlcnRpY2FsID0gNDtcbiAgICAgIGNvbnN0IG1lYXN1cmUgPSBjb250ZXh0Lm1lYXN1cmVUZXh0KHVzZXJuYW1lQW5kSWRsZVN0YXRlKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVIZWlnaHQgPVxuICAgICAgICBtZWFzdXJlLmFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCArIG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQ7XG5cbiAgICAgIC8vIEJvcmRlclxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBzdHJva2U7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KFxuICAgICAgICBvZmZzZXRYIC0gMSxcbiAgICAgICAgb2Zmc2V0WSAtIDEsXG4gICAgICAgIG1lYXN1cmUud2lkdGggKyAyICogcGFkZGluZ0hvcml6b250YWwgKyAyLFxuICAgICAgICBtZWFzdXJlSGVpZ2h0ICsgMiAqIHBhZGRpbmdWZXJ0aWNhbCArIDIsXG4gICAgICApO1xuICAgICAgLy8gQmFja2dyb3VuZFxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kO1xuICAgICAgY29udGV4dC5maWxsUmVjdChcbiAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WSxcbiAgICAgICAgbWVhc3VyZS53aWR0aCArIDIgKiBwYWRkaW5nSG9yaXpvbnRhbCxcbiAgICAgICAgbWVhc3VyZUhlaWdodCArIDIgKiBwYWRkaW5nVmVydGljYWwsXG4gICAgICApO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcblxuICAgICAgY29udGV4dC5maWxsVGV4dChcbiAgICAgICAgdXNlcm5hbWVBbmRJZGxlU3RhdGUsXG4gICAgICAgIG9mZnNldFggKyBwYWRkaW5nSG9yaXpvbnRhbCxcbiAgICAgICAgb2Zmc2V0WSArIHBhZGRpbmdWZXJ0aWNhbCArIG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cblxuICAvLyBQYWludCBzY3JvbGxiYXJzXG4gIGxldCBzY3JvbGxCYXJzO1xuICBpZiAocmVuZGVyU2Nyb2xsYmFycykge1xuICAgIHNjcm9sbEJhcnMgPSBnZXRTY3JvbGxCYXJzKFxuICAgICAgZWxlbWVudHMsXG4gICAgICBub3JtYWxpemVkQ2FudmFzV2lkdGgsXG4gICAgICBub3JtYWxpemVkQ2FudmFzSGVpZ2h0LFxuICAgICAgc2NlbmVTdGF0ZSxcbiAgICApO1xuXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBTQ1JPTExCQVJfQ09MT1I7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmdiYSgyNTUsMjU1LDI1NSwwLjgpXCI7XG4gICAgW3Njcm9sbEJhcnMuaG9yaXpvbnRhbCwgc2Nyb2xsQmFycy52ZXJ0aWNhbF0uZm9yRWFjaCgoc2Nyb2xsQmFyKSA9PiB7XG4gICAgICBpZiAoc2Nyb2xsQmFyKSB7XG4gICAgICAgIHJvdW5kUmVjdChcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHNjcm9sbEJhci54LFxuICAgICAgICAgIHNjcm9sbEJhci55LFxuICAgICAgICAgIHNjcm9sbEJhci53aWR0aCxcbiAgICAgICAgICBzY3JvbGxCYXIuaGVpZ2h0LFxuICAgICAgICAgIFNDUk9MTEJBUl9XSURUSCAvIDIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH1cblxuICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgcmV0dXJuIHsgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50OiB2aXNpYmxlRWxlbWVudHMubGVuZ3RoID4gMCwgc2Nyb2xsQmFycyB9O1xufTtcblxuY29uc3QgcmVuZGVyVHJhbnNmb3JtSGFuZGxlcyA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBzY2VuZVN0YXRlOiBTY2VuZVN0YXRlLFxuICB0cmFuc2Zvcm1IYW5kbGVzOiBUcmFuc2Zvcm1IYW5kbGVzLFxuICBhbmdsZTogbnVtYmVyLFxuKTogdm9pZCA9PiB7XG4gIE9iamVjdC5rZXlzKHRyYW5zZm9ybUhhbmRsZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZSA9IHRyYW5zZm9ybUhhbmRsZXNba2V5IGFzIFRyYW5zZm9ybUhhbmRsZVR5cGVdO1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyBzY2VuZVN0YXRlLnpvb20udmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSBcInJvdGF0aW9uXCIpIHtcbiAgICAgICAgZmlsbENpcmNsZShcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVswXSArIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIsXG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlWzFdICsgdHJhbnNmb3JtSGFuZGxlWzNdIC8gMixcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVbMl0gLyAyLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVswXSxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVbMV0sXG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlWzJdLFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVszXSxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVbMF0gKyB0cmFuc2Zvcm1IYW5kbGVbMl0gLyAyLFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVsxXSArIHRyYW5zZm9ybUhhbmRsZVszXSAvIDIsXG4gICAgICAgICAgYW5nbGUsXG4gICAgICAgICAgdHJ1ZSwgLy8gZmlsbCBiZWZvcmUgc3Ryb2tlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgcmVuZGVyU2VsZWN0aW9uQm9yZGVyID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4gIGVsZW1lbnRQcm9wZXJ0aWVzOiB7XG4gICAgYW5nbGU6IG51bWJlcjtcbiAgICBlbGVtZW50WDE6IG51bWJlcjtcbiAgICBlbGVtZW50WTE6IG51bWJlcjtcbiAgICBlbGVtZW50WDI6IG51bWJlcjtcbiAgICBlbGVtZW50WTI6IG51bWJlcjtcbiAgICBzZWxlY3Rpb25Db2xvcnM6IHN0cmluZ1tdO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHsgYW5nbGUsIGVsZW1lbnRYMSwgZWxlbWVudFkxLCBlbGVtZW50WDIsIGVsZW1lbnRZMiwgc2VsZWN0aW9uQ29sb3JzIH0gPVxuICAgIGVsZW1lbnRQcm9wZXJ0aWVzO1xuICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50WDIgLSBlbGVtZW50WDE7XG4gIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50WTIgLSBlbGVtZW50WTE7XG5cbiAgY29uc3QgZGFzaGVkTGluZVBhZGRpbmcgPSA0IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuICBjb25zdCBkYXNoV2lkdGggPSA4IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuICBjb25zdCBzcGFjZVdpZHRoID0gNCAvIHNjZW5lU3RhdGUuem9vbS52YWx1ZTtcblxuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC50cmFuc2xhdGUoc2NlbmVTdGF0ZS5zY3JvbGxYLCBzY2VuZVN0YXRlLnNjcm9sbFkpO1xuICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyBzY2VuZVN0YXRlLnpvb20udmFsdWU7XG5cbiAgY29uc3QgY291bnQgPSBzZWxlY3Rpb25Db2xvcnMubGVuZ3RoO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpIHtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc2VsZWN0aW9uQ29sb3JzW2luZGV4XTtcbiAgICBjb250ZXh0LnNldExpbmVEYXNoKFtcbiAgICAgIGRhc2hXaWR0aCxcbiAgICAgIHNwYWNlV2lkdGggKyAoZGFzaFdpZHRoICsgc3BhY2VXaWR0aCkgKiAoY291bnQgLSAxKSxcbiAgICBdKTtcbiAgICBjb250ZXh0LmxpbmVEYXNoT2Zmc2V0ID0gKGRhc2hXaWR0aCArIHNwYWNlV2lkdGgpICogaW5kZXg7XG4gICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihcbiAgICAgIGNvbnRleHQsXG4gICAgICBlbGVtZW50WDEgLSBkYXNoZWRMaW5lUGFkZGluZyxcbiAgICAgIGVsZW1lbnRZMSAtIGRhc2hlZExpbmVQYWRkaW5nLFxuICAgICAgZWxlbWVudFdpZHRoICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLFxuICAgICAgZWxlbWVudEhlaWdodCArIGRhc2hlZExpbmVQYWRkaW5nICogMixcbiAgICAgIGVsZW1lbnRYMSArIGVsZW1lbnRXaWR0aCAvIDIsXG4gICAgICBlbGVtZW50WTEgKyBlbGVtZW50SGVpZ2h0IC8gMixcbiAgICAgIGFuZ2xlLFxuICAgICk7XG4gIH1cbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5jb25zdCByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0ID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4gIHN1Z2dlc3RlZEJpbmRpbmc6IFN1Z2dlc3RlZEJpbmRpbmcsXG4pID0+IHtcbiAgY29uc3QgcmVuZGVySGlnaGxpZ2h0ID0gQXJyYXkuaXNBcnJheShzdWdnZXN0ZWRCaW5kaW5nKVxuICAgID8gcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvclN1Z2dlc3RlZFBvaW50QmluZGluZ1xuICAgIDogcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvckJpbmRhYmxlRWxlbWVudDtcblxuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC50cmFuc2xhdGUoc2NlbmVTdGF0ZS5zY3JvbGxYLCBzY2VuZVN0YXRlLnNjcm9sbFkpO1xuICByZW5kZXJIaWdobGlnaHQoY29udGV4dCwgc3VnZ2VzdGVkQmluZGluZyBhcyBhbnkpO1xuXG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3QgcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvckJpbmRhYmxlRWxlbWVudCA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBlbGVtZW50OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IHdpZHRoID0geDIgLSB4MTtcbiAgY29uc3QgaGVpZ2h0ID0geTIgLSB5MTtcbiAgY29uc3QgdGhyZXNob2xkID0gbWF4QmluZGluZ0dhcChlbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcblxuICAvLyBTbyB0aGF0IHdlIGRvbid0IG92ZXJsYXAgdGhlIGVsZW1lbnQgaXRzZWxmXG4gIGNvbnN0IHN0cm9rZU9mZnNldCA9IDQ7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsLjA1KVwiO1xuICBjb250ZXh0LmxpbmVXaWR0aCA9IHRocmVzaG9sZCAtIHN0cm9rZU9mZnNldDtcbiAgY29uc3QgcGFkZGluZyA9IHN0cm9rZU9mZnNldCAvIDIgKyB0aHJlc2hvbGQgLyAyO1xuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBzdHJva2VSZWN0V2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB4MSAtIHBhZGRpbmcsXG4gICAgICAgIHkxIC0gcGFkZGluZyxcbiAgICAgICAgd2lkdGggKyBwYWRkaW5nICogMixcbiAgICAgICAgaGVpZ2h0ICsgcGFkZGluZyAqIDIsXG4gICAgICAgIHgxICsgd2lkdGggLyAyLFxuICAgICAgICB5MSArIGhlaWdodCAvIDIsXG4gICAgICAgIGVsZW1lbnQuYW5nbGUsXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICAgIGNvbnN0IHNpZGUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3Qgd1BhZGRpbmcgPSAocGFkZGluZyAqIHNpZGUpIC8gaGVpZ2h0O1xuICAgICAgY29uc3QgaFBhZGRpbmcgPSAocGFkZGluZyAqIHNpZGUpIC8gd2lkdGg7XG4gICAgICBzdHJva2VEaWFtb25kV2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB3aWR0aCArIHdQYWRkaW5nICogMixcbiAgICAgICAgaGVpZ2h0ICsgaFBhZGRpbmcgKiAyLFxuICAgICAgICB4MSArIHdpZHRoIC8gMixcbiAgICAgICAgeTEgKyBoZWlnaHQgLyAyLFxuICAgICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICBzdHJva2VFbGxpcHNlV2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB3aWR0aCArIHBhZGRpbmcgKiAyLFxuICAgICAgICBoZWlnaHQgKyBwYWRkaW5nICogMixcbiAgICAgICAgeDEgKyB3aWR0aCAvIDIsXG4gICAgICAgIHkxICsgaGVpZ2h0IC8gMixcbiAgICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgfVxufTtcblxuY29uc3QgcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvclN1Z2dlc3RlZFBvaW50QmluZGluZyA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBzdWdnZXN0ZWRCaW5kaW5nOiBTdWdnZXN0ZWRQb2ludEJpbmRpbmcsXG4pID0+IHtcbiAgY29uc3QgW2VsZW1lbnQsIHN0YXJ0T3JFbmQsIGJpbmRhYmxlRWxlbWVudF0gPSBzdWdnZXN0ZWRCaW5kaW5nO1xuXG4gIGNvbnN0IHRocmVzaG9sZCA9IG1heEJpbmRpbmdHYXAoXG4gICAgYmluZGFibGVFbGVtZW50LFxuICAgIGJpbmRhYmxlRWxlbWVudC53aWR0aCxcbiAgICBiaW5kYWJsZUVsZW1lbnQuaGVpZ2h0LFxuICApO1xuXG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMClcIjtcbiAgY29udGV4dC5maWxsU3R5bGUgPSBcInJnYmEoMCwwLDAsLjA1KVwiO1xuXG4gIGNvbnN0IHBvaW50SW5kaWNlcyA9XG4gICAgc3RhcnRPckVuZCA9PT0gXCJib3RoXCIgPyBbMCwgLTFdIDogc3RhcnRPckVuZCA9PT0gXCJzdGFydFwiID8gWzBdIDogWy0xXTtcbiAgcG9pbnRJbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgY29uc3QgW3gsIHldID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBpbmRleCxcbiAgICApO1xuICAgIGZpbGxDaXJjbGUoY29udGV4dCwgeCwgeSwgdGhyZXNob2xkKTtcbiAgfSk7XG59O1xuXG5jb25zdCBpc1Zpc2libGVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgY2FudmFzV2lkdGg6IG51bWJlcixcbiAgY2FudmFzSGVpZ2h0OiBudW1iZXIsXG4gIHZpZXdUcmFuc2Zvcm1hdGlvbnM6IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50Qm91bmRzKGVsZW1lbnQpOyAvLyBzY2VuZSBjb29yZGluYXRlc1xuICBjb25zdCB0b3BMZWZ0U2NlbmVDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAge1xuICAgICAgY2xpZW50WDogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRMZWZ0LFxuICAgICAgY2xpZW50WTogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRUb3AsXG4gICAgfSxcbiAgICB2aWV3VHJhbnNmb3JtYXRpb25zLFxuICApO1xuICBjb25zdCBib3R0b21SaWdodFNjZW5lQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgIHtcbiAgICAgIGNsaWVudFg6IHZpZXdUcmFuc2Zvcm1hdGlvbnMub2Zmc2V0TGVmdCArIGNhbnZhc1dpZHRoLFxuICAgICAgY2xpZW50WTogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRUb3AgKyBjYW52YXNIZWlnaHQsXG4gICAgfSxcbiAgICB2aWV3VHJhbnNmb3JtYXRpb25zLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgdG9wTGVmdFNjZW5lQ29vcmRzLnggPD0geDIgJiZcbiAgICB0b3BMZWZ0U2NlbmVDb29yZHMueSA8PSB5MiAmJlxuICAgIGJvdHRvbVJpZ2h0U2NlbmVDb29yZHMueCA+PSB4MSAmJlxuICAgIGJvdHRvbVJpZ2h0U2NlbmVDb29yZHMueSA+PSB5MVxuICApO1xufTtcblxuLy8gVGhpcyBzaG91bGQgYmUgb25seSBjYWxsZWQgZm9yIGV4cG9ydGluZyBwdXJwb3Nlc1xuZXhwb3J0IGNvbnN0IHJlbmRlclNjZW5lVG9TdmcgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgcnN2ZzogUm91Z2hTVkcsXG4gIHN2Z1Jvb3Q6IFNWR0VsZW1lbnQsXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAge1xuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICB9OiB7XG4gICAgb2Zmc2V0WD86IG51bWJlcjtcbiAgICBvZmZzZXRZPzogbnVtYmVyO1xuICB9ID0ge30sXG4pID0+IHtcbiAgaWYgKCFzdmdSb290KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIHJlbmRlciBlbGVtZW50c1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgaWYgKCFlbGVtZW50LmlzRGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVuZGVyRWxlbWVudFRvU3ZnKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgcnN2ZyxcbiAgICAgICAgICBzdmdSb290LFxuICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgIGVsZW1lbnQueCArIG9mZnNldFgsXG4gICAgICAgICAgZWxlbWVudC55ICsgb2Zmc2V0WSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../renderer/renderScene.ts\n");
|
|
2788
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"renderScene\": () => (/* binding */ renderScene),\n/* harmony export */ \"renderSceneToSvg\": () => (/* binding */ renderSceneToSvg)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _roundRect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./roundRect */ \"../../renderer/roundRect.ts\");\n/* harmony import */ var _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/scrollbars */ \"../../scene/scrollbars.ts\");\n/* harmony import */ var _scene_selection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../scene/selection */ \"../../scene/selection.ts\");\n/* harmony import */ var _renderElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _clients__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../clients */ \"../../clients.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/collision */ \"../../element/collision.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../types */ \"../../types.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst hasEmojiSupport = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.supportsEmoji)();\r\nconst strokeRectWithRotation = (context, x, y, width, height, cx, cy, angle, fill = false) => {\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(angle);\r\n if (fill) {\r\n context.fillRect(x - cx, y - cy, width, height);\r\n }\r\n context.strokeRect(x - cx, y - cy, width, height);\r\n context.restore();\r\n};\r\nconst strokeDiamondWithRotation = (context, width, height, cx, cy, angle) => {\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(angle);\r\n context.beginPath();\r\n context.moveTo(0, height / 2);\r\n context.lineTo(width / 2, 0);\r\n context.lineTo(0, -height / 2);\r\n context.lineTo(-width / 2, 0);\r\n context.closePath();\r\n context.stroke();\r\n context.restore();\r\n};\r\nconst strokeEllipseWithRotation = (context, width, height, cx, cy, angle) => {\r\n context.beginPath();\r\n context.ellipse(cx, cy, width / 2, height / 2, angle, 0, Math.PI * 2);\r\n context.stroke();\r\n};\r\nconst fillCircle = (context, cx, cy, radius) => {\r\n context.beginPath();\r\n context.arc(cx, cy, radius, 0, Math.PI * 2);\r\n context.fill();\r\n context.stroke();\r\n};\r\nconst strokeGrid = (context, gridSize, offsetX, offsetY, width, height) => {\r\n context.save();\r\n context.strokeStyle = \"rgba(0,0,0,0.1)\";\r\n context.beginPath();\r\n for (let x = offsetX; x < offsetX + width + gridSize * 2; x += gridSize) {\r\n context.moveTo(x, offsetY - gridSize);\r\n context.lineTo(x, offsetY + height + gridSize * 2);\r\n }\r\n for (let y = offsetY; y < offsetY + height + gridSize * 2; y += gridSize) {\r\n context.moveTo(offsetX - gridSize, y);\r\n context.lineTo(offsetX + width + gridSize * 2, y);\r\n }\r\n context.stroke();\r\n context.restore();\r\n};\r\nconst renderLinearPointHandles = (context, appState, sceneState, element) => {\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointsGlobalCoordinates(element).forEach((point, idx) => {\r\n var _a;\r\n context.strokeStyle = \"red\";\r\n context.setLineDash([]);\r\n context.fillStyle =\r\n ((_a = appState.editingLinearElement) === null || _a === void 0 ? void 0 : _a.activePointIndex) === idx\r\n ? \"rgba(255, 127, 127, 0.9)\"\r\n : \"rgba(255, 255, 255, 0.9)\";\r\n const { POINT_HANDLE_SIZE } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor;\r\n fillCircle(context, point[0], point[1], POINT_HANDLE_SIZE / 2 / sceneState.zoom.value);\r\n });\r\n context.restore();\r\n};\r\nconst renderScene = (elements, appState, selectionElement, scale, rc, canvas, sceneState, \r\n// extra options passed to the renderer\r\n{ renderScrollbars = true, renderSelection = true, \r\n// Whether to employ render optimizations to improve performance.\r\n// Should not be turned on for export operations and similar, because it\r\n// doesn't guarantee pixel-perfect output.\r\nrenderOptimizations = false, renderGrid = true, \r\n/** when exporting the behavior is slightly different (e.g. we can't use\r\n CSS filters) */\r\nisExport = false, } = {}) => {\r\n if (canvas === null) {\r\n return { atLeastOneVisibleElement: false };\r\n }\r\n const context = canvas.getContext(\"2d\");\r\n context.setTransform(1, 0, 0, 1, 0, 0);\r\n context.save();\r\n context.scale(scale, scale);\r\n // When doing calculations based on canvas width we should used normalized one\r\n const normalizedCanvasWidth = canvas.width / scale;\r\n const normalizedCanvasHeight = canvas.height / scale;\r\n if (isExport && sceneState.theme === \"dark\") {\r\n context.filter = _constants__WEBPACK_IMPORTED_MODULE_13__.THEME_FILTER;\r\n }\r\n // Paint background\r\n if (typeof sceneState.viewBackgroundColor === \"string\") {\r\n const hasTransparence = sceneState.viewBackgroundColor === \"transparent\" ||\r\n sceneState.viewBackgroundColor.length === 5 || // #RGBA\r\n sceneState.viewBackgroundColor.length === 9 || // #RRGGBBA\r\n /(hsla|rgba)\\(/.test(sceneState.viewBackgroundColor);\r\n if (hasTransparence) {\r\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\r\n }\r\n context.save();\r\n context.fillStyle = sceneState.viewBackgroundColor;\r\n context.fillRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\r\n context.restore();\r\n }\r\n else {\r\n context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\r\n }\r\n // Apply zoom\r\n const zoomTranslationX = sceneState.zoom.translation.x;\r\n const zoomTranslationY = sceneState.zoom.translation.y;\r\n context.save();\r\n context.translate(zoomTranslationX, zoomTranslationY);\r\n context.scale(sceneState.zoom.value, sceneState.zoom.value);\r\n // Grid\r\n if (renderGrid && appState.gridSize) {\r\n strokeGrid(context, appState.gridSize, -Math.ceil(zoomTranslationX / sceneState.zoom.value / appState.gridSize) *\r\n appState.gridSize +\r\n (sceneState.scrollX % appState.gridSize), -Math.ceil(zoomTranslationY / sceneState.zoom.value / appState.gridSize) *\r\n appState.gridSize +\r\n (sceneState.scrollY % appState.gridSize), normalizedCanvasWidth / sceneState.zoom.value, normalizedCanvasHeight / sceneState.zoom.value);\r\n }\r\n // Paint visible elements\r\n const visibleElements = elements.filter((element) => isVisibleElement(element, normalizedCanvasWidth, normalizedCanvasHeight, {\r\n zoom: sceneState.zoom,\r\n offsetLeft: appState.offsetLeft,\r\n offsetTop: appState.offsetTop,\r\n scrollX: sceneState.scrollX,\r\n scrollY: sceneState.scrollY,\r\n }));\r\n visibleElements.forEach((element) => {\r\n try {\r\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(element, rc, context, renderOptimizations, sceneState);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n });\r\n if (appState.editingLinearElement) {\r\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getElement(appState.editingLinearElement.elementId);\r\n if (element) {\r\n renderLinearPointHandles(context, appState, sceneState, element);\r\n }\r\n }\r\n // Paint selection element\r\n if (selectionElement) {\r\n try {\r\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElement)(selectionElement, rc, context, renderOptimizations, sceneState);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_10__.isBindingEnabled)(appState)) {\r\n appState.suggestedBindings\r\n .filter((binding) => binding != null)\r\n .forEach((suggestedBinding) => {\r\n renderBindingHighlight(context, sceneState, suggestedBinding);\r\n });\r\n }\r\n // Paint selected elements\r\n if (renderSelection &&\r\n !appState.multiElement &&\r\n !appState.editingLinearElement) {\r\n const selections = elements.reduce((acc, element) => {\r\n const selectionColors = [];\r\n // local user\r\n if (appState.selectedElementIds[element.id] &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_8__.isSelectedViaGroup)(appState, element)) {\r\n selectionColors.push(open_color__WEBPACK_IMPORTED_MODULE_0__.black);\r\n }\r\n // remote users\r\n if (sceneState.remoteSelectedElementIds[element.id]) {\r\n selectionColors.push(...sceneState.remoteSelectedElementIds[element.id].map((socketId) => {\r\n const { background } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(socketId, appState);\r\n return background;\r\n }));\r\n }\r\n if (selectionColors.length) {\r\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n acc.push({\r\n angle: element.angle,\r\n elementX1,\r\n elementY1,\r\n elementX2,\r\n elementY2,\r\n selectionColors,\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n const addSelectionForGroupId = (groupId) => {\r\n const groupElements = (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getElementsInGroup)(elements, groupId);\r\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(groupElements);\r\n selections.push({\r\n angle: 0,\r\n elementX1,\r\n elementX2,\r\n elementY1,\r\n elementY2,\r\n selectionColors: [open_color__WEBPACK_IMPORTED_MODULE_0__.black],\r\n });\r\n };\r\n for (const groupId of (0,_groups__WEBPACK_IMPORTED_MODULE_8__.getSelectedGroupIds)(appState)) {\r\n // TODO: support multiplayer selected group IDs\r\n addSelectionForGroupId(groupId);\r\n }\r\n if (appState.editingGroupId) {\r\n addSelectionForGroupId(appState.editingGroupId);\r\n }\r\n selections.forEach((selection) => renderSelectionBorder(context, sceneState, selection));\r\n const locallySelectedElements = (0,_scene_selection__WEBPACK_IMPORTED_MODULE_4__.getSelectedElements)(elements, appState);\r\n // Paint resize transformHandles\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n if (locallySelectedElements.length === 1) {\r\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandles)(locallySelectedElements[0], sceneState.zoom, \"mouse\");\r\n if (!appState.viewModeEnabled) {\r\n renderTransformHandles(context, sceneState, transformHandles, locallySelectedElements[0].angle);\r\n }\r\n }\r\n else if (locallySelectedElements.length > 1 && !appState.isRotating) {\r\n const dashedLinePadding = 4 / sceneState.zoom.value;\r\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(locallySelectedElements);\r\n const initialLineDash = context.getLineDash();\r\n context.setLineDash([2 / sceneState.zoom.value]);\r\n const lineWidth = context.lineWidth;\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n strokeRectWithRotation(context, x1 - dashedLinePadding, y1 - dashedLinePadding, x2 - x1 + dashedLinePadding * 2, y2 - y1 + dashedLinePadding * 2, (x1 + x2) / 2, (y1 + y2) / 2, 0);\r\n context.lineWidth = lineWidth;\r\n context.setLineDash(initialLineDash);\r\n const transformHandles = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getTransformHandlesFromCoords)([x1, y1, x2, y2], 0, sceneState.zoom, \"mouse\", _element__WEBPACK_IMPORTED_MODULE_1__.OMIT_SIDES_FOR_MULTIPLE_ELEMENTS);\r\n renderTransformHandles(context, sceneState, transformHandles, 0);\r\n }\r\n context.restore();\r\n }\r\n // Reset zoom\r\n context.restore();\r\n // Paint remote pointers\r\n for (const clientId in sceneState.remotePointerViewportCoords) {\r\n let { x, y } = sceneState.remotePointerViewportCoords[clientId];\r\n x -= appState.offsetLeft;\r\n y -= appState.offsetTop;\r\n const width = 9;\r\n const height = 14;\r\n const isOutOfBounds = x < 0 ||\r\n x > normalizedCanvasWidth - width ||\r\n y < 0 ||\r\n y > normalizedCanvasHeight - height;\r\n x = Math.max(x, 0);\r\n x = Math.min(x, normalizedCanvasWidth - width);\r\n y = Math.max(y, 0);\r\n y = Math.min(y, normalizedCanvasHeight - height);\r\n const { background, stroke } = (0,_clients__WEBPACK_IMPORTED_MODULE_6__.getClientColors)(clientId, appState);\r\n context.save();\r\n context.strokeStyle = stroke;\r\n context.fillStyle = background;\r\n const userState = sceneState.remotePointerUserStates[clientId];\r\n if (isOutOfBounds || userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\r\n context.globalAlpha = 0.48;\r\n }\r\n if (sceneState.remotePointerButton &&\r\n sceneState.remotePointerButton[clientId] === \"down\") {\r\n context.beginPath();\r\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\r\n context.lineWidth = 3;\r\n context.strokeStyle = \"#ffffff88\";\r\n context.stroke();\r\n context.closePath();\r\n context.beginPath();\r\n context.arc(x, y, 15, 0, 2 * Math.PI, false);\r\n context.lineWidth = 1;\r\n context.strokeStyle = stroke;\r\n context.stroke();\r\n context.closePath();\r\n }\r\n context.beginPath();\r\n context.moveTo(x, y);\r\n context.lineTo(x + 1, y + 14);\r\n context.lineTo(x + 4, y + 9);\r\n context.lineTo(x + 9, y + 10);\r\n context.lineTo(x, y);\r\n context.fill();\r\n context.stroke();\r\n const username = sceneState.remotePointerUsernames[clientId];\r\n let idleState = \"\";\r\n if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY) {\r\n idleState = hasEmojiSupport ? \"⚫️\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.AWAY})`;\r\n }\r\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE) {\r\n idleState = hasEmojiSupport ? \"💤\" : ` (${_types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.IDLE})`;\r\n }\r\n else if (userState === _types__WEBPACK_IMPORTED_MODULE_12__.UserIdleState.ACTIVE) {\r\n idleState = hasEmojiSupport ? \"🟢\" : \"\";\r\n }\r\n const usernameAndIdleState = `${username ? `${username} ` : \"\"}${idleState}`;\r\n if (!isOutOfBounds && usernameAndIdleState) {\r\n const offsetX = x + width;\r\n const offsetY = y + height;\r\n const paddingHorizontal = 4;\r\n const paddingVertical = 4;\r\n const measure = context.measureText(usernameAndIdleState);\r\n const measureHeight = measure.actualBoundingBoxDescent + measure.actualBoundingBoxAscent;\r\n // Border\r\n context.fillStyle = stroke;\r\n context.fillRect(offsetX - 1, offsetY - 1, measure.width + 2 * paddingHorizontal + 2, measureHeight + 2 * paddingVertical + 2);\r\n // Background\r\n context.fillStyle = background;\r\n context.fillRect(offsetX, offsetY, measure.width + 2 * paddingHorizontal, measureHeight + 2 * paddingVertical);\r\n context.fillStyle = open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n context.fillText(usernameAndIdleState, offsetX + paddingHorizontal, offsetY + paddingVertical + measure.actualBoundingBoxAscent);\r\n }\r\n context.restore();\r\n context.closePath();\r\n }\r\n // Paint scrollbars\r\n let scrollBars;\r\n if (renderScrollbars) {\r\n scrollBars = (0,_scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.getScrollBars)(elements, normalizedCanvasWidth, normalizedCanvasHeight, sceneState);\r\n context.save();\r\n context.fillStyle = _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_COLOR;\r\n context.strokeStyle = \"rgba(255,255,255,0.8)\";\r\n [scrollBars.horizontal, scrollBars.vertical].forEach((scrollBar) => {\r\n if (scrollBar) {\r\n (0,_roundRect__WEBPACK_IMPORTED_MODULE_2__.roundRect)(context, scrollBar.x, scrollBar.y, scrollBar.width, scrollBar.height, _scene_scrollbars__WEBPACK_IMPORTED_MODULE_3__.SCROLLBAR_WIDTH / 2);\r\n }\r\n });\r\n context.restore();\r\n }\r\n context.restore();\r\n return { atLeastOneVisibleElement: visibleElements.length > 0, scrollBars };\r\n};\r\nconst renderTransformHandles = (context, sceneState, transformHandles, angle) => {\r\n Object.keys(transformHandles).forEach((key) => {\r\n const transformHandle = transformHandles[key];\r\n if (transformHandle !== undefined) {\r\n context.save();\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n if (key === \"rotation\") {\r\n fillCircle(context, transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, transformHandle[2] / 2);\r\n }\r\n else {\r\n strokeRectWithRotation(context, transformHandle[0], transformHandle[1], transformHandle[2], transformHandle[3], transformHandle[0] + transformHandle[2] / 2, transformHandle[1] + transformHandle[3] / 2, angle, true);\r\n }\r\n context.restore();\r\n }\r\n });\r\n};\r\nconst renderSelectionBorder = (context, sceneState, elementProperties) => {\r\n const { angle, elementX1, elementY1, elementX2, elementY2, selectionColors } = elementProperties;\r\n const elementWidth = elementX2 - elementX1;\r\n const elementHeight = elementY2 - elementY1;\r\n const dashedLinePadding = 4 / sceneState.zoom.value;\r\n const dashWidth = 8 / sceneState.zoom.value;\r\n const spaceWidth = 4 / sceneState.zoom.value;\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n context.lineWidth = 1 / sceneState.zoom.value;\r\n const count = selectionColors.length;\r\n for (let index = 0; index < count; ++index) {\r\n context.strokeStyle = selectionColors[index];\r\n context.setLineDash([\r\n dashWidth,\r\n spaceWidth + (dashWidth + spaceWidth) * (count - 1),\r\n ]);\r\n context.lineDashOffset = (dashWidth + spaceWidth) * index;\r\n strokeRectWithRotation(context, elementX1 - dashedLinePadding, elementY1 - dashedLinePadding, elementWidth + dashedLinePadding * 2, elementHeight + dashedLinePadding * 2, elementX1 + elementWidth / 2, elementY1 + elementHeight / 2, angle);\r\n }\r\n context.restore();\r\n};\r\nconst renderBindingHighlight = (context, sceneState, suggestedBinding) => {\r\n const renderHighlight = Array.isArray(suggestedBinding)\r\n ? renderBindingHighlightForSuggestedPointBinding\r\n : renderBindingHighlightForBindableElement;\r\n context.save();\r\n context.translate(sceneState.scrollX, sceneState.scrollY);\r\n renderHighlight(context, suggestedBinding);\r\n context.restore();\r\n};\r\nconst renderBindingHighlightForBindableElement = (context, element) => {\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const width = x2 - x1;\r\n const height = y2 - y1;\r\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(element, width, height);\r\n // So that we don't overlap the element itself\r\n const strokeOffset = 4;\r\n context.strokeStyle = \"rgba(0,0,0,.05)\";\r\n context.lineWidth = threshold - strokeOffset;\r\n const padding = strokeOffset / 2 + threshold / 2;\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"text\":\r\n strokeRectWithRotation(context, x1 - padding, y1 - padding, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\r\n break;\r\n case \"diamond\":\r\n const side = Math.hypot(width, height);\r\n const wPadding = (padding * side) / height;\r\n const hPadding = (padding * side) / width;\r\n strokeDiamondWithRotation(context, width + wPadding * 2, height + hPadding * 2, x1 + width / 2, y1 + height / 2, element.angle);\r\n break;\r\n case \"ellipse\":\r\n strokeEllipseWithRotation(context, width + padding * 2, height + padding * 2, x1 + width / 2, y1 + height / 2, element.angle);\r\n break;\r\n }\r\n};\r\nconst renderBindingHighlightForSuggestedPointBinding = (context, suggestedBinding) => {\r\n const [element, startOrEnd, bindableElement] = suggestedBinding;\r\n const threshold = (0,_element_collision__WEBPACK_IMPORTED_MODULE_9__.maxBindingGap)(bindableElement, bindableElement.width, bindableElement.height);\r\n context.strokeStyle = \"rgba(0,0,0,0)\";\r\n context.fillStyle = \"rgba(0,0,0,.05)\";\r\n const pointIndices = startOrEnd === \"both\" ? [0, -1] : startOrEnd === \"start\" ? [0] : [-1];\r\n pointIndices.forEach((index) => {\r\n const [x, y] = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getPointAtIndexGlobalCoordinates(element, index);\r\n fillCircle(context, x, y, threshold);\r\n });\r\n};\r\nconst isVisibleElement = (element, canvasWidth, canvasHeight, viewTransformations) => {\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_1__.getElementBounds)(element); // scene coordinates\r\n const topLeftSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\r\n clientX: viewTransformations.offsetLeft,\r\n clientY: viewTransformations.offsetTop,\r\n }, viewTransformations);\r\n const bottomRightSceneCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.viewportCoordsToSceneCoords)({\r\n clientX: viewTransformations.offsetLeft + canvasWidth,\r\n clientY: viewTransformations.offsetTop + canvasHeight,\r\n }, viewTransformations);\r\n return (topLeftSceneCoords.x <= x2 &&\r\n topLeftSceneCoords.y <= y2 &&\r\n bottomRightSceneCoords.x >= x1 &&\r\n bottomRightSceneCoords.y >= y1);\r\n};\r\n// This should be only called for exporting purposes\r\nconst renderSceneToSvg = (elements, rsvg, svgRoot, files, { offsetX = 0, offsetY = 0, exportWithDarkMode = false, } = {}) => {\r\n if (!svgRoot) {\r\n return;\r\n }\r\n // render elements\r\n elements.forEach((element) => {\r\n if (!element.isDeleted) {\r\n try {\r\n (0,_renderElement__WEBPACK_IMPORTED_MODULE_5__.renderElementToSvg)(element, rsvg, svgRoot, files, element.x + offsetX, element.y + offsetY, exportWithDarkMode);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n });\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUNuQixPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFDbkIsa0JBQWtCLENBQ25CLENBQUM7YUFDSDtZQUFDLE9BQU8sS0FBVSxFQUFFO2dCQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9yZW5kZXJlci9yZW5kZXJTY2VuZS50cz9lMjZmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdWdoQ2FudmFzIH0gZnJvbSBcInJvdWdoanMvYmluL2NhbnZhc1wiO1xuaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tIFwicm91Z2hqcy9iaW4vc3ZnXCI7XG5pbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcblxuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzLCBab29tIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyxcbiAgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMsXG4gIGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzLFxuICBnZXRUcmFuc2Zvcm1IYW5kbGVzLFxuICBnZXRFbGVtZW50Qm91bmRzLFxuICBnZXRDb21tb25Cb3VuZHMsXG59IGZyb20gXCIuLi9lbGVtZW50XCI7XG5cbmltcG9ydCB7IHJvdW5kUmVjdCB9IGZyb20gXCIuL3JvdW5kUmVjdFwiO1xuaW1wb3J0IHsgU2NlbmVTdGF0ZSB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0U2Nyb2xsQmFycyxcbiAgU0NST0xMQkFSX0NPTE9SLFxuICBTQ1JPTExCQVJfV0lEVEgsXG59IGZyb20gXCIuLi9zY2VuZS9zY3JvbGxiYXJzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lL3NlbGVjdGlvblwiO1xuXG5pbXBvcnQgeyByZW5kZXJFbGVtZW50LCByZW5kZXJFbGVtZW50VG9TdmcgfSBmcm9tIFwiLi9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRDbGllbnRDb2xvcnMgfSBmcm9tIFwiLi4vY2xpZW50c1wiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7XG4gIGlzU2VsZWN0ZWRWaWFHcm91cCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkcyxcbiAgZ2V0RWxlbWVudHNJbkdyb3VwLFxufSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgeyBtYXhCaW5kaW5nR2FwIH0gZnJvbSBcIi4uL2VsZW1lbnQvY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICBTdWdnZXN0ZWRCaW5kaW5nLFxuICBTdWdnZXN0ZWRQb2ludEJpbmRpbmcsXG4gIGlzQmluZGluZ0VuYWJsZWQsXG59IGZyb20gXCIuLi9lbGVtZW50L2JpbmRpbmdcIjtcbmltcG9ydCB7XG4gIFRyYW5zZm9ybUhhbmRsZXMsXG4gIFRyYW5zZm9ybUhhbmRsZVR5cGUsXG59IGZyb20gXCIuLi9lbGVtZW50L3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcywgc3VwcG9ydHNFbW9qaSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgVXNlcklkbGVTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBoYXNFbW9qaVN1cHBvcnQgPSBzdXBwb3J0c0Vtb2ppKCk7XG5cbmNvbnN0IHN0cm9rZVJlY3RXaXRoUm90YXRpb24gPSAoXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBjeDogbnVtYmVyLFxuICBjeTogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuICBmaWxsOiBib29sZWFuID0gZmFsc2UsXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgaWYgKGZpbGwpIHtcbiAgICBjb250ZXh0LmZpbGxSZWN0KHggLSBjeCwgeSAtIGN5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgfVxuICBjb250ZXh0LnN0cm9rZVJlY3QoeCAtIGN4LCB5IC0gY3ksIHdpZHRoLCBoZWlnaHQpO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcbn07XG5cbmNvbnN0IHN0cm9rZURpYW1vbmRXaXRoUm90YXRpb24gPSAoXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIGN4OiBudW1iZXIsXG4gIGN5OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGFuZ2xlKTtcbiAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY29udGV4dC5tb3ZlVG8oMCwgaGVpZ2h0IC8gMik7XG4gIGNvbnRleHQubGluZVRvKHdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQubGluZVRvKDAsIC1oZWlnaHQgLyAyKTtcbiAgY29udGV4dC5saW5lVG8oLXdpZHRoIC8gMiwgMCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3Qgc3Ryb2tlRWxsaXBzZVdpdGhSb3RhdGlvbiA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgY3g6IG51bWJlcixcbiAgY3k6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbikgPT4ge1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjb250ZXh0LmVsbGlwc2UoY3gsIGN5LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGFuZ2xlLCAwLCBNYXRoLlBJICogMik7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG59O1xuXG5jb25zdCBmaWxsQ2lyY2xlID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGN4OiBudW1iZXIsXG4gIGN5OiBudW1iZXIsXG4gIHJhZGl1czogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNvbnRleHQuYXJjKGN4LCBjeSwgcmFkaXVzLCAwLCBNYXRoLlBJICogMik7XG4gIGNvbnRleHQuZmlsbCgpO1xuICBjb250ZXh0LnN0cm9rZSgpO1xufTtcblxuY29uc3Qgc3Ryb2tlR3JpZCA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBncmlkU2l6ZTogbnVtYmVyLFxuICBvZmZzZXRYOiBudW1iZXIsXG4gIG9mZnNldFk6IG51bWJlcixcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMC4xKVwiO1xuICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICBmb3IgKGxldCB4ID0gb2Zmc2V0WDsgeCA8IG9mZnNldFggKyB3aWR0aCArIGdyaWRTaXplICogMjsgeCArPSBncmlkU2l6ZSkge1xuICAgIGNvbnRleHQubW92ZVRvKHgsIG9mZnNldFkgLSBncmlkU2l6ZSk7XG4gICAgY29udGV4dC5saW5lVG8oeCwgb2Zmc2V0WSArIGhlaWdodCArIGdyaWRTaXplICogMik7XG4gIH1cbiAgZm9yIChsZXQgeSA9IG9mZnNldFk7IHkgPCBvZmZzZXRZICsgaGVpZ2h0ICsgZ3JpZFNpemUgKiAyOyB5ICs9IGdyaWRTaXplKSB7XG4gICAgY29udGV4dC5tb3ZlVG8ob2Zmc2V0WCAtIGdyaWRTaXplLCB5KTtcbiAgICBjb250ZXh0LmxpbmVUbyhvZmZzZXRYICsgd2lkdGggKyBncmlkU2l6ZSAqIDIsIHkpO1xuICB9XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3QgcmVuZGVyTGluZWFyUG9pbnRIYW5kbGVzID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4pID0+IHtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHNjZW5lU3RhdGUuc2Nyb2xsWCwgc2NlbmVTdGF0ZS5zY3JvbGxZKTtcbiAgY29udGV4dC5saW5lV2lkdGggPSAxIC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuXG4gIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRzR2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCkuZm9yRWFjaChcbiAgICAocG9pbnQsIGlkeCkgPT4ge1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID1cbiAgICAgICAgYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ/LmFjdGl2ZVBvaW50SW5kZXggPT09IGlkeFxuICAgICAgICAgID8gXCJyZ2JhKDI1NSwgMTI3LCAxMjcsIDAuOSlcIlxuICAgICAgICAgIDogXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSlcIjtcbiAgICAgIGNvbnN0IHsgUE9JTlRfSEFORExFX1NJWkUgfSA9IExpbmVhckVsZW1lbnRFZGl0b3I7XG4gICAgICBmaWxsQ2lyY2xlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBwb2ludFswXSxcbiAgICAgICAgcG9pbnRbMV0sXG4gICAgICAgIFBPSU5UX0hBTkRMRV9TSVpFIC8gMiAvIHNjZW5lU3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyU2NlbmUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBzZWxlY3Rpb25FbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuICBzY2FsZTogbnVtYmVyLFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4gIC8vIGV4dHJhIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZW5kZXJlclxuICB7XG4gICAgcmVuZGVyU2Nyb2xsYmFycyA9IHRydWUsXG4gICAgcmVuZGVyU2VsZWN0aW9uID0gdHJ1ZSxcbiAgICAvLyBXaGV0aGVyIHRvIGVtcGxveSByZW5kZXIgb3B0aW1pemF0aW9ucyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICAgIC8vIFNob3VsZCBub3QgYmUgdHVybmVkIG9uIGZvciBleHBvcnQgb3BlcmF0aW9ucyBhbmQgc2ltaWxhciwgYmVjYXVzZSBpdFxuICAgIC8vIGRvZXNuJ3QgZ3VhcmFudGVlIHBpeGVsLXBlcmZlY3Qgb3V0cHV0LlxuICAgIHJlbmRlck9wdGltaXphdGlvbnMgPSBmYWxzZSxcbiAgICByZW5kZXJHcmlkID0gdHJ1ZSxcbiAgICAvKiogd2hlbiBleHBvcnRpbmcgdGhlIGJlaGF2aW9yIGlzIHNsaWdodGx5IGRpZmZlcmVudCAoZS5nLiB3ZSBjYW4ndCB1c2VcbiAgICAgICAgQ1NTIGZpbHRlcnMpICovXG4gICAgaXNFeHBvcnQgPSBmYWxzZSxcbiAgfToge1xuICAgIHJlbmRlclNjcm9sbGJhcnM/OiBib29sZWFuO1xuICAgIHJlbmRlclNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgcmVuZGVyT3B0aW1pemF0aW9ucz86IGJvb2xlYW47XG4gICAgcmVuZGVyR3JpZD86IGJvb2xlYW47XG4gICAgaXNFeHBvcnQ/OiBib29sZWFuO1xuICB9ID0ge30sXG4pID0+IHtcbiAgaWYgKGNhbnZhcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7IGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcblxuICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcblxuICAvLyBXaGVuIGRvaW5nIGNhbGN1bGF0aW9ucyBiYXNlZCBvbiBjYW52YXMgd2lkdGggd2Ugc2hvdWxkIHVzZWQgbm9ybWFsaXplZCBvbmVcbiAgY29uc3Qgbm9ybWFsaXplZENhbnZhc1dpZHRoID0gY2FudmFzLndpZHRoIC8gc2NhbGU7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgPSBjYW52YXMuaGVpZ2h0IC8gc2NhbGU7XG5cbiAgaWYgKGlzRXhwb3J0ICYmIHNjZW5lU3RhdGUudGhlbWUgPT09IFwiZGFya1wiKSB7XG4gICAgY29udGV4dC5maWx0ZXIgPSBUSEVNRV9GSUxURVI7XG4gIH1cblxuICAvLyBQYWludCBiYWNrZ3JvdW5kXG4gIGlmICh0eXBlb2Ygc2NlbmVTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgaGFzVHJhbnNwYXJlbmNlID1cbiAgICAgIHNjZW5lU3RhdGUudmlld0JhY2tncm91bmRDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiIHx8XG4gICAgICBzY2VuZVN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA1IHx8IC8vICNSR0JBXG4gICAgICBzY2VuZVN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IubGVuZ3RoID09PSA5IHx8IC8vICNSUkdHQkJBXG4gICAgICAvKGhzbGF8cmdiYSlcXCgvLnRlc3Qoc2NlbmVTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICBpZiAoaGFzVHJhbnNwYXJlbmNlKSB7XG4gICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCBub3JtYWxpemVkQ2FudmFzV2lkdGgsIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQpO1xuICAgIH1cbiAgICBjb250ZXh0LnNhdmUoKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHNjZW5lU3RhdGUudmlld0JhY2tncm91bmRDb2xvcjtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgbm9ybWFsaXplZENhbnZhc1dpZHRoLCBub3JtYWxpemVkQ2FudmFzSGVpZ2h0KTtcbiAgfVxuXG4gIC8vIEFwcGx5IHpvb21cbiAgY29uc3Qgem9vbVRyYW5zbGF0aW9uWCA9IHNjZW5lU3RhdGUuem9vbS50cmFuc2xhdGlvbi54O1xuICBjb25zdCB6b29tVHJhbnNsYXRpb25ZID0gc2NlbmVTdGF0ZS56b29tLnRyYW5zbGF0aW9uLnk7XG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnRyYW5zbGF0ZSh6b29tVHJhbnNsYXRpb25YLCB6b29tVHJhbnNsYXRpb25ZKTtcbiAgY29udGV4dC5zY2FsZShzY2VuZVN0YXRlLnpvb20udmFsdWUsIHNjZW5lU3RhdGUuem9vbS52YWx1ZSk7XG5cbiAgLy8gR3JpZFxuICBpZiAocmVuZGVyR3JpZCAmJiBhcHBTdGF0ZS5ncmlkU2l6ZSkge1xuICAgIHN0cm9rZUdyaWQoXG4gICAgICBjb250ZXh0LFxuICAgICAgYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgICAtTWF0aC5jZWlsKHpvb21UcmFuc2xhdGlvblggLyBzY2VuZVN0YXRlLnpvb20udmFsdWUgLyBhcHBTdGF0ZS5ncmlkU2l6ZSkgKlxuICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSArXG4gICAgICAgIChzY2VuZVN0YXRlLnNjcm9sbFggJSBhcHBTdGF0ZS5ncmlkU2l6ZSksXG4gICAgICAtTWF0aC5jZWlsKHpvb21UcmFuc2xhdGlvblkgLyBzY2VuZVN0YXRlLnpvb20udmFsdWUgLyBhcHBTdGF0ZS5ncmlkU2l6ZSkgKlxuICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSArXG4gICAgICAgIChzY2VuZVN0YXRlLnNjcm9sbFkgJSBhcHBTdGF0ZS5ncmlkU2l6ZSksXG4gICAgICBub3JtYWxpemVkQ2FudmFzV2lkdGggLyBzY2VuZVN0YXRlLnpvb20udmFsdWUsXG4gICAgICBub3JtYWxpemVkQ2FudmFzSGVpZ2h0IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlLFxuICAgICk7XG4gIH1cblxuICAvLyBQYWludCB2aXNpYmxlIGVsZW1lbnRzXG4gIGNvbnN0IHZpc2libGVFbGVtZW50cyA9IGVsZW1lbnRzLmZpbHRlcigoZWxlbWVudCkgPT5cbiAgICBpc1Zpc2libGVFbGVtZW50KGVsZW1lbnQsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCwgbm9ybWFsaXplZENhbnZhc0hlaWdodCwge1xuICAgICAgem9vbTogc2NlbmVTdGF0ZS56b29tLFxuICAgICAgb2Zmc2V0TGVmdDogYXBwU3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgIG9mZnNldFRvcDogYXBwU3RhdGUub2Zmc2V0VG9wLFxuICAgICAgc2Nyb2xsWDogc2NlbmVTdGF0ZS5zY3JvbGxYLFxuICAgICAgc2Nyb2xsWTogc2NlbmVTdGF0ZS5zY3JvbGxZLFxuICAgIH0pLFxuICApO1xuXG4gIHZpc2libGVFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlckVsZW1lbnQoZWxlbWVudCwgcmMsIGNvbnRleHQsIHJlbmRlck9wdGltaXphdGlvbnMsIHNjZW5lU3RhdGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChcbiAgICAgIGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCxcbiAgICApO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZW5kZXJMaW5lYXJQb2ludEhhbmRsZXMoY29udGV4dCwgYXBwU3RhdGUsIHNjZW5lU3RhdGUsIGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhaW50IHNlbGVjdGlvbiBlbGVtZW50XG4gIGlmIChzZWxlY3Rpb25FbGVtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlckVsZW1lbnQoXG4gICAgICAgIHNlbGVjdGlvbkVsZW1lbnQsXG4gICAgICAgIHJjLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICByZW5kZXJPcHRpbWl6YXRpb25zLFxuICAgICAgICBzY2VuZVN0YXRlLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNCaW5kaW5nRW5hYmxlZChhcHBTdGF0ZSkpIHtcbiAgICBhcHBTdGF0ZS5zdWdnZXN0ZWRCaW5kaW5nc1xuICAgICAgLmZpbHRlcigoYmluZGluZykgPT4gYmluZGluZyAhPSBudWxsKVxuICAgICAgLmZvckVhY2goKHN1Z2dlc3RlZEJpbmRpbmcpID0+IHtcbiAgICAgICAgcmVuZGVyQmluZGluZ0hpZ2hsaWdodChjb250ZXh0LCBzY2VuZVN0YXRlLCBzdWdnZXN0ZWRCaW5kaW5nISk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFBhaW50IHNlbGVjdGVkIGVsZW1lbnRzXG4gIGlmIChcbiAgICByZW5kZXJTZWxlY3Rpb24gJiZcbiAgICAhYXBwU3RhdGUubXVsdGlFbGVtZW50ICYmXG4gICAgIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50XG4gICkge1xuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBlbGVtZW50cy5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uQ29sb3JzID0gW107XG4gICAgICAvLyBsb2NhbCB1c2VyXG4gICAgICBpZiAoXG4gICAgICAgIGFwcFN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSAmJlxuICAgICAgICAhaXNTZWxlY3RlZFZpYUdyb3VwKGFwcFN0YXRlLCBlbGVtZW50KVxuICAgICAgKSB7XG4gICAgICAgIHNlbGVjdGlvbkNvbG9ycy5wdXNoKG9jLmJsYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW90ZSB1c2Vyc1xuICAgICAgaWYgKHNjZW5lU3RhdGUucmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgIHNlbGVjdGlvbkNvbG9ycy5wdXNoKFxuICAgICAgICAgIC4uLnNjZW5lU3RhdGUucmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdLm1hcCgoc29ja2V0SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYmFja2dyb3VuZCB9ID0gZ2V0Q2xpZW50Q29sb3JzKHNvY2tldElkLCBhcHBTdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gYmFja2dyb3VuZDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3Rpb25Db2xvcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IFtlbGVtZW50WDEsIGVsZW1lbnRZMSwgZWxlbWVudFgyLCBlbGVtZW50WTJdID1cbiAgICAgICAgICBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICBhbmdsZTogZWxlbWVudC5hbmdsZSxcbiAgICAgICAgICBlbGVtZW50WDEsXG4gICAgICAgICAgZWxlbWVudFkxLFxuICAgICAgICAgIGVsZW1lbnRYMixcbiAgICAgICAgICBlbGVtZW50WTIsXG4gICAgICAgICAgc2VsZWN0aW9uQ29sb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10gYXMgeyBhbmdsZTogbnVtYmVyOyBlbGVtZW50WDE6IG51bWJlcjsgZWxlbWVudFkxOiBudW1iZXI7IGVsZW1lbnRYMjogbnVtYmVyOyBlbGVtZW50WTI6IG51bWJlcjsgc2VsZWN0aW9uQ29sb3JzOiBzdHJpbmdbXSB9W10pO1xuXG4gICAgY29uc3QgYWRkU2VsZWN0aW9uRm9yR3JvdXBJZCA9IChncm91cElkOiBHcm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cEVsZW1lbnRzID0gZ2V0RWxlbWVudHNJbkdyb3VwKGVsZW1lbnRzLCBncm91cElkKTtcbiAgICAgIGNvbnN0IFtlbGVtZW50WDEsIGVsZW1lbnRZMSwgZWxlbWVudFgyLCBlbGVtZW50WTJdID1cbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKGdyb3VwRWxlbWVudHMpO1xuICAgICAgc2VsZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgIGVsZW1lbnRYMSxcbiAgICAgICAgZWxlbWVudFgyLFxuICAgICAgICBlbGVtZW50WTEsXG4gICAgICAgIGVsZW1lbnRZMixcbiAgICAgICAgc2VsZWN0aW9uQ29sb3JzOiBbb2MuYmxhY2tdLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBnZXRTZWxlY3RlZEdyb3VwSWRzKGFwcFN0YXRlKSkge1xuICAgICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBsYXllciBzZWxlY3RlZCBncm91cCBJRHNcbiAgICAgIGFkZFNlbGVjdGlvbkZvckdyb3VwSWQoZ3JvdXBJZCk7XG4gICAgfVxuXG4gICAgaWYgKGFwcFN0YXRlLmVkaXRpbmdHcm91cElkKSB7XG4gICAgICBhZGRTZWxlY3Rpb25Gb3JHcm91cElkKGFwcFN0YXRlLmVkaXRpbmdHcm91cElkKTtcbiAgICB9XG5cbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT5cbiAgICAgIHJlbmRlclNlbGVjdGlvbkJvcmRlcihjb250ZXh0LCBzY2VuZVN0YXRlLCBzZWxlY3Rpb24pLFxuICAgICk7XG5cbiAgICBjb25zdCBsb2NhbGx5U2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcblxuICAgIC8vIFBhaW50IHJlc2l6ZSB0cmFuc2Zvcm1IYW5kbGVzXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoc2NlbmVTdGF0ZS5zY3JvbGxYLCBzY2VuZVN0YXRlLnNjcm9sbFkpO1xuICAgIGlmIChsb2NhbGx5U2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2Mud2hpdGU7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVzID0gZ2V0VHJhbnNmb3JtSGFuZGxlcyhcbiAgICAgICAgbG9jYWxseVNlbGVjdGVkRWxlbWVudHNbMF0sXG4gICAgICAgIHNjZW5lU3RhdGUuem9vbSxcbiAgICAgICAgXCJtb3VzZVwiLCAvLyB3aGVuIHdlIHJlbmRlciB3ZSBkb24ndCBrbm93IHdoaWNoIHBvaW50ZXIgdHlwZSBzbyB1c2UgbW91c2VcbiAgICAgICk7XG4gICAgICBpZiAoIWFwcFN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICByZW5kZXJUcmFuc2Zvcm1IYW5kbGVzKFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgc2NlbmVTdGF0ZSxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVzLFxuICAgICAgICAgIGxvY2FsbHlTZWxlY3RlZEVsZW1lbnRzWzBdLmFuZ2xlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobG9jYWxseVNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSAmJiAhYXBwU3RhdGUuaXNSb3RhdGluZykge1xuICAgICAgY29uc3QgZGFzaGVkTGluZVBhZGRpbmcgPSA0IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcbiAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMobG9jYWxseVNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgY29uc3QgaW5pdGlhbExpbmVEYXNoID0gY29udGV4dC5nZXRMaW5lRGFzaCgpO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMiAvIHNjZW5lU3RhdGUuem9vbS52YWx1ZV0pO1xuICAgICAgY29uc3QgbGluZVdpZHRoID0gY29udGV4dC5saW5lV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyBzY2VuZVN0YXRlLnpvb20udmFsdWU7XG4gICAgICBzdHJva2VSZWN0V2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB4MSAtIGRhc2hlZExpbmVQYWRkaW5nLFxuICAgICAgICB5MSAtIGRhc2hlZExpbmVQYWRkaW5nLFxuICAgICAgICB4MiAtIHgxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLFxuICAgICAgICB5MiAtIHkxICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLFxuICAgICAgICAoeDEgKyB4MikgLyAyLFxuICAgICAgICAoeTEgKyB5MikgLyAyLFxuICAgICAgICAwLFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChpbml0aWFsTGluZURhc2gpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtSGFuZGxlcyA9IGdldFRyYW5zZm9ybUhhbmRsZXNGcm9tQ29vcmRzKFxuICAgICAgICBbeDEsIHkxLCB4MiwgeTJdLFxuICAgICAgICAwLFxuICAgICAgICBzY2VuZVN0YXRlLnpvb20sXG4gICAgICAgIFwibW91c2VcIixcbiAgICAgICAgT01JVF9TSURFU19GT1JfTVVMVElQTEVfRUxFTUVOVFMsXG4gICAgICApO1xuICAgICAgcmVuZGVyVHJhbnNmb3JtSGFuZGxlcyhjb250ZXh0LCBzY2VuZVN0YXRlLCB0cmFuc2Zvcm1IYW5kbGVzLCAwKTtcbiAgICB9XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH1cblxuICAvLyBSZXNldCB6b29tXG4gIGNvbnRleHQucmVzdG9yZSgpO1xuXG4gIC8vIFBhaW50IHJlbW90ZSBwb2ludGVyc1xuICBmb3IgKGNvbnN0IGNsaWVudElkIGluIHNjZW5lU3RhdGUucmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzKSB7XG4gICAgbGV0IHsgeCwgeSB9ID0gc2NlbmVTdGF0ZS5yZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHNbY2xpZW50SWRdO1xuXG4gICAgeCAtPSBhcHBTdGF0ZS5vZmZzZXRMZWZ0O1xuICAgIHkgLT0gYXBwU3RhdGUub2Zmc2V0VG9wO1xuXG4gICAgY29uc3Qgd2lkdGggPSA5O1xuICAgIGNvbnN0IGhlaWdodCA9IDE0O1xuXG4gICAgY29uc3QgaXNPdXRPZkJvdW5kcyA9XG4gICAgICB4IDwgMCB8fFxuICAgICAgeCA+IG5vcm1hbGl6ZWRDYW52YXNXaWR0aCAtIHdpZHRoIHx8XG4gICAgICB5IDwgMCB8fFxuICAgICAgeSA+IG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgLSBoZWlnaHQ7XG5cbiAgICB4ID0gTWF0aC5tYXgoeCwgMCk7XG4gICAgeCA9IE1hdGgubWluKHgsIG5vcm1hbGl6ZWRDYW52YXNXaWR0aCAtIHdpZHRoKTtcbiAgICB5ID0gTWF0aC5tYXgoeSwgMCk7XG4gICAgeSA9IE1hdGgubWluKHksIG5vcm1hbGl6ZWRDYW52YXNIZWlnaHQgLSBoZWlnaHQpO1xuXG4gICAgY29uc3QgeyBiYWNrZ3JvdW5kLCBzdHJva2UgfSA9IGdldENsaWVudENvbG9ycyhjbGllbnRJZCwgYXBwU3RhdGUpO1xuXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGJhY2tncm91bmQ7XG5cbiAgICBjb25zdCB1c2VyU3RhdGUgPSBzY2VuZVN0YXRlLnJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzW2NsaWVudElkXTtcbiAgICBpZiAoaXNPdXRPZkJvdW5kcyB8fCB1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuQVdBWSkge1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IDAuNDg7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2NlbmVTdGF0ZS5yZW1vdGVQb2ludGVyQnV0dG9uICYmXG4gICAgICBzY2VuZVN0YXRlLnJlbW90ZVBvaW50ZXJCdXR0b25bY2xpZW50SWRdID09PSBcImRvd25cIlxuICAgICkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHgsIHksIDE1LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAzO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwiI2ZmZmZmZjg4XCI7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHgsIHksIDE1LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH1cblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5tb3ZlVG8oeCwgeSk7XG4gICAgY29udGV4dC5saW5lVG8oeCArIDEsIHkgKyAxNCk7XG4gICAgY29udGV4dC5saW5lVG8oeCArIDQsIHkgKyA5KTtcbiAgICBjb250ZXh0LmxpbmVUbyh4ICsgOSwgeSArIDEwKTtcbiAgICBjb250ZXh0LmxpbmVUbyh4LCB5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgY29uc3QgdXNlcm5hbWUgPSBzY2VuZVN0YXRlLnJlbW90ZVBvaW50ZXJVc2VybmFtZXNbY2xpZW50SWRdO1xuXG4gICAgbGV0IGlkbGVTdGF0ZSA9IFwiXCI7XG4gICAgaWYgKHVzZXJTdGF0ZSA9PT0gVXNlcklkbGVTdGF0ZS5BV0FZKSB7XG4gICAgICBpZGxlU3RhdGUgPSBoYXNFbW9qaVN1cHBvcnQgPyBcIuKaq++4j1wiIDogYCAoJHtVc2VySWRsZVN0YXRlLkFXQVl9KWA7XG4gICAgfSBlbHNlIGlmICh1c2VyU3RhdGUgPT09IFVzZXJJZGxlU3RhdGUuSURMRSkge1xuICAgICAgaWRsZVN0YXRlID0gaGFzRW1vamlTdXBwb3J0ID8gXCLwn5KkXCIgOiBgICgke1VzZXJJZGxlU3RhdGUuSURMRX0pYDtcbiAgICB9IGVsc2UgaWYgKHVzZXJTdGF0ZSA9PT0gVXNlcklkbGVTdGF0ZS5BQ1RJVkUpIHtcbiAgICAgIGlkbGVTdGF0ZSA9IGhhc0Vtb2ppU3VwcG9ydCA/IFwi8J+folwiIDogXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VybmFtZUFuZElkbGVTdGF0ZSA9IGAke1xuICAgICAgdXNlcm5hbWUgPyBgJHt1c2VybmFtZX0gYCA6IFwiXCJcbiAgICB9JHtpZGxlU3RhdGV9YDtcblxuICAgIGlmICghaXNPdXRPZkJvdW5kcyAmJiB1c2VybmFtZUFuZElkbGVTdGF0ZSkge1xuICAgICAgY29uc3Qgb2Zmc2V0WCA9IHggKyB3aWR0aDtcbiAgICAgIGNvbnN0IG9mZnNldFkgPSB5ICsgaGVpZ2h0O1xuICAgICAgY29uc3QgcGFkZGluZ0hvcml6b250YWwgPSA0O1xuICAgICAgY29uc3QgcGFkZGluZ1ZlcnRpY2FsID0gNDtcbiAgICAgIGNvbnN0IG1lYXN1cmUgPSBjb250ZXh0Lm1lYXN1cmVUZXh0KHVzZXJuYW1lQW5kSWRsZVN0YXRlKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVIZWlnaHQgPVxuICAgICAgICBtZWFzdXJlLmFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCArIG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQ7XG5cbiAgICAgIC8vIEJvcmRlclxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBzdHJva2U7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KFxuICAgICAgICBvZmZzZXRYIC0gMSxcbiAgICAgICAgb2Zmc2V0WSAtIDEsXG4gICAgICAgIG1lYXN1cmUud2lkdGggKyAyICogcGFkZGluZ0hvcml6b250YWwgKyAyLFxuICAgICAgICBtZWFzdXJlSGVpZ2h0ICsgMiAqIHBhZGRpbmdWZXJ0aWNhbCArIDIsXG4gICAgICApO1xuICAgICAgLy8gQmFja2dyb3VuZFxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kO1xuICAgICAgY29udGV4dC5maWxsUmVjdChcbiAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WSxcbiAgICAgICAgbWVhc3VyZS53aWR0aCArIDIgKiBwYWRkaW5nSG9yaXpvbnRhbCxcbiAgICAgICAgbWVhc3VyZUhlaWdodCArIDIgKiBwYWRkaW5nVmVydGljYWwsXG4gICAgICApO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvYy53aGl0ZTtcblxuICAgICAgY29udGV4dC5maWxsVGV4dChcbiAgICAgICAgdXNlcm5hbWVBbmRJZGxlU3RhdGUsXG4gICAgICAgIG9mZnNldFggKyBwYWRkaW5nSG9yaXpvbnRhbCxcbiAgICAgICAgb2Zmc2V0WSArIHBhZGRpbmdWZXJ0aWNhbCArIG1lYXN1cmUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cblxuICAvLyBQYWludCBzY3JvbGxiYXJzXG4gIGxldCBzY3JvbGxCYXJzO1xuICBpZiAocmVuZGVyU2Nyb2xsYmFycykge1xuICAgIHNjcm9sbEJhcnMgPSBnZXRTY3JvbGxCYXJzKFxuICAgICAgZWxlbWVudHMsXG4gICAgICBub3JtYWxpemVkQ2FudmFzV2lkdGgsXG4gICAgICBub3JtYWxpemVkQ2FudmFzSGVpZ2h0LFxuICAgICAgc2NlbmVTdGF0ZSxcbiAgICApO1xuXG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBTQ1JPTExCQVJfQ09MT1I7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IFwicmdiYSgyNTUsMjU1LDI1NSwwLjgpXCI7XG4gICAgW3Njcm9sbEJhcnMuaG9yaXpvbnRhbCwgc2Nyb2xsQmFycy52ZXJ0aWNhbF0uZm9yRWFjaCgoc2Nyb2xsQmFyKSA9PiB7XG4gICAgICBpZiAoc2Nyb2xsQmFyKSB7XG4gICAgICAgIHJvdW5kUmVjdChcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHNjcm9sbEJhci54LFxuICAgICAgICAgIHNjcm9sbEJhci55LFxuICAgICAgICAgIHNjcm9sbEJhci53aWR0aCxcbiAgICAgICAgICBzY3JvbGxCYXIuaGVpZ2h0LFxuICAgICAgICAgIFNDUk9MTEJBUl9XSURUSCAvIDIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29udGV4dC5yZXN0b3JlKCk7XG4gIH1cblxuICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgcmV0dXJuIHsgYXRMZWFzdE9uZVZpc2libGVFbGVtZW50OiB2aXNpYmxlRWxlbWVudHMubGVuZ3RoID4gMCwgc2Nyb2xsQmFycyB9O1xufTtcblxuY29uc3QgcmVuZGVyVHJhbnNmb3JtSGFuZGxlcyA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBzY2VuZVN0YXRlOiBTY2VuZVN0YXRlLFxuICB0cmFuc2Zvcm1IYW5kbGVzOiBUcmFuc2Zvcm1IYW5kbGVzLFxuICBhbmdsZTogbnVtYmVyLFxuKTogdm9pZCA9PiB7XG4gIE9iamVjdC5rZXlzKHRyYW5zZm9ybUhhbmRsZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZSA9IHRyYW5zZm9ybUhhbmRsZXNba2V5IGFzIFRyYW5zZm9ybUhhbmRsZVR5cGVdO1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyBzY2VuZVN0YXRlLnpvb20udmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSBcInJvdGF0aW9uXCIpIHtcbiAgICAgICAgZmlsbENpcmNsZShcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVswXSArIHRyYW5zZm9ybUhhbmRsZVsyXSAvIDIsXG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlWzFdICsgdHJhbnNmb3JtSGFuZGxlWzNdIC8gMixcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVbMl0gLyAyLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVswXSxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVbMV0sXG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlWzJdLFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVszXSxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVbMF0gKyB0cmFuc2Zvcm1IYW5kbGVbMl0gLyAyLFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVsxXSArIHRyYW5zZm9ybUhhbmRsZVszXSAvIDIsXG4gICAgICAgICAgYW5nbGUsXG4gICAgICAgICAgdHJ1ZSwgLy8gZmlsbCBiZWZvcmUgc3Ryb2tlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgcmVuZGVyU2VsZWN0aW9uQm9yZGVyID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4gIGVsZW1lbnRQcm9wZXJ0aWVzOiB7XG4gICAgYW5nbGU6IG51bWJlcjtcbiAgICBlbGVtZW50WDE6IG51bWJlcjtcbiAgICBlbGVtZW50WTE6IG51bWJlcjtcbiAgICBlbGVtZW50WDI6IG51bWJlcjtcbiAgICBlbGVtZW50WTI6IG51bWJlcjtcbiAgICBzZWxlY3Rpb25Db2xvcnM6IHN0cmluZ1tdO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHsgYW5nbGUsIGVsZW1lbnRYMSwgZWxlbWVudFkxLCBlbGVtZW50WDIsIGVsZW1lbnRZMiwgc2VsZWN0aW9uQ29sb3JzIH0gPVxuICAgIGVsZW1lbnRQcm9wZXJ0aWVzO1xuICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50WDIgLSBlbGVtZW50WDE7XG4gIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50WTIgLSBlbGVtZW50WTE7XG5cbiAgY29uc3QgZGFzaGVkTGluZVBhZGRpbmcgPSA0IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuICBjb25zdCBkYXNoV2lkdGggPSA4IC8gc2NlbmVTdGF0ZS56b29tLnZhbHVlO1xuICBjb25zdCBzcGFjZVdpZHRoID0gNCAvIHNjZW5lU3RhdGUuem9vbS52YWx1ZTtcblxuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC50cmFuc2xhdGUoc2NlbmVTdGF0ZS5zY3JvbGxYLCBzY2VuZVN0YXRlLnNjcm9sbFkpO1xuICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyBzY2VuZVN0YXRlLnpvb20udmFsdWU7XG5cbiAgY29uc3QgY291bnQgPSBzZWxlY3Rpb25Db2xvcnMubGVuZ3RoO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpIHtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc2VsZWN0aW9uQ29sb3JzW2luZGV4XTtcbiAgICBjb250ZXh0LnNldExpbmVEYXNoKFtcbiAgICAgIGRhc2hXaWR0aCxcbiAgICAgIHNwYWNlV2lkdGggKyAoZGFzaFdpZHRoICsgc3BhY2VXaWR0aCkgKiAoY291bnQgLSAxKSxcbiAgICBdKTtcbiAgICBjb250ZXh0LmxpbmVEYXNoT2Zmc2V0ID0gKGRhc2hXaWR0aCArIHNwYWNlV2lkdGgpICogaW5kZXg7XG4gICAgc3Ryb2tlUmVjdFdpdGhSb3RhdGlvbihcbiAgICAgIGNvbnRleHQsXG4gICAgICBlbGVtZW50WDEgLSBkYXNoZWRMaW5lUGFkZGluZyxcbiAgICAgIGVsZW1lbnRZMSAtIGRhc2hlZExpbmVQYWRkaW5nLFxuICAgICAgZWxlbWVudFdpZHRoICsgZGFzaGVkTGluZVBhZGRpbmcgKiAyLFxuICAgICAgZWxlbWVudEhlaWdodCArIGRhc2hlZExpbmVQYWRkaW5nICogMixcbiAgICAgIGVsZW1lbnRYMSArIGVsZW1lbnRXaWR0aCAvIDIsXG4gICAgICBlbGVtZW50WTEgKyBlbGVtZW50SGVpZ2h0IC8gMixcbiAgICAgIGFuZ2xlLFxuICAgICk7XG4gIH1cbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5jb25zdCByZW5kZXJCaW5kaW5nSGlnaGxpZ2h0ID0gKFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4gIHN1Z2dlc3RlZEJpbmRpbmc6IFN1Z2dlc3RlZEJpbmRpbmcsXG4pID0+IHtcbiAgY29uc3QgcmVuZGVySGlnaGxpZ2h0ID0gQXJyYXkuaXNBcnJheShzdWdnZXN0ZWRCaW5kaW5nKVxuICAgID8gcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvclN1Z2dlc3RlZFBvaW50QmluZGluZ1xuICAgIDogcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvckJpbmRhYmxlRWxlbWVudDtcblxuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC50cmFuc2xhdGUoc2NlbmVTdGF0ZS5zY3JvbGxYLCBzY2VuZVN0YXRlLnNjcm9sbFkpO1xuICByZW5kZXJIaWdobGlnaHQoY29udGV4dCwgc3VnZ2VzdGVkQmluZGluZyBhcyBhbnkpO1xuXG4gIGNvbnRleHQucmVzdG9yZSgpO1xufTtcblxuY29uc3QgcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvckJpbmRhYmxlRWxlbWVudCA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBlbGVtZW50OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IHdpZHRoID0geDIgLSB4MTtcbiAgY29uc3QgaGVpZ2h0ID0geTIgLSB5MTtcbiAgY29uc3QgdGhyZXNob2xkID0gbWF4QmluZGluZ0dhcChlbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcblxuICAvLyBTbyB0aGF0IHdlIGRvbid0IG92ZXJsYXAgdGhlIGVsZW1lbnQgaXRzZWxmXG4gIGNvbnN0IHN0cm9rZU9mZnNldCA9IDQ7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsLjA1KVwiO1xuICBjb250ZXh0LmxpbmVXaWR0aCA9IHRocmVzaG9sZCAtIHN0cm9rZU9mZnNldDtcbiAgY29uc3QgcGFkZGluZyA9IHN0cm9rZU9mZnNldCAvIDIgKyB0aHJlc2hvbGQgLyAyO1xuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBzdHJva2VSZWN0V2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB4MSAtIHBhZGRpbmcsXG4gICAgICAgIHkxIC0gcGFkZGluZyxcbiAgICAgICAgd2lkdGggKyBwYWRkaW5nICogMixcbiAgICAgICAgaGVpZ2h0ICsgcGFkZGluZyAqIDIsXG4gICAgICAgIHgxICsgd2lkdGggLyAyLFxuICAgICAgICB5MSArIGhlaWdodCAvIDIsXG4gICAgICAgIGVsZW1lbnQuYW5nbGUsXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICAgIGNvbnN0IHNpZGUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3Qgd1BhZGRpbmcgPSAocGFkZGluZyAqIHNpZGUpIC8gaGVpZ2h0O1xuICAgICAgY29uc3QgaFBhZGRpbmcgPSAocGFkZGluZyAqIHNpZGUpIC8gd2lkdGg7XG4gICAgICBzdHJva2VEaWFtb25kV2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB3aWR0aCArIHdQYWRkaW5nICogMixcbiAgICAgICAgaGVpZ2h0ICsgaFBhZGRpbmcgKiAyLFxuICAgICAgICB4MSArIHdpZHRoIC8gMixcbiAgICAgICAgeTEgKyBoZWlnaHQgLyAyLFxuICAgICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICBzdHJva2VFbGxpcHNlV2l0aFJvdGF0aW9uKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB3aWR0aCArIHBhZGRpbmcgKiAyLFxuICAgICAgICBoZWlnaHQgKyBwYWRkaW5nICogMixcbiAgICAgICAgeDEgKyB3aWR0aCAvIDIsXG4gICAgICAgIHkxICsgaGVpZ2h0IC8gMixcbiAgICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgfVxufTtcblxuY29uc3QgcmVuZGVyQmluZGluZ0hpZ2hsaWdodEZvclN1Z2dlc3RlZFBvaW50QmluZGluZyA9IChcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBzdWdnZXN0ZWRCaW5kaW5nOiBTdWdnZXN0ZWRQb2ludEJpbmRpbmcsXG4pID0+IHtcbiAgY29uc3QgW2VsZW1lbnQsIHN0YXJ0T3JFbmQsIGJpbmRhYmxlRWxlbWVudF0gPSBzdWdnZXN0ZWRCaW5kaW5nO1xuXG4gIGNvbnN0IHRocmVzaG9sZCA9IG1heEJpbmRpbmdHYXAoXG4gICAgYmluZGFibGVFbGVtZW50LFxuICAgIGJpbmRhYmxlRWxlbWVudC53aWR0aCxcbiAgICBiaW5kYWJsZUVsZW1lbnQuaGVpZ2h0LFxuICApO1xuXG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMClcIjtcbiAgY29udGV4dC5maWxsU3R5bGUgPSBcInJnYmEoMCwwLDAsLjA1KVwiO1xuXG4gIGNvbnN0IHBvaW50SW5kaWNlcyA9XG4gICAgc3RhcnRPckVuZCA9PT0gXCJib3RoXCIgPyBbMCwgLTFdIDogc3RhcnRPckVuZCA9PT0gXCJzdGFydFwiID8gWzBdIDogWy0xXTtcbiAgcG9pbnRJbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgY29uc3QgW3gsIHldID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBpbmRleCxcbiAgICApO1xuICAgIGZpbGxDaXJjbGUoY29udGV4dCwgeCwgeSwgdGhyZXNob2xkKTtcbiAgfSk7XG59O1xuXG5jb25zdCBpc1Zpc2libGVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgY2FudmFzV2lkdGg6IG51bWJlcixcbiAgY2FudmFzSGVpZ2h0OiBudW1iZXIsXG4gIHZpZXdUcmFuc2Zvcm1hdGlvbnM6IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50Qm91bmRzKGVsZW1lbnQpOyAvLyBzY2VuZSBjb29yZGluYXRlc1xuICBjb25zdCB0b3BMZWZ0U2NlbmVDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAge1xuICAgICAgY2xpZW50WDogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRMZWZ0LFxuICAgICAgY2xpZW50WTogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRUb3AsXG4gICAgfSxcbiAgICB2aWV3VHJhbnNmb3JtYXRpb25zLFxuICApO1xuICBjb25zdCBib3R0b21SaWdodFNjZW5lQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgIHtcbiAgICAgIGNsaWVudFg6IHZpZXdUcmFuc2Zvcm1hdGlvbnMub2Zmc2V0TGVmdCArIGNhbnZhc1dpZHRoLFxuICAgICAgY2xpZW50WTogdmlld1RyYW5zZm9ybWF0aW9ucy5vZmZzZXRUb3AgKyBjYW52YXNIZWlnaHQsXG4gICAgfSxcbiAgICB2aWV3VHJhbnNmb3JtYXRpb25zLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgdG9wTGVmdFNjZW5lQ29vcmRzLnggPD0geDIgJiZcbiAgICB0b3BMZWZ0U2NlbmVDb29yZHMueSA8PSB5MiAmJlxuICAgIGJvdHRvbVJpZ2h0U2NlbmVDb29yZHMueCA+PSB4MSAmJlxuICAgIGJvdHRvbVJpZ2h0U2NlbmVDb29yZHMueSA+PSB5MVxuICApO1xufTtcblxuLy8gVGhpcyBzaG91bGQgYmUgb25seSBjYWxsZWQgZm9yIGV4cG9ydGluZyBwdXJwb3Nlc1xuZXhwb3J0IGNvbnN0IHJlbmRlclNjZW5lVG9TdmcgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgcnN2ZzogUm91Z2hTVkcsXG4gIHN2Z1Jvb3Q6IFNWR0VsZW1lbnQsXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAge1xuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSA9IGZhbHNlLFxuICB9OiB7XG4gICAgb2Zmc2V0WD86IG51bWJlcjtcbiAgICBvZmZzZXRZPzogbnVtYmVyO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIXN2Z1Jvb3QpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gcmVuZGVyIGVsZW1lbnRzXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBpZiAoIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZW5kZXJFbGVtZW50VG9TdmcoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICByc3ZnLFxuICAgICAgICAgIHN2Z1Jvb3QsXG4gICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgZWxlbWVudC54ICsgb2Zmc2V0WCxcbiAgICAgICAgICBlbGVtZW50LnkgKyBvZmZzZXRZLFxuICAgICAgICAgIGV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../renderer/renderScene.ts\n");
|
|
2789
2789
|
|
|
2790
2790
|
/***/ }),
|
|
2791
2791
|
|
|
@@ -2829,7 +2829,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2829
2829
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2830
2830
|
|
|
2831
2831
|
"use strict";
|
|
2832
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\r\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = width * appState.exportScale;\r\n canvas.height = height * appState.exportScale;\r\n return { canvas, scale: appState.exportScale };\r\n}) => __awaiter(void 0, void 0, void 0, function* () {\r\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\r\n const { canvas, scale = 1 } = createCanvas(width, height);\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\r\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\r\n imageCache: new Map(),\r\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\r\n files,\r\n });\r\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas), canvas, {\r\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\r\n scrollX: -minX + exportPadding,\r\n scrollY: -minY + exportPadding,\r\n zoom: defaultAppState.zoom,\r\n remotePointerViewportCoords: {},\r\n remoteSelectedElementIds: {},\r\n shouldCacheIgnoreZoom: false,\r\n remotePointerUsernames: {},\r\n remotePointerUserStates: {},\r\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\r\n imageCache,\r\n }, {\r\n renderScrollbars: false,\r\n renderSelection: false,\r\n renderOptimizations: true,\r\n renderGrid: false,\r\n isExport: true,\r\n });\r\n return canvas;\r\n});\r\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\r\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\r\n let metadata = \"\";\r\n if (exportEmbedScene) {\r\n try {\r\n metadata = yield (yield Promise.all(/*! import() | image */[__webpack_require__.e(\"vendor\"), __webpack_require__.e(\"image\")]).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\r\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\r\n });\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\r\n // initialze SVG root\r\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\r\n svgRoot.setAttribute(\"version\", \"1.1\");\r\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\r\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\r\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\r\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\r\n if (appState.exportWithDarkMode) {\r\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\r\n }\r\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style>\n @font-face {\n font-family: \"Virgil\";\n src: url(\"https://excalidraw.com/Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"https://excalidraw.com/Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\r\n // render background rect\r\n if (appState.exportBackground && viewBackgroundColor) {\r\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\r\n rect.setAttribute(\"x\", \"0\");\r\n rect.setAttribute(\"y\", \"0\");\r\n rect.setAttribute(\"width\", `${width}`);\r\n rect.setAttribute(\"height\", `${height}`);\r\n rect.setAttribute(\"fill\", viewBackgroundColor);\r\n svgRoot.appendChild(rect);\r\n }\r\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\r\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\r\n offsetX: -minX + exportPadding,\r\n offsetY: -minY + exportPadding,\r\n });\r\n return svgRoot;\r\n});\r\n// calculate smallest area to fit the contents in\r\nconst getCanvasSize = (elements, exportPadding) => {\r\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\r\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\r\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\r\n return [minX, minY, width, height];\r\n};\r\nconst getExportSize = (elements, exportPadding, scale) => {\r\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\r\n return [width, height];\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUcsZ0RBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBRXBFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxDQUMzQixRQUFnRCxFQUNoRCxhQUFxQixFQUNyQixLQUFhLEVBQ0ssRUFBRTtJQUNwQixNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FDcEUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUM3QyxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcyB9IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUsIHJlbmRlclNjZW5lVG9TdmcgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIHVwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5cbmV4cG9ydCBjb25zdCBTVkdfRVhQT1JUX1RBRyA9IGA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT5gO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIH06IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICB9LFxuICBjcmVhdGVDYW52YXM6IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDsgc2NhbGU6IG51bWJlciB9ID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIHJldHVybiB7IGNhbnZhcywgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlIH07XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG5cbiAgY29uc3QgeyBjYW52YXMsIHNjYWxlID0gMSB9ID0gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgaW1hZ2VDYWNoZSB9ID0gYXdhaXQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50cykubWFwKFxuICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkLFxuICAgICksXG4gICAgZmlsZXMsXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKFxuICAgIGVsZW1lbnRzLFxuICAgIGFwcFN0YXRlLFxuICAgIG51bGwsXG4gICAgc2NhbGUsXG4gICAgcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgY2FudmFzLFxuICAgIHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgIH0sXG4gICAge1xuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyT3B0aW1pemF0aW9uczogdHJ1ZSxcbiAgICAgIHJlbmRlckdyaWQ6IGZhbHNlLFxuICAgICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgfSxcbiAgKTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgc3ZnUm9vdC5pbm5lckhUTUwgPSBgXG4gICR7U1ZHX0VYUE9SVF9UQUd9XG4gICR7bWV0YWRhdGF9XG4gIDxkZWZzPlxuICAgIDxzdHlsZT5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCJodHRwczovL2V4Y2FsaWRyYXcuY29tL1ZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vQ2FzY2FkaWEud29mZjJcIik7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9kZWZzPlxuICBgO1xuXG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZXhwb3J0UGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
2832
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\r\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = width * appState.exportScale;\r\n canvas.height = height * appState.exportScale;\r\n return { canvas, scale: appState.exportScale };\r\n}) => __awaiter(void 0, void 0, void 0, function* () {\r\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\r\n const { canvas, scale = 1 } = createCanvas(width, height);\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\r\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\r\n imageCache: new Map(),\r\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\r\n files,\r\n });\r\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas), canvas, {\r\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\r\n scrollX: -minX + exportPadding,\r\n scrollY: -minY + exportPadding,\r\n zoom: defaultAppState.zoom,\r\n remotePointerViewportCoords: {},\r\n remoteSelectedElementIds: {},\r\n shouldCacheIgnoreZoom: false,\r\n remotePointerUsernames: {},\r\n remotePointerUserStates: {},\r\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\r\n imageCache,\r\n }, {\r\n renderScrollbars: false,\r\n renderSelection: false,\r\n renderOptimizations: true,\r\n renderGrid: false,\r\n isExport: true,\r\n });\r\n return canvas;\r\n});\r\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\r\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\r\n let metadata = \"\";\r\n if (exportEmbedScene) {\r\n try {\r\n metadata = yield (yield Promise.all(/*! import() | image */[__webpack_require__.e(\"vendor\"), __webpack_require__.e(\"image\")]).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\r\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\r\n });\r\n }\r\n catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\r\n // initialze SVG root\r\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\r\n svgRoot.setAttribute(\"version\", \"1.1\");\r\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\r\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\r\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\r\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\r\n if (appState.exportWithDarkMode) {\r\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\r\n }\r\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style>\n @font-face {\n font-family: \"Virgil\";\n src: url(\"https://excalidraw.com/Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"https://excalidraw.com/Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\r\n // render background rect\r\n if (appState.exportBackground && viewBackgroundColor) {\r\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\r\n rect.setAttribute(\"x\", \"0\");\r\n rect.setAttribute(\"y\", \"0\");\r\n rect.setAttribute(\"width\", `${width}`);\r\n rect.setAttribute(\"height\", `${height}`);\r\n rect.setAttribute(\"fill\", viewBackgroundColor);\r\n svgRoot.appendChild(rect);\r\n }\r\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\r\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\r\n offsetX: -minX + exportPadding,\r\n offsetY: -minY + exportPadding,\r\n exportWithDarkMode: appState.exportWithDarkMode,\r\n });\r\n return svgRoot;\r\n});\r\n// calculate smallest area to fit the contents in\r\nconst getCanvasSize = (elements, exportPadding) => {\r\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\r\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\r\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\r\n return [minX, minY, width, height];\r\n};\r\nconst getExportSize = (elements, exportPadding, scale) => {\r\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\r\n return [width, height];\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vc2NlbmUvZXhwb3J0LnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFzQztBQUVjO0FBQ29CO0FBQ3BDO0FBRXdDO0FBQzNCO0FBQ0Y7QUFJckI7QUFFbkIsTUFBTSxjQUFjLEdBQUcsZ0NBQWdDLENBQUM7QUFFeEQsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsUUFBZ0QsRUFDaEQsUUFBa0IsRUFDbEIsS0FBa0IsRUFDbEIsRUFDRSxnQkFBZ0IsRUFDaEIsYUFBYSxHQUFHLDhEQUFzQixFQUN0QyxtQkFBbUIsR0FLcEIsRUFDRCxlQUdvRCxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUNwRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDNUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUM5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDakQsQ0FBQyxFQUNELEVBQUU7SUFDRixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUUzRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTFELE1BQU0sZUFBZSxHQUFHLDZEQUFrQixFQUFFLENBQUM7SUFFN0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sZ0VBQWdCLENBQUM7UUFDNUMsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3JCLE9BQU8sRUFBRSwyRUFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQ2hELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUM1QjtRQUNELEtBQUs7S0FDTixDQUFDLENBQUM7SUFFSCxrRUFBVyxDQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsSUFBSSxFQUNKLEtBQUssRUFDTCxnRUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUNwQixNQUFNLEVBQ047UUFDRSxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDbEUsT0FBTyxFQUFFLENBQUMsSUFBSSxHQUFHLGFBQWE7UUFDOUIsT0FBTyxFQUFFLENBQUMsSUFBSSxHQUFHLGFBQWE7UUFDOUIsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJO1FBQzFCLDJCQUEyQixFQUFFLEVBQUU7UUFDL0Isd0JBQXdCLEVBQUUsRUFBRTtRQUM1QixxQkFBcUIsRUFBRSxLQUFLO1FBQzVCLHNCQUFzQixFQUFFLEVBQUU7UUFDMUIsdUJBQXVCLEVBQUUsRUFBRTtRQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87UUFDckQsVUFBVTtLQUNYLEVBQ0Q7UUFDRSxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLG1CQUFtQixFQUFFLElBQUk7UUFDekIsVUFBVSxFQUFFLEtBQUs7UUFDakIsUUFBUSxFQUFFLElBQUk7S0FDZixDQUNGLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLEVBQUM7QUFFSyxNQUFNLFdBQVcsR0FBRyxDQUN6QixRQUFnRCxFQUNoRCxRQU9DLEVBQ0QsS0FBeUIsRUFDRCxFQUFFO0lBQzFCLE1BQU0sRUFDSixhQUFhLEdBQUcsOERBQXNCLEVBQ3RDLG1CQUFtQixFQUNuQixXQUFXLEdBQUcsQ0FBQyxFQUNmLGdCQUFnQixHQUNqQixHQUFHLFFBQVEsQ0FBQztJQUNiLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNsQixJQUFJLGdCQUFnQixFQUFFO1FBQ3BCLElBQUk7WUFDRixRQUFRLEdBQUcsTUFBTSxDQUNmLE1BQU0sNE1BQThELENBQ3JFLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2xCLElBQUksRUFBRSwyREFBZSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUM7YUFDaEUsQ0FBQyxDQUFDO1NBQ0o7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO0tBQ0Y7SUFDRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUUzRSxxQkFBcUI7SUFDckIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyw4Q0FBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hELE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLDhDQUFNLENBQUMsQ0FBQztJQUN0QyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxPQUFPLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFELE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDeEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxNQUFNLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxRCxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMvQixPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxvREFBWSxDQUFDLENBQUM7S0FDOUM7SUFFRCxPQUFPLENBQUMsU0FBUyxHQUFHO0lBQ2xCLGNBQWM7SUFDZCxRQUFROzs7Ozs7Ozs7Ozs7O0dBYVQsQ0FBQztJQUVGLHlCQUF5QjtJQUN6QixJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxtQkFBbUIsRUFBRTtRQUNwRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsYUFBYyxDQUFDLGVBQWUsQ0FBQyw4Q0FBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNCO0lBRUQsTUFBTSxJQUFJLEdBQUcsNkRBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyx1RUFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFO1FBQ3JELE9BQU8sRUFBRSxDQUFDLElBQUksR0FBRyxhQUFhO1FBQzlCLE9BQU8sRUFBRSxDQUFDLElBQUksR0FBRyxhQUFhO1FBQzlCLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7S0FDaEQsQ0FBQyxDQUFDO0lBRUgsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxFQUFDO0FBRUYsaURBQWlEO0FBQ2pELE1BQU0sYUFBYSxHQUFHLENBQ3BCLFFBQWdELEVBQ2hELGFBQXFCLEVBQ2EsRUFBRTtJQUNwQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0VBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLGdEQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFFcEUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVLLE1BQU0sYUFBYSxHQUFHLENBQzNCLFFBQWdELEVBQ2hELGFBQXFCLEVBQ3JCLEtBQWEsRUFDSyxFQUFFO0lBQ3BCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUNwRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQzdDLENBQUM7SUFFRixPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9zY2VuZS9leHBvcnQudHM/OWJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uQm91bmRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSwgcmVuZGVyU2NlbmVUb1N2ZyB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBCaW5hcnlGaWxlcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgU1ZHX05TLCBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcblxuZXhwb3J0IGNvbnN0IFNWR19FWFBPUlRfVEFHID0gYDwhLS0gc3ZnLXNvdXJjZTpleGNhbGlkcmF3IC0tPmA7XG5cbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IGFzeW5jIChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAge1xuICAgIGV4cG9ydEJhY2tncm91bmQsXG4gICAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gICAgdmlld0JhY2tncm91bmRDb2xvcixcbiAgfToge1xuICAgIGV4cG9ydEJhY2tncm91bmQ6IGJvb2xlYW47XG4gICAgZXhwb3J0UGFkZGluZz86IG51bWJlcjtcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIH0sXG4gIGNyZWF0ZUNhbnZhczogKFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICkgPT4geyBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50OyBzY2FsZTogbnVtYmVyIH0gPSAod2lkdGgsIGhlaWdodCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgcmV0dXJuIHsgY2FudmFzLCBzY2FsZTogYXBwU3RhdGUuZXhwb3J0U2NhbGUgfTtcbiAgfSxcbikgPT4ge1xuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICBjb25zdCB7IGNhbnZhcywgc2NhbGUgPSAxIH0gPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG5cbiAgY29uc3QgeyBpbWFnZUNhY2hlIH0gPSBhd2FpdCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoXG4gICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5maWxlSWQsXG4gICAgKSxcbiAgICBmaWxlcyxcbiAgfSk7XG5cbiAgcmVuZGVyU2NlbmUoXG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgbnVsbCxcbiAgICBzY2FsZSxcbiAgICByb3VnaC5jYW52YXMoY2FudmFzKSxcbiAgICBjYW52YXMsXG4gICAge1xuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHt9LFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiB7fSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgfSxcbiAgICB7XG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJPcHRpbWl6YXRpb25zOiB0cnVlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydDogdHJ1ZSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4pOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmUsXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi8gXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKVxuICAgICAgKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWx6ZSBTVkcgcm9vdFxuICBjb25zdCBzdmdSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzdmdcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBTVkdfTlMpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aCAqIGV4cG9ydFNjYWxlfWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHQgKiBleHBvcnRTY2FsZX1gKTtcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSkge1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gIH1cblxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vVmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG5cbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
2833
2833
|
|
|
2834
2834
|
/***/ }),
|
|
2835
2835
|
|
|
@@ -2906,7 +2906,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2906
2906
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2907
2907
|
|
|
2908
2908
|
"use strict";
|
|
2909
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserIdleState\": () => (/* binding */ UserIdleState)\n/* harmony export */ });\nvar UserIdleState;\r\n(function (UserIdleState) {\r\n UserIdleState[\"ACTIVE\"] = \"active\";\r\n UserIdleState[\"AWAY\"] = \"away\";\r\n UserIdleState[\"IDLE\"] = \"idle\";\r\n})(UserIdleState || (UserIdleState = {}));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdHlwZXMudHMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQTZRQSxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsa0NBQWlCO0lBQ2pCLDhCQUFhO0lBQ2IsOEJBQWE7QUFDZixDQUFDLEVBSlcsYUFBYSxLQUFiLGFBQWEsUUFJeEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdHlwZXMudHM/MDI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQb2ludGVyVHlwZSxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBDaGFydFR5cGUsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRmlsZUlkLFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBUaGVtZSxcbn0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5pbXBvcnQgeyBQb2ludCBhcyBSb3VnaFBvaW50IH0gZnJvbSBcInJvdWdoanMvYmluL2dlb21ldHJ5XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBTdWdnZXN0ZWRCaW5kaW5nIH0gZnJvbSBcIi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuL2RhdGEvdHlwZXNcIjtcbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlUHJvbWlzZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTcHJlYWRzaGVldCB9IGZyb20gXCIuL2NoYXJ0c1wiO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tIFwiLi9pMThuXCI7XG5pbXBvcnQgeyBDbGlwYm9hcmREYXRhIH0gZnJvbSBcIi4vY2xpcGJvYXJkXCI7XG5pbXBvcnQgeyBpc092ZXJTY3JvbGxCYXJzIH0gZnJvbSBcIi4vc2NlbmVcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL2VsZW1lbnQvdHJhbnNmb3JtSGFuZGxlc1wiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVTeXN0ZW1IYW5kbGUgfSBmcm9tIFwiLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcbmltcG9ydCB0eXBlIHsgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTLCBNSU1FX1RZUEVTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBvaW50ID0gUmVhZG9ubHk8Um91Z2hQb2ludD47XG5cbmV4cG9ydCB0eXBlIENvbGxhYm9yYXRvciA9IHtcbiAgcG9pbnRlcj86IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9O1xuICBidXR0b24/OiBcInVwXCIgfCBcImRvd25cIjtcbiAgc2VsZWN0ZWRFbGVtZW50SWRzPzogQXBwU3RhdGVbXCJzZWxlY3RlZEVsZW1lbnRJZHNcIl07XG4gIHVzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgdXNlclN0YXRlPzogVXNlcklkbGVTdGF0ZTtcbiAgY29sb3I/OiB7XG4gICAgYmFja2dyb3VuZDogc3RyaW5nO1xuICAgIHN0cm9rZTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YVVSTCA9IHN0cmluZyAmIHsgX2JyYW5kOiBcIkRhdGFVUkxcIiB9O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlRGF0YSA9IHtcbiAgbWltZVR5cGU6XG4gICAgfCB0eXBlb2YgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTW251bWJlcl1cbiAgICAvLyBmdXR1cmUgdXNlciBvciB1bmtub3duIGZpbGUgdHlwZVxuICAgIHwgdHlwZW9mIE1JTUVfVFlQRVMuYmluYXJ5O1xuICBpZDogRmlsZUlkO1xuICBkYXRhVVJMOiBEYXRhVVJMO1xuICBjcmVhdGVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlTWV0YWRhdGEgPSBPbWl0PEJpbmFyeUZpbGVEYXRhLCBcImRhdGFVUkxcIj47XG5cbmV4cG9ydCB0eXBlIEJpbmFyeUZpbGVzID0gUmVjb3JkPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEJpbmFyeUZpbGVEYXRhPjtcblxuZXhwb3J0IHR5cGUgQXBwU3RhdGUgPSB7XG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICBkcmFnZ2luZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIHJlc2l6aW5nRWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbDtcbiAgbXVsdGlFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PiB8IG51bGw7XG4gIHNlbGVjdGlvbkVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGlzQmluZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIHN0YXJ0Qm91bmRFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ+IHwgbnVsbDtcbiAgc3VnZ2VzdGVkQmluZGluZ3M6IFN1Z2dlc3RlZEJpbmRpbmdbXTtcbiAgLy8gZWxlbWVudCBiZWluZyBlZGl0ZWQsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYWRkZWQgdG8gZWxlbWVudHMgYXJyYXkgeWV0XG4gIC8vIChlLmcuIHRleHQgZWxlbWVudCB3aGVuIHR5cGluZyBpbnRvIHRoZSBpbnB1dClcbiAgZWRpdGluZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBMaW5lYXJFbGVtZW50RWRpdG9yIHwgbnVsbDtcbiAgZWxlbWVudFR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdO1xuICBlbGVtZW50TG9ja2VkOiBib29sZWFuO1xuICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICBleHBvcnRFbWJlZFNjZW5lOiBib29sZWFuO1xuICBleHBvcnRXaXRoRGFya01vZGU6IGJvb2xlYW47XG4gIGV4cG9ydFNjYWxlOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1GaWxsU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wiZmlsbFN0eWxlXCJdO1xuICBjdXJyZW50SXRlbVN0cm9rZVdpZHRoOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU3R5bGVcIl07XG4gIGN1cnJlbnRJdGVtUm91Z2huZXNzOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtT3BhY2l0eTogbnVtYmVyO1xuICBjdXJyZW50SXRlbUZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG4gIGN1cnJlbnRJdGVtRm9udFNpemU6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1UZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICBjdXJyZW50SXRlbUVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICB2aWV3QmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIHNjcm9sbFg6IG51bWJlcjtcbiAgc2Nyb2xsWTogbnVtYmVyO1xuICBjdXJzb3JCdXR0b246IFwidXBcIiB8IFwiZG93blwiO1xuICBzY3JvbGxlZE91dHNpZGU6IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbiAgaXNSZXNpemluZzogYm9vbGVhbjtcbiAgaXNSb3RhdGluZzogYm9vbGVhbjtcbiAgem9vbTogWm9vbTtcbiAgb3Blbk1lbnU6IFwiY2FudmFzXCIgfCBcInNoYXBlXCIgfCBudWxsO1xuICBvcGVuUG9wdXA6XG4gICAgfCBcImNhbnZhc0NvbG9yUGlja2VyXCJcbiAgICB8IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCJcbiAgICB8IFwic3Ryb2tlQ29sb3JQaWNrZXJcIlxuICAgIHwgbnVsbDtcbiAgbGFzdFBvaW50ZXJEb3duV2l0aDogUG9pbnRlclR5cGU7XG4gIHNlbGVjdGVkRWxlbWVudElkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH07XG4gIHNob3VsZENhY2hlSWdub3JlWm9vbTogYm9vbGVhbjtcbiAgc2hvd0hlbHBEaWFsb2c6IGJvb2xlYW47XG4gIHRvYXN0TWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgemVuTW9kZUVuYWJsZWQ6IGJvb2xlYW47XG4gIHRoZW1lOiBUaGVtZTtcbiAgZ3JpZFNpemU6IG51bWJlciB8IG51bGw7XG4gIHZpZXdNb2RlRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKiogdG9wLW1vc3Qgc2VsZWN0ZWQgZ3JvdXBzIChpLmUuIGRvZXMgbm90IGluY2x1ZGUgbmVzdGVkIGdyb3VwcykgKi9cbiAgc2VsZWN0ZWRHcm91cElkczogeyBbZ3JvdXBJZDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICAvKiogZ3JvdXAgYmVpbmcgZWRpdGVkIHdoZW4geW91IGRyaWxsIGRvd24gdG8gaXRzIGNvbnN0aXR1ZW50IGVsZW1lbnRcbiAgICAoZS5nLiB3aGVuIHlvdSBkb3VibGUtY2xpY2sgb24gYSBncm91cCdzIGVsZW1lbnQpICovXG4gIGVkaXRpbmdHcm91cElkOiBHcm91cElkIHwgbnVsbDtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIG9mZnNldFRvcDogbnVtYmVyO1xuICBvZmZzZXRMZWZ0OiBudW1iZXI7XG5cbiAgaXNMaWJyYXJ5T3BlbjogYm9vbGVhbjtcbiAgZmlsZUhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGw7XG4gIGNvbGxhYm9yYXRvcnM6IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIHNob3dTdGF0czogYm9vbGVhbjtcbiAgY3VycmVudENoYXJ0VHlwZTogQ2hhcnRUeXBlO1xuICBwYXN0ZURpYWxvZzpcbiAgICB8IHtcbiAgICAgICAgc2hvd246IGZhbHNlO1xuICAgICAgICBkYXRhOiBudWxsO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzaG93bjogdHJ1ZTtcbiAgICAgICAgZGF0YTogU3ByZWFkc2hlZXQ7XG4gICAgICB9O1xuICAvKiogaW1hZ2VFbGVtZW50IHdhaXRpbmcgdG8gYmUgcGxhY2VkIG9uIGNhbnZhcyAqL1xuICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+IHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRab29tVmFsdWUgPSBudW1iZXIgJiB7IF9icmFuZDogXCJub3JtYWxpemVkWm9vbVwiIH07XG5cbmV4cG9ydCB0eXBlIFpvb20gPSBSZWFkb25seTx7XG4gIHZhbHVlOiBOb3JtYWxpemVkWm9vbVZhbHVlO1xuICB0cmFuc2xhdGlvbjogUmVhZG9ubHk8e1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0+O1xufT47XG5cbmV4cG9ydCB0eXBlIFBvaW50ZXJDb29yZHMgPSBSZWFkb25seTx7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufT47XG5cbmV4cG9ydCB0eXBlIEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBNYXA8bnVtYmVyLCBQb2ludGVyQ29vcmRzPjtcbiAgbGFzdENlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgaW5pdGlhbERpc3RhbmNlOiBudW1iZXIgfCBudWxsO1xuICBpbml0aWFsU2NhbGU6IG51bWJlciB8IG51bGw7XG59O1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBHZXN0dXJlRXZlbnQgZXh0ZW5kcyBVSUV2ZW50IHtcbiAgcmVhZG9ubHkgcm90YXRpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NhbGU6IG51bWJlcjtcbn1cblxuLy8gbGlicmFyaWVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqIEBkZXByZWNhdGVkIGxlZ2FjeTogZG8gbm90IHVzZSBvdXRzaWRlIG9mIG1pZ3JhdGlvbiBwYXRocyAqL1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1fdjEgPSByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuLyoqIEBkZXByZWNhdGVkIGxlZ2FjeTogZG8gbm90IHVzZSBvdXRzaWRlIG9mIG1pZ3JhdGlvbiBwYXRocyAqL1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1zX3YxID0gcmVhZG9ubHkgTGlicmFyeUl0ZW1fdjFbXTtcblxuLyoqIHYyIGxpYnJhcnkgaXRlbSAqL1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW0gPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHN0YXR1czogXCJwdWJsaXNoZWRcIiB8IFwidW5wdWJsaXNoZWRcIjtcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W107XG4gIC8qKiB0aW1lc3RhbXAgaW4gZXBvY2ggKG1zKSAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIExpYnJhcnlJdGVtcyA9IHJlYWRvbmx5IExpYnJhcnlJdGVtW107XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBOT1RFIHJlYWR5L3JlYWR5UHJvbWlzZSBwcm9wcyBhcmUgb3B0aW9uYWwgZm9yIGhvc3QgYXBwcycgc2FrZSAob3VyIG93blxuLy8gaW1wbGVtIGd1YXJhbnRlZXMgZXhpc3RlbmNlKVxuZXhwb3J0IHR5cGUgRXhjYWxpZHJhd0FQSVJlZlZhbHVlID1cbiAgfCBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSVxuICB8IHtcbiAgICAgIHJlYWR5UHJvbWlzZT86IFJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPjtcbiAgICAgIHJlYWR5PzogZmFsc2U7XG4gICAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBFeGNhbGlkcmF3UHJvcHMge1xuICBvbkNoYW5nZT86IChcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICApID0+IHZvaWQ7XG4gIGluaXRpYWxEYXRhPzogSW1wb3J0ZWREYXRhU3RhdGUgfCBudWxsIHwgUHJvbWlzZTxJbXBvcnRlZERhdGFTdGF0ZSB8IG51bGw+O1xuICBleGNhbGlkcmF3UmVmPzogRm9yd2FyZFJlZjxFeGNhbGlkcmF3QVBJUmVmVmFsdWU+O1xuICBvbkNvbGxhYkJ1dHRvbkNsaWNrPzogKCkgPT4gdm9pZDtcbiAgaXNDb2xsYWJvcmF0aW5nPzogYm9vbGVhbjtcbiAgb25Qb2ludGVyVXBkYXRlPzogKHBheWxvYWQ6IHtcbiAgICBwb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgYnV0dG9uOiBcImRvd25cIiB8IFwidXBcIjtcbiAgICBwb2ludGVyc01hcDogR2VzdHVyZVtcInBvaW50ZXJzXCJdO1xuICB9KSA9PiB2b2lkO1xuICBvblBhc3RlPzogKFxuICAgIGRhdGE6IENsaXBib2FyZERhdGEsXG4gICAgZXZlbnQ6IENsaXBib2FyZEV2ZW50IHwgbnVsbCxcbiAgKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgb25Ecm9wPzogKFxuICAgIGV2ZW50OiBSZWFjdC5EcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+LFxuICApID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuO1xuICByZW5kZXJUb3BSaWdodFVJPzogKFxuICAgIGlzTW9iaWxlOiBib29sZWFuLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSA9PiBKU1guRWxlbWVudCB8IG51bGw7XG4gIHJlbmRlckZvb3Rlcj86IChpc01vYmlsZTogYm9vbGVhbiwgYXBwU3RhdGU6IEFwcFN0YXRlKSA9PiBKU1guRWxlbWVudDtcbiAgbGFuZ0NvZGU/OiBMYW5ndWFnZVtcImNvZGVcIl07XG4gIHZpZXdNb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIHplbk1vZGVFbmFibGVkPzogYm9vbGVhbjtcbiAgZ3JpZE1vZGVFbmFibGVkPzogYm9vbGVhbjtcbiAgbGlicmFyeVJldHVyblVybD86IHN0cmluZztcbiAgdGhlbWU/OiBUaGVtZTtcbiAgbmFtZT86IHN0cmluZztcbiAgcmVuZGVyQ3VzdG9tU3RhdHM/OiAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSA9PiBKU1guRWxlbWVudDtcbiAgVUlPcHRpb25zPzogVUlPcHRpb25zO1xuICBkZXRlY3RTY3JvbGw/OiBib29sZWFuO1xuICBoYW5kbGVLZXlib2FyZEdsb2JhbGx5PzogYm9vbGVhbjtcbiAgb25MaWJyYXJ5Q2hhbmdlPzogKGxpYnJhcnlJdGVtczogTGlicmFyeUl0ZW1zKSA9PiB2b2lkIHwgUHJvbWlzZTxhbnk+O1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICBvbkJlZm9yZVRleHRFZGl0PzogKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHN0cmluZztcbiAgb25CZWZvcmVUZXh0U3VibWl0PzogKFxuICAgIHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgdGV4dFRvU3VibWl0OiBzdHJpbmcsXG4gICAgaXNEZWxldGVkOiBib29sZWFuLFxuICApID0+IHN0cmluZztcbiAgZ2VuZXJhdGVJZEZvckZpbGU/OiAoZmlsZTogRmlsZSkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgdHlwZSBTY2VuZURhdGEgPSB7XG4gIGVsZW1lbnRzPzogSW1wb3J0ZWREYXRhU3RhdGVbXCJlbGVtZW50c1wiXTtcbiAgYXBwU3RhdGU/OiBJbXBvcnRlZERhdGFTdGF0ZVtcImFwcFN0YXRlXCJdO1xuICBjb2xsYWJvcmF0b3JzPzogTWFwPHN0cmluZywgQ29sbGFib3JhdG9yPjtcbiAgY29tbWl0VG9IaXN0b3J5PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBlbnVtIFVzZXJJZGxlU3RhdGUge1xuICBBQ1RJVkUgPSBcImFjdGl2ZVwiLFxuICBBV0FZID0gXCJhd2F5XCIsXG4gIElETEUgPSBcImlkbGVcIixcbn1cblxuZXhwb3J0IHR5cGUgRXhwb3J0T3B0cyA9IHtcbiAgc2F2ZUZpbGVUb0Rpc2s/OiBib29sZWFuO1xuICBvbkV4cG9ydFRvQmFja2VuZD86IChcbiAgICBleHBvcnRlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICApID0+IHZvaWQ7XG4gIHJlbmRlckN1c3RvbVVJPzogKFxuICAgIGV4cG9ydGVkRWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICBmaWxlczogQmluYXJ5RmlsZXMsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICkgPT4gSlNYLkVsZW1lbnQ7XG59O1xuXG50eXBlIENhbnZhc0FjdGlvbnMgPSB7XG4gIGNoYW5nZVZpZXdCYWNrZ3JvdW5kQ29sb3I/OiBib29sZWFuO1xuICBjbGVhckNhbnZhcz86IGJvb2xlYW47XG4gIGV4cG9ydD86IGZhbHNlIHwgRXhwb3J0T3B0cztcbiAgbG9hZFNjZW5lPzogYm9vbGVhbjtcbiAgc2F2ZVRvQWN0aXZlRmlsZT86IGJvb2xlYW47XG4gIHRoZW1lPzogYm9vbGVhbjtcbiAgc2F2ZUFzSW1hZ2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVUlPcHRpb25zID0ge1xuICBjYW52YXNBY3Rpb25zPzogQ2FudmFzQWN0aW9ucztcbn07XG5cbmV4cG9ydCB0eXBlIEFwcFByb3BzID0gRXhjYWxpZHJhd1Byb3BzICYge1xuICBVSU9wdGlvbnM6IHtcbiAgICBjYW52YXNBY3Rpb25zOiBSZXF1aXJlZDxDYW52YXNBY3Rpb25zPiAmIHsgZXhwb3J0OiBFeHBvcnRPcHRzIH07XG4gIH07XG4gIGRldGVjdFNjcm9sbDogYm9vbGVhbjtcbiAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseTogYm9vbGVhbjtcbn07XG5cbi8qKiBBIHN1YnNldCBvZiBBcHAgY2xhc3MgcHJvcGVydGllcyB0aGF0IHdlIG5lZWQgdG8gdXNlIGVsc2V3aGVyZVxuICogaW4gdGhlIGFwcCwgZWcgTWFuYWdlci4gRmFjdG9yZWQgb3V0IGludG8gYSBzZXBhcmF0ZSB0eXBlIHRvIGtlZXAgRFJZLiAqL1xuZXhwb3J0IHR5cGUgQXBwQ2xhc3NQcm9wZXJ0aWVzID0ge1xuICBwcm9wczogQXBwUHJvcHM7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBmb2N1c0NvbnRhaW5lcigpOiB2b2lkO1xuICBsaWJyYXJ5OiBMaWJyYXJ5O1xuICBpbWFnZUNhY2hlOiBNYXA8XG4gICAgRmlsZUlkLFxuICAgIHtcbiAgICAgIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PjtcbiAgICAgIG1pbWVUeXBlOiB0eXBlb2YgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTW251bWJlcl07XG4gICAgfVxuICA+O1xuICBmaWxlczogQmluYXJ5RmlsZXM7XG59O1xuXG5leHBvcnQgdHlwZSBQb2ludGVyRG93blN0YXRlID0gUmVhZG9ubHk8e1xuICAvLyBUaGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggcG9pbnRlckRvd24gaGFwcGVuZWRcbiAgb3JpZ2luOiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+O1xuICAvLyBTYW1lIGFzIFwib3JpZ2luXCIgYnV0IHNuYXBwZWQgdG8gdGhlIGdyaWQsIGlmIGdyaWQgaXMgb25cbiAgb3JpZ2luSW5HcmlkOiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+O1xuICAvLyBTY3JvbGxiYXIgY2hlY2tzXG4gIHNjcm9sbGJhcnM6IFJldHVyblR5cGU8dHlwZW9mIGlzT3ZlclNjcm9sbEJhcnM+O1xuICAvLyBUaGUgcHJldmlvdXMgcG9pbnRlciBwb3NpdGlvblxuICBsYXN0Q29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIC8vIG1hcCBvZiBvcmlnaW5hbCBlbGVtZW50cyBkYXRhXG4gIG9yaWdpbmFsRWxlbWVudHM6IE1hcDxzdHJpbmcsIE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+PjtcbiAgcmVzaXplOiB7XG4gICAgLy8gSGFuZGxlIHdoZW4gcmVzaXppbmcsIG1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgICBoYW5kbGVUeXBlOiBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGU7XG4gICAgLy8gVGhpcyBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIGlzUmVzaXppbmc6IGJvb2xlYW47XG4gICAgLy8gVGhpcyBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9mZnNldDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBhcnJvd0RpcmVjdGlvbjogXCJvcmlnaW5cIiB8IFwiZW5kXCI7XG4gICAgLy8gVGhpcyBpcyBhIGNlbnRlciBwb2ludCBvZiBzZWxlY3RlZCBlbGVtZW50cyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudCAoZm9yIHJvdGF0aW9uIG9ubHkpXG4gICAgY2VudGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIH07XG4gIGhpdDoge1xuICAgIC8vIFRoZSBlbGVtZW50IHRoZSBwb2ludGVyIGlzIFwiaGl0dGluZ1wiLCBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsXG4gICAgLy8gcG9pbnRlciBkb3duIGV2ZW50XG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD4gfCBudWxsO1xuICAgIC8vIFRoZSBlbGVtZW50cyB0aGUgcG9pbnRlciBpcyBcImhpdHRpbmdcIiwgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbFxuICAgIC8vIHBvaW50ZXIgZG93biBldmVudFxuICAgIGFsbEhpdEVsZW1lbnRzOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBib29sZWFuO1xuICAgIC8vIFdoZXRoZXIgc2VsZWN0ZWQgZWxlbWVudChzKSB3ZXJlIGR1cGxpY2F0ZWQsIG1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlXG4gICAgLy8gcG9pbnRlciBpbnRlcmFjdGlvblxuICAgIGhhc0JlZW5EdXBsaWNhdGVkOiBib29sZWFuO1xuICAgIGhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzOiBib29sZWFuO1xuICB9O1xuICB3aXRoQ21kT3JDdHJsOiBib29sZWFuO1xuICBkcmFnOiB7XG4gICAgLy8gTWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgcG9pbnRlciBpbnRlcmF0aW9uXG4gICAgaGFzT2NjdXJyZWQ6IGJvb2xlYW47XG4gICAgLy8gTWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgcG9pbnRlciBpbnRlcmF0aW9uXG4gICAgb2Zmc2V0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsO1xuICB9O1xuICAvLyBXZSBuZWVkIHRvIGhhdmUgdGhlc2UgaW4gdGhlIHN0YXRlIHNvIHRoYXQgd2UgY2FuIHVuc3Vic2NyaWJlIHRoZW1cbiAgZXZlbnRMaXN0ZW5lcnM6IHtcbiAgICAvLyBJdCdzIGRlZmluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb25Nb3ZlOiBudWxsIHwgKChldmVudDogUG9pbnRlckV2ZW50KSA9PiB2b2lkKTtcbiAgICAvLyBJdCdzIGRlZmluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb25VcDogbnVsbCB8ICgoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCk7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uS2V5RG93bjogbnVsbCB8ICgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQpO1xuICAgIC8vIEl0J3MgZGVmaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvbktleVVwOiBudWxsIHwgKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCk7XG4gIH07XG59PjtcblxuZXhwb3J0IHR5cGUgRXhjYWxpZHJhd0ltcGVyYXRpdmVBUEkgPSB7XG4gIHVwZGF0ZVNjZW5lOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJ1cGRhdGVTY2VuZVwiXTtcbiAgcmVzZXRTY2VuZTogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wicmVzZXRTY2VuZVwiXTtcbiAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IEluc3RhbmNlVHlwZTxcbiAgICB0eXBlb2YgQXBwXG4gID5bXCJnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZFwiXTtcbiAgaGlzdG9yeToge1xuICAgIGNsZWFyOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZXNldEhpc3RvcnlcIl07XG4gIH07XG4gIHNjcm9sbFRvQ29udGVudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wic2Nyb2xsVG9Db250ZW50XCJdO1xuICB6b29tVG9GaXQ6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInpvb21Ub0ZpdFwiXTtcbiAgZ2V0U2NlbmVFbGVtZW50czogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wiZ2V0U2NlbmVFbGVtZW50c1wiXTtcbiAgZ2V0QXBwU3RhdGU6ICgpID0+IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInN0YXRlXCJdO1xuICBnZXRGaWxlczogKCkgPT4gSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wiZmlsZXNcIl07XG4gIHJlZnJlc2g6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInJlZnJlc2hcIl07XG4gIGltcG9ydExpYnJhcnk6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImltcG9ydExpYnJhcnlGcm9tVXJsXCJdO1xuICBzZXRUb2FzdE1lc3NhZ2U6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInNldFRvYXN0TWVzc2FnZVwiXTtcbiAgYWRkRmlsZXM6IChkYXRhOiBCaW5hcnlGaWxlRGF0YVtdKSA9PiB2b2lkO1xuICByZWFkeVByb21pc2U6IFJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPjtcbiAgcmVhZHk6IHRydWU7XG4gIGlkOiBzdHJpbmc7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../types.ts\n");
|
|
2909
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserIdleState\": () => (/* binding */ UserIdleState)\n/* harmony export */ });\nvar UserIdleState;\r\n(function (UserIdleState) {\r\n UserIdleState[\"ACTIVE\"] = \"active\";\r\n UserIdleState[\"AWAY\"] = \"away\";\r\n UserIdleState[\"IDLE\"] = \"idle\";\r\n})(UserIdleState || (UserIdleState = {}));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdHlwZXMudHMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQThRQSxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsa0NBQWlCO0lBQ2pCLDhCQUFhO0lBQ2IsOEJBQWE7QUFDZixDQUFDLEVBSlcsYUFBYSxLQUFiLGFBQWEsUUFJeEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdHlwZXMudHM/MDI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQb2ludGVyVHlwZSxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBDaGFydFR5cGUsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRmlsZUlkLFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBUaGVtZSxcbn0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5pbXBvcnQgeyBQb2ludCBhcyBSb3VnaFBvaW50IH0gZnJvbSBcInJvdWdoanMvYmluL2dlb21ldHJ5XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBTdWdnZXN0ZWRCaW5kaW5nIH0gZnJvbSBcIi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuL2RhdGEvdHlwZXNcIjtcbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlUHJvbWlzZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTcHJlYWRzaGVldCB9IGZyb20gXCIuL2NoYXJ0c1wiO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tIFwiLi9pMThuXCI7XG5pbXBvcnQgeyBDbGlwYm9hcmREYXRhIH0gZnJvbSBcIi4vY2xpcGJvYXJkXCI7XG5pbXBvcnQgeyBpc092ZXJTY3JvbGxCYXJzIH0gZnJvbSBcIi4vc2NlbmVcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL2VsZW1lbnQvdHJhbnNmb3JtSGFuZGxlc1wiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVTeXN0ZW1IYW5kbGUgfSBmcm9tIFwiLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcbmltcG9ydCB0eXBlIHsgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTLCBNSU1FX1RZUEVTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBvaW50ID0gUmVhZG9ubHk8Um91Z2hQb2ludD47XG5cbmV4cG9ydCB0eXBlIENvbGxhYm9yYXRvciA9IHtcbiAgcG9pbnRlcj86IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9O1xuICBidXR0b24/OiBcInVwXCIgfCBcImRvd25cIjtcbiAgc2VsZWN0ZWRFbGVtZW50SWRzPzogQXBwU3RhdGVbXCJzZWxlY3RlZEVsZW1lbnRJZHNcIl07XG4gIHVzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgdXNlclN0YXRlPzogVXNlcklkbGVTdGF0ZTtcbiAgY29sb3I/OiB7XG4gICAgYmFja2dyb3VuZDogc3RyaW5nO1xuICAgIHN0cm9rZTogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YVVSTCA9IHN0cmluZyAmIHsgX2JyYW5kOiBcIkRhdGFVUkxcIiB9O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlRGF0YSA9IHtcbiAgbWltZVR5cGU6XG4gICAgfCB0eXBlb2YgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTW251bWJlcl1cbiAgICAvLyBmdXR1cmUgdXNlciBvciB1bmtub3duIGZpbGUgdHlwZVxuICAgIHwgdHlwZW9mIE1JTUVfVFlQRVMuYmluYXJ5O1xuICBpZDogRmlsZUlkO1xuICBkYXRhVVJMOiBEYXRhVVJMO1xuICBjcmVhdGVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlTWV0YWRhdGEgPSBPbWl0PEJpbmFyeUZpbGVEYXRhLCBcImRhdGFVUkxcIj47XG5cbmV4cG9ydCB0eXBlIEJpbmFyeUZpbGVzID0gUmVjb3JkPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEJpbmFyeUZpbGVEYXRhPjtcblxuZXhwb3J0IHR5cGUgQXBwU3RhdGUgPSB7XG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICBkcmFnZ2luZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIHJlc2l6aW5nRWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbDtcbiAgbXVsdGlFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PiB8IG51bGw7XG4gIHNlbGVjdGlvbkVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGlzQmluZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIHN0YXJ0Qm91bmRFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ+IHwgbnVsbDtcbiAgc3VnZ2VzdGVkQmluZGluZ3M6IFN1Z2dlc3RlZEJpbmRpbmdbXTtcbiAgLy8gZWxlbWVudCBiZWluZyBlZGl0ZWQsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYWRkZWQgdG8gZWxlbWVudHMgYXJyYXkgeWV0XG4gIC8vIChlLmcuIHRleHQgZWxlbWVudCB3aGVuIHR5cGluZyBpbnRvIHRoZSBpbnB1dClcbiAgZWRpdGluZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBMaW5lYXJFbGVtZW50RWRpdG9yIHwgbnVsbDtcbiAgZWxlbWVudFR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdO1xuICBlbGVtZW50TG9ja2VkOiBib29sZWFuO1xuICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICBleHBvcnRFbWJlZFNjZW5lOiBib29sZWFuO1xuICBleHBvcnRXaXRoRGFya01vZGU6IGJvb2xlYW47XG4gIGV4cG9ydFNjYWxlOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1GaWxsU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wiZmlsbFN0eWxlXCJdO1xuICBjdXJyZW50SXRlbVN0cm9rZVdpZHRoOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU3R5bGVcIl07XG4gIGN1cnJlbnRJdGVtUm91Z2huZXNzOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtT3BhY2l0eTogbnVtYmVyO1xuICBjdXJyZW50SXRlbUZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG4gIGN1cnJlbnRJdGVtRm9udFNpemU6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1UZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICBjdXJyZW50SXRlbUVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3M6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU2hhcnBuZXNzXCJdO1xuICB2aWV3QmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIHNjcm9sbFg6IG51bWJlcjtcbiAgc2Nyb2xsWTogbnVtYmVyO1xuICBjdXJzb3JCdXR0b246IFwidXBcIiB8IFwiZG93blwiO1xuICBzY3JvbGxlZE91dHNpZGU6IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbiAgaXNSZXNpemluZzogYm9vbGVhbjtcbiAgaXNSb3RhdGluZzogYm9vbGVhbjtcbiAgem9vbTogWm9vbTtcbiAgb3Blbk1lbnU6IFwiY2FudmFzXCIgfCBcInNoYXBlXCIgfCBudWxsO1xuICBvcGVuUG9wdXA6XG4gICAgfCBcImNhbnZhc0NvbG9yUGlja2VyXCJcbiAgICB8IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCJcbiAgICB8IFwic3Ryb2tlQ29sb3JQaWNrZXJcIlxuICAgIHwgbnVsbDtcbiAgbGFzdFBvaW50ZXJEb3duV2l0aDogUG9pbnRlclR5cGU7XG4gIHNlbGVjdGVkRWxlbWVudElkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH07XG4gIHNob3VsZENhY2hlSWdub3JlWm9vbTogYm9vbGVhbjtcbiAgc2hvd0hlbHBEaWFsb2c6IGJvb2xlYW47XG4gIHRvYXN0TWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgemVuTW9kZUVuYWJsZWQ6IGJvb2xlYW47XG4gIHRoZW1lOiBUaGVtZTtcbiAgZ3JpZFNpemU6IG51bWJlciB8IG51bGw7XG4gIHZpZXdNb2RlRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKiogdG9wLW1vc3Qgc2VsZWN0ZWQgZ3JvdXBzIChpLmUuIGRvZXMgbm90IGluY2x1ZGUgbmVzdGVkIGdyb3VwcykgKi9cbiAgc2VsZWN0ZWRHcm91cElkczogeyBbZ3JvdXBJZDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICAvKiogZ3JvdXAgYmVpbmcgZWRpdGVkIHdoZW4geW91IGRyaWxsIGRvd24gdG8gaXRzIGNvbnN0aXR1ZW50IGVsZW1lbnRcbiAgICAoZS5nLiB3aGVuIHlvdSBkb3VibGUtY2xpY2sgb24gYSBncm91cCdzIGVsZW1lbnQpICovXG4gIGVkaXRpbmdHcm91cElkOiBHcm91cElkIHwgbnVsbDtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIG9mZnNldFRvcDogbnVtYmVyO1xuICBvZmZzZXRMZWZ0OiBudW1iZXI7XG5cbiAgaXNMaWJyYXJ5T3BlbjogYm9vbGVhbjtcbiAgZmlsZUhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGw7XG4gIGNvbGxhYm9yYXRvcnM6IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIHNob3dTdGF0czogYm9vbGVhbjtcbiAgY3VycmVudENoYXJ0VHlwZTogQ2hhcnRUeXBlO1xuICBwYXN0ZURpYWxvZzpcbiAgICB8IHtcbiAgICAgICAgc2hvd246IGZhbHNlO1xuICAgICAgICBkYXRhOiBudWxsO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzaG93bjogdHJ1ZTtcbiAgICAgICAgZGF0YTogU3ByZWFkc2hlZXQ7XG4gICAgICB9O1xuICAvKiogaW1hZ2VFbGVtZW50IHdhaXRpbmcgdG8gYmUgcGxhY2VkIG9uIGNhbnZhcyAqL1xuICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+IHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRab29tVmFsdWUgPSBudW1iZXIgJiB7IF9icmFuZDogXCJub3JtYWxpemVkWm9vbVwiIH07XG5cbmV4cG9ydCB0eXBlIFpvb20gPSBSZWFkb25seTx7XG4gIHZhbHVlOiBOb3JtYWxpemVkWm9vbVZhbHVlO1xuICB0cmFuc2xhdGlvbjogUmVhZG9ubHk8e1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0+O1xufT47XG5cbmV4cG9ydCB0eXBlIFBvaW50ZXJDb29yZHMgPSBSZWFkb25seTx7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufT47XG5cbmV4cG9ydCB0eXBlIEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBNYXA8bnVtYmVyLCBQb2ludGVyQ29vcmRzPjtcbiAgbGFzdENlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgaW5pdGlhbERpc3RhbmNlOiBudW1iZXIgfCBudWxsO1xuICBpbml0aWFsU2NhbGU6IG51bWJlciB8IG51bGw7XG59O1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBHZXN0dXJlRXZlbnQgZXh0ZW5kcyBVSUV2ZW50IHtcbiAgcmVhZG9ubHkgcm90YXRpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NhbGU6IG51bWJlcjtcbn1cblxuLy8gbGlicmFyaWVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqIEBkZXByZWNhdGVkIGxlZ2FjeTogZG8gbm90IHVzZSBvdXRzaWRlIG9mIG1pZ3JhdGlvbiBwYXRocyAqL1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1fdjEgPSByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuLyoqIEBkZXByZWNhdGVkIGxlZ2FjeTogZG8gbm90IHVzZSBvdXRzaWRlIG9mIG1pZ3JhdGlvbiBwYXRocyAqL1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1zX3YxID0gcmVhZG9ubHkgTGlicmFyeUl0ZW1fdjFbXTtcblxuLyoqIHYyIGxpYnJhcnkgaXRlbSAqL1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW0gPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHN0YXR1czogXCJwdWJsaXNoZWRcIiB8IFwidW5wdWJsaXNoZWRcIjtcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W107XG4gIC8qKiB0aW1lc3RhbXAgaW4gZXBvY2ggKG1zKSAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIExpYnJhcnlJdGVtcyA9IHJlYWRvbmx5IExpYnJhcnlJdGVtW107XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBOT1RFIHJlYWR5L3JlYWR5UHJvbWlzZSBwcm9wcyBhcmUgb3B0aW9uYWwgZm9yIGhvc3QgYXBwcycgc2FrZSAob3VyIG93blxuLy8gaW1wbGVtIGd1YXJhbnRlZXMgZXhpc3RlbmNlKVxuZXhwb3J0IHR5cGUgRXhjYWxpZHJhd0FQSVJlZlZhbHVlID1cbiAgfCBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSVxuICB8IHtcbiAgICAgIHJlYWR5UHJvbWlzZT86IFJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPjtcbiAgICAgIHJlYWR5PzogZmFsc2U7XG4gICAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBFeGNhbGlkcmF3UHJvcHMge1xuICBvbkNoYW5nZT86IChcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICApID0+IHZvaWQ7XG4gIGluaXRpYWxEYXRhPzogSW1wb3J0ZWREYXRhU3RhdGUgfCBudWxsIHwgUHJvbWlzZTxJbXBvcnRlZERhdGFTdGF0ZSB8IG51bGw+O1xuICBleGNhbGlkcmF3UmVmPzogRm9yd2FyZFJlZjxFeGNhbGlkcmF3QVBJUmVmVmFsdWU+O1xuICBvbkNvbGxhYkJ1dHRvbkNsaWNrPzogKCkgPT4gdm9pZDtcbiAgaXNDb2xsYWJvcmF0aW5nPzogYm9vbGVhbjtcbiAgb25Qb2ludGVyVXBkYXRlPzogKHBheWxvYWQ6IHtcbiAgICBwb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgYnV0dG9uOiBcImRvd25cIiB8IFwidXBcIjtcbiAgICBwb2ludGVyc01hcDogR2VzdHVyZVtcInBvaW50ZXJzXCJdO1xuICB9KSA9PiB2b2lkO1xuICBvblBhc3RlPzogKFxuICAgIGRhdGE6IENsaXBib2FyZERhdGEsXG4gICAgZXZlbnQ6IENsaXBib2FyZEV2ZW50IHwgbnVsbCxcbiAgKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgb25Ecm9wPzogKFxuICAgIGV2ZW50OiBSZWFjdC5EcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+LFxuICApID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuO1xuICByZW5kZXJUb3BSaWdodFVJPzogKFxuICAgIGlzTW9iaWxlOiBib29sZWFuLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSA9PiBKU1guRWxlbWVudCB8IG51bGw7XG4gIHJlbmRlckZvb3Rlcj86IChpc01vYmlsZTogYm9vbGVhbiwgYXBwU3RhdGU6IEFwcFN0YXRlKSA9PiBKU1guRWxlbWVudDtcbiAgbGFuZ0NvZGU/OiBMYW5ndWFnZVtcImNvZGVcIl07XG4gIHZpZXdNb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIHplbk1vZGVFbmFibGVkPzogYm9vbGVhbjtcbiAgZ3JpZE1vZGVFbmFibGVkPzogYm9vbGVhbjtcbiAgbGlicmFyeVJldHVyblVybD86IHN0cmluZztcbiAgdGhlbWU/OiBUaGVtZTtcbiAgbmFtZT86IHN0cmluZztcbiAgcmVuZGVyQ3VzdG9tU3RhdHM/OiAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSA9PiBKU1guRWxlbWVudDtcbiAgVUlPcHRpb25zPzogVUlPcHRpb25zO1xuICBkZXRlY3RTY3JvbGw/OiBib29sZWFuO1xuICBoYW5kbGVLZXlib2FyZEdsb2JhbGx5PzogYm9vbGVhbjtcbiAgb25MaWJyYXJ5Q2hhbmdlPzogKGxpYnJhcnlJdGVtczogTGlicmFyeUl0ZW1zKSA9PiB2b2lkIHwgUHJvbWlzZTxhbnk+O1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICBvbkJlZm9yZVRleHRFZGl0PzogKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHN0cmluZztcbiAgb25CZWZvcmVUZXh0U3VibWl0PzogKFxuICAgIHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgdGV4dFRvU3VibWl0OiBzdHJpbmcsXG4gICAgaXNEZWxldGVkOiBib29sZWFuLFxuICApID0+IHN0cmluZztcbiAgZ2VuZXJhdGVJZEZvckZpbGU/OiAoZmlsZTogRmlsZSkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICBvblRoZW1lQ2hhbmdlPzogKG5ld1RoZW1lOiBzdHJpbmcpID0+IHZvaWQ7ICBcbn1cblxuZXhwb3J0IHR5cGUgU2NlbmVEYXRhID0ge1xuICBlbGVtZW50cz86IEltcG9ydGVkRGF0YVN0YXRlW1wiZWxlbWVudHNcIl07XG4gIGFwcFN0YXRlPzogSW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXTtcbiAgY29sbGFib3JhdG9ycz86IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIGNvbW1pdFRvSGlzdG9yeT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZW51bSBVc2VySWRsZVN0YXRlIHtcbiAgQUNUSVZFID0gXCJhY3RpdmVcIixcbiAgQVdBWSA9IFwiYXdheVwiLFxuICBJRExFID0gXCJpZGxlXCIsXG59XG5cbmV4cG9ydCB0eXBlIEV4cG9ydE9wdHMgPSB7XG4gIHNhdmVGaWxlVG9EaXNrPzogYm9vbGVhbjtcbiAgb25FeHBvcnRUb0JhY2tlbmQ/OiAoXG4gICAgZXhwb3J0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgKSA9PiB2b2lkO1xuICByZW5kZXJDdXN0b21VST86IChcbiAgICBleHBvcnRlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICApID0+IEpTWC5FbGVtZW50O1xufTtcblxudHlwZSBDYW52YXNBY3Rpb25zID0ge1xuICBjaGFuZ2VWaWV3QmFja2dyb3VuZENvbG9yPzogYm9vbGVhbjtcbiAgY2xlYXJDYW52YXM/OiBib29sZWFuO1xuICBleHBvcnQ/OiBmYWxzZSB8IEV4cG9ydE9wdHM7XG4gIGxvYWRTY2VuZT86IGJvb2xlYW47XG4gIHNhdmVUb0FjdGl2ZUZpbGU/OiBib29sZWFuO1xuICB0aGVtZT86IGJvb2xlYW47XG4gIHNhdmVBc0ltYWdlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFVJT3B0aW9ucyA9IHtcbiAgY2FudmFzQWN0aW9ucz86IENhbnZhc0FjdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBBcHBQcm9wcyA9IEV4Y2FsaWRyYXdQcm9wcyAmIHtcbiAgVUlPcHRpb25zOiB7XG4gICAgY2FudmFzQWN0aW9uczogUmVxdWlyZWQ8Q2FudmFzQWN0aW9ucz4gJiB7IGV4cG9ydDogRXhwb3J0T3B0cyB9O1xuICB9O1xuICBkZXRlY3RTY3JvbGw6IGJvb2xlYW47XG4gIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk6IGJvb2xlYW47XG59O1xuXG4vKiogQSBzdWJzZXQgb2YgQXBwIGNsYXNzIHByb3BlcnRpZXMgdGhhdCB3ZSBuZWVkIHRvIHVzZSBlbHNld2hlcmVcbiAqIGluIHRoZSBhcHAsIGVnIE1hbmFnZXIuIEZhY3RvcmVkIG91dCBpbnRvIGEgc2VwYXJhdGUgdHlwZSB0byBrZWVwIERSWS4gKi9cbmV4cG9ydCB0eXBlIEFwcENsYXNzUHJvcGVydGllcyA9IHtcbiAgcHJvcHM6IEFwcFByb3BzO1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZm9jdXNDb250YWluZXIoKTogdm9pZDtcbiAgbGlicmFyeTogTGlicmFyeTtcbiAgaW1hZ2VDYWNoZTogTWFwPFxuICAgIEZpbGVJZCxcbiAgICB7XG4gICAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD47XG4gICAgICBtaW1lVHlwZTogdHlwZW9mIEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFU1tudW1iZXJdO1xuICAgIH1cbiAgPjtcbiAgZmlsZXM6IEJpbmFyeUZpbGVzO1xufTtcblxuZXhwb3J0IHR5cGUgUG9pbnRlckRvd25TdGF0ZSA9IFJlYWRvbmx5PHtcbiAgLy8gVGhlIGZpcnN0IHBvc2l0aW9uIGF0IHdoaWNoIHBvaW50ZXJEb3duIGhhcHBlbmVkXG4gIG9yaWdpbjogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PjtcbiAgLy8gU2FtZSBhcyBcIm9yaWdpblwiIGJ1dCBzbmFwcGVkIHRvIHRoZSBncmlkLCBpZiBncmlkIGlzIG9uXG4gIG9yaWdpbkluR3JpZDogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PjtcbiAgLy8gU2Nyb2xsYmFyIGNoZWNrc1xuICBzY3JvbGxiYXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBpc092ZXJTY3JvbGxCYXJzPjtcbiAgLy8gVGhlIHByZXZpb3VzIHBvaW50ZXIgcG9zaXRpb25cbiAgbGFzdENvb3JkczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAvLyBtYXAgb2Ygb3JpZ2luYWwgZWxlbWVudHMgZGF0YVxuICBvcmlnaW5hbEVsZW1lbnRzOiBNYXA8c3RyaW5nLCBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50Pj47XG4gIHJlc2l6ZToge1xuICAgIC8vIEhhbmRsZSB3aGVuIHJlc2l6aW5nLCBtaWdodCBjaGFuZ2UgZHVyaW5nIHRoZSBwb2ludGVyIGludGVyYWN0aW9uXG4gICAgaGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBpc1Jlc2l6aW5nOiBib29sZWFuO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvZmZzZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIgfCBcImVuZFwiO1xuICAgIC8vIFRoaXMgaXMgYSBjZW50ZXIgcG9pbnQgb2Ygc2VsZWN0ZWQgZWxlbWVudHMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnQgKGZvciByb3RhdGlvbiBvbmx5KVxuICAgIGNlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICB9O1xuICBoaXQ6IHtcbiAgICAvLyBUaGUgZWxlbWVudCB0aGUgcG9pbnRlciBpcyBcImhpdHRpbmdcIiwgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbFxuICAgIC8vIHBvaW50ZXIgZG93biBldmVudFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbDtcbiAgICAvLyBUaGUgZWxlbWVudHMgdGhlIHBvaW50ZXIgaXMgXCJoaXR0aW5nXCIsIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWxcbiAgICAvLyBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBhbGxIaXRFbGVtZW50czogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXTtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgd2FzQWRkZWRUb1NlbGVjdGlvbjogYm9vbGVhbjtcbiAgICAvLyBXaGV0aGVyIHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkdXBsaWNhdGVkLCBtaWdodCBjaGFuZ2UgZHVyaW5nIHRoZVxuICAgIC8vIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgICBoYXNCZWVuRHVwbGljYXRlZDogYm9vbGVhbjtcbiAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czogYm9vbGVhbjtcbiAgfTtcbiAgd2l0aENtZE9yQ3RybDogYm9vbGVhbjtcbiAgZHJhZzoge1xuICAgIC8vIE1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhdGlvblxuICAgIGhhc09jY3VycmVkOiBib29sZWFuO1xuICAgIC8vIE1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhdGlvblxuICAgIG9mZnNldDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgfTtcbiAgLy8gV2UgbmVlZCB0byBoYXZlIHRoZXNlIGluIHRoZSBzdGF0ZSBzbyB0aGF0IHdlIGNhbiB1bnN1YnNjcmliZSB0aGVtXG4gIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uTW92ZTogbnVsbCB8ICgoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCk7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uVXA6IG51bGwgfCAoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQpO1xuICAgIC8vIEl0J3MgZGVmaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvbktleURvd246IG51bGwgfCAoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkKTtcbiAgICAvLyBJdCdzIGRlZmluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb25LZXlVcDogbnVsbCB8ICgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQpO1xuICB9O1xufT47XG5cbmV4cG9ydCB0eXBlIEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICB1cGRhdGVTY2VuZTogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1widXBkYXRlU2NlbmVcIl07XG4gIHJlc2V0U2NlbmU6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInJlc2V0U2NlbmVcIl07XG4gIGdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkOiBJbnN0YW5jZVR5cGU8XG4gICAgdHlwZW9mIEFwcFxuICA+W1wiZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWRcIl07XG4gIGhpc3Rvcnk6IHtcbiAgICBjbGVhcjogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wicmVzZXRIaXN0b3J5XCJdO1xuICB9O1xuICBzY3JvbGxUb0NvbnRlbnQ6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInNjcm9sbFRvQ29udGVudFwiXTtcbiAgem9vbVRvRml0OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJ6b29tVG9GaXRcIl07XG4gIGdldFNjZW5lRWxlbWVudHM6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImdldFNjZW5lRWxlbWVudHNcIl07XG4gIGdldEFwcFN0YXRlOiAoKSA9PiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzdGF0ZVwiXTtcbiAgZ2V0RmlsZXM6ICgpID0+IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImZpbGVzXCJdO1xuICByZWZyZXNoOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZWZyZXNoXCJdO1xuICBpbXBvcnRMaWJyYXJ5OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJpbXBvcnRMaWJyYXJ5RnJvbVVybFwiXTtcbiAgc2V0VG9hc3RNZXNzYWdlOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzZXRUb2FzdE1lc3NhZ2VcIl07XG4gIGFkZEZpbGVzOiAoZGF0YTogQmluYXJ5RmlsZURhdGFbXSkgPT4gdm9pZDtcbiAgcmVhZHlQcm9taXNlOiBSZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST47XG4gIHJlYWR5OiB0cnVlO1xuICBpZDogc3RyaW5nO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../types.ts\n");
|
|
2910
2910
|
|
|
2911
2911
|
/***/ }),
|
|
2912
2912
|
|
|
@@ -3126,7 +3126,7 @@ module.exports = JSON.parse('{"ar-SA":98,"bg-BG":66,"bn-BD":0,"ca-ES":88,"cs-CZ"
|
|
|
3126
3126
|
/***/ ((module) => {
|
|
3127
3127
|
|
|
3128
3128
|
"use strict";
|
|
3129
|
-
module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-obsidian-
|
|
3129
|
+
module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.10.0-obsidian-11","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.16.0","@babel/plugin-transform-arrow-functions":"7.16.0","@babel/plugin-transform-async-to-generator":"7.16.0","@babel/plugin-transform-runtime":"7.16.0","@babel/plugin-transform-typescript":"7.16.1","@babel/preset-env":"7.16.0","@babel/preset-react":"7.16.0","@babel/preset-typescript":"7.16.0","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","file-loader":"6.2.0","mini-css-extract-plugin":"2.4.4","postcss-loader":"6.2.0","sass-loader":"12.3.0","terser-webpack-plugin":"5.2.5","ts-loader":"9.2.6","typescript":"4.4.4","webpack":"5.64.0","webpack-bundle-analyzer":"4.5.0","webpack-cli":"4.9.1"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack"}}');
|
|
3130
3130
|
|
|
3131
3131
|
/***/ })
|
|
3132
3132
|
|