@dwelle/excalidraw 0.3.70 → 0.3.71

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.
@@ -1781,7 +1781,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1781
1781
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1782
1782
 
1783
1783
  "use strict";
1784
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\r\nconst trackEvent = typeof process !== \"undefined\" &&\r\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.69\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\r\n typeof window !== \"undefined\" &&\r\n window.gtag\r\n ? (category, action, label, value) => {\r\n try {\r\n window.gtag(\"event\", action, {\r\n event_category: category,\r\n event_label: label,\r\n value,\r\n });\r\n }\r\n catch (error) {\r\n console.error(\"error logging to ga\", error);\r\n }\r\n }\r\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.69\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\r\n ? (category, action, label, value) => { }\r\n : (category, action, label, value) => {\r\n // Uncomment the next line to track locally\r\n // console.log(\"Track Event\", { category, action, label, value });\r\n };\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsaXpCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksaXpCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
1784
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\r\nconst trackEvent = typeof process !== \"undefined\" &&\r\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.70\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\r\n typeof window !== \"undefined\" &&\r\n window.gtag\r\n ? (category, action, label, value) => {\r\n try {\r\n window.gtag(\"event\", action, {\r\n event_category: category,\r\n event_label: label,\r\n value,\r\n });\r\n }\r\n catch (error) {\r\n console.error(\"error logging to ga\", error);\r\n }\r\n }\r\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.70\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\r\n ? (category, action, label, value) => { }\r\n : (category, action, label, value) => {\r\n // Uncomment the next line to track locally\r\n // console.log(\"Track Event\", { category, action, label, value });\r\n };\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsaXpCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksaXpCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
1785
1785
 
1786
1786
  /***/ }),
1787
1787
 
@@ -2155,7 +2155,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2155
2155
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2156
2156
 
2157
2157
  "use strict";
2158
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash */ \"../../../node_modules/lodash/lodash.js\");\n/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./App */ \"../../components/App.tsx\");\n/* harmony import */ var _ConfirmDialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ConfirmDialog */ \"../../components/ConfirmDialog.tsx\");\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _LibraryUnit__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./LibraryUnit */ \"../../components/LibraryUnit.tsx\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Stack */ \"../../components/Stack.tsx\");\n/* harmony import */ var _ToolButton__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _Tooltip__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Tooltip */ \"../../components/Tooltip.tsx\");\n/* harmony import */ var _LibraryMenuItems_scss__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./LibraryMenuItems.scss */ \"../../components/LibraryMenuItems.scss\");\n/* harmony import */ var _LibraryMenuItems_scss__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_LibraryMenuItems_scss__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _Spinner__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Spinner */ \"../../components/Spinner.tsx\");\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _SidebarLockButton__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./SidebarLockButton */ \"../../components/SidebarLockButton.tsx\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst LibraryMenuItems = ({ isLoading, libraryItems, onRemoveFromLibrary, onAddToLibrary, onInsertLibraryItems, pendingElements, theme, setAppState, appState, libraryReturnUrl, library, files, id, selectedItems, onSelectItems, onPublish, resetLibrary, }) => {\r\n const renderRemoveLibAlert = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(() => {\r\n const content = selectedItems.length\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.removeItemsFromsLibrary\", { count: selectedItems.length })\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.resetLibrary\");\r\n const title = selectedItems.length\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"confirmDialog.removeItemsFromLib\")\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"confirmDialog.resetLibrary\");\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ConfirmDialog__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object.assign({ onConfirm: () => {\r\n if (selectedItems.length) {\r\n onRemoveFromLibrary();\r\n }\r\n else {\r\n resetLibrary();\r\n }\r\n setShowRemoveLibAlert(false);\r\n }, onCancel: () => {\r\n setShowRemoveLibAlert(false);\r\n }, title: title }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"p\", { children: content }, void 0) }), void 0));\r\n }, [selectedItems, onRemoveFromLibrary, resetLibrary]);\r\n const [showRemoveLibAlert, setShowRemoveLibAlert] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(false);\r\n const device = (0,_App__WEBPACK_IMPORTED_MODULE_6__.useDevice)();\r\n const renderLibraryActions = () => {\r\n const itemsSelected = !!selectedItems.length;\r\n const items = itemsSelected\r\n ? libraryItems.filter((item) => selectedItems.includes(item.id))\r\n : libraryItems;\r\n const resetLabel = itemsSelected\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.remove\")\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.resetLibrary\");\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"library-actions\" }, { children: [!itemsSelected && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, { type: \"button\", title: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.load\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.load\"), icon: _icons__WEBPACK_IMPORTED_MODULE_8__.load, onClick: () => __awaiter(void 0, void 0, void 0, function* () {\r\n try {\r\n yield library.updateLibrary({\r\n libraryItems: (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_16__.fileOpen)({\r\n description: \"Excalidraw library files\",\r\n // ToDo: Be over-permissive until https://bugs.webkit.org/show_bug.cgi?id=34442\r\n // gets resolved. Else, iOS users cannot open `.excalidraw` files.\r\n /*\r\n extensions: [\".json\", \".excalidrawlib\"],\r\n */\r\n }),\r\n merge: true,\r\n openLibraryMenu: true,\r\n });\r\n }\r\n catch (error) {\r\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\r\n console.warn(error);\r\n return;\r\n }\r\n setAppState({ errorMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"errors.importLibraryError\") });\r\n }\r\n }), className: \"library-actions--load\" }, \"import\")), !!items.length && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, Object.assign({ type: \"button\", title: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.export\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.export\"), icon: _icons__WEBPACK_IMPORTED_MODULE_8__.exportToFileIcon, onClick: () => __awaiter(void 0, void 0, void 0, function* () {\r\n const libraryItems = itemsSelected\r\n ? items\r\n : yield library.getLatestLibrary();\r\n (0,_data_json__WEBPACK_IMPORTED_MODULE_3__.saveLibraryAsJSON)(libraryItems)\r\n .catch(_utils__WEBPACK_IMPORTED_MODULE_5__.muteFSAbortError)\r\n .catch((error) => {\r\n setAppState({ errorMessage: error.message });\r\n });\r\n }), className: \"library-actions--export\" }, { children: selectedItems.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"library-actions-counter\" }, { children: selectedItems.length }), void 0)) }), \"export\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, Object.assign({ type: \"button\", title: resetLabel, \"aria-label\": resetLabel, icon: _icons__WEBPACK_IMPORTED_MODULE_8__.trash, onClick: () => setShowRemoveLibAlert(true), className: \"library-actions--remove\" }, { children: selectedItems.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"library-actions-counter\" }, { children: selectedItems.length }), void 0)) }), \"reset\")] }, void 0)), itemsSelected && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Tooltip__WEBPACK_IMPORTED_MODULE_12__.Tooltip, Object.assign({ label: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"hints.publishLibrary\") }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, Object.assign({ type: \"button\", \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.publishLibrary\"), label: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.publishLibrary\"), icon: _icons__WEBPACK_IMPORTED_MODULE_8__.publishIcon, className: \"library-actions--publish\", onClick: onPublish }, { children: [!device.isMobile && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"label\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.publishLibrary\") }, void 0), selectedItems.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"library-actions-counter\" }, { children: selectedItems.length }), void 0))] }), void 0) }), void 0)), device.isMobile && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"library-menu-browse-button--mobile\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"a\", Object.assign({ href: `${\"https://libraries.excalidraw.com\"}?target=${window.name || \"_blank\"}&referrer=${referrer}&useHash=true&token=${id}&theme=${theme}&version=${_constants__WEBPACK_IMPORTED_MODULE_14__.VERSIONS.excalidrawLibrary}`, target: \"_excalidraw_libraries\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.libraries\") }), void 0) }), void 0))] }), void 0));\r\n };\r\n const CELLS_PER_ROW = device.isMobile && !device.isSmScreen ? 6 : 4;\r\n const referrer = libraryReturnUrl || window.location.origin + window.location.pathname;\r\n const [lastSelectedItem, setLastSelectedItem] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(null);\r\n const onItemSelectToggle = (id, event) => {\r\n const shouldSelect = !selectedItems.includes(id);\r\n const orderedItems = [...unpublishedItems, ...publishedItems];\r\n if (shouldSelect) {\r\n if (event.shiftKey && lastSelectedItem) {\r\n const rangeStart = orderedItems.findIndex((item) => item.id === lastSelectedItem);\r\n const rangeEnd = orderedItems.findIndex((item) => item.id === id);\r\n if (rangeStart === -1 || rangeEnd === -1) {\r\n onSelectItems([...selectedItems, id]);\r\n return;\r\n }\r\n const selectedItemsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_5__.arrayToMap)(selectedItems);\r\n const nextSelectedIds = orderedItems.reduce((acc, item, idx) => {\r\n if ((idx >= rangeStart && idx <= rangeEnd) ||\r\n selectedItemsMap.has(item.id)) {\r\n acc.push(item.id);\r\n }\r\n return acc;\r\n }, []);\r\n onSelectItems(nextSelectedIds);\r\n }\r\n else {\r\n onSelectItems([...selectedItems, id]);\r\n }\r\n setLastSelectedItem(id);\r\n }\r\n else {\r\n setLastSelectedItem(null);\r\n onSelectItems(selectedItems.filter((_id) => _id !== id));\r\n }\r\n };\r\n const getInsertedElements = (id) => {\r\n let targetElements;\r\n if (selectedItems.includes(id)) {\r\n targetElements = libraryItems.filter((item) => selectedItems.includes(item.id));\r\n }\r\n else {\r\n targetElements = libraryItems.filter((item) => item.id === id);\r\n }\r\n return targetElements;\r\n };\r\n const createLibraryItemCompo = (params) => {\r\n var _a, _b, _c, _d, _e;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stack__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Col, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LibraryUnit__WEBPACK_IMPORTED_MODULE_9__.LibraryUnit, { elements: (_a = params.item) === null || _a === void 0 ? void 0 : _a.elements, files: files, isPending: !((_b = params.item) === null || _b === void 0 ? void 0 : _b.id) && !!((_c = params.item) === null || _c === void 0 ? void 0 : _c.elements), onClick: params.onClick || (() => { }), id: ((_d = params.item) === null || _d === void 0 ? void 0 : _d.id) || null, selected: !!((_e = params.item) === null || _e === void 0 ? void 0 : _e.id) && selectedItems.includes(params.item.id), onToggle: onItemSelectToggle, onDrag: (id, event) => {\r\n event.dataTransfer.setData(_constants__WEBPACK_IMPORTED_MODULE_14__.MIME_TYPES.excalidrawlib, (0,_data_json__WEBPACK_IMPORTED_MODULE_3__.serializeLibraryAsJSON)(getInsertedElements(id)));\r\n } }, void 0) }, params.key));\r\n };\r\n const renderLibrarySection = (items) => {\r\n const _items = items.map((item) => {\r\n if (item.id) {\r\n return createLibraryItemCompo({\r\n item,\r\n onClick: () => onInsertLibraryItems(getInsertedElements(item.id)),\r\n key: item.id,\r\n });\r\n }\r\n return createLibraryItemCompo({\r\n key: \"__pending__item__\",\r\n item,\r\n onClick: () => onAddToLibrary(pendingElements),\r\n });\r\n });\r\n // ensure we render all empty cells if no items are present\r\n let rows = (0,lodash__WEBPACK_IMPORTED_MODULE_1__.chunk)(_items, CELLS_PER_ROW);\r\n if (!rows.length) {\r\n rows = [[]];\r\n }\r\n return rows.map((rowItems, index, rows) => {\r\n if (index === rows.length - 1) {\r\n // pad row with empty cells\r\n rowItems = rowItems.concat(new Array(CELLS_PER_ROW - rowItems.length)\r\n .fill(null)\r\n .map((_, index) => {\r\n return createLibraryItemCompo({\r\n key: `empty_${index}`,\r\n item: null,\r\n });\r\n }));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stack__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Row, Object.assign({ align: \"center\", gap: 1 }, { children: rowItems }), index));\r\n });\r\n };\r\n const unpublishedItems = libraryItems.filter((item) => item.status !== \"published\");\r\n const publishedItems = libraryItems.filter((item) => item.status === \"published\");\r\n const renderLibraryHeader = () => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"layer-ui__library-header\" }, { children: [renderLibraryActions(), device.canDeviceFitSidebar && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"layer-ui__sidebar-lock-button\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_SidebarLockButton__WEBPACK_IMPORTED_MODULE_17__.SidebarLockButton, { checked: appState.isLibraryMenuDocked, onChange: () => {\r\n var _a;\r\n (_a = document\r\n .querySelector(\".layer-ui__wrapper\")) === null || _a === void 0 ? void 0 : _a.classList.add(\"animate\");\r\n const nextState = !appState.isLibraryMenuDocked;\r\n setAppState({\r\n isLibraryMenuDocked: nextState,\r\n });\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_18__.trackEvent)(\"library\", `toggleLibraryDock (${nextState ? \"dock\" : \"undock\"})`, `sidebar (${device.isMobile ? \"mobile\" : \"desktop\"})`);\r\n } }, void 0) }), void 0) }, void 0)), !device.isMobile && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"ToolIcon__icon__close\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: \"Modal__close\", onClick: () => setAppState({\r\n isLibraryOpen: false,\r\n }), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.close\") }, { children: _icons__WEBPACK_IMPORTED_MODULE_8__.close }), void 0) }), void 0))] }), \"library-header\") }, void 0));\r\n };\r\n const renderLibraryMenuItems = () => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Stack__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Col, Object.assign({ className: \"library-menu-items-container__items\", align: \"start\", gap: 1, style: {\r\n flex: publishedItems.length > 0 ? 1 : \"0 0 auto\",\r\n marginBottom: 0,\r\n } }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"separator\" }, { children: [(pendingElements.length > 0 ||\r\n unpublishedItems.length > 0 ||\r\n publishedItems.length > 0) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.personalLib\") }, void 0)), isLoading && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: {\r\n marginLeft: \"auto\",\r\n marginRight: \"1rem\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n fontWeight: \"normal\",\r\n } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: { transform: \"translateY(2px)\" } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Spinner__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {}, void 0) }), void 0) }), void 0))] }), void 0), !pendingElements.length && !unpublishedItems.length ? ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ style: {\r\n height: 65,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n fontSize: \".9rem\",\r\n } }, { children: [\"No items yet!\", (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: {\r\n margin: \".6rem 0\",\r\n fontSize: \".8em\",\r\n width: \"70%\",\r\n textAlign: \"center\",\r\n } }, { children: publishedItems.length > 0\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"library.hint_emptyPrivateLibrary\")\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"library.hint_emptyLibrary\") }), void 0)] }), void 0)) : (renderLibrarySection([\r\n // append pending library item\r\n ...(pendingElements.length\r\n ? [{ id: null, elements: pendingElements }]\r\n : []),\r\n ...unpublishedItems,\r\n ]))] }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(publishedItems.length > 0 ||\r\n (!device.isMobile &&\r\n (pendingElements.length > 0 || unpublishedItems.length > 0))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"separator\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.excalidrawLib\") }), void 0)), publishedItems.length > 0 && renderLibrarySection(publishedItems)] }, void 0)] }), void 0));\r\n };\r\n const renderLibraryFooter = () => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"a\", Object.assign({ className: \"library-menu-browse-button\", href: `${\"https://libraries.excalidraw.com\"}?target=${window.name || \"_blank\"}&referrer=${referrer}&useHash=true&token=${id}&theme=${theme}&version=${_constants__WEBPACK_IMPORTED_MODULE_14__.VERSIONS.excalidrawLibrary}`, target: \"_excalidraw_libraries\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.libraries\") }), void 0));\r\n };\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"library-menu-items-container\", style: device.isMobile\r\n ? {\r\n minHeight: \"200px\",\r\n maxHeight: \"70vh\",\r\n }\r\n : undefined }, { children: [showRemoveLibAlert && renderRemoveLibAlert(), renderLibraryHeader(), renderLibraryMenuItems(), !device.isMobile && renderLibraryFooter()] }), void 0));\r\n};\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LibraryMenuItems);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vY29tcG9uZW50cy9MaWJyYXJ5TWVudUl0ZW1zLnRzeC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBK0I7QUFDc0I7QUFDb0I7QUFHN0M7QUFRNEI7QUFDdEI7QUFDVTtBQUNnQztBQUNoQztBQUNoQjtBQUNjO0FBQ047QUFFSDtBQUNtQjtBQUNwQjtBQUNjO0FBRVU7QUFDZDtBQUUxQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsRUFDeEIsU0FBUyxFQUNULFlBQVksRUFDWixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsS0FBSyxFQUNMLFdBQVcsRUFDWCxRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxLQUFLLEVBQ0wsRUFBRSxFQUNGLGFBQWEsRUFDYixhQUFhLEVBQ2IsU0FBUyxFQUNULFlBQVksR0FtQmIsRUFBRSxFQUFFO0lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxrREFBVyxDQUFDLEdBQUcsRUFBRTtRQUM1QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTTtZQUNsQyxDQUFDLENBQUMsd0NBQUMsQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEUsQ0FBQyxDQUFDLHdDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTTtZQUNoQyxDQUFDLENBQUMsd0NBQUMsQ0FBQyxrQ0FBa0MsQ0FBQztZQUN2QyxDQUFDLENBQUMsd0NBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sQ0FDTCx1REFBQyxzREFBYSxrQkFDWixTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUNkLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtvQkFDeEIsbUJBQW1CLEVBQUUsQ0FBQztpQkFDdkI7cUJBQU07b0JBQ0wsWUFBWSxFQUFFLENBQUM7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QUNsQixTQUFTLEVBQUUsTUFBTTthQUNsQjtZQUNILENBQUMsQ0FBQyxTQUFTLGlCQUdkLGtCQUFrQixJQUFJLG9CQUFvQixFQUFFLEVBQzVDLG1CQUFtQixFQUFFLEVBQ3JCLHNCQUFzQixFQUFFLEVBQ3hCLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxhQUN0QyxDQUNQLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixpRUFBZSxnQkFBZ0IsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0xpYnJhcnlNZW51SXRlbXMudHN4P2Y3NDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2h1bmsgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBzYXZlTGlicmFyeUFzSlNPTiwgc2VyaWFsaXplTGlicmFyeUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50LCBOb25EZWxldGVkIH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHtcbiAgQXBwU3RhdGUsXG4gIEJpbmFyeUZpbGVzLFxuICBFeGNhbGlkcmF3UHJvcHMsXG4gIExpYnJhcnlJdGVtLFxuICBMaWJyYXJ5SXRlbXMsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCwgbXV0ZUZTQWJvcnRFcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgdXNlRGV2aWNlIH0gZnJvbSBcIi4vQXBwXCI7XG5pbXBvcnQgQ29uZmlybURpYWxvZyBmcm9tIFwiLi9Db25maXJtRGlhbG9nXCI7XG5pbXBvcnQgeyBjbG9zZSwgZXhwb3J0VG9GaWxlSWNvbiwgbG9hZCwgcHVibGlzaEljb24sIHRyYXNoIH0gZnJvbSBcIi4vaWNvbnNcIjtcbmltcG9ydCB7IExpYnJhcnlVbml0IH0gZnJvbSBcIi4vTGlicmFyeVVuaXRcIjtcbmltcG9ydCBTdGFjayBmcm9tIFwiLi9TdGFja1wiO1xuaW1wb3J0IHsgVG9vbEJ1dHRvbiB9IGZyb20gXCIuL1Rvb2xCdXR0b25cIjtcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tIFwiLi9Ub29sdGlwXCI7XG5cbmltcG9ydCBcIi4vTGlicmFyeU1lbnVJdGVtcy5zY3NzXCI7XG5pbXBvcnQgeyBNSU1FX1RZUEVTLCBWRVJTSU9OUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuL1NwaW5uZXJcIjtcbmltcG9ydCB7IGZpbGVPcGVuIH0gZnJvbSBcIi4uL2RhdGEvZmlsZXN5c3RlbVwiO1xuXG5pbXBvcnQgeyBTaWRlYmFyTG9ja0J1dHRvbiB9IGZyb20gXCIuL1NpZGViYXJMb2NrQnV0dG9uXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuXG5jb25zdCBMaWJyYXJ5TWVudUl0ZW1zID0gKHtcbiAgaXNMb2FkaW5nLFxuICBsaWJyYXJ5SXRlbXMsXG4gIG9uUmVtb3ZlRnJvbUxpYnJhcnksXG4gIG9uQWRkVG9MaWJyYXJ5LFxuICBvbkluc2VydExpYnJhcnlJdGVtcyxcbiAgcGVuZGluZ0VsZW1lbnRzLFxuICB0aGVtZSxcbiAgc2V0QXBwU3RhdGUsXG4gIGFwcFN0YXRlLFxuICBsaWJyYXJ5UmV0dXJuVXJsLFxuICBsaWJyYXJ5LFxuICBmaWxlcyxcbiAgaWQsXG4gIHNlbGVjdGVkSXRlbXMsXG4gIG9uU2VsZWN0SXRlbXMsXG4gIG9uUHVibGlzaCxcbiAgcmVzZXRMaWJyYXJ5LFxufToge1xuICBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIGxpYnJhcnlJdGVtczogTGlicmFyeUl0ZW1zO1xuICBwZW5kaW5nRWxlbWVudHM6IExpYnJhcnlJdGVtW1wiZWxlbWVudHNcIl07XG4gIG9uUmVtb3ZlRnJvbUxpYnJhcnk6ICgpID0+IHZvaWQ7XG4gIG9uSW5zZXJ0TGlicmFyeUl0ZW1zOiAobGlicmFyeUl0ZW1zOiBMaWJyYXJ5SXRlbXMpID0+IHZvaWQ7XG4gIG9uQWRkVG9MaWJyYXJ5OiAoZWxlbWVudHM6IExpYnJhcnlJdGVtW1wiZWxlbWVudHNcIl0pID0+IHZvaWQ7XG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdO1xuICBmaWxlczogQmluYXJ5RmlsZXM7XG4gIHNldEFwcFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXTtcbiAgYXBwU3RhdGU6IEFwcFN0YXRlO1xuICBsaWJyYXJ5UmV0dXJuVXJsOiBFeGNhbGlkcmF3UHJvcHNbXCJsaWJyYXJ5UmV0dXJuVXJsXCJdO1xuICBsaWJyYXJ5OiBMaWJyYXJ5O1xuICBpZDogc3RyaW5nO1xuICBzZWxlY3RlZEl0ZW1zOiBMaWJyYXJ5SXRlbVtcImlkXCJdW107XG4gIG9uU2VsZWN0SXRlbXM6IChpZDogTGlicmFyeUl0ZW1bXCJpZFwiXVtdKSA9PiB2b2lkO1xuICBvblB1Ymxpc2g6ICgpID0+IHZvaWQ7XG4gIHJlc2V0TGlicmFyeTogKCkgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgcmVuZGVyUmVtb3ZlTGliQWxlcnQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHNlbGVjdGVkSXRlbXMubGVuZ3RoXG4gICAgICA/IHQoXCJhbGVydHMucmVtb3ZlSXRlbXNGcm9tc0xpYnJhcnlcIiwgeyBjb3VudDogc2VsZWN0ZWRJdGVtcy5sZW5ndGggfSlcbiAgICAgIDogdChcImFsZXJ0cy5yZXNldExpYnJhcnlcIik7XG4gICAgY29uc3QgdGl0bGUgPSBzZWxlY3RlZEl0ZW1zLmxlbmd0aFxuICAgICAgPyB0KFwiY29uZmlybURpYWxvZy5yZW1vdmVJdGVtc0Zyb21MaWJcIilcbiAgICAgIDogdChcImNvbmZpcm1EaWFsb2cucmVzZXRMaWJyYXJ5XCIpO1xuICAgIHJldHVybiAoXG4gICAgICA8Q29uZmlybURpYWxvZ1xuICAgICAgICBvbkNvbmZpcm09eygpID0+IHtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG9uUmVtb3ZlRnJvbUxpYnJhcnkoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRMaWJyYXJ5KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldFNob3dSZW1vdmVMaWJBbGVydChmYWxzZSk7XG4gICAgICAgIH19XG4gICAgICAgIG9uQ2FuY2VsPXsoKSA9PiB7XG4gICAgICAgICAgc2V0U2hvd1JlbW92ZUxpYkFsZXJ0KGZhbHNlKTtcbiAgICAgICAgfX1cbiAgICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgPlxuICAgICAgICA8cD57Y29udGVudH08L3A+XG4gICAgICA8L0NvbmZpcm1EaWFsb2c+XG4gICAgKTtcbiAgfSwgW3NlbGVjdGVkSXRlbXMsIG9uUmVtb3ZlRnJvbUxpYnJhcnksIHJlc2V0TGlicmFyeV0pO1xuXG4gIGNvbnN0IFtzaG93UmVtb3ZlTGliQWxlcnQsIHNldFNob3dSZW1vdmVMaWJBbGVydF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGRldmljZSA9IHVzZURldmljZSgpO1xuICBjb25zdCByZW5kZXJMaWJyYXJ5QWN0aW9ucyA9ICgpID0+IHtcbiAgICBjb25zdCBpdGVtc1NlbGVjdGVkID0gISFzZWxlY3RlZEl0ZW1zLmxlbmd0aDtcbiAgICBjb25zdCBpdGVtcyA9IGl0ZW1zU2VsZWN0ZWRcbiAgICAgID8gbGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhpdGVtLmlkKSlcbiAgICAgIDogbGlicmFyeUl0ZW1zO1xuICAgIGNvbnN0IHJlc2V0TGFiZWwgPSBpdGVtc1NlbGVjdGVkXG4gICAgICA/IHQoXCJidXR0b25zLnJlbW92ZVwiKVxuICAgICAgOiB0KFwiYnV0dG9ucy5yZXNldExpYnJhcnlcIik7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlicmFyeS1hY3Rpb25zXCI+XG4gICAgICAgIHshaXRlbXNTZWxlY3RlZCAmJiAoXG4gICAgICAgICAgPFRvb2xCdXR0b25cbiAgICAgICAgICAgIGtleT1cImltcG9ydFwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPXt0KFwiYnV0dG9ucy5sb2FkXCIpfVxuICAgICAgICAgICAgYXJpYS1sYWJlbD17dChcImJ1dHRvbnMubG9hZFwiKX1cbiAgICAgICAgICAgIGljb249e2xvYWR9XG4gICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbGlicmFyeS51cGRhdGVMaWJyYXJ5KHtcbiAgICAgICAgICAgICAgICAgIGxpYnJhcnlJdGVtczogZmlsZU9wZW4oe1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJFeGNhbGlkcmF3IGxpYnJhcnkgZmlsZXNcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gVG9EbzogQmUgb3Zlci1wZXJtaXNzaXZlIHVudGlsIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDQ0MlxuICAgICAgICAgICAgICAgICAgICAvLyBnZXRzIHJlc29sdmVkLiBFbHNlLCBpT1MgdXNlcnMgY2Fubm90IG9wZW4gYC5leGNhbGlkcmF3YCBmaWxlcy5cbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogW1wiLmpzb25cIiwgXCIuZXhjYWxpZHJhd2xpYlwiXSxcbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICAgICAgICBvcGVuTGlicmFyeU1lbnU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRBcHBTdGF0ZSh7IGVycm9yTWVzc2FnZTogdChcImVycm9ycy5pbXBvcnRMaWJyYXJ5RXJyb3JcIikgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJsaWJyYXJ5LWFjdGlvbnMtLWxvYWRcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHshIWl0ZW1zLmxlbmd0aCAmJiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxUb29sQnV0dG9uXG4gICAgICAgICAgICAgIGtleT1cImV4cG9ydFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB0aXRsZT17dChcImJ1dHRvbnMuZXhwb3J0XCIpfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5leHBvcnRcIil9XG4gICAgICAgICAgICAgIGljb249e2V4cG9ydFRvRmlsZUljb259XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaWJyYXJ5SXRlbXMgPSBpdGVtc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICA/IGl0ZW1zXG4gICAgICAgICAgICAgICAgICA6IGF3YWl0IGxpYnJhcnkuZ2V0TGF0ZXN0TGlicmFyeSgpO1xuICAgICAgICAgICAgICAgIHNhdmVMaWJyYXJ5QXNKU09OKGxpYnJhcnlJdGVtcylcbiAgICAgICAgICAgICAgICAgIC5jYXRjaChtdXRlRlNBYm9ydEVycm9yKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRBcHBTdGF0ZSh7IGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJsaWJyYXJ5LWFjdGlvbnMtLWV4cG9ydFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImxpYnJhcnktYWN0aW9ucy1jb3VudGVyXCI+XG4gICAgICAgICAgICAgICAgICB7c2VsZWN0ZWRJdGVtcy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9Ub29sQnV0dG9uPlxuICAgICAgICAgICAgPFRvb2xCdXR0b25cbiAgICAgICAgICAgICAga2V5PVwicmVzZXRcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9e3Jlc2V0TGFiZWx9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3Jlc2V0TGFiZWx9XG4gICAgICAgICAgICAgIGljb249e3RyYXNofVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93UmVtb3ZlTGliQWxlcnQodHJ1ZSl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImxpYnJhcnktYWN0aW9ucy0tcmVtb3ZlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3NlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibGlicmFyeS1hY3Rpb25zLWNvdW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIHtzZWxlY3RlZEl0ZW1zLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1Rvb2xCdXR0b24+XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICAgIHtpdGVtc1NlbGVjdGVkICYmIChcbiAgICAgICAgICA8VG9vbHRpcCBsYWJlbD17dChcImhpbnRzLnB1Ymxpc2hMaWJyYXJ5XCIpfT5cbiAgICAgICAgICAgIDxUb29sQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5wdWJsaXNoTGlicmFyeVwiKX1cbiAgICAgICAgICAgICAgbGFiZWw9e3QoXCJidXR0b25zLnB1Ymxpc2hMaWJyYXJ5XCIpfVxuICAgICAgICAgICAgICBpY29uPXtwdWJsaXNoSWNvbn1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibGlicmFyeS1hY3Rpb25zLS1wdWJsaXNoXCJcbiAgICAgICAgICAgICAgb25DbGljaz17b25QdWJsaXNofVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7IWRldmljZS5pc01vYmlsZSAmJiA8bGFiZWw+e3QoXCJidXR0b25zLnB1Ymxpc2hMaWJyYXJ5XCIpfTwvbGFiZWw+fVxuICAgICAgICAgICAgICB7c2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJsaWJyYXJ5LWFjdGlvbnMtY291bnRlclwiPlxuICAgICAgICAgICAgICAgICAge3NlbGVjdGVkSXRlbXMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvVG9vbEJ1dHRvbj5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICl9XG4gICAgICAgIHtkZXZpY2UuaXNNb2JpbGUgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlicmFyeS1tZW51LWJyb3dzZS1idXR0b24tLW1vYmlsZVwiPlxuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgaHJlZj17YCR7cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0xJQlJBUllfVVJMfT90YXJnZXQ9JHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubmFtZSB8fCBcIl9ibGFua1wiXG4gICAgICAgICAgICAgIH0mcmVmZXJyZXI9JHtyZWZlcnJlcn0mdXNlSGFzaD10cnVlJnRva2VuPSR7aWR9JnRoZW1lPSR7dGhlbWV9JnZlcnNpb249JHtcbiAgICAgICAgICAgICAgICBWRVJTSU9OUy5leGNhbGlkcmF3TGlicmFyeVxuICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2V4Y2FsaWRyYXdfbGlicmFyaWVzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3QoXCJsYWJlbHMubGlicmFyaWVzXCIpfVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBDRUxMU19QRVJfUk9XID0gZGV2aWNlLmlzTW9iaWxlICYmICFkZXZpY2UuaXNTbVNjcmVlbiA/IDYgOiA0O1xuXG4gIGNvbnN0IHJlZmVycmVyID1cbiAgICBsaWJyYXJ5UmV0dXJuVXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG5cbiAgY29uc3QgW2xhc3RTZWxlY3RlZEl0ZW0sIHNldExhc3RTZWxlY3RlZEl0ZW1dID0gdXNlU3RhdGU8XG4gICAgTGlicmFyeUl0ZW1bXCJpZFwiXSB8IG51bGxcbiAgPihudWxsKTtcblxuICBjb25zdCBvbkl0ZW1TZWxlY3RUb2dnbGUgPSAoXG4gICAgaWQ6IExpYnJhcnlJdGVtW1wiaWRcIl0sXG4gICAgZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQsXG4gICkgPT4ge1xuICAgIGNvbnN0IHNob3VsZFNlbGVjdCA9ICFzZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKGlkKTtcblxuICAgIGNvbnN0IG9yZGVyZWRJdGVtcyA9IFsuLi51bnB1Ymxpc2hlZEl0ZW1zLCAuLi5wdWJsaXNoZWRJdGVtc107XG5cbiAgICBpZiAoc2hvdWxkU2VsZWN0KSB7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgbGFzdFNlbGVjdGVkSXRlbSkge1xuICAgICAgICBjb25zdCByYW5nZVN0YXJ0ID0gb3JkZXJlZEl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5pZCA9PT0gbGFzdFNlbGVjdGVkSXRlbSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmFuZ2VFbmQgPSBvcmRlcmVkSXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCk7XG5cbiAgICAgICAgaWYgKHJhbmdlU3RhcnQgPT09IC0xIHx8IHJhbmdlRW5kID09PSAtMSkge1xuICAgICAgICAgIG9uU2VsZWN0SXRlbXMoWy4uLnNlbGVjdGVkSXRlbXMsIGlkXSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtc01hcCA9IGFycmF5VG9NYXAoc2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgIGNvbnN0IG5leHRTZWxlY3RlZElkcyA9IG9yZGVyZWRJdGVtcy5yZWR1Y2UoXG4gICAgICAgICAgKGFjYzogTGlicmFyeUl0ZW1bXCJpZFwiXVtdLCBpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKGlkeCA+PSByYW5nZVN0YXJ0ICYmIGlkeCA8PSByYW5nZUVuZCkgfHxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc01hcC5oYXMoaXRlbS5pZClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBhY2MucHVzaChpdGVtLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcblxuICAgICAgICBvblNlbGVjdEl0ZW1zKG5leHRTZWxlY3RlZElkcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvblNlbGVjdEl0ZW1zKFsuLi5zZWxlY3RlZEl0ZW1zLCBpZF0pO1xuICAgICAgfVxuICAgICAgc2V0TGFzdFNlbGVjdGVkSXRlbShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExhc3RTZWxlY3RlZEl0ZW0obnVsbCk7XG4gICAgICBvblNlbGVjdEl0ZW1zKHNlbGVjdGVkSXRlbXMuZmlsdGVyKChfaWQpID0+IF9pZCAhPT0gaWQpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0SW5zZXJ0ZWRFbGVtZW50cyA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IHRhcmdldEVsZW1lbnRzO1xuICAgIGlmIChzZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKGlkKSkge1xuICAgICAgdGFyZ2V0RWxlbWVudHMgPSBsaWJyYXJ5SXRlbXMuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICBzZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKGl0ZW0uaWQpLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0RWxlbWVudHMgPSBsaWJyYXJ5SXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRFbGVtZW50cztcbiAgfTtcblxuICBjb25zdCBjcmVhdGVMaWJyYXJ5SXRlbUNvbXBvID0gKHBhcmFtczoge1xuICAgIGl0ZW06XG4gICAgICB8IExpYnJhcnlJdGVtXG4gICAgICB8IC8qIHBlbmRpbmcgbGlicmFyeSBpdGVtICovIHtcbiAgICAgICAgICBpZDogbnVsbDtcbiAgICAgICAgICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXTtcbiAgICAgICAgfVxuICAgICAgfCBudWxsO1xuICAgIG9uQ2xpY2s/OiAoKSA9PiB2b2lkO1xuICAgIGtleTogc3RyaW5nO1xuICB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdGFjay5Db2wga2V5PXtwYXJhbXMua2V5fT5cbiAgICAgICAgPExpYnJhcnlVbml0XG4gICAgICAgICAgZWxlbWVudHM9e3BhcmFtcy5pdGVtPy5lbGVtZW50c31cbiAgICAgICAgICBmaWxlcz17ZmlsZXN9XG4gICAgICAgICAgaXNQZW5kaW5nPXshcGFyYW1zLml0ZW0/LmlkICYmICEhcGFyYW1zLml0ZW0/LmVsZW1lbnRzfVxuICAgICAgICAgIG9uQ2xpY2s9e3BhcmFtcy5vbkNsaWNrIHx8ICgoKSA9PiB7fSl9XG4gICAgICAgICAgaWQ9e3BhcmFtcy5pdGVtPy5pZCB8fCBudWxsfVxuICAgICAgICAgIHNlbGVjdGVkPXshIXBhcmFtcy5pdGVtPy5pZCAmJiBzZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKHBhcmFtcy5pdGVtLmlkKX1cbiAgICAgICAgICBvblRvZ2dsZT17b25JdGVtU2VsZWN0VG9nZ2xlfVxuICAgICAgICAgIG9uRHJhZz17KGlkLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXG4gICAgICAgICAgICAgIE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYixcbiAgICAgICAgICAgICAgc2VyaWFsaXplTGlicmFyeUFzSlNPTihnZXRJbnNlcnRlZEVsZW1lbnRzKGlkKSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICA8L1N0YWNrLkNvbD5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHJlbmRlckxpYnJhcnlTZWN0aW9uID0gKFxuICAgIGl0ZW1zOiAoXG4gICAgICB8IExpYnJhcnlJdGVtXG4gICAgICB8IC8qIHBlbmRpbmcgbGlicmFyeSBpdGVtICovIHtcbiAgICAgICAgICBpZDogbnVsbDtcbiAgICAgICAgICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXTtcbiAgICAgICAgfVxuICAgIClbXSxcbiAgKSA9PiB7XG4gICAgY29uc3QgX2l0ZW1zID0gaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5pZCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTGlicmFyeUl0ZW1Db21wbyh7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBvbkluc2VydExpYnJhcnlJdGVtcyhnZXRJbnNlcnRlZEVsZW1lbnRzKGl0ZW0uaWQpKSxcbiAgICAgICAgICBrZXk6IGl0ZW0uaWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZUxpYnJhcnlJdGVtQ29tcG8oe1xuICAgICAgICBrZXk6IFwiX19wZW5kaW5nX19pdGVtX19cIixcbiAgICAgICAgaXRlbSxcbiAgICAgICAgb25DbGljazogKCkgPT4gb25BZGRUb0xpYnJhcnkocGVuZGluZ0VsZW1lbnRzKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gZW5zdXJlIHdlIHJlbmRlciBhbGwgZW1wdHkgY2VsbHMgaWYgbm8gaXRlbXMgYXJlIHByZXNlbnRcbiAgICBsZXQgcm93cyA9IGNodW5rKF9pdGVtcywgQ0VMTFNfUEVSX1JPVyk7XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgcm93cyA9IFtbXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3dJdGVtcywgaW5kZXgsIHJvd3MpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gcm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIHBhZCByb3cgd2l0aCBlbXB0eSBjZWxsc1xuICAgICAgICByb3dJdGVtcyA9IHJvd0l0ZW1zLmNvbmNhdChcbiAgICAgICAgICBuZXcgQXJyYXkoQ0VMTFNfUEVSX1JPVyAtIHJvd0l0ZW1zLmxlbmd0aClcbiAgICAgICAgICAgIC5maWxsKG51bGwpXG4gICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlTGlicmFyeUl0ZW1Db21wbyh7XG4gICAgICAgICAgICAgICAga2V5OiBgZW1wdHlfJHtpbmRleH1gLFxuICAgICAgICAgICAgICAgIGl0ZW06IG51bGwsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3RhY2suUm93IGFsaWduPVwiY2VudGVyXCIgZ2FwPXsxfSBrZXk9e2luZGV4fT5cbiAgICAgICAgICB7cm93SXRlbXN9XG4gICAgICAgIDwvU3RhY2suUm93PlxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCB1bnB1Ymxpc2hlZEl0ZW1zID0gbGlicmFyeUl0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gaXRlbS5zdGF0dXMgIT09IFwicHVibGlzaGVkXCIsXG4gICk7XG4gIGNvbnN0IHB1Ymxpc2hlZEl0ZW1zID0gbGlicmFyeUl0ZW1zLmZpbHRlcihcbiAgICAoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09IFwicHVibGlzaGVkXCIsXG4gICk7XG5cbiAgY29uc3QgcmVuZGVyTGlicmFyeUhlYWRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYXllci11aV9fbGlicmFyeS1oZWFkZXJcIiBrZXk9XCJsaWJyYXJ5LWhlYWRlclwiPlxuICAgICAgICAgIHtyZW5kZXJMaWJyYXJ5QWN0aW9ucygpfVxuICAgICAgICAgIHtkZXZpY2UuY2FuRGV2aWNlRml0U2lkZWJhciAmJiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxheWVyLXVpX19zaWRlYmFyLWxvY2stYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgPFNpZGViYXJMb2NrQnV0dG9uXG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXthcHBTdGF0ZS5pc0xpYnJhcnlNZW51RG9ja2VkfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIi5sYXllci11aV9fd3JhcHBlclwiKVxuICAgICAgICAgICAgICAgICAgICAgID8uY2xhc3NMaXN0LmFkZChcImFuaW1hdGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9ICFhcHBTdGF0ZS5pc0xpYnJhcnlNZW51RG9ja2VkO1xuICAgICAgICAgICAgICAgICAgICBzZXRBcHBTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgaXNMaWJyYXJ5TWVudURvY2tlZDogbmV4dFN0YXRlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICBcImxpYnJhcnlcIixcbiAgICAgICAgICAgICAgICAgICAgICBgdG9nZ2xlTGlicmFyeURvY2sgKCR7bmV4dFN0YXRlID8gXCJkb2NrXCIgOiBcInVuZG9ja1wifSlgLFxuICAgICAgICAgICAgICAgICAgICAgIGBzaWRlYmFyICgke2RldmljZS5pc01vYmlsZSA/IFwibW9iaWxlXCIgOiBcImRlc2t0b3BcIn0pYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICAgIHshZGV2aWNlLmlzTW9iaWxlICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiVG9vbEljb25fX2ljb25fX2Nsb3NlXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJNb2RhbF9fY2xvc2VcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICBzZXRBcHBTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGlzTGlicmFyeU9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dChcImJ1dHRvbnMuY2xvc2VcIil9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Y2xvc2V9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8Lz5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHJlbmRlckxpYnJhcnlNZW51SXRlbXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdGFjay5Db2xcbiAgICAgICAgY2xhc3NOYW1lPVwibGlicmFyeS1tZW51LWl0ZW1zLWNvbnRhaW5lcl9faXRlbXNcIlxuICAgICAgICBhbGlnbj1cInN0YXJ0XCJcbiAgICAgICAgZ2FwPXsxfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGZsZXg6IHB1Ymxpc2hlZEl0ZW1zLmxlbmd0aCA+IDAgPyAxIDogXCIwIDAgYXV0b1wiLFxuICAgICAgICAgIG1hcmdpbkJvdHRvbTogMCxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPD5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlcGFyYXRvclwiPlxuICAgICAgICAgICAgeyhwZW5kaW5nRWxlbWVudHMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICB1bnB1Ymxpc2hlZEl0ZW1zLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgcHVibGlzaGVkSXRlbXMubGVuZ3RoID4gMCkgJiYgKFxuICAgICAgICAgICAgICA8ZGl2Pnt0KFwibGFiZWxzLnBlcnNvbmFsTGliXCIpfTwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtpc0xvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6IFwiMXJlbVwiLFxuICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogXCJub3JtYWxcIixcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgycHgpXCIgfX0+XG4gICAgICAgICAgICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgeyFwZW5kaW5nRWxlbWVudHMubGVuZ3RoICYmICF1bnB1Ymxpc2hlZEl0ZW1zLmxlbmd0aCA/IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDY1LFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IFwiLjlyZW1cIixcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgTm8gaXRlbXMgeWV0IVxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogXCIuNnJlbSAwXCIsXG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIuOGVtXCIsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogXCI3MCVcIixcbiAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3B1Ymxpc2hlZEl0ZW1zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gdChcImxpYnJhcnkuaGludF9lbXB0eVByaXZhdGVMaWJyYXJ5XCIpXG4gICAgICAgICAgICAgICAgICA6IHQoXCJsaWJyYXJ5LmhpbnRfZW1wdHlMaWJyYXJ5XCIpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICByZW5kZXJMaWJyYXJ5U2VjdGlvbihbXG4gICAgICAgICAgICAgIC8vIGFwcGVuZCBwZW5kaW5nIGxpYnJhcnkgaXRlbVxuICAgICAgICAgICAgICAuLi4ocGVuZGluZ0VsZW1lbnRzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gW3sgaWQ6IG51bGwsIGVsZW1lbnRzOiBwZW5kaW5nRWxlbWVudHMgfV1cbiAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgLi4udW5wdWJsaXNoZWRJdGVtcyxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgKX1cbiAgICAgICAgPC8+XG5cbiAgICAgICAgPD5cbiAgICAgICAgICB7KHB1Ymxpc2hlZEl0ZW1zLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICghZGV2aWNlLmlzTW9iaWxlICYmXG4gICAgICAgICAgICAgIChwZW5kaW5nRWxlbWVudHMubGVuZ3RoID4gMCB8fCB1bnB1Ymxpc2hlZEl0ZW1zLmxlbmd0aCA+IDApKSkgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZXBhcmF0b3JcIj57dChcImxhYmVscy5leGNhbGlkcmF3TGliXCIpfTwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge3B1Ymxpc2hlZEl0ZW1zLmxlbmd0aCA+IDAgJiYgcmVuZGVyTGlicmFyeVNlY3Rpb24ocHVibGlzaGVkSXRlbXMpfVxuICAgICAgICA8Lz5cbiAgICAgIDwvU3RhY2suQ29sPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyTGlicmFyeUZvb3RlciA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGFcbiAgICAgICAgY2xhc3NOYW1lPVwibGlicmFyeS1tZW51LWJyb3dzZS1idXR0b25cIlxuICAgICAgICBocmVmPXtgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfTElCUkFSWV9VUkx9P3RhcmdldD0ke1xuICAgICAgICAgIHdpbmRvdy5uYW1lIHx8IFwiX2JsYW5rXCJcbiAgICAgICAgfSZyZWZlcnJlcj0ke3JlZmVycmVyfSZ1c2VIYXNoPXRydWUmdG9rZW49JHtpZH0mdGhlbWU9JHt0aGVtZX0mdmVyc2lvbj0ke1xuICAgICAgICAgIFZFUlNJT05TLmV4Y2FsaWRyYXdMaWJyYXJ5XG4gICAgICAgIH1gfVxuICAgICAgICB0YXJnZXQ9XCJfZXhjYWxpZHJhd19saWJyYXJpZXNcIlxuICAgICAgPlxuICAgICAgICB7dChcImxhYmVscy5saWJyYXJpZXNcIil9XG4gICAgICA8L2E+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImxpYnJhcnktbWVudS1pdGVtcy1jb250YWluZXJcIlxuICAgICAgc3R5bGU9e1xuICAgICAgICBkZXZpY2UuaXNNb2JpbGVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiBcIjIwMHB4XCIsXG4gICAgICAgICAgICAgIG1heEhlaWdodDogXCI3MHZoXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICA+XG4gICAgICB7c2hvd1JlbW92ZUxpYkFsZXJ0ICYmIHJlbmRlclJlbW92ZUxpYkFsZXJ0KCl9XG4gICAgICB7cmVuZGVyTGlicmFyeUhlYWRlcigpfVxuICAgICAge3JlbmRlckxpYnJhcnlNZW51SXRlbXMoKX1cbiAgICAgIHshZGV2aWNlLmlzTW9iaWxlICYmIHJlbmRlckxpYnJhcnlGb290ZXIoKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExpYnJhcnlNZW51SXRlbXM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/LibraryMenuItems.tsx\n");
2158
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash */ \"../../../node_modules/lodash/lodash.js\");\n/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./App */ \"../../components/App.tsx\");\n/* harmony import */ var _ConfirmDialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ConfirmDialog */ \"../../components/ConfirmDialog.tsx\");\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _LibraryUnit__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./LibraryUnit */ \"../../components/LibraryUnit.tsx\");\n/* harmony import */ var _Stack__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Stack */ \"../../components/Stack.tsx\");\n/* harmony import */ var _ToolButton__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ToolButton */ \"../../components/ToolButton.tsx\");\n/* harmony import */ var _Tooltip__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Tooltip */ \"../../components/Tooltip.tsx\");\n/* harmony import */ var _LibraryMenuItems_scss__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./LibraryMenuItems.scss */ \"../../components/LibraryMenuItems.scss\");\n/* harmony import */ var _LibraryMenuItems_scss__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_LibraryMenuItems_scss__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _Spinner__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Spinner */ \"../../components/Spinner.tsx\");\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _SidebarLockButton__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./SidebarLockButton */ \"../../components/SidebarLockButton.tsx\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst LibraryMenuItems = ({ isLoading, libraryItems, onRemoveFromLibrary, onAddToLibrary, onInsertLibraryItems, pendingElements, theme, setAppState, appState, libraryReturnUrl, library, files, id, selectedItems, onSelectItems, onPublish, resetLibrary, }) => {\r\n const renderRemoveLibAlert = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(() => {\r\n const content = selectedItems.length\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.removeItemsFromsLibrary\", { count: selectedItems.length })\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.resetLibrary\");\r\n const title = selectedItems.length\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"confirmDialog.removeItemsFromLib\")\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"confirmDialog.resetLibrary\");\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ConfirmDialog__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object.assign({ onConfirm: () => {\r\n if (selectedItems.length) {\r\n onRemoveFromLibrary();\r\n }\r\n else {\r\n resetLibrary();\r\n }\r\n setShowRemoveLibAlert(false);\r\n }, onCancel: () => {\r\n setShowRemoveLibAlert(false);\r\n }, title: title }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"p\", { children: content }, void 0) }), void 0));\r\n }, [selectedItems, onRemoveFromLibrary, resetLibrary]);\r\n const [showRemoveLibAlert, setShowRemoveLibAlert] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(false);\r\n const device = (0,_App__WEBPACK_IMPORTED_MODULE_6__.useDevice)();\r\n const renderLibraryActions = () => {\r\n const itemsSelected = !!selectedItems.length;\r\n const items = itemsSelected\r\n ? libraryItems.filter((item) => selectedItems.includes(item.id))\r\n : libraryItems;\r\n const resetLabel = itemsSelected\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.remove\")\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.resetLibrary\");\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"library-actions\" }, { children: [!itemsSelected && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, { type: \"button\", title: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.load\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.load\"), icon: _icons__WEBPACK_IMPORTED_MODULE_8__.load, onClick: () => __awaiter(void 0, void 0, void 0, function* () {\r\n try {\r\n yield library.updateLibrary({\r\n libraryItems: (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_16__.fileOpen)({\r\n description: \"Excalidraw library files\",\r\n // ToDo: Be over-permissive until https://bugs.webkit.org/show_bug.cgi?id=34442\r\n // gets resolved. Else, iOS users cannot open `.excalidraw` files.\r\n /*\r\n extensions: [\".json\", \".excalidrawlib\"],\r\n */\r\n }),\r\n merge: true,\r\n openLibraryMenu: true,\r\n });\r\n }\r\n catch (error) {\r\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\r\n console.warn(error);\r\n return;\r\n }\r\n setAppState({ errorMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"errors.importLibraryError\") });\r\n }\r\n }), className: \"library-actions--load\" }, \"import\")), !!items.length && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, Object.assign({ type: \"button\", title: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.export\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.export\"), icon: _icons__WEBPACK_IMPORTED_MODULE_8__.exportToFileIcon, onClick: () => __awaiter(void 0, void 0, void 0, function* () {\r\n const libraryItems = itemsSelected\r\n ? items\r\n : yield library.getLatestLibrary();\r\n (0,_data_json__WEBPACK_IMPORTED_MODULE_3__.saveLibraryAsJSON)(libraryItems)\r\n .catch(_utils__WEBPACK_IMPORTED_MODULE_5__.muteFSAbortError)\r\n .catch((error) => {\r\n setAppState({ errorMessage: error.message });\r\n });\r\n }), className: \"library-actions--export\" }, { children: selectedItems.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"library-actions-counter\" }, { children: selectedItems.length }), void 0)) }), \"export\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, Object.assign({ type: \"button\", title: resetLabel, \"aria-label\": resetLabel, icon: _icons__WEBPACK_IMPORTED_MODULE_8__.trash, onClick: () => setShowRemoveLibAlert(true), className: \"library-actions--remove\" }, { children: selectedItems.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"library-actions-counter\" }, { children: selectedItems.length }), void 0)) }), \"reset\")] }, void 0)), itemsSelected && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Tooltip__WEBPACK_IMPORTED_MODULE_12__.Tooltip, Object.assign({ label: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"hints.publishLibrary\") }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_ToolButton__WEBPACK_IMPORTED_MODULE_11__.ToolButton, Object.assign({ type: \"button\", \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.publishLibrary\"), label: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.publishLibrary\"), icon: _icons__WEBPACK_IMPORTED_MODULE_8__.publishIcon, className: \"library-actions--publish\", onClick: onPublish }, { children: [!device.isMobile && (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"label\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.publishLibrary\") }, void 0), selectedItems.length > 0 && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"library-actions-counter\" }, { children: selectedItems.length }), void 0))] }), void 0) }), void 0)), device.isMobile && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"library-menu-browse-button--mobile\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"a\", Object.assign({ href: `${\"https://libraries.excalidraw.com\"}?target=${window.name || \"_blank\"}&referrer=${referrer}&useHash=true&token=${id}&theme=${theme}&version=${_constants__WEBPACK_IMPORTED_MODULE_14__.VERSIONS.excalidrawLibrary}`, target: \"_excalidraw_libraries\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.libraries\") }), void 0) }), void 0))] }), void 0));\r\n };\r\n const CELLS_PER_ROW = device.isMobile && !device.isSmScreen ? 6 : 4;\r\n const referrer = libraryReturnUrl || window.location.origin + window.location.pathname;\r\n const [lastSelectedItem, setLastSelectedItem] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(null);\r\n const onItemSelectToggle = (id, event) => {\r\n const shouldSelect = !selectedItems.includes(id);\r\n const orderedItems = [...unpublishedItems, ...publishedItems];\r\n if (shouldSelect) {\r\n if (event.shiftKey && lastSelectedItem) {\r\n const rangeStart = orderedItems.findIndex((item) => item.id === lastSelectedItem);\r\n const rangeEnd = orderedItems.findIndex((item) => item.id === id);\r\n if (rangeStart === -1 || rangeEnd === -1) {\r\n onSelectItems([...selectedItems, id]);\r\n return;\r\n }\r\n const selectedItemsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_5__.arrayToMap)(selectedItems);\r\n const nextSelectedIds = orderedItems.reduce((acc, item, idx) => {\r\n if ((idx >= rangeStart && idx <= rangeEnd) ||\r\n selectedItemsMap.has(item.id)) {\r\n acc.push(item.id);\r\n }\r\n return acc;\r\n }, []);\r\n onSelectItems(nextSelectedIds);\r\n }\r\n else {\r\n onSelectItems([...selectedItems, id]);\r\n }\r\n setLastSelectedItem(id);\r\n }\r\n else {\r\n setLastSelectedItem(null);\r\n onSelectItems(selectedItems.filter((_id) => _id !== id));\r\n }\r\n };\r\n const getInsertedElements = (id) => {\r\n let targetElements;\r\n if (selectedItems.includes(id)) {\r\n targetElements = libraryItems.filter((item) => selectedItems.includes(item.id));\r\n }\r\n else {\r\n targetElements = libraryItems.filter((item) => item.id === id);\r\n }\r\n return targetElements;\r\n };\r\n const createLibraryItemCompo = (params) => {\r\n var _a, _b, _c, _d, _e;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stack__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Col, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LibraryUnit__WEBPACK_IMPORTED_MODULE_9__.LibraryUnit, { elements: (_a = params.item) === null || _a === void 0 ? void 0 : _a.elements, files: files, isPending: !((_b = params.item) === null || _b === void 0 ? void 0 : _b.id) && !!((_c = params.item) === null || _c === void 0 ? void 0 : _c.elements), onClick: params.onClick || (() => { }), id: ((_d = params.item) === null || _d === void 0 ? void 0 : _d.id) || null, selected: !!((_e = params.item) === null || _e === void 0 ? void 0 : _e.id) && selectedItems.includes(params.item.id), onToggle: onItemSelectToggle, onDrag: (id, event) => {\r\n event.dataTransfer.setData(_constants__WEBPACK_IMPORTED_MODULE_14__.MIME_TYPES.excalidrawlib, (0,_data_json__WEBPACK_IMPORTED_MODULE_3__.serializeLibraryAsJSON)(getInsertedElements(id)));\r\n } }, void 0) }, params.key));\r\n };\r\n const renderLibrarySection = (items) => {\r\n const _items = items.map((item) => {\r\n if (item.id) {\r\n return createLibraryItemCompo({\r\n item,\r\n onClick: () => onInsertLibraryItems(getInsertedElements(item.id)),\r\n key: item.id,\r\n });\r\n }\r\n return createLibraryItemCompo({\r\n key: \"__pending__item__\",\r\n item,\r\n onClick: () => onAddToLibrary(pendingElements),\r\n });\r\n });\r\n // ensure we render all empty cells if no items are present\r\n let rows = (0,lodash__WEBPACK_IMPORTED_MODULE_1__.chunk)(_items, CELLS_PER_ROW);\r\n if (!rows.length) {\r\n rows = [[]];\r\n }\r\n return rows.map((rowItems, index, rows) => {\r\n if (index === rows.length - 1) {\r\n // pad row with empty cells\r\n rowItems = rowItems.concat(new Array(CELLS_PER_ROW - rowItems.length)\r\n .fill(null)\r\n .map((_, index) => {\r\n return createLibraryItemCompo({\r\n key: `empty_${index}`,\r\n item: null,\r\n });\r\n }));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stack__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Row, Object.assign({ align: \"center\", gap: 1 }, { children: rowItems }), index));\r\n });\r\n };\r\n const unpublishedItems = libraryItems.filter((item) => item.status !== \"published\");\r\n const publishedItems = libraryItems.filter((item) => item.status === \"published\");\r\n const renderLibraryHeader = () => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"layer-ui__library-header\" }, { children: [renderLibraryActions(), device.canDeviceFitSidebar && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"layer-ui__sidebar-lock-button\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_SidebarLockButton__WEBPACK_IMPORTED_MODULE_17__.SidebarLockButton, { checked: appState.isLibraryMenuDocked, onChange: () => {\r\n var _a;\r\n (_a = document\r\n .querySelector(\".layer-ui__wrapper\")) === null || _a === void 0 ? void 0 : _a.classList.add(\"animate\");\r\n const nextState = !appState.isLibraryMenuDocked;\r\n setAppState({\r\n isLibraryMenuDocked: nextState,\r\n });\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_18__.trackEvent)(\"library\", `toggleLibraryDock (${nextState ? \"dock\" : \"undock\"})`, `sidebar (${device.isMobile ? \"mobile\" : \"desktop\"})`);\r\n } }, void 0) }), void 0) }, void 0)), !device.isMobile && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"ToolIcon__icon__close\" }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: \"Modal__close\", onClick: () => setAppState({\r\n isLibraryOpen: false,\r\n }), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.close\") }, { children: _icons__WEBPACK_IMPORTED_MODULE_8__.close }), void 0) }), void 0))] }), \"library-header\") }, void 0));\r\n };\r\n const renderLibraryMenuItems = () => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Stack__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Col, Object.assign({ className: \"library-menu-items-container__items\", align: \"start\", gap: 1, style: {\r\n flex: publishedItems.length > 0 ? 1 : \"0 1 auto\",\r\n marginBottom: 0,\r\n } }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"separator\" }, { children: [(pendingElements.length > 0 ||\r\n unpublishedItems.length > 0 ||\r\n publishedItems.length > 0) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.personalLib\") }, void 0)), isLoading && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: {\r\n marginLeft: \"auto\",\r\n marginRight: \"1rem\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n fontWeight: \"normal\",\r\n } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: { transform: \"translateY(2px)\" } }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Spinner__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {}, void 0) }), void 0) }), void 0))] }), void 0), !pendingElements.length && !unpublishedItems.length ? ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ style: {\r\n height: 65,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n fontSize: \".9rem\",\r\n } }, { children: [(0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"library.noItems\"), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: {\r\n margin: \".6rem 0\",\r\n fontSize: \".8em\",\r\n width: \"70%\",\r\n textAlign: \"center\",\r\n } }, { children: publishedItems.length > 0\r\n ? (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"library.hint_emptyPrivateLibrary\")\r\n : (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"library.hint_emptyLibrary\") }), void 0)] }), void 0)) : (renderLibrarySection([\r\n // append pending library item\r\n ...(pendingElements.length\r\n ? [{ id: null, elements: pendingElements }]\r\n : []),\r\n ...unpublishedItems,\r\n ]))] }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [(publishedItems.length > 0 ||\r\n (!device.isMobile &&\r\n (pendingElements.length > 0 || unpublishedItems.length > 0))) && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"separator\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.excalidrawLib\") }), void 0)), publishedItems.length > 0 ? (renderLibrarySection(publishedItems)) : unpublishedItems.length > 0 ? ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ style: {\r\n margin: \"1rem 0\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n fontSize: \".9rem\",\r\n } }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"library.noItems\") }), void 0)) : null] }, void 0)] }), void 0));\r\n };\r\n const renderLibraryFooter = () => {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"a\", Object.assign({ className: \"library-menu-browse-button\", href: `${\"https://libraries.excalidraw.com\"}?target=${window.name || \"_blank\"}&referrer=${referrer}&useHash=true&token=${id}&theme=${theme}&version=${_constants__WEBPACK_IMPORTED_MODULE_14__.VERSIONS.excalidrawLibrary}`, target: \"_excalidraw_libraries\" }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"labels.libraries\") }), void 0));\r\n };\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"div\", Object.assign({ className: \"library-menu-items-container\", style: device.isMobile\r\n ? {\r\n minHeight: \"200px\",\r\n maxHeight: \"70vh\",\r\n }\r\n : undefined }, { children: [showRemoveLibAlert && renderRemoveLibAlert(), renderLibraryHeader(), renderLibraryMenuItems(), !device.isMobile && renderLibraryFooter()] }), void 0));\r\n};\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LibraryMenuItems);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vY29tcG9uZW50cy9MaWJyYXJ5TWVudUl0ZW1zLnRzeC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBK0I7QUFDc0I7QUFDb0I7QUFHN0M7QUFRNEI7QUFDdEI7QUFDVTtBQUNnQztBQUNoQztBQUNoQjtBQUNjO0FBQ047QUFFSDtBQUNtQjtBQUNwQjtBQUNjO0FBRVU7QUFDZDtBQUUxQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsRUFDeEIsU0FBUyxFQUNULFlBQVksRUFDWixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsS0FBSyxFQUNMLFdBQVcsRUFDWCxRQUFRLEVBQ1IsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxLQUFLLEVBQ0wsRUFBRSxFQUNGLGFBQWEsRUFDYixhQUFhLEVBQ2IsU0FBUyxFQUNULFlBQVksR0FtQmIsRUFBRSxFQUFFO0lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxrREFBVyxDQUFDLEdBQUcsRUFBRTtRQUM1QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTTtZQUNsQyxDQUFDLENBQUMsd0NBQUMsQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEUsQ0FBQyxDQUFDLHdDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTTtZQUNoQyxDQUFDLENBQUMsd0NBQUMsQ0FBQyxrQ0FBa0MsQ0FBQztZQUN2QyxDQUFDLENBQUMsd0NBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sQ0FDTCx1REFBQyxzREFBYSxrQkFDWixTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUNkLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtvQkFDeEIsbUJBQW1CLEVBQUUsQ0FBQztpQkFDdkI7cUJBQU07b0JBQ0wsWUFBWSxFQUFFLENBQUM7aUJBQ2hCO2dCQUNELHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLENBQUMsRUFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLENBQUMsRUFDRCxLQUFLLEVBQUUsS0FBSyxnQkFFWix3RUFBSSxPQUFPLFdBQUssWUFDRixDQUNqQixDQUFDO0lBQ0osQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFFdkQsTUFBTSxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLEdBQUcsK0NBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxNQUFNLE1BQU0sR0FBRywrQ0FBUyxFQUFFLENBQUM7SUFDM0IsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEVBQUU7UUFDaEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsYUFBYTtZQUN6QixDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNqQixNQUFNLFVBQVUsR0FBRyxhQUFhO1lBQzlCLENBQUMsQ0FBQyx3Q0FBQyxDQUFDLGdCQUFnQixDQUFDO1lBQ3JCLENBQUMsQ0FBQyx3Q0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUNMLCtFQUFLLFNBQVMsRUFBQyxpQkFBaUIsaUJBQzdCLENBQUMsYUFBYSxJQUFJLENBQ2pCLHVEQUFDLG9EQUFVLElBRVQsSUFBSSxFQUFDLFFBQVEsRUFDYixLQUFLLEVBQUUsd0NBQUMsQ0FBQyxjQUFjLENBQUMsZ0JBQ1osd0NBQUMsQ0FBQyxjQUFjLENBQUMsRUFDN0IsSUFBSSxFQUFFLHdDQUFJLEVBQ1YsT0FBTyxFQUFFLEdBQVMsRUFBRTt3QkFDbEIsSUFBSTs0QkFDRixNQUFNLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0NBQzFCLFlBQVksRUFBRSwyREFBUSxDQUFDO29DQUNyQixXQUFXLEVBQUUsMEJBQTBCO29DQUN2QywrRUFBK0U7b0NBQy9FLGtFQUFrRTtvQ0FDbEU7O3NDQUVFO2lDQUNILENBQUM7Z0NBQ0YsS0FBSyxFQUFFLElBQUk7Z0NBQ1gsZUFBZSxFQUFFLElBQUk7NkJBQ3RCLENBQUMsQ0FBQzt5QkFDSjt3QkFBQyxPQUFPLEtBQVUsRUFBRTs0QkFDbkIsSUFBSSxNQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsSUFBSSxNQUFLLFlBQVksRUFBRTtnQ0FDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDcEIsT0FBTzs2QkFDUjs0QkFDRCxXQUFXLENBQUMsRUFBRSxZQUFZLEVBQUUsd0NBQUMsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQzt5QkFDL0Q7b0JBQ0gsQ0FBQyxHQUNELFNBQVMsRUFBQyx1QkFBdUIsSUEzQjdCLFFBQVEsQ0E0QlosQ0FDSCxFQUNBLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQ2pCLDhIQUNFLHVEQUFDLG9EQUFVLGtCQUVULElBQUksRUFBQyxRQUFRLEVBQ2IsS0FBSyxFQUFFLHdDQUFDLENBQUMsZ0JBQWdCLENBQUMsZ0JBQ2Qsd0NBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMvQixJQUFJLEVBQUUsb0RBQWdCLEVBQ3RCLE9BQU8sRUFBRSxHQUFTLEVBQUU7Z0NBQ2xCLE1BQU0sWUFBWSxHQUFHLGFBQWE7b0NBQ2hDLENBQUMsQ0FBQyxLQUFLO29DQUNQLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dDQUNyQyw2REFBaUIsQ0FBQyxZQUFZLENBQUM7cUNBQzVCLEtBQUssQ0FBQyxvREFBZ0IsQ0FBQztxQ0FDdkIsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0NBQ2YsV0FBVyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dDQUMvQyxDQUFDLENBQUMsQ0FBQzs0QkFDUCxDQUFDLEdBQ0QsU0FBUyxFQUFDLHlCQUF5QixnQkFFbEMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDM0IsK0VBQU0sU0FBUyxFQUFDLHlCQUF5QixnQkFDdEMsYUFBYSxDQUFDLE1BQU0sWUFDaEIsQ0FDUixLQXJCRyxRQUFRLENBc0JELEVBQ2IsdURBQUMsb0RBQVUsa0JBRVQsSUFBSSxFQUFDLFFBQVEsRUFDYixLQUFLLEVBQUUsVUFBVSxnQkFDTCxVQUFVLEVBQ3RCLElBQUksRUFBRSx5Q0FBSyxFQUNYLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFDMUMsU0FBUyxFQUFDLHlCQUF5QixnQkFFbEMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDM0IsK0VBQU0sU0FBUyxFQUFDLHlCQUF5QixnQkFDdEMsYUFBYSxDQUFDLE1BQU0sWUFDaEIsQ0FDUixLQVpHLE9BQU8sQ0FhQSxZQUNaLENBQ0osRUFDQSxhQUFhLElBQUksQ0FDaEIsdURBQUMsOENBQU8sa0JBQUMsS0FBSyxFQUFFLHdDQUFDLENBQUMsc0JBQXNCLENBQUMsZ0JBQ3ZDLHdEQUFDLG9EQUFVLGtCQUNULElBQUksRUFBQyxRQUFRLGdCQUNELHdDQUFDLENBQUMsd0JBQXdCLENBQUMsRUFDdkMsS0FBSyxFQUFFLHdDQUFDLENBQUMsd0JBQXdCLENBQUMsRUFDbEMsSUFBSSxFQUFFLCtDQUFXLEVBQ2pCLFNBQVMsRUFBQywwQkFBMEIsRUFDcEMsT0FBTyxFQUFFLFNBQVMsaUJBRWpCLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSw0RUFBUSx3Q0FBQyxDQUFDLHdCQUF3QixDQUFDLFdBQVMsRUFDaEUsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDM0IsK0VBQU0sU0FBUyxFQUFDLHlCQUF5QixnQkFDdEMsYUFBYSxDQUFDLE1BQU0sWUFDaEIsQ0FDUixhQUNVLFlBQ0wsQ0FDWCxFQUNBLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FDbEIsOEVBQUssU0FBUyxFQUFDLG9DQUFvQyxnQkFDakQsNEVBQ0UsSUFBSSxFQUFFLEdBQUcsa0NBQWlDLFdBQ3hDLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFDakIsYUFBYSxRQUFRLHVCQUF1QixFQUFFLFVBQVUsS0FBSyxZQUMzRCxtRUFDRixFQUFFLEVBQ0YsTUFBTSxFQUFDLHVCQUF1QixnQkFFN0Isd0NBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxZQUNwQixZQUNBLENBQ1AsYUFDRyxDQUNQLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEUsTUFBTSxRQUFRLEdBQ1osZ0JBQWdCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFFeEUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLEdBQUcsK0NBQVEsQ0FFdEQsSUFBSSxDQUFDLENBQUM7SUFFUixNQUFNLGtCQUFrQixHQUFHLENBQ3pCLEVBQXFCLEVBQ3JCLEtBQXVCLEVBQ3ZCLEVBQUU7UUFDRixNQUFNLFlBQVksR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFakQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7UUFFOUQsSUFBSSxZQUFZLEVBQUU7WUFDaEIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLGdCQUFnQixFQUFFO2dCQUN0QyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUN2QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxnQkFBZ0IsQ0FDdkMsQ0FBQztnQkFDRixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUVsRSxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ3hDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLE9BQU87aUJBQ1I7Z0JBRUQsTUFBTSxnQkFBZ0IsR0FBRyxrREFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUN6QyxDQUFDLEdBQXdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUN0QyxJQUNFLENBQUMsR0FBRyxJQUFJLFVBQVUsSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDO3dCQUN0QyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUM3Qjt3QkFDQSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDbkI7b0JBQ0QsT0FBTyxHQUFHLENBQUM7Z0JBQ2IsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO2dCQUVGLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxhQUFhLENBQUMsQ0FBQyxHQUFHLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDekI7YUFBTTtZQUNMLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMxRDtJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRTtRQUN6QyxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDOUIsY0FBYyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1QyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDaEMsQ0FBQztTQUNIO2FBQU07WUFDTCxjQUFjLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNoRTtRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxNQVUvQixFQUFFLEVBQUU7O1FBQ0gsT0FBTyxDQUNMLHVEQUFDLG1EQUFTLGNBQ1IsdURBQUMscURBQVcsSUFDVixRQUFRLEVBQUUsWUFBTSxDQUFDLElBQUksMENBQUUsUUFBUSxFQUMvQixLQUFLLEVBQUUsS0FBSyxFQUNaLFNBQVMsRUFBRSxDQUFDLGFBQU0sQ0FBQyxJQUFJLDBDQUFFLEVBQUUsS0FBSSxDQUFDLENBQUMsYUFBTSxDQUFDLElBQUksMENBQUUsUUFBUSxHQUN0RCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxFQUNyQyxFQUFFLEVBQUUsYUFBTSxDQUFDLElBQUksMENBQUUsRUFBRSxLQUFJLElBQUksRUFDM0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxhQUFNLENBQUMsSUFBSSwwQ0FBRSxFQUFFLEtBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUNyRSxRQUFRLEVBQUUsa0JBQWtCLEVBQzVCLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDcEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQ3hCLGlFQUF3QixFQUN4QixrRUFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNoRCxDQUFDO2dCQUNKLENBQUMsV0FDRCxJQWZZLE1BQU0sQ0FBQyxHQUFHLENBZ0JkLENBQ2IsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLE1BQU0sb0JBQW9CLEdBQUcsQ0FDM0IsS0FNRyxFQUNILEVBQUU7UUFDRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUNYLE9BQU8sc0JBQXNCLENBQUM7b0JBQzVCLElBQUk7b0JBQ0osT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDakUsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO2lCQUNiLENBQUMsQ0FBQzthQUNKO1lBQ0QsT0FBTyxzQkFBc0IsQ0FBQztnQkFDNUIsR0FBRyxFQUFFLG1CQUFtQjtnQkFDeEIsSUFBSTtnQkFDSixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQzthQUMvQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILDJEQUEyRDtRQUMzRCxJQUFJLElBQUksR0FBRyw2Q0FBSyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNiO1FBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN4QyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDN0IsMkJBQTJCO2dCQUMzQixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FDeEIsSUFBSSxLQUFLLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7cUJBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUM7cUJBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUNoQixPQUFPLHNCQUFzQixDQUFDO3dCQUM1QixHQUFHLEVBQUUsU0FBUyxLQUFLLEVBQUU7d0JBQ3JCLElBQUksRUFBRSxJQUFJO3FCQUNYLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FDTCxDQUFDO2FBQ0g7WUFDRCxPQUFPLENBQ0wsdURBQUMsbURBQVMsa0JBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxnQkFDN0IsUUFBUSxLQUQ0QixLQUFLLENBRWhDLENBQ2IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUMxQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQ3RDLENBQUM7SUFDRixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUN4QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQ3RDLENBQUM7SUFFRixNQUFNLG1CQUFtQixHQUFHLEdBQUcsRUFBRTtRQUMvQixPQUFPLENBQ0wsNEhBQ0UsK0VBQUssU0FBUyxFQUFDLDBCQUEwQixpQkFDdEMsb0JBQW9CLEVBQUUsRUFDdEIsTUFBTSxDQUFDLG1CQUFtQixJQUFJLENBQzdCLDRIQUNFLDhFQUFLLFNBQVMsRUFBQywrQkFBK0IsZ0JBQzVDLHVEQUFDLGtFQUFpQixJQUNoQixPQUFPLEVBQUUsUUFBUSxDQUFDLG1CQUFtQixFQUNyQyxRQUFRLEVBQUUsR0FBRyxFQUFFOztvQ0FDYixjQUFRO3lDQUNMLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQywwQ0FDbEMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQ0FDN0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7b0NBQ2hELFdBQVcsQ0FBQzt3Q0FDVixtQkFBbUIsRUFBRSxTQUFTO3FDQUMvQixDQUFDLENBQUM7b0NBQ0gsdURBQVUsQ0FDUixTQUFTLEVBQ1Qsc0JBQXNCLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFDdEQsWUFBWSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUN0RCxDQUFDO2dDQUNKLENBQUMsV0FDRCxZQUNFLFdBQ0wsQ0FDSixFQUNBLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUNuQiw4RUFBSyxTQUFTLEVBQUMsdUJBQXVCLGdCQUNwQyxpRkFDRSxTQUFTLEVBQUMsY0FBYyxFQUN4QixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQ1osV0FBVyxDQUFDO2dDQUNWLGFBQWEsRUFBRSxLQUFLOzZCQUNyQixDQUFDLGdCQUVRLHdDQUFDLENBQUMsZUFBZSxDQUFDLGdCQUU3Qix5Q0FBSyxZQUNDLFlBQ0wsQ0FDUCxNQXZDMkMsZ0JBQWdCLENBd0N4RCxXQUNMLENBQ0osQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxFQUFFO1FBQ2xDLE9BQU8sQ0FDTCx3REFBQyxtREFBUyxrQkFDUixTQUFTLEVBQUMscUNBQXFDLEVBQy9DLEtBQUssRUFBQyxPQUFPLEVBQ2IsR0FBRyxFQUFFLENBQUMsRUFDTixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7Z0JBQ2hELFlBQVksRUFBRSxDQUFDO2FBQ2hCLGlCQUVELDhIQUNFLCtFQUFLLFNBQVMsRUFBQyxXQUFXLGlCQUN2QixDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQ0FDMUIsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUM7b0NBQzNCLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDOUIsMEVBQU0sd0NBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFPLENBQ3JDLEVBQ0EsU0FBUyxJQUFJLENBQ1osOEVBQ0UsS0FBSyxFQUFFO3dDQUNMLFVBQVUsRUFBRSxNQUFNO3dDQUNsQixXQUFXLEVBQUUsTUFBTTt3Q0FDbkIsT0FBTyxFQUFFLE1BQU07d0NBQ2YsVUFBVSxFQUFFLFFBQVE7d0NBQ3BCLFVBQVUsRUFBRSxRQUFRO3FDQUNyQixnQkFFRCw4RUFBSyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQzFDLHVEQUFDLGlEQUFPLGFBQUcsWUFDUCxZQUNGLENBQ1AsYUFDRyxFQUNMLENBQUMsZUFBZSxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDckQsK0VBQ0UsS0FBSyxFQUFFO2dDQUNMLE1BQU0sRUFBRSxFQUFFO2dDQUNWLE9BQU8sRUFBRSxNQUFNO2dDQUNmLGFBQWEsRUFBRSxRQUFRO2dDQUN2QixVQUFVLEVBQUUsUUFBUTtnQ0FDcEIsY0FBYyxFQUFFLFFBQVE7Z0NBQ3hCLEtBQUssRUFBRSxNQUFNO2dDQUNiLFFBQVEsRUFBRSxPQUFPOzZCQUNsQixpQkFFQSx3Q0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQ3JCLDhFQUNFLEtBQUssRUFBRTt3Q0FDTCxNQUFNLEVBQUUsU0FBUzt3Q0FDakIsUUFBUSxFQUFFLE1BQU07d0NBQ2hCLEtBQUssRUFBRSxLQUFLO3dDQUNaLFNBQVMsRUFBRSxRQUFRO3FDQUNwQixnQkFFQSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7d0NBQ3hCLENBQUMsQ0FBQyx3Q0FBQyxDQUFDLGtDQUFrQyxDQUFDO3dDQUN2QyxDQUFDLENBQUMsd0NBQUMsQ0FBQywyQkFBMkIsQ0FBQyxZQUM5QixhQUNGLENBQ1AsQ0FBQyxDQUFDLENBQUMsQ0FDRixvQkFBb0IsQ0FBQzs0QkFDbkIsOEJBQThCOzRCQUM5QixHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU07Z0NBQ3hCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLENBQUM7Z0NBQzNDLENBQUMsQ0FBQyxFQUFFLENBQUM7NEJBQ1AsR0FBRyxnQkFBZ0I7eUJBQ3BCLENBQUMsQ0FDSCxZQUNBLEVBRUgsOEhBQ0csQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7NEJBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUTtnQ0FDZixDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkUsOEVBQUssU0FBUyxFQUFDLFdBQVcsZ0JBQUUsd0NBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFPLENBQzdELEVBQ0EsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzNCLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUNyQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNoQyw4RUFDRSxLQUFLLEVBQUU7Z0NBQ0wsTUFBTSxFQUFFLFFBQVE7Z0NBQ2hCLE9BQU8sRUFBRSxNQUFNO2dDQUNmLGFBQWEsRUFBRSxRQUFRO2dDQUN2QixVQUFVLEVBQUUsUUFBUTtnQ0FDcEIsY0FBYyxFQUFFLFFBQVE7Z0NBQ3hCLEtBQUssRUFBRSxNQUFNO2dDQUNiLFFBQVEsRUFBRSxPQUFPOzZCQUNsQixnQkFFQSx3Q0FBQyxDQUFDLGlCQUFpQixDQUFDLFlBQ2pCLENBQ1AsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUNQLGFBQ08sQ0FDYixDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUU7UUFDL0IsT0FBTyxDQUNMLDRFQUNFLFNBQVMsRUFBQyw0QkFBNEIsRUFDdEMsSUFBSSxFQUFFLEdBQUcsa0NBQWlDLFdBQ3hDLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFDakIsYUFBYSxRQUFRLHVCQUF1QixFQUFFLFVBQVUsS0FBSyxZQUMzRCxtRUFDRixFQUFFLEVBQ0YsTUFBTSxFQUFDLHVCQUF1QixnQkFFN0Isd0NBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxZQUNwQixDQUNMLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixPQUFPLENBQ0wsK0VBQ0UsU0FBUyxFQUFDLDhCQUE4QixFQUN4QyxLQUFLLEVBQ0gsTUFBTSxDQUFDLFFBQVE7WUFDYixDQUFDLENBQUM7Z0JBQ0UsU0FBUyxFQUFFLE9BQU87Z0JBQ2xCLFNBQVMsRUFBRSxNQUFNO2FBQ2xCO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsaUJBR2Qsa0JBQWtCLElBQUksb0JBQW9CLEVBQUUsRUFDNUMsbUJBQW1CLEVBQUUsRUFDckIsc0JBQXNCLEVBQUUsRUFDeEIsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLG1CQUFtQixFQUFFLGFBQ3RDLENBQ1AsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLGlFQUFlLGdCQUFnQixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvTGlicmFyeU1lbnVJdGVtcy50c3g/Zjc0MiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjaHVuayB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHNhdmVMaWJyYXJ5QXNKU09OLCBzZXJpYWxpemVMaWJyYXJ5QXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4uL2RhdGEvbGlicmFyeVwiO1xuaW1wb3J0IHsgRXhjYWxpZHJhd0VsZW1lbnQsIE5vbkRlbGV0ZWQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQge1xuICBBcHBTdGF0ZSxcbiAgQmluYXJ5RmlsZXMsXG4gIEV4Y2FsaWRyYXdQcm9wcyxcbiAgTGlicmFyeUl0ZW0sXG4gIExpYnJhcnlJdGVtcyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBhcnJheVRvTWFwLCBtdXRlRlNBYm9ydEVycm9yIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VEZXZpY2UgfSBmcm9tIFwiLi9BcHBcIjtcbmltcG9ydCBDb25maXJtRGlhbG9nIGZyb20gXCIuL0NvbmZpcm1EaWFsb2dcIjtcbmltcG9ydCB7IGNsb3NlLCBleHBvcnRUb0ZpbGVJY29uLCBsb2FkLCBwdWJsaXNoSWNvbiwgdHJhc2ggfSBmcm9tIFwiLi9pY29uc1wiO1xuaW1wb3J0IHsgTGlicmFyeVVuaXQgfSBmcm9tIFwiLi9MaWJyYXJ5VW5pdFwiO1xuaW1wb3J0IFN0YWNrIGZyb20gXCIuL1N0YWNrXCI7XG5pbXBvcnQgeyBUb29sQnV0dG9uIH0gZnJvbSBcIi4vVG9vbEJ1dHRvblwiO1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gXCIuL1Rvb2x0aXBcIjtcblxuaW1wb3J0IFwiLi9MaWJyYXJ5TWVudUl0ZW1zLnNjc3NcIjtcbmltcG9ydCB7IE1JTUVfVFlQRVMsIFZFUlNJT05TIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IFNwaW5uZXIgZnJvbSBcIi4vU3Bpbm5lclwiO1xuaW1wb3J0IHsgZmlsZU9wZW4gfSBmcm9tIFwiLi4vZGF0YS9maWxlc3lzdGVtXCI7XG5cbmltcG9ydCB7IFNpZGViYXJMb2NrQnV0dG9uIH0gZnJvbSBcIi4vU2lkZWJhckxvY2tCdXR0b25cIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5cbmNvbnN0IExpYnJhcnlNZW51SXRlbXMgPSAoe1xuICBpc0xvYWRpbmcsXG4gIGxpYnJhcnlJdGVtcyxcbiAgb25SZW1vdmVGcm9tTGlicmFyeSxcbiAgb25BZGRUb0xpYnJhcnksXG4gIG9uSW5zZXJ0TGlicmFyeUl0ZW1zLFxuICBwZW5kaW5nRWxlbWVudHMsXG4gIHRoZW1lLFxuICBzZXRBcHBTdGF0ZSxcbiAgYXBwU3RhdGUsXG4gIGxpYnJhcnlSZXR1cm5VcmwsXG4gIGxpYnJhcnksXG4gIGZpbGVzLFxuICBpZCxcbiAgc2VsZWN0ZWRJdGVtcyxcbiAgb25TZWxlY3RJdGVtcyxcbiAgb25QdWJsaXNoLFxuICByZXNldExpYnJhcnksXG59OiB7XG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgbGlicmFyeUl0ZW1zOiBMaWJyYXJ5SXRlbXM7XG4gIHBlbmRpbmdFbGVtZW50czogTGlicmFyeUl0ZW1bXCJlbGVtZW50c1wiXTtcbiAgb25SZW1vdmVGcm9tTGlicmFyeTogKCkgPT4gdm9pZDtcbiAgb25JbnNlcnRMaWJyYXJ5SXRlbXM6IChsaWJyYXJ5SXRlbXM6IExpYnJhcnlJdGVtcykgPT4gdm9pZDtcbiAgb25BZGRUb0xpYnJhcnk6IChlbGVtZW50czogTGlicmFyeUl0ZW1bXCJlbGVtZW50c1wiXSkgPT4gdm9pZDtcbiAgdGhlbWU6IEFwcFN0YXRlW1widGhlbWVcIl07XG4gIGZpbGVzOiBCaW5hcnlGaWxlcztcbiAgc2V0QXBwU3RhdGU6IFJlYWN0LkNvbXBvbmVudDxhbnksIEFwcFN0YXRlPltcInNldFN0YXRlXCJdO1xuICBhcHBTdGF0ZTogQXBwU3RhdGU7XG4gIGxpYnJhcnlSZXR1cm5Vcmw6IEV4Y2FsaWRyYXdQcm9wc1tcImxpYnJhcnlSZXR1cm5VcmxcIl07XG4gIGxpYnJhcnk6IExpYnJhcnk7XG4gIGlkOiBzdHJpbmc7XG4gIHNlbGVjdGVkSXRlbXM6IExpYnJhcnlJdGVtW1wiaWRcIl1bXTtcbiAgb25TZWxlY3RJdGVtczogKGlkOiBMaWJyYXJ5SXRlbVtcImlkXCJdW10pID0+IHZvaWQ7XG4gIG9uUHVibGlzaDogKCkgPT4gdm9pZDtcbiAgcmVzZXRMaWJyYXJ5OiAoKSA9PiB2b2lkO1xufSkgPT4ge1xuICBjb25zdCByZW5kZXJSZW1vdmVMaWJBbGVydCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gc2VsZWN0ZWRJdGVtcy5sZW5ndGhcbiAgICAgID8gdChcImFsZXJ0cy5yZW1vdmVJdGVtc0Zyb21zTGlicmFyeVwiLCB7IGNvdW50OiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCB9KVxuICAgICAgOiB0KFwiYWxlcnRzLnJlc2V0TGlicmFyeVwiKTtcbiAgICBjb25zdCB0aXRsZSA9IHNlbGVjdGVkSXRlbXMubGVuZ3RoXG4gICAgICA/IHQoXCJjb25maXJtRGlhbG9nLnJlbW92ZUl0ZW1zRnJvbUxpYlwiKVxuICAgICAgOiB0KFwiY29uZmlybURpYWxvZy5yZXNldExpYnJhcnlcIik7XG4gICAgcmV0dXJuIChcbiAgICAgIDxDb25maXJtRGlhbG9nXG4gICAgICAgIG9uQ29uZmlybT17KCkgPT4ge1xuICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgb25SZW1vdmVGcm9tTGlicmFyeSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldExpYnJhcnkoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0U2hvd1JlbW92ZUxpYkFsZXJ0KGZhbHNlKTtcbiAgICAgICAgfX1cbiAgICAgICAgb25DYW5jZWw9eygpID0+IHtcbiAgICAgICAgICBzZXRTaG93UmVtb3ZlTGliQWxlcnQoZmFsc2UpO1xuICAgICAgICB9fVxuICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICA+XG4gICAgICAgIDxwPntjb250ZW50fTwvcD5cbiAgICAgIDwvQ29uZmlybURpYWxvZz5cbiAgICApO1xuICB9LCBbc2VsZWN0ZWRJdGVtcywgb25SZW1vdmVGcm9tTGlicmFyeSwgcmVzZXRMaWJyYXJ5XSk7XG5cbiAgY29uc3QgW3Nob3dSZW1vdmVMaWJBbGVydCwgc2V0U2hvd1JlbW92ZUxpYkFsZXJ0XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgZGV2aWNlID0gdXNlRGV2aWNlKCk7XG4gIGNvbnN0IHJlbmRlckxpYnJhcnlBY3Rpb25zID0gKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW1zU2VsZWN0ZWQgPSAhIXNlbGVjdGVkSXRlbXMubGVuZ3RoO1xuICAgIGNvbnN0IGl0ZW1zID0gaXRlbXNTZWxlY3RlZFxuICAgICAgPyBsaWJyYXJ5SXRlbXMuZmlsdGVyKChpdGVtKSA9PiBzZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKGl0ZW0uaWQpKVxuICAgICAgOiBsaWJyYXJ5SXRlbXM7XG4gICAgY29uc3QgcmVzZXRMYWJlbCA9IGl0ZW1zU2VsZWN0ZWRcbiAgICAgID8gdChcImJ1dHRvbnMucmVtb3ZlXCIpXG4gICAgICA6IHQoXCJidXR0b25zLnJlc2V0TGlicmFyeVwiKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJsaWJyYXJ5LWFjdGlvbnNcIj5cbiAgICAgICAgeyFpdGVtc1NlbGVjdGVkICYmIChcbiAgICAgICAgICA8VG9vbEJ1dHRvblxuICAgICAgICAgICAga2V5PVwiaW1wb3J0XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9e3QoXCJidXR0b25zLmxvYWRcIil9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5sb2FkXCIpfVxuICAgICAgICAgICAgaWNvbj17bG9hZH1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBsaWJyYXJ5LnVwZGF0ZUxpYnJhcnkoe1xuICAgICAgICAgICAgICAgICAgbGlicmFyeUl0ZW1zOiBmaWxlT3Blbih7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkV4Y2FsaWRyYXcgbGlicmFyeSBmaWxlc1wiLFxuICAgICAgICAgICAgICAgICAgICAvLyBUb0RvOiBCZSBvdmVyLXBlcm1pc3NpdmUgdW50aWwgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM0NDQyXG4gICAgICAgICAgICAgICAgICAgIC8vIGdldHMgcmVzb2x2ZWQuIEVsc2UsIGlPUyB1c2VycyBjYW5ub3Qgb3BlbiBgLmV4Y2FsaWRyYXdgIGZpbGVzLlxuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zOiBbXCIuanNvblwiLCBcIi5leGNhbGlkcmF3bGliXCJdLFxuICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBtZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG9wZW5MaWJyYXJ5TWVudTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlKHsgZXJyb3JNZXNzYWdlOiB0KFwiZXJyb3JzLmltcG9ydExpYnJhcnlFcnJvclwiKSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImxpYnJhcnktYWN0aW9ucy0tbG9hZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgeyEhaXRlbXMubGVuZ3RoICYmIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFRvb2xCdXR0b25cbiAgICAgICAgICAgICAga2V5PVwiZXhwb3J0XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRpdGxlPXt0KFwiYnV0dG9ucy5leHBvcnRcIil9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJidXR0b25zLmV4cG9ydFwiKX1cbiAgICAgICAgICAgICAgaWNvbj17ZXhwb3J0VG9GaWxlSWNvbn1cbiAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpYnJhcnlJdGVtcyA9IGl0ZW1zU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgID8gaXRlbXNcbiAgICAgICAgICAgICAgICAgIDogYXdhaXQgbGlicmFyeS5nZXRMYXRlc3RMaWJyYXJ5KCk7XG4gICAgICAgICAgICAgICAgc2F2ZUxpYnJhcnlBc0pTT04obGlicmFyeUl0ZW1zKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKG11dGVGU0Fib3J0RXJyb3IpXG4gICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlKHsgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImxpYnJhcnktYWN0aW9ucy0tZXhwb3J0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3NlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibGlicmFyeS1hY3Rpb25zLWNvdW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIHtzZWxlY3RlZEl0ZW1zLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1Rvb2xCdXR0b24+XG4gICAgICAgICAgICA8VG9vbEJ1dHRvblxuICAgICAgICAgICAgICBrZXk9XCJyZXNldFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB0aXRsZT17cmVzZXRMYWJlbH1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD17cmVzZXRMYWJlbH1cbiAgICAgICAgICAgICAgaWNvbj17dHJhc2h9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNob3dSZW1vdmVMaWJBbGVydCh0cnVlKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibGlicmFyeS1hY3Rpb25zLS1yZW1vdmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJsaWJyYXJ5LWFjdGlvbnMtY291bnRlclwiPlxuICAgICAgICAgICAgICAgICAge3NlbGVjdGVkSXRlbXMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvVG9vbEJ1dHRvbj5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgICAge2l0ZW1zU2VsZWN0ZWQgJiYgKFxuICAgICAgICAgIDxUb29sdGlwIGxhYmVsPXt0KFwiaGludHMucHVibGlzaExpYnJhcnlcIil9PlxuICAgICAgICAgICAgPFRvb2xCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJidXR0b25zLnB1Ymxpc2hMaWJyYXJ5XCIpfVxuICAgICAgICAgICAgICBsYWJlbD17dChcImJ1dHRvbnMucHVibGlzaExpYnJhcnlcIil9XG4gICAgICAgICAgICAgIGljb249e3B1Ymxpc2hJY29ufVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJsaWJyYXJ5LWFjdGlvbnMtLXB1Ymxpc2hcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXtvblB1Ymxpc2h9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHshZGV2aWNlLmlzTW9iaWxlICYmIDxsYWJlbD57dChcImJ1dHRvbnMucHVibGlzaExpYnJhcnlcIil9PC9sYWJlbD59XG4gICAgICAgICAgICAgIHtzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImxpYnJhcnktYWN0aW9ucy1jb3VudGVyXCI+XG4gICAgICAgICAgICAgICAgICB7c2VsZWN0ZWRJdGVtcy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9Ub29sQnV0dG9uPlxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgKX1cbiAgICAgICAge2RldmljZS5pc01vYmlsZSAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsaWJyYXJ5LW1lbnUtYnJvd3NlLWJ1dHRvbi0tbW9iaWxlXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBocmVmPXtgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfTElCUkFSWV9VUkx9P3RhcmdldD0ke1xuICAgICAgICAgICAgICAgIHdpbmRvdy5uYW1lIHx8IFwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgfSZyZWZlcnJlcj0ke3JlZmVycmVyfSZ1c2VIYXNoPXRydWUmdG9rZW49JHtpZH0mdGhlbWU9JHt0aGVtZX0mdmVyc2lvbj0ke1xuICAgICAgICAgICAgICAgIFZFUlNJT05TLmV4Y2FsaWRyYXdMaWJyYXJ5XG4gICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICB0YXJnZXQ9XCJfZXhjYWxpZHJhd19saWJyYXJpZXNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dChcImxhYmVscy5saWJyYXJpZXNcIil9XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IENFTExTX1BFUl9ST1cgPSBkZXZpY2UuaXNNb2JpbGUgJiYgIWRldmljZS5pc1NtU2NyZWVuID8gNiA6IDQ7XG5cbiAgY29uc3QgcmVmZXJyZXIgPVxuICAgIGxpYnJhcnlSZXR1cm5VcmwgfHwgd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcblxuICBjb25zdCBbbGFzdFNlbGVjdGVkSXRlbSwgc2V0TGFzdFNlbGVjdGVkSXRlbV0gPSB1c2VTdGF0ZTxcbiAgICBMaWJyYXJ5SXRlbVtcImlkXCJdIHwgbnVsbFxuICA+KG51bGwpO1xuXG4gIGNvbnN0IG9uSXRlbVNlbGVjdFRvZ2dsZSA9IChcbiAgICBpZDogTGlicmFyeUl0ZW1bXCJpZFwiXSxcbiAgICBldmVudDogUmVhY3QuTW91c2VFdmVudCxcbiAgKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkU2VsZWN0ID0gIXNlbGVjdGVkSXRlbXMuaW5jbHVkZXMoaWQpO1xuXG4gICAgY29uc3Qgb3JkZXJlZEl0ZW1zID0gWy4uLnVucHVibGlzaGVkSXRlbXMsIC4uLnB1Ymxpc2hlZEl0ZW1zXTtcblxuICAgIGlmIChzaG91bGRTZWxlY3QpIHtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiBsYXN0U2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSBvcmRlcmVkSXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmlkID09PSBsYXN0U2VsZWN0ZWRJdGVtLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByYW5nZUVuZCA9IG9yZGVyZWRJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKTtcblxuICAgICAgICBpZiAocmFuZ2VTdGFydCA9PT0gLTEgfHwgcmFuZ2VFbmQgPT09IC0xKSB7XG4gICAgICAgICAgb25TZWxlY3RJdGVtcyhbLi4uc2VsZWN0ZWRJdGVtcywgaWRdKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zTWFwID0gYXJyYXlUb01hcChzZWxlY3RlZEl0ZW1zKTtcbiAgICAgICAgY29uc3QgbmV4dFNlbGVjdGVkSWRzID0gb3JkZXJlZEl0ZW1zLnJlZHVjZShcbiAgICAgICAgICAoYWNjOiBMaWJyYXJ5SXRlbVtcImlkXCJdW10sIGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoaWR4ID49IHJhbmdlU3RhcnQgJiYgaWR4IDw9IHJhbmdlRW5kKSB8fFxuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTWFwLmhhcyhpdGVtLmlkKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGFjYy5wdXNoKGl0ZW0uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtdLFxuICAgICAgICApO1xuXG4gICAgICAgIG9uU2VsZWN0SXRlbXMobmV4dFNlbGVjdGVkSWRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uU2VsZWN0SXRlbXMoWy4uLnNlbGVjdGVkSXRlbXMsIGlkXSk7XG4gICAgICB9XG4gICAgICBzZXRMYXN0U2VsZWN0ZWRJdGVtKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0TGFzdFNlbGVjdGVkSXRlbShudWxsKTtcbiAgICAgIG9uU2VsZWN0SXRlbXMoc2VsZWN0ZWRJdGVtcy5maWx0ZXIoKF9pZCkgPT4gX2lkICE9PSBpZCkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRJbnNlcnRlZEVsZW1lbnRzID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgdGFyZ2V0RWxlbWVudHM7XG4gICAgaWYgKHNlbGVjdGVkSXRlbXMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICB0YXJnZXRFbGVtZW50cyA9IGxpYnJhcnlJdGVtcy5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIHNlbGVjdGVkSXRlbXMuaW5jbHVkZXMoaXRlbS5pZCksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRFbGVtZW50cyA9IGxpYnJhcnlJdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldEVsZW1lbnRzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUxpYnJhcnlJdGVtQ29tcG8gPSAocGFyYW1zOiB7XG4gICAgaXRlbTpcbiAgICAgIHwgTGlicmFyeUl0ZW1cbiAgICAgIHwgLyogcGVuZGluZyBsaWJyYXJ5IGl0ZW0gKi8ge1xuICAgICAgICAgIGlkOiBudWxsO1xuICAgICAgICAgIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuICAgICAgICB9XG4gICAgICB8IG51bGw7XG4gICAgb25DbGljaz86ICgpID0+IHZvaWQ7XG4gICAga2V5OiBzdHJpbmc7XG4gIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0YWNrLkNvbCBrZXk9e3BhcmFtcy5rZXl9PlxuICAgICAgICA8TGlicmFyeVVuaXRcbiAgICAgICAgICBlbGVtZW50cz17cGFyYW1zLml0ZW0/LmVsZW1lbnRzfVxuICAgICAgICAgIGZpbGVzPXtmaWxlc31cbiAgICAgICAgICBpc1BlbmRpbmc9eyFwYXJhbXMuaXRlbT8uaWQgJiYgISFwYXJhbXMuaXRlbT8uZWxlbWVudHN9XG4gICAgICAgICAgb25DbGljaz17cGFyYW1zLm9uQ2xpY2sgfHwgKCgpID0+IHt9KX1cbiAgICAgICAgICBpZD17cGFyYW1zLml0ZW0/LmlkIHx8IG51bGx9XG4gICAgICAgICAgc2VsZWN0ZWQ9eyEhcGFyYW1zLml0ZW0/LmlkICYmIHNlbGVjdGVkSXRlbXMuaW5jbHVkZXMocGFyYW1zLml0ZW0uaWQpfVxuICAgICAgICAgIG9uVG9nZ2xlPXtvbkl0ZW1TZWxlY3RUb2dnbGV9XG4gICAgICAgICAgb25EcmFnPXsoaWQsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcbiAgICAgICAgICAgICAgTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliLFxuICAgICAgICAgICAgICBzZXJpYWxpemVMaWJyYXJ5QXNKU09OKGdldEluc2VydGVkRWxlbWVudHMoaWQpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgIDwvU3RhY2suQ29sPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyTGlicmFyeVNlY3Rpb24gPSAoXG4gICAgaXRlbXM6IChcbiAgICAgIHwgTGlicmFyeUl0ZW1cbiAgICAgIHwgLyogcGVuZGluZyBsaWJyYXJ5IGl0ZW0gKi8ge1xuICAgICAgICAgIGlkOiBudWxsO1xuICAgICAgICAgIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuICAgICAgICB9XG4gICAgKVtdLFxuICApID0+IHtcbiAgICBjb25zdCBfaXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLmlkKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMaWJyYXJ5SXRlbUNvbXBvKHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IG9uSW5zZXJ0TGlicmFyeUl0ZW1zKGdldEluc2VydGVkRWxlbWVudHMoaXRlbS5pZCkpLFxuICAgICAgICAgIGtleTogaXRlbS5pZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlTGlicmFyeUl0ZW1Db21wbyh7XG4gICAgICAgIGtleTogXCJfX3BlbmRpbmdfX2l0ZW1fX1wiLFxuICAgICAgICBpdGVtLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiBvbkFkZFRvTGlicmFyeShwZW5kaW5nRWxlbWVudHMpLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBlbnN1cmUgd2UgcmVuZGVyIGFsbCBlbXB0eSBjZWxscyBpZiBubyBpdGVtcyBhcmUgcHJlc2VudFxuICAgIGxldCByb3dzID0gY2h1bmsoX2l0ZW1zLCBDRUxMU19QRVJfUk9XKTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICByb3dzID0gW1tdXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvd0l0ZW1zLCBpbmRleCwgcm93cykgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSByb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgLy8gcGFkIHJvdyB3aXRoIGVtcHR5IGNlbGxzXG4gICAgICAgIHJvd0l0ZW1zID0gcm93SXRlbXMuY29uY2F0KFxuICAgICAgICAgIG5ldyBBcnJheShDRUxMU19QRVJfUk9XIC0gcm93SXRlbXMubGVuZ3RoKVxuICAgICAgICAgICAgLmZpbGwobnVsbClcbiAgICAgICAgICAgIC5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVMaWJyYXJ5SXRlbUNvbXBvKHtcbiAgICAgICAgICAgICAgICBrZXk6IGBlbXB0eV8ke2luZGV4fWAsXG4gICAgICAgICAgICAgICAgaXRlbTogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdGFjay5Sb3cgYWxpZ249XCJjZW50ZXJcIiBnYXA9ezF9IGtleT17aW5kZXh9PlxuICAgICAgICAgIHtyb3dJdGVtc31cbiAgICAgICAgPC9TdGFjay5Sb3c+XG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHVucHVibGlzaGVkSXRlbXMgPSBsaWJyYXJ5SXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiBpdGVtLnN0YXR1cyAhPT0gXCJwdWJsaXNoZWRcIixcbiAgKTtcbiAgY29uc3QgcHVibGlzaGVkSXRlbXMgPSBsaWJyYXJ5SXRlbXMuZmlsdGVyKFxuICAgIChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gXCJwdWJsaXNoZWRcIixcbiAgKTtcblxuICBjb25zdCByZW5kZXJMaWJyYXJ5SGVhZGVyID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxheWVyLXVpX19saWJyYXJ5LWhlYWRlclwiIGtleT1cImxpYnJhcnktaGVhZGVyXCI+XG4gICAgICAgICAge3JlbmRlckxpYnJhcnlBY3Rpb25zKCl9XG4gICAgICAgICAge2RldmljZS5jYW5EZXZpY2VGaXRTaWRlYmFyICYmIChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGF5ZXItdWlfX3NpZGViYXItbG9jay1idXR0b25cIj5cbiAgICAgICAgICAgICAgICA8U2lkZWJhckxvY2tCdXR0b25cbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2FwcFN0YXRlLmlzTGlicmFyeU1lbnVEb2NrZWR9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiLmxheWVyLXVpX193cmFwcGVyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgPy5jbGFzc0xpc3QuYWRkKFwiYW5pbWF0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gIWFwcFN0YXRlLmlzTGlicmFyeU1lbnVEb2NrZWQ7XG4gICAgICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICBpc0xpYnJhcnlNZW51RG9ja2VkOiBuZXh0U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cmFja0V2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgIFwibGlicmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGB0b2dnbGVMaWJyYXJ5RG9jayAoJHtuZXh0U3RhdGUgPyBcImRvY2tcIiA6IFwidW5kb2NrXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgYHNpZGViYXIgKCR7ZGV2aWNlLmlzTW9iaWxlID8gXCJtb2JpbGVcIiA6IFwiZGVza3RvcFwifSlgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgICAgeyFkZXZpY2UuaXNNb2JpbGUgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJUb29sSWNvbl9faWNvbl9fY2xvc2VcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIk1vZGFsX19jbG9zZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaXNMaWJyYXJ5T3BlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5jbG9zZVwiKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtjbG9zZX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyTGlicmFyeU1lbnVJdGVtcyA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0YWNrLkNvbFxuICAgICAgICBjbGFzc05hbWU9XCJsaWJyYXJ5LW1lbnUtaXRlbXMtY29udGFpbmVyX19pdGVtc1wiXG4gICAgICAgIGFsaWduPVwic3RhcnRcIlxuICAgICAgICBnYXA9ezF9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgZmxleDogcHVibGlzaGVkSXRlbXMubGVuZ3RoID4gMCA/IDEgOiBcIjAgMSBhdXRvXCIsXG4gICAgICAgICAgbWFyZ2luQm90dG9tOiAwLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VwYXJhdG9yXCI+XG4gICAgICAgICAgICB7KHBlbmRpbmdFbGVtZW50cy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgIHVucHVibGlzaGVkSXRlbXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICBwdWJsaXNoZWRJdGVtcy5sZW5ndGggPiAwKSAmJiAoXG4gICAgICAgICAgICAgIDxkaXY+e3QoXCJsYWJlbHMucGVyc29uYWxMaWJcIil9PC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2lzTG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCJhdXRvXCIsXG4gICAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogXCIxcmVtXCIsXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDJweClcIiB9fT5cbiAgICAgICAgICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7IXBlbmRpbmdFbGVtZW50cy5sZW5ndGggJiYgIXVucHVibGlzaGVkSXRlbXMubGVuZ3RoID8gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGhlaWdodDogNjUsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIuOXJlbVwiLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dChcImxpYnJhcnkubm9JdGVtc1wiKX1cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBtYXJnaW46IFwiLjZyZW0gMFwiLFxuICAgICAgICAgICAgICAgICAgZm9udFNpemU6IFwiLjhlbVwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiNzAlXCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtwdWJsaXNoZWRJdGVtcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICA/IHQoXCJsaWJyYXJ5LmhpbnRfZW1wdHlQcml2YXRlTGlicmFyeVwiKVxuICAgICAgICAgICAgICAgICAgOiB0KFwibGlicmFyeS5oaW50X2VtcHR5TGlicmFyeVwiKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgcmVuZGVyTGlicmFyeVNlY3Rpb24oW1xuICAgICAgICAgICAgICAvLyBhcHBlbmQgcGVuZGluZyBsaWJyYXJ5IGl0ZW1cbiAgICAgICAgICAgICAgLi4uKHBlbmRpbmdFbGVtZW50cy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IFt7IGlkOiBudWxsLCBlbGVtZW50czogcGVuZGluZ0VsZW1lbnRzIH1dXG4gICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgIC4uLnVucHVibGlzaGVkSXRlbXMsXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICl9XG4gICAgICAgIDwvPlxuXG4gICAgICAgIDw+XG4gICAgICAgICAgeyhwdWJsaXNoZWRJdGVtcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAoIWRldmljZS5pc01vYmlsZSAmJlxuICAgICAgICAgICAgICAocGVuZGluZ0VsZW1lbnRzLmxlbmd0aCA+IDAgfHwgdW5wdWJsaXNoZWRJdGVtcy5sZW5ndGggPiAwKSkpICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VwYXJhdG9yXCI+e3QoXCJsYWJlbHMuZXhjYWxpZHJhd0xpYlwiKX08L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtwdWJsaXNoZWRJdGVtcy5sZW5ndGggPiAwID8gKFxuICAgICAgICAgICAgcmVuZGVyTGlicmFyeVNlY3Rpb24ocHVibGlzaGVkSXRlbXMpXG4gICAgICAgICAgKSA6IHVucHVibGlzaGVkSXRlbXMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMXJlbSAwXCIsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIuOXJlbVwiLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dChcImxpYnJhcnkubm9JdGVtc1wiKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8Lz5cbiAgICAgIDwvU3RhY2suQ29sPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyTGlicmFyeUZvb3RlciA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGFcbiAgICAgICAgY2xhc3NOYW1lPVwibGlicmFyeS1tZW51LWJyb3dzZS1idXR0b25cIlxuICAgICAgICBocmVmPXtgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfTElCUkFSWV9VUkx9P3RhcmdldD0ke1xuICAgICAgICAgIHdpbmRvdy5uYW1lIHx8IFwiX2JsYW5rXCJcbiAgICAgICAgfSZyZWZlcnJlcj0ke3JlZmVycmVyfSZ1c2VIYXNoPXRydWUmdG9rZW49JHtpZH0mdGhlbWU9JHt0aGVtZX0mdmVyc2lvbj0ke1xuICAgICAgICAgIFZFUlNJT05TLmV4Y2FsaWRyYXdMaWJyYXJ5XG4gICAgICAgIH1gfVxuICAgICAgICB0YXJnZXQ9XCJfZXhjYWxpZHJhd19saWJyYXJpZXNcIlxuICAgICAgPlxuICAgICAgICB7dChcImxhYmVscy5saWJyYXJpZXNcIil9XG4gICAgICA8L2E+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImxpYnJhcnktbWVudS1pdGVtcy1jb250YWluZXJcIlxuICAgICAgc3R5bGU9e1xuICAgICAgICBkZXZpY2UuaXNNb2JpbGVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiBcIjIwMHB4XCIsXG4gICAgICAgICAgICAgIG1heEhlaWdodDogXCI3MHZoXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICA+XG4gICAgICB7c2hvd1JlbW92ZUxpYkFsZXJ0ICYmIHJlbmRlclJlbW92ZUxpYkFsZXJ0KCl9XG4gICAgICB7cmVuZGVyTGlicmFyeUhlYWRlcigpfVxuICAgICAge3JlbmRlckxpYnJhcnlNZW51SXRlbXMoKX1cbiAgICAgIHshZGV2aWNlLmlzTW9iaWxlICYmIHJlbmRlckxpYnJhcnlGb290ZXIoKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExpYnJhcnlNZW51SXRlbXM7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/LibraryMenuItems.tsx\n");
2159
2159
 
2160
2160
  /***/ }),
2161
2161
 
@@ -2936,7 +2936,7 @@ eval("\r\nmodule.exports = function (item) {\r\n var content = item[1];\r\n
2936
2936
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2937
2937
 
2938
2938
  "use strict";
2939
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\r\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\r\n /* eslint-disable */\r\n /* global __webpack_public_path__:writable */\r\n __webpack_require__.p =\r\n window.EXCALIDRAW_ASSET_PATH ||\r\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.3.69\"}/dist/`;\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLG9CQUFvQixJQUFJLFFBQXVCLFFBQVEsQ0FBQztDQUNoRiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3B1YmxpY1BhdGguanM/YTg3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlYgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IEVOVi5URVNUKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9XG4gICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfS9kaXN0L2A7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./publicPath.js\n");
2939
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\r\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\r\n /* eslint-disable */\r\n /* global __webpack_public_path__:writable */\r\n __webpack_require__.p =\r\n window.EXCALIDRAW_ASSET_PATH ||\r\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.3.70\"}/dist/`;\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLG9CQUFvQixJQUFJLFFBQXVCLFFBQVEsQ0FBQztDQUNoRiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3B1YmxpY1BhdGguanM/YTg3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlYgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IEVOVi5URVNUKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9XG4gICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfS9kaXN0L2A7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./publicPath.js\n");
2940
2940
 
2941
2941
  /***/ }),
2942
2942
 
@@ -3046,7 +3046,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3046
3046
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3047
3047
 
3048
3048
  "use strict";
3049
- 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 renderScrollbars: false,\r\n renderSelection: false,\r\n renderGrid: false,\r\n isExporting: 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.resolve(/*! import() */).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 // initialize 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 let assetPath = \"https://excalidraw.com/\";\r\n // Asset path needs to be determined only when using package\r\n if (true) {\r\n assetPath =\r\n window.EXCALIDRAW_ASSET_PATH ||\r\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.3.69\"}`;\r\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\r\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\r\n }\r\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\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,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dC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZShlbGVtZW50cywgYXBwU3RhdGUsIG51bGwsIHNjYWxlLCByb3VnaC5jYW52YXMoY2FudmFzKSwgY2FudmFzLCB7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBzY3JvbGxZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHt9LFxuICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICBpbWFnZUNhY2hlLFxuICAgIHJlbmRlclNjcm9sbGJhcnM6IGZhbHNlLFxuICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgaXNFeHBvcnRpbmc6IHRydWUsXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4pOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmUsXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi8gXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKVxuICAgICAgKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGU+XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiVmlyZ2lsXCI7XG4gICAgICAgIHNyYzogdXJsKFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCJodHRwczovL2V4Y2FsaWRyYXcuY29tL0Nhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
3049
+ 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 renderScrollbars: false,\r\n renderSelection: false,\r\n renderGrid: false,\r\n isExporting: 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.resolve(/*! import() */).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 // initialize 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 let assetPath = \"https://excalidraw.com/\";\r\n // Asset path needs to be determined only when using package\r\n if (true) {\r\n assetPath =\r\n window.EXCALIDRAW_ASSET_PATH ||\r\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.3.70\"}`;\r\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\r\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\r\n }\r\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\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,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dC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZShlbGVtZW50cywgYXBwU3RhdGUsIG51bGwsIHNjYWxlLCByb3VnaC5jYW52YXMoY2FudmFzKSwgY2FudmFzLCB7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBzY3JvbGxZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHt9LFxuICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICBpbWFnZUNhY2hlLFxuICAgIHJlbmRlclNjcm9sbGJhcnM6IGZhbHNlLFxuICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgaXNFeHBvcnRpbmc6IHRydWUsXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4pOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmUsXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi8gXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKVxuICAgICAgKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGU+XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiVmlyZ2lsXCI7XG4gICAgICAgIHNyYzogdXJsKFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCJodHRwczovL2V4Y2FsaWRyYXcuY29tL0Nhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
3050
3050
 
3051
3051
  /***/ }),
3052
3052
 
@@ -3134,7 +3134,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3134
3134
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3135
3135
 
3136
3136
  "use strict";
3137
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements)\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 _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\r\n\r\n\r\n\r\n\r\nlet mockDateTime = null;\r\nconst setDateTimeForTests = (dateTime) => {\r\n mockDateTime = dateTime;\r\n};\r\nconst getDateTime = () => {\r\n if (mockDateTime) {\r\n return mockDateTime;\r\n }\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\r\n const day = `${date.getDate()}`.padStart(2, \"0\");\r\n const hr = `${date.getHours()}`.padStart(2, \"0\");\r\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\r\n return `${year}-${month}-${day}-${hr}${min}`;\r\n};\r\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\r\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\r\n target instanceof HTMLBRElement || // newline in wysiwyg\r\n target instanceof HTMLInputElement ||\r\n target instanceof HTMLTextAreaElement ||\r\n target instanceof HTMLSelectElement;\r\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\r\n target instanceof HTMLBRElement || // newline in wysiwyg\r\n target instanceof HTMLTextAreaElement ||\r\n (target instanceof HTMLInputElement &&\r\n (target.type === \"text\" || target.type === \"number\"));\r\nconst getFontFamilyString = ({ fontFamily, }) => {\r\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\r\n if (id === fontFamily) {\r\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\r\n }\r\n }\r\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\r\n};\r\n/** returns fontSize+fontFamily string for assignment to DOM elements */\r\nconst getFontString = ({ fontSize, fontFamily, }) => {\r\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\r\n};\r\nconst debounce = (fn, timeout) => {\r\n let handle = 0;\r\n let lastArgs = null;\r\n const ret = (...args) => {\r\n lastArgs = args;\r\n clearTimeout(handle);\r\n handle = window.setTimeout(() => {\r\n lastArgs = null;\r\n fn(...args);\r\n }, timeout);\r\n };\r\n ret.flush = () => {\r\n clearTimeout(handle);\r\n if (lastArgs) {\r\n const _lastArgs = lastArgs;\r\n lastArgs = null;\r\n fn(..._lastArgs);\r\n }\r\n };\r\n ret.cancel = () => {\r\n lastArgs = null;\r\n clearTimeout(handle);\r\n };\r\n return ret;\r\n};\r\n// throttle callback to execute once per animation frame\r\nconst throttleRAF = (fn) => {\r\n let handle = null;\r\n let lastArgs = null;\r\n let callback = null;\r\n const ret = (...args) => {\r\n if (false) {}\r\n lastArgs = args;\r\n callback = fn;\r\n if (handle === null) {\r\n handle = window.requestAnimationFrame(() => {\r\n handle = null;\r\n lastArgs = null;\r\n callback = null;\r\n fn(...args);\r\n });\r\n }\r\n };\r\n ret.flush = () => {\r\n if (handle !== null) {\r\n cancelAnimationFrame(handle);\r\n handle = null;\r\n }\r\n if (lastArgs) {\r\n const _lastArgs = lastArgs;\r\n const _callback = callback;\r\n lastArgs = null;\r\n callback = null;\r\n if (_callback !== null) {\r\n _callback(..._lastArgs);\r\n }\r\n }\r\n };\r\n ret.cancel = () => {\r\n lastArgs = null;\r\n callback = null;\r\n if (handle !== null) {\r\n cancelAnimationFrame(handle);\r\n handle = null;\r\n }\r\n };\r\n return ret;\r\n};\r\n// https://github.com/lodash/lodash/blob/es/chunk.js\r\nconst chunk = (array, size) => {\r\n if (!array.length || size < 1) {\r\n return [];\r\n }\r\n let index = 0;\r\n let resIndex = 0;\r\n const result = Array(Math.ceil(array.length / size));\r\n while (index < array.length) {\r\n result[resIndex++] = array.slice(index, (index += size));\r\n }\r\n return result;\r\n};\r\nconst selectNode = (node) => {\r\n const selection = window.getSelection();\r\n if (selection) {\r\n const range = document.createRange();\r\n range.selectNodeContents(node);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n};\r\nconst removeSelection = () => {\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n }\r\n};\r\nconst distance = (x, y) => Math.abs(x - y);\r\nconst updateActiveTool = (appState, data) => {\r\n if (data.type === \"custom\") {\r\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\r\n }\r\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\r\n ? appState.activeTool.lastActiveToolBeforeEraser\r\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\r\n};\r\nconst resetCursor = (canvas) => {\r\n if (canvas) {\r\n canvas.style.cursor = \"\";\r\n }\r\n};\r\nconst setCursor = (canvas, cursor) => {\r\n if (canvas) {\r\n canvas.style.cursor = cursor;\r\n }\r\n};\r\nlet eraserCanvasCache;\r\nlet previewDataURL;\r\nconst setEraserCursor = (canvas, theme) => {\r\n const cursorImageSizePx = 20;\r\n const drawCanvas = () => {\r\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\r\n eraserCanvasCache = document.createElement(\"canvas\");\r\n eraserCanvasCache.theme = theme;\r\n eraserCanvasCache.height = cursorImageSizePx;\r\n eraserCanvasCache.width = cursorImageSizePx;\r\n const context = eraserCanvasCache.getContext(\"2d\");\r\n context.lineWidth = 1;\r\n context.beginPath();\r\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\r\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n context.fill();\r\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\r\n context.stroke();\r\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\r\n };\r\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\r\n drawCanvas();\r\n }\r\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\r\n};\r\nconst setCursorForShape = (canvas, appState) => {\r\n if (!canvas) {\r\n return;\r\n }\r\n if (appState.activeTool.type === \"selection\") {\r\n resetCursor(canvas);\r\n }\r\n else if (appState.activeTool.type === \"eraser\") {\r\n setEraserCursor(canvas, appState.theme);\r\n // do nothing if image tool is selected which suggests there's\r\n // a image-preview set as the cursor\r\n // Ignore custom type as well and let host decide\r\n }\r\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\r\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\r\n }\r\n};\r\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\r\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\r\nconst exitFullScreen = () => document.exitFullscreen();\r\nconst getShortcutKey = (shortcut) => {\r\n shortcut = shortcut\r\n .replace(/\\bAlt\\b/i, \"Alt\")\r\n .replace(/\\bShift\\b/i, \"Shift\")\r\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\r\n .replace(/\\bDel\\b/i, \"Delete\");\r\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\r\n return shortcut\r\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\r\n .replace(/\\bAlt\\b/i, \"Option\");\r\n }\r\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\r\n};\r\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\r\n const invScale = 1 / zoom.value;\r\n const x = (clientX - offsetLeft) * invScale - scrollX;\r\n const y = (clientY - offsetTop) * invScale - scrollY;\r\n return { x, y };\r\n};\r\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\r\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\r\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\r\n return { x, y };\r\n};\r\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\r\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\r\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\r\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\r\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\r\n/**\r\n * Checks whether first directional character is RTL. Meaning whether it starts\r\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\r\n * RTL.\r\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\r\n */\r\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\r\nconst tupleToCoors = (xyTuple) => {\r\n const [x, y] = xyTuple;\r\n return { x, y };\r\n};\r\n/** use as a rejectionHandler to mute filesystem Abort errors */\r\nconst muteFSAbortError = (error) => {\r\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\r\n console.warn(error);\r\n return;\r\n }\r\n throw error;\r\n};\r\nconst findIndex = (array, cb, fromIndex = 0) => {\r\n if (fromIndex < 0) {\r\n fromIndex = array.length + fromIndex;\r\n }\r\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\r\n let index = fromIndex - 1;\r\n while (++index < array.length) {\r\n if (cb(array[index], index, array)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n};\r\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\r\n if (fromIndex < 0) {\r\n fromIndex = array.length + fromIndex;\r\n }\r\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\r\n let index = fromIndex + 1;\r\n while (--index > -1) {\r\n if (cb(array[index], index, array)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n};\r\nconst isTransparent = (color) => {\r\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\r\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\r\n return (isRGBTransparent ||\r\n isRRGGBBTransparent ||\r\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\r\n};\r\nconst resolvablePromise = () => {\r\n let resolve;\r\n let reject;\r\n const promise = new Promise((_resolve, _reject) => {\r\n resolve = _resolve;\r\n reject = _reject;\r\n });\r\n promise.resolve = resolve;\r\n promise.reject = reject;\r\n return promise;\r\n};\r\n/**\r\n * @param func handler taking at most single parameter (event).\r\n */\r\nconst withBatchedUpdates = (func) => ((event) => {\r\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\r\n});\r\n/**\r\n * barches React state updates and throttles the calls to a single call per\r\n * animation frame\r\n */\r\nconst withBatchedUpdatesThrottled = (func) => {\r\n // @ts-ignore\r\n return throttleRAF(((event) => {\r\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\r\n }));\r\n};\r\n//https://stackoverflow.com/a/9462382/8418\r\nconst nFormatter = (num, digits) => {\r\n const si = [\r\n { value: 1, symbol: \"b\" },\r\n { value: 1e3, symbol: \"k\" },\r\n { value: 1e6, symbol: \"M\" },\r\n { value: 1e9, symbol: \"G\" },\r\n ];\r\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\r\n let index;\r\n for (index = si.length - 1; index > 0; index--) {\r\n if (num >= si[index].value) {\r\n break;\r\n }\r\n }\r\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\r\n};\r\nconst getVersion = () => {\r\n var _a;\r\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\r\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\r\n};\r\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\r\nconst supportsEmoji = () => {\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n return false;\r\n }\r\n const offset = 12;\r\n ctx.fillStyle = \"#f00\";\r\n ctx.textBaseline = \"top\";\r\n ctx.font = \"32px Arial\";\r\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\r\n // Luckily 😀 isn't supported.\r\n ctx.fillText(\"😀\", 0, 0);\r\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\r\n};\r\nconst getNearestScrollableContainer = (element) => {\r\n let parent = element.parentElement;\r\n while (parent) {\r\n if (parent === document.body) {\r\n return document;\r\n }\r\n const { overflowY } = window.getComputedStyle(parent);\r\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\r\n if (hasScrollableContent &&\r\n (overflowY === \"auto\" ||\r\n overflowY === \"scroll\" ||\r\n overflowY === \"overlay\")) {\r\n return parent;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return document;\r\n};\r\nconst focusNearestParent = (element) => {\r\n let parent = element.parentElement;\r\n while (parent) {\r\n if (parent.tabIndex > -1) {\r\n parent.focus();\r\n return;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n};\r\nconst preventUnload = (event) => {\r\n event.preventDefault();\r\n // NOTE: modern browsers no longer allow showing a custom message here\r\n event.returnValue = \"\";\r\n};\r\nconst bytesToHexString = (bytes) => {\r\n return Array.from(bytes)\r\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\r\n .join(\"\");\r\n};\r\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\r\n/**\r\n * Transforms array of objects containing `id` attribute,\r\n * or array of ids (strings), into a Map, keyd by `id`.\r\n */\r\nconst arrayToMap = (items) => {\r\n return items.reduce((acc, element) => {\r\n acc.set(typeof element === \"string\" ? element : element.id, element);\r\n return acc;\r\n }, new Map());\r\n};\r\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.69\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\r\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.69\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\r\nconst wrapEvent = (name, nativeEvent) => {\r\n return new CustomEvent(name, {\r\n detail: {\r\n nativeEvent,\r\n },\r\n cancelable: true,\r\n });\r\n};\r\nconst updateObject = (obj, updates) => {\r\n let didChange = false;\r\n for (const key in updates) {\r\n const value = updates[key];\r\n if (typeof value !== \"undefined\") {\r\n if (obj[key] === value &&\r\n // if object, always update because its attrs could have changed\r\n (typeof value !== \"object\" || value === null)) {\r\n continue;\r\n }\r\n didChange = true;\r\n }\r\n }\r\n if (!didChange) {\r\n return obj;\r\n }\r\n return Object.assign(Object.assign({}, obj), updates);\r\n};\r\nconst isPrimitive = (val) => {\r\n const type = typeof val;\r\n return val == null || (type !== \"object\" && type !== \"function\");\r\n};\r\nconst getFrame = () => {\r\n try {\r\n return window.self === window.top ? \"top\" : \"iframe\";\r\n }\r\n catch (error) {\r\n return \"iframe\";\r\n }\r\n};\r\nconst isPromiseLike = (value) => {\r\n return (!!value &&\r\n typeof value === \"object\" &&\r\n \"then\" in value &&\r\n \"catch\" in value &&\r\n \"finally\" in value);\r\n};\r\nconst queryFocusableElements = (container) => {\r\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\r\n return focusableElements\r\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\r\n : [];\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztLQUN0RDtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxDQUMzQixLQUFVLEVBQ3NDLEVBQUU7SUFDbEQsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1FBQ1AsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixNQUFNLElBQUksS0FBSztRQUNmLE9BQU8sSUFBSSxLQUFLO1FBQ2hCLFNBQVMsSUFBSSxLQUFLLENBQ25CLENBQUM7QUFDSixDQUFDLENBQUM7QUFFSyxNQUFNLHNCQUFzQixHQUFHLENBQUMsU0FBNkIsRUFBRSxFQUFFO0lBQ3RFLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLGdCQUFnQixDQUNuRCxvRUFBb0UsQ0FDckUsQ0FBQztJQUVGLE9BQU8saUJBQWlCO1FBQ3RCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ1YsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFFLE9BQTRCLENBQUMsUUFBUSxDQUNuRTtRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/NzYzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcblxuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7XG4gIENVUlNPUl9UWVBFLFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIEVWRU5ULFxuICBGT05UX0ZBTUlMWSxcbiAgTUlNRV9UWVBFUyxcbiAgVEhFTUUsXG4gIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGb250RmFtaWx5VmFsdWVzLCBGb250U3RyaW5nIH0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIERhdGFVUkwsIExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyLCBab29tIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgaXNEYXJ3aW4gfSBmcm9tIFwiLi9rZXlzXCI7XG5pbXBvcnQgeyBTSEFQRVMgfSBmcm9tIFwiLi9zaGFwZXNcIjtcblxubGV0IG1vY2tEYXRlVGltZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBjb25zdCBzZXREYXRlVGltZUZvclRlc3RzID0gKGRhdGVUaW1lOiBzdHJpbmcpID0+IHtcbiAgbW9ja0RhdGVUaW1lID0gZGF0ZVRpbWU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0ZVRpbWUgPSAoKSA9PiB7XG4gIGlmIChtb2NrRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gbW9ja0RhdGVUaW1lO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgZGF5ID0gYCR7ZGF0ZS5nZXREYXRlKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGhyID0gYCR7ZGF0ZS5nZXRIb3VycygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBtaW4gPSBgJHtkYXRlLmdldE1pbnV0ZXMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblxuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9LSR7aHJ9JHttaW59YDtcbn07XG5cbmV4cG9ydCBjb25zdCBjYXBpdGFsaXplU3RyaW5nID0gKHN0cjogc3RyaW5nKSA9PlxuICBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG5cbmV4cG9ydCBjb25zdCBpc1Rvb2xJY29uID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXMgSFRNTEVsZW1lbnQgPT5cbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmNsYXNzTmFtZS5pbmNsdWRlcyhcIlRvb2xJY29uXCIpO1xuXG5leHBvcnQgY29uc3QgaXNJbnB1dExpa2UgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTFNlbGVjdEVsZW1lbnRcbiAgfCBIVE1MQlJFbGVtZW50XG4gIHwgSFRNTERpdkVsZW1lbnQgPT5cbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiKSB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQ7XG5cbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRWxlbWVudCA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MQlJFbGVtZW50XG4gIHwgSFRNTERpdkVsZW1lbnQgPT5cbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiKSB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgKHRhcmdldC50eXBlID09PSBcInRleHRcIiB8fCB0YXJnZXQudHlwZSA9PT0gXCJudW1iZXJcIikpO1xuXG5leHBvcnQgY29uc3QgZ2V0Rm9udEZhbWlseVN0cmluZyA9ICh7XG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIGZvciAoY29uc3QgW2ZvbnRGYW1pbHlTdHJpbmcsIGlkXSBvZiBPYmplY3QuZW50cmllcyhGT05UX0ZBTUlMWSkpIHtcbiAgICBpZiAoaWQgPT09IGZvbnRGYW1pbHkpIHtcbiAgICAgIHJldHVybiBgJHtmb250RmFtaWx5U3RyaW5nfSwgJHtXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlR9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVDtcbn07XG5cbi8qKiByZXR1cm5zIGZvbnRTaXplK2ZvbnRGYW1pbHkgc3RyaW5nIGZvciBhc3NpZ25tZW50IHRvIERPTSBlbGVtZW50cyAqL1xuZXhwb3J0IGNvbnN0IGdldEZvbnRTdHJpbmcgPSAoe1xuICBmb250U2l6ZSxcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udFNpemU6IG51bWJlcjtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgcmV0dXJuIGAke2ZvbnRTaXplfXB4ICR7Z2V0Rm9udEZhbWlseVN0cmluZyh7IGZvbnRGYW1pbHkgfSl9YCBhcyBGb250U3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgdGltZW91dDogbnVtYmVyLFxuKSA9PiB7XG4gIGxldCBoYW5kbGUgPSAwO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaGFuZGxlID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgfSwgdGltZW91dCk7XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGNvbnN0IF9sYXN0QXJncyA9IGxhc3RBcmdzO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uX2xhc3RBcmdzKTtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufTtcblxuLy8gdGhyb3R0bGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBvbmNlIHBlciBhbmltYXRpb24gZnJhbWVcbmV4cG9ydCBjb25zdCB0aHJvdHRsZVJBRiA9IDxUIGV4dGVuZHMgYW55W10+KGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCkgPT4ge1xuICBsZXQgaGFuZGxlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGxldCBjYWxsYmFjazogKCguLi5hcmdzOiBUKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgY2FsbGJhY2sgPSBmbjtcbiAgICBpZiAoaGFuZGxlID09PSBudWxsKSB7XG4gICAgICBoYW5kbGUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgaGFuZGxlID0gbnVsbDtcbiAgICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgaWYgKGhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlKTtcbiAgICAgIGhhbmRsZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBjb25zdCBfY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGNhbGxiYWNrID0gbnVsbDtcbiAgICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgX2NhbGxiYWNrKC4uLl9sYXN0QXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjYWxsYmFjayA9IG51bGw7XG4gICAgaWYgKGhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlKTtcbiAgICAgIGhhbmRsZSA9IG51bGw7XG4gICAgfVxuICB9O1xuICByZXR1cm4gcmV0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9lcy9jaHVuay5qc1xuZXhwb3J0IGNvbnN0IGNodW5rID0gPFQgZXh0ZW5kcyBhbnk+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBzaXplOiBudW1iZXIsXG4pOiBUW11bXSA9PiB7XG4gIGlmICghYXJyYXkubGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCByZXNJbmRleCA9IDA7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSk7XG4gIHdoaWxlIChpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGFycmF5LnNsaWNlKGluZGV4LCAoaW5kZXggKz0gc2l6ZSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0Tm9kZSA9IChub2RlOiBFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3Rpb24gPSAoKSA9PiB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBNYXRoLmFicyh4IC0geSk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY3RpdmVUb29sID0gKFxuICBhcHBTdGF0ZTogUGljazxBcHBTdGF0ZSwgXCJhY3RpdmVUb29sXCI+LFxuICBkYXRhOiAoXG4gICAgfCB7IHR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdIHwgXCJlcmFzZXJcIiB9XG4gICAgfCB7IHR5cGU6IFwiY3VzdG9tXCI7IGN1c3RvbVR5cGU6IHN0cmluZyB9XG4gICkgJiB7IGxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyPzogTGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIgfSxcbik6IEFwcFN0YXRlW1wiYWN0aXZlVG9vbFwiXSA9PiB7XG4gIGlmIChkYXRhLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXBwU3RhdGUuYWN0aXZlVG9vbCxcbiAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICBjdXN0b21UeXBlOiBkYXRhLmN1c3RvbVR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uYXBwU3RhdGUuYWN0aXZlVG9vbCxcbiAgICBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcjpcbiAgICAgIGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGFwcFN0YXRlLmFjdGl2ZVRvb2wubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXJcbiAgICAgICAgOiBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyLFxuICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICBjdXN0b21UeXBlOiBudWxsLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gXCJcIjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCwgY3Vyc29yOiBzdHJpbmcpID0+IHtcbiAgaWYgKGNhbnZhcykge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XG4gIH1cbn07XG5cbmxldCBlcmFzZXJDYW52YXNDYWNoZTogYW55O1xubGV0IHByZXZpZXdEYXRhVVJMOiBzdHJpbmc7XG5leHBvcnQgY29uc3Qgc2V0RXJhc2VyQ3Vyc29yID0gKFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgdGhlbWU6IEFwcFN0YXRlW1widGhlbWVcIl0sXG4pID0+IHtcbiAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSAyMDtcblxuICBjb25zdCBkcmF3Q2FudmFzID0gKCkgPT4ge1xuICAgIGNvbnN0IGlzRGFya1RoZW1lID0gdGhlbWUgPT09IFRIRU1FLkRBUks7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLnRoZW1lID0gdGhlbWU7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUuaGVpZ2h0ID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUud2lkdGggPSBjdXJzb3JJbWFnZVNpemVQeDtcbiAgICBjb25zdCBjb250ZXh0ID0gZXJhc2VyQ2FudmFzQ2FjaGUuZ2V0Q29udGV4dChcIjJkXCIpITtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhcbiAgICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoIC8gMixcbiAgICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCAvIDIsXG4gICAgICA1LFxuICAgICAgMCxcbiAgICAgIDIgKiBNYXRoLlBJLFxuICAgICk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLmJsYWNrIDogb2Mud2hpdGU7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGlzRGFya1RoZW1lID8gb2Mud2hpdGUgOiBvYy5ibGFjaztcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgIHByZXZpZXdEYXRhVVJMID0gZXJhc2VyQ2FudmFzQ2FjaGUudG9EYXRhVVJMKE1JTUVfVFlQRVMuc3ZnKSBhcyBEYXRhVVJMO1xuICB9O1xuICBpZiAoIWVyYXNlckNhbnZhc0NhY2hlIHx8IGVyYXNlckNhbnZhc0NhY2hlLnRoZW1lICE9PSB0aGVtZSkge1xuICAgIGRyYXdDYW52YXMoKTtcbiAgfVxuXG4gIHNldEN1cnNvcihcbiAgICBjYW52YXMsXG4gICAgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgJHtjdXJzb3JJbWFnZVNpemVQeCAvIDJ9ICR7XG4gICAgICBjdXJzb3JJbWFnZVNpemVQeCAvIDJcbiAgICB9LCBhdXRvYCxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3JGb3JTaGFwZSA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbikgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgcmVzZXRDdXJzb3IoY2FudmFzKTtcbiAgfSBlbHNlIGlmIChhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiZXJhc2VyXCIpIHtcbiAgICBzZXRFcmFzZXJDdXJzb3IoY2FudmFzLCBhcHBTdGF0ZS50aGVtZSk7XG4gICAgLy8gZG8gbm90aGluZyBpZiBpbWFnZSB0b29sIGlzIHNlbGVjdGVkIHdoaWNoIHN1Z2dlc3RzIHRoZXJlJ3NcbiAgICAvLyBhIGltYWdlLXByZXZpZXcgc2V0IGFzIHRoZSBjdXJzb3JcbiAgICAvLyBJZ25vcmUgY3VzdG9tIHR5cGUgYXMgd2VsbCBhbmQgbGV0IGhvc3QgZGVjaWRlXG4gIH0gZWxzZSBpZiAoIVtcImltYWdlXCIsIFwiY3VzdG9tXCJdLmluY2x1ZGVzKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuQ1JPU1NIQUlSO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gKCkgPT5cbiAgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcblxuZXhwb3J0IGNvbnN0IGFsbG93RnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZXhpdEZ1bGxTY3JlZW4gPSAoKSA9PiBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSAoc2hvcnRjdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHNob3J0Y3V0ID0gc2hvcnRjdXRcbiAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiQWx0XCIpXG4gICAgLnJlcGxhY2UoL1xcYlNoaWZ0XFxiL2ksIFwiU2hpZnRcIilcbiAgICAucmVwbGFjZSgvXFxiKEVudGVyfFJldHVybilcXGIvaSwgXCJFbnRlclwiKVxuICAgIC5yZXBsYWNlKC9cXGJEZWxcXGIvaSwgXCJEZWxldGVcIik7XG5cbiAgaWYgKGlzRGFyd2luKSB7XG4gICAgcmV0dXJuIHNob3J0Y3V0XG4gICAgICAucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ21kXCIpXG4gICAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiT3B0aW9uXCIpO1xuICB9XG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvaSwgXCJDdHJsXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyA9IChcbiAgeyBjbGllbnRYLCBjbGllbnRZIH06IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSxcbiAge1xuICAgIHpvb20sXG4gICAgb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRUb3AsXG4gICAgc2Nyb2xsWCxcbiAgICBzY3JvbGxZLFxuICB9OiB7XG4gICAgem9vbTogWm9vbTtcbiAgICBvZmZzZXRMZWZ0OiBudW1iZXI7XG4gICAgb2Zmc2V0VG9wOiBudW1iZXI7XG4gICAgc2Nyb2xsWDogbnVtYmVyO1xuICAgIHNjcm9sbFk6IG51bWJlcjtcbiAgfSxcbikgPT4ge1xuICBjb25zdCBpbnZTY2FsZSA9IDEgLyB6b29tLnZhbHVlO1xuICBjb25zdCB4ID0gKGNsaWVudFggLSBvZmZzZXRMZWZ0KSAqIGludlNjYWxlIC0gc2Nyb2xsWDtcbiAgY29uc3QgeSA9IChjbGllbnRZIC0gb2Zmc2V0VG9wKSAqIGludlNjYWxlIC0gc2Nyb2xsWTtcblxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzID0gKFxuICB7IHNjZW5lWCwgc2NlbmVZIH06IHsgc2NlbmVYOiBudW1iZXI7IHNjZW5lWTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgeCA9IChzY2VuZVggKyBzY3JvbGxYKSAqIHpvb20udmFsdWUgKyBvZmZzZXRMZWZ0O1xuICBjb25zdCB5ID0gKHNjZW5lWSArIHNjcm9sbFkpICogem9vbS52YWx1ZSArIG9mZnNldFRvcDtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbENTU1ZhcmlhYmxlID0gKG5hbWU6IHN0cmluZykgPT5cbiAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tJHtuYW1lfWApO1xuXG5jb25zdCBSU19MVFJfQ0hBUlMgPVxuICBcIkEtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJCOFxcdTAzMDAtXFx1MDU5MFxcdTA4MDAtXFx1MUZGRlwiICtcbiAgXCJcXHUyQzAwLVxcdUZCMUNcXHVGREZFLVxcdUZFNkZcXHVGRUZELVxcdUZGRkZcIjtcbmNvbnN0IFJTX1JUTF9DSEFSUyA9IFwiXFx1MDU5MS1cXHUwN0ZGXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXCI7XG5jb25zdCBSRV9SVExfQ0hFQ0sgPSBuZXcgUmVnRXhwKGBeW14ke1JTX0xUUl9DSEFSU31dKlske1JTX1JUTF9DSEFSU31dYCk7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGZpcnN0IGRpcmVjdGlvbmFsIGNoYXJhY3RlciBpcyBSVEwuIE1lYW5pbmcgd2hldGhlciBpdCBzdGFydHNcbiAqICB3aXRoIFJUTCBjaGFyYWN0ZXJzLCBvciBpbmRldGVybWluYXRlIChudW1iZXJzIGV0Yy4pIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnlcbiAqICBSVEwuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzE3MjIjZGlzY3Vzc2lvbl9yNDM2MzQwMTcxXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JUTCA9ICh0ZXh0OiBzdHJpbmcpID0+IFJFX1JUTF9DSEVDSy50ZXN0KHRleHQpO1xuXG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gKFxuICB4eVR1cGxlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLFxuKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLyoqIHVzZSBhcyBhIHJlamVjdGlvbkhhbmRsZXIgdG8gbXV0ZSBmaWxlc3lzdGVtIEFib3J0IGVycm9ycyAqL1xuZXhwb3J0IGNvbnN0IG11dGVGU0Fib3J0RXJyb3IgPSAoZXJyb3I/OiBFcnJvcikgPT4ge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgZXJyb3I7XG59O1xuXG5leHBvcnQgY29uc3QgZmluZEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gMCxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuICB3aGlsZSAoKytpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRMYXN0SW5kZXggPSA8VD4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIGNiOiAoZWxlbWVudDogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IHJlYWRvbmx5IFRbXSkgPT4gYm9vbGVhbixcbiAgZnJvbUluZGV4OiBudW1iZXIgPSBhcnJheS5sZW5ndGggLSAxLFxuKSA9PiB7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoICsgZnJvbUluZGV4O1xuICB9XG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICB3aGlsZSAoLS1pbmRleCA+IC0xKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUcmFuc3BhcmVudCA9IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIChcbiAgICBpc1JHQlRyYW5zcGFyZW50IHx8XG4gICAgaXNSUkdHQkJUcmFuc3BhcmVudCB8fFxuICAgIGNvbG9yID09PSBjb2xvcnMuZWxlbWVudEJhY2tncm91bmRbMF1cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlc29sdmFibGVQcm9taXNlPFQ+ID0gUHJvbWlzZTxUPiAmIHtcbiAgcmVzb2x2ZTogW1RdIGV4dGVuZHMgW3VuZGVmaW5lZF0gPyAodmFsdWU/OiBUKSA9PiB2b2lkIDogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuZXhwb3J0IGNvbnN0IHJlc29sdmFibGVQcm9taXNlID0gPFQ+KCkgPT4ge1xuICBsZXQgcmVzb2x2ZSE6IGFueTtcbiAgbGV0IHJlamVjdCE6IGFueTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgKHByb21pc2UgYXMgYW55KS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgKHByb21pc2UgYXMgYW55KS5yZWplY3QgPSByZWplY3Q7XG4gIHJldHVybiBwcm9taXNlIGFzIFJlc29sdmFibGVQcm9taXNlPFQ+O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZnVuYyBoYW5kbGVyIHRha2luZyBhdCBtb3N0IHNpbmdsZSBwYXJhbWV0ZXIgKGV2ZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlcyA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+XG4gICgoZXZlbnQpID0+IHtcbiAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhmdW5jIGFzIFRGdW5jdGlvbiwgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb247XG5cbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlc1Rocm90dGxlZCA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+IHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUY8UGFyYW1ldGVyczxURnVuY3Rpb24+PigoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb24pO1xufTtcblxuLy9odHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTQ2MjM4Mi84NDE4XG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IChudW06IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzaSA9IFtcbiAgICB7IHZhbHVlOiAxLCBzeW1ib2w6IFwiYlwiIH0sXG4gICAgeyB2YWx1ZTogMWUzLCBzeW1ib2w6IFwia1wiIH0sXG4gICAgeyB2YWx1ZTogMWU2LCBzeW1ib2w6IFwiTVwiIH0sXG4gICAgeyB2YWx1ZTogMWU5LCBzeW1ib2w6IFwiR1wiIH0sXG4gIF07XG4gIGNvbnN0IHJ4ID0gL1xcLjArJHwoXFwuWzAtOV0qWzEtOV0pMCskLztcbiAgbGV0IGluZGV4O1xuICBmb3IgKGluZGV4ID0gc2kubGVuZ3RoIC0gMTsgaW5kZXggPiAwOyBpbmRleC0tKSB7XG4gICAgaWYgKG51bSA+PSBzaVtpbmRleF0udmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgIChudW0gLyBzaVtpbmRleF0udmFsdWUpLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpICsgc2lbaW5kZXhdLnN5bWJvbFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZlcnNpb24gPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MTWV0YUVsZW1lbnQ+KCdtZXRhW25hbWU9XCJ2ZXJzaW9uXCJdJyk/LmNvbnRlbnQgfHxcbiAgICBERUZBVUxUX1ZFUlNJT05cbiAgKTtcbn07XG5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcbmV4cG9ydCBjb25zdCBzdXBwb3J0c0Vtb2ppID0gKCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBpZiAoIWN0eCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjtcbiAgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cbiAgY3R4LmZpbGxUZXh0KFwi8J+YgFwiLCAwLCAwKTtcbiAgcmV0dXJuIGN0eC5nZXRJbWFnZURhdGEob2Zmc2V0LCBvZmZzZXQsIDEsIDEpLmRhdGFbMF0gIT09IDA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuKTogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuICAgIGNvbnN0IHsgb3ZlcmZsb3dZIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgIGNvbnN0IGhhc1Njcm9sbGFibGVDb250ZW50ID0gcGFyZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKFxuICAgICAgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgJiZcbiAgICAgIChvdmVyZmxvd1kgPT09IFwiYXV0b1wiIHx8XG4gICAgICAgIG92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwib3ZlcmxheVwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IChlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LnRhYkluZGV4ID4gLTEpIHtcbiAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHByZXZlbnRVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vIE5PVEU6IG1vZGVybiBicm93c2VycyBubyBsb25nZXIgYWxsb3cgc2hvd2luZyBhIGN1c3RvbSBtZXNzYWdlIGhlcmVcbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ5dGVzVG9IZXhTdHJpbmcgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgLm1hcCgoYnl0ZSkgPT4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpKVxuICAgIC5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVwZGF0ZWRUaW1lc3RhbXAgPSAoKSA9PiAoaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKSk7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYGlkYCBhdHRyaWJ1dGUsXG4gKiBvciBhcnJheSBvZiBpZHMgKHN0cmluZ3MpLCBpbnRvIGEgTWFwLCBrZXlkIGJ5IGBpZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZz4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4pID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBNYXA8c3RyaW5nLCBUPiwgZWxlbWVudCkgPT4ge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Rlc3RFbnYgPSAoKSA9PlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uTk9ERV9FTlYgPT09IFwidGVzdFwiO1xuXG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IHdyYXBFdmVudCA9IDxUIGV4dGVuZHMgRXZlbnQ+KG5hbWU6IEVWRU5ULCBuYXRpdmVFdmVudDogVCkgPT4ge1xuICByZXR1cm4gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgIH0sXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlT2JqZWN0ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqOiBULFxuICB1cGRhdGVzOiBQYXJ0aWFsPFQ+LFxuKTogVCA9PiB7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgIGNvbnN0IHZhbHVlID0gKHVwZGF0ZXMgYXMgYW55KVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG9iaiBhcyBhbnkpW2tleV0gPT09IHZhbHVlICYmXG4gICAgICAgIC8vIGlmIG9iamVjdCwgYWx3YXlzIHVwZGF0ZSBiZWNhdXNlIGl0cyBhdHRycyBjb3VsZCBoYXZlIGNoYW5nZWRcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vYmosXG4gICAgLi4udXBkYXRlcyxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWw6IGFueSkgPT4ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8ICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc1Byb21pc2VMaWtlID0gKFxuICB2YWx1ZTogYW55LFxuKTogdmFsdWUgaXMgUHJvbWlzZTxSZXNvbHV0aW9uVHlwZTx0eXBlb2YgdmFsdWU+PiA9PiB7XG4gIHJldHVybiAoXG4gICAgISF2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwidGhlblwiIGluIHZhbHVlICYmXG4gICAgXCJjYXRjaFwiIGluIHZhbHVlICYmXG4gICAgXCJmaW5hbGx5XCIgaW4gdmFsdWVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICBcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiLFxuICApO1xuXG4gIHJldHVybiBmb2N1c2FibGVFbGVtZW50c1xuICAgID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnRhYkluZGV4ID4gLTEgJiYgIShlbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmRpc2FibGVkLFxuICAgICAgKVxuICAgIDogW107XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../utils.ts\n");
3137
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements)\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 _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\r\n\r\n\r\n\r\n\r\nlet mockDateTime = null;\r\nconst setDateTimeForTests = (dateTime) => {\r\n mockDateTime = dateTime;\r\n};\r\nconst getDateTime = () => {\r\n if (mockDateTime) {\r\n return mockDateTime;\r\n }\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\r\n const day = `${date.getDate()}`.padStart(2, \"0\");\r\n const hr = `${date.getHours()}`.padStart(2, \"0\");\r\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\r\n return `${year}-${month}-${day}-${hr}${min}`;\r\n};\r\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\r\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\r\n target instanceof HTMLBRElement || // newline in wysiwyg\r\n target instanceof HTMLInputElement ||\r\n target instanceof HTMLTextAreaElement ||\r\n target instanceof HTMLSelectElement;\r\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\r\n target instanceof HTMLBRElement || // newline in wysiwyg\r\n target instanceof HTMLTextAreaElement ||\r\n (target instanceof HTMLInputElement &&\r\n (target.type === \"text\" || target.type === \"number\"));\r\nconst getFontFamilyString = ({ fontFamily, }) => {\r\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\r\n if (id === fontFamily) {\r\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\r\n }\r\n }\r\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\r\n};\r\n/** returns fontSize+fontFamily string for assignment to DOM elements */\r\nconst getFontString = ({ fontSize, fontFamily, }) => {\r\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\r\n};\r\nconst debounce = (fn, timeout) => {\r\n let handle = 0;\r\n let lastArgs = null;\r\n const ret = (...args) => {\r\n lastArgs = args;\r\n clearTimeout(handle);\r\n handle = window.setTimeout(() => {\r\n lastArgs = null;\r\n fn(...args);\r\n }, timeout);\r\n };\r\n ret.flush = () => {\r\n clearTimeout(handle);\r\n if (lastArgs) {\r\n const _lastArgs = lastArgs;\r\n lastArgs = null;\r\n fn(..._lastArgs);\r\n }\r\n };\r\n ret.cancel = () => {\r\n lastArgs = null;\r\n clearTimeout(handle);\r\n };\r\n return ret;\r\n};\r\n// throttle callback to execute once per animation frame\r\nconst throttleRAF = (fn) => {\r\n let handle = null;\r\n let lastArgs = null;\r\n let callback = null;\r\n const ret = (...args) => {\r\n if (false) {}\r\n lastArgs = args;\r\n callback = fn;\r\n if (handle === null) {\r\n handle = window.requestAnimationFrame(() => {\r\n handle = null;\r\n lastArgs = null;\r\n callback = null;\r\n fn(...args);\r\n });\r\n }\r\n };\r\n ret.flush = () => {\r\n if (handle !== null) {\r\n cancelAnimationFrame(handle);\r\n handle = null;\r\n }\r\n if (lastArgs) {\r\n const _lastArgs = lastArgs;\r\n const _callback = callback;\r\n lastArgs = null;\r\n callback = null;\r\n if (_callback !== null) {\r\n _callback(..._lastArgs);\r\n }\r\n }\r\n };\r\n ret.cancel = () => {\r\n lastArgs = null;\r\n callback = null;\r\n if (handle !== null) {\r\n cancelAnimationFrame(handle);\r\n handle = null;\r\n }\r\n };\r\n return ret;\r\n};\r\n// https://github.com/lodash/lodash/blob/es/chunk.js\r\nconst chunk = (array, size) => {\r\n if (!array.length || size < 1) {\r\n return [];\r\n }\r\n let index = 0;\r\n let resIndex = 0;\r\n const result = Array(Math.ceil(array.length / size));\r\n while (index < array.length) {\r\n result[resIndex++] = array.slice(index, (index += size));\r\n }\r\n return result;\r\n};\r\nconst selectNode = (node) => {\r\n const selection = window.getSelection();\r\n if (selection) {\r\n const range = document.createRange();\r\n range.selectNodeContents(node);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n};\r\nconst removeSelection = () => {\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n }\r\n};\r\nconst distance = (x, y) => Math.abs(x - y);\r\nconst updateActiveTool = (appState, data) => {\r\n if (data.type === \"custom\") {\r\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\r\n }\r\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\r\n ? appState.activeTool.lastActiveToolBeforeEraser\r\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\r\n};\r\nconst resetCursor = (canvas) => {\r\n if (canvas) {\r\n canvas.style.cursor = \"\";\r\n }\r\n};\r\nconst setCursor = (canvas, cursor) => {\r\n if (canvas) {\r\n canvas.style.cursor = cursor;\r\n }\r\n};\r\nlet eraserCanvasCache;\r\nlet previewDataURL;\r\nconst setEraserCursor = (canvas, theme) => {\r\n const cursorImageSizePx = 20;\r\n const drawCanvas = () => {\r\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\r\n eraserCanvasCache = document.createElement(\"canvas\");\r\n eraserCanvasCache.theme = theme;\r\n eraserCanvasCache.height = cursorImageSizePx;\r\n eraserCanvasCache.width = cursorImageSizePx;\r\n const context = eraserCanvasCache.getContext(\"2d\");\r\n context.lineWidth = 1;\r\n context.beginPath();\r\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\r\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\r\n context.fill();\r\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\r\n context.stroke();\r\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\r\n };\r\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\r\n drawCanvas();\r\n }\r\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\r\n};\r\nconst setCursorForShape = (canvas, appState) => {\r\n if (!canvas) {\r\n return;\r\n }\r\n if (appState.activeTool.type === \"selection\") {\r\n resetCursor(canvas);\r\n }\r\n else if (appState.activeTool.type === \"eraser\") {\r\n setEraserCursor(canvas, appState.theme);\r\n // do nothing if image tool is selected which suggests there's\r\n // a image-preview set as the cursor\r\n // Ignore custom type as well and let host decide\r\n }\r\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\r\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\r\n }\r\n};\r\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\r\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\r\nconst exitFullScreen = () => document.exitFullscreen();\r\nconst getShortcutKey = (shortcut) => {\r\n shortcut = shortcut\r\n .replace(/\\bAlt\\b/i, \"Alt\")\r\n .replace(/\\bShift\\b/i, \"Shift\")\r\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\r\n .replace(/\\bDel\\b/i, \"Delete\");\r\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\r\n return shortcut\r\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\r\n .replace(/\\bAlt\\b/i, \"Option\");\r\n }\r\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\r\n};\r\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\r\n const invScale = 1 / zoom.value;\r\n const x = (clientX - offsetLeft) * invScale - scrollX;\r\n const y = (clientY - offsetTop) * invScale - scrollY;\r\n return { x, y };\r\n};\r\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\r\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\r\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\r\n return { x, y };\r\n};\r\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\r\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\r\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\r\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\r\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\r\n/**\r\n * Checks whether first directional character is RTL. Meaning whether it starts\r\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\r\n * RTL.\r\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\r\n */\r\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\r\nconst tupleToCoors = (xyTuple) => {\r\n const [x, y] = xyTuple;\r\n return { x, y };\r\n};\r\n/** use as a rejectionHandler to mute filesystem Abort errors */\r\nconst muteFSAbortError = (error) => {\r\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\r\n console.warn(error);\r\n return;\r\n }\r\n throw error;\r\n};\r\nconst findIndex = (array, cb, fromIndex = 0) => {\r\n if (fromIndex < 0) {\r\n fromIndex = array.length + fromIndex;\r\n }\r\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\r\n let index = fromIndex - 1;\r\n while (++index < array.length) {\r\n if (cb(array[index], index, array)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n};\r\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\r\n if (fromIndex < 0) {\r\n fromIndex = array.length + fromIndex;\r\n }\r\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\r\n let index = fromIndex + 1;\r\n while (--index > -1) {\r\n if (cb(array[index], index, array)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n};\r\nconst isTransparent = (color) => {\r\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\r\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\r\n return (isRGBTransparent ||\r\n isRRGGBBTransparent ||\r\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\r\n};\r\nconst resolvablePromise = () => {\r\n let resolve;\r\n let reject;\r\n const promise = new Promise((_resolve, _reject) => {\r\n resolve = _resolve;\r\n reject = _reject;\r\n });\r\n promise.resolve = resolve;\r\n promise.reject = reject;\r\n return promise;\r\n};\r\n/**\r\n * @param func handler taking at most single parameter (event).\r\n */\r\nconst withBatchedUpdates = (func) => ((event) => {\r\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\r\n});\r\n/**\r\n * barches React state updates and throttles the calls to a single call per\r\n * animation frame\r\n */\r\nconst withBatchedUpdatesThrottled = (func) => {\r\n // @ts-ignore\r\n return throttleRAF(((event) => {\r\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\r\n }));\r\n};\r\n//https://stackoverflow.com/a/9462382/8418\r\nconst nFormatter = (num, digits) => {\r\n const si = [\r\n { value: 1, symbol: \"b\" },\r\n { value: 1e3, symbol: \"k\" },\r\n { value: 1e6, symbol: \"M\" },\r\n { value: 1e9, symbol: \"G\" },\r\n ];\r\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\r\n let index;\r\n for (index = si.length - 1; index > 0; index--) {\r\n if (num >= si[index].value) {\r\n break;\r\n }\r\n }\r\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\r\n};\r\nconst getVersion = () => {\r\n var _a;\r\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\r\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\r\n};\r\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\r\nconst supportsEmoji = () => {\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) {\r\n return false;\r\n }\r\n const offset = 12;\r\n ctx.fillStyle = \"#f00\";\r\n ctx.textBaseline = \"top\";\r\n ctx.font = \"32px Arial\";\r\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\r\n // Luckily 😀 isn't supported.\r\n ctx.fillText(\"😀\", 0, 0);\r\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\r\n};\r\nconst getNearestScrollableContainer = (element) => {\r\n let parent = element.parentElement;\r\n while (parent) {\r\n if (parent === document.body) {\r\n return document;\r\n }\r\n const { overflowY } = window.getComputedStyle(parent);\r\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\r\n if (hasScrollableContent &&\r\n (overflowY === \"auto\" ||\r\n overflowY === \"scroll\" ||\r\n overflowY === \"overlay\")) {\r\n return parent;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return document;\r\n};\r\nconst focusNearestParent = (element) => {\r\n let parent = element.parentElement;\r\n while (parent) {\r\n if (parent.tabIndex > -1) {\r\n parent.focus();\r\n return;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n};\r\nconst preventUnload = (event) => {\r\n event.preventDefault();\r\n // NOTE: modern browsers no longer allow showing a custom message here\r\n event.returnValue = \"\";\r\n};\r\nconst bytesToHexString = (bytes) => {\r\n return Array.from(bytes)\r\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\r\n .join(\"\");\r\n};\r\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\r\n/**\r\n * Transforms array of objects containing `id` attribute,\r\n * or array of ids (strings), into a Map, keyd by `id`.\r\n */\r\nconst arrayToMap = (items) => {\r\n return items.reduce((acc, element) => {\r\n acc.set(typeof element === \"string\" ? element : element.id, element);\r\n return acc;\r\n }, new Map());\r\n};\r\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.70\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\r\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.3.70\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\r\nconst wrapEvent = (name, nativeEvent) => {\r\n return new CustomEvent(name, {\r\n detail: {\r\n nativeEvent,\r\n },\r\n cancelable: true,\r\n });\r\n};\r\nconst updateObject = (obj, updates) => {\r\n let didChange = false;\r\n for (const key in updates) {\r\n const value = updates[key];\r\n if (typeof value !== \"undefined\") {\r\n if (obj[key] === value &&\r\n // if object, always update because its attrs could have changed\r\n (typeof value !== \"object\" || value === null)) {\r\n continue;\r\n }\r\n didChange = true;\r\n }\r\n }\r\n if (!didChange) {\r\n return obj;\r\n }\r\n return Object.assign(Object.assign({}, obj), updates);\r\n};\r\nconst isPrimitive = (val) => {\r\n const type = typeof val;\r\n return val == null || (type !== \"object\" && type !== \"function\");\r\n};\r\nconst getFrame = () => {\r\n try {\r\n return window.self === window.top ? \"top\" : \"iframe\";\r\n }\r\n catch (error) {\r\n return \"iframe\";\r\n }\r\n};\r\nconst isPromiseLike = (value) => {\r\n return (!!value &&\r\n typeof value === \"object\" &&\r\n \"then\" in value &&\r\n \"catch\" in value &&\r\n \"finally\" in value);\r\n};\r\nconst queryFocusableElements = (container) => {\r\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\r\n return focusableElements\r\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\r\n : [];\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztLQUN0RDtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDLENBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxDQUMzQixLQUFVLEVBQ3NDLEVBQUU7SUFDbEQsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1FBQ1AsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixNQUFNLElBQUksS0FBSztRQUNmLE9BQU8sSUFBSSxLQUFLO1FBQ2hCLFNBQVMsSUFBSSxLQUFLLENBQ25CLENBQUM7QUFDSixDQUFDLENBQUM7QUFFSyxNQUFNLHNCQUFzQixHQUFHLENBQUMsU0FBNkIsRUFBRSxFQUFFO0lBQ3RFLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLGdCQUFnQixDQUNuRCxvRUFBb0UsQ0FDckUsQ0FBQztJQUVGLE9BQU8saUJBQWlCO1FBQ3RCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ1YsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFFLE9BQTRCLENBQUMsUUFBUSxDQUNuRTtRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdXRpbHMudHM/NzYzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb2MgZnJvbSBcIm9wZW4tY29sb3JcIjtcblxuaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7XG4gIENVUlNPUl9UWVBFLFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIEVWRU5ULFxuICBGT05UX0ZBTUlMWSxcbiAgTUlNRV9UWVBFUyxcbiAgVEhFTUUsXG4gIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGb250RmFtaWx5VmFsdWVzLCBGb250U3RyaW5nIH0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIERhdGFVUkwsIExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyLCBab29tIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgaXNEYXJ3aW4gfSBmcm9tIFwiLi9rZXlzXCI7XG5pbXBvcnQgeyBTSEFQRVMgfSBmcm9tIFwiLi9zaGFwZXNcIjtcblxubGV0IG1vY2tEYXRlVGltZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBjb25zdCBzZXREYXRlVGltZUZvclRlc3RzID0gKGRhdGVUaW1lOiBzdHJpbmcpID0+IHtcbiAgbW9ja0RhdGVUaW1lID0gZGF0ZVRpbWU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0ZVRpbWUgPSAoKSA9PiB7XG4gIGlmIChtb2NrRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gbW9ja0RhdGVUaW1lO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgZGF5ID0gYCR7ZGF0ZS5nZXREYXRlKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGhyID0gYCR7ZGF0ZS5nZXRIb3VycygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBtaW4gPSBgJHtkYXRlLmdldE1pbnV0ZXMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblxuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9LSR7aHJ9JHttaW59YDtcbn07XG5cbmV4cG9ydCBjb25zdCBjYXBpdGFsaXplU3RyaW5nID0gKHN0cjogc3RyaW5nKSA9PlxuICBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG5cbmV4cG9ydCBjb25zdCBpc1Rvb2xJY29uID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXMgSFRNTEVsZW1lbnQgPT5cbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmNsYXNzTmFtZS5pbmNsdWRlcyhcIlRvb2xJY29uXCIpO1xuXG5leHBvcnQgY29uc3QgaXNJbnB1dExpa2UgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTFNlbGVjdEVsZW1lbnRcbiAgfCBIVE1MQlJFbGVtZW50XG4gIHwgSFRNTERpdkVsZW1lbnQgPT5cbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiKSB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQ7XG5cbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRWxlbWVudCA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MQlJFbGVtZW50XG4gIHwgSFRNTERpdkVsZW1lbnQgPT5cbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiKSB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgKHRhcmdldC50eXBlID09PSBcInRleHRcIiB8fCB0YXJnZXQudHlwZSA9PT0gXCJudW1iZXJcIikpO1xuXG5leHBvcnQgY29uc3QgZ2V0Rm9udEZhbWlseVN0cmluZyA9ICh7XG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIGZvciAoY29uc3QgW2ZvbnRGYW1pbHlTdHJpbmcsIGlkXSBvZiBPYmplY3QuZW50cmllcyhGT05UX0ZBTUlMWSkpIHtcbiAgICBpZiAoaWQgPT09IGZvbnRGYW1pbHkpIHtcbiAgICAgIHJldHVybiBgJHtmb250RmFtaWx5U3RyaW5nfSwgJHtXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlR9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVDtcbn07XG5cbi8qKiByZXR1cm5zIGZvbnRTaXplK2ZvbnRGYW1pbHkgc3RyaW5nIGZvciBhc3NpZ25tZW50IHRvIERPTSBlbGVtZW50cyAqL1xuZXhwb3J0IGNvbnN0IGdldEZvbnRTdHJpbmcgPSAoe1xuICBmb250U2l6ZSxcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udFNpemU6IG51bWJlcjtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgcmV0dXJuIGAke2ZvbnRTaXplfXB4ICR7Z2V0Rm9udEZhbWlseVN0cmluZyh7IGZvbnRGYW1pbHkgfSl9YCBhcyBGb250U3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgdGltZW91dDogbnVtYmVyLFxuKSA9PiB7XG4gIGxldCBoYW5kbGUgPSAwO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaGFuZGxlID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgfSwgdGltZW91dCk7XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGNvbnN0IF9sYXN0QXJncyA9IGxhc3RBcmdzO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uX2xhc3RBcmdzKTtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufTtcblxuLy8gdGhyb3R0bGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBvbmNlIHBlciBhbmltYXRpb24gZnJhbWVcbmV4cG9ydCBjb25zdCB0aHJvdHRsZVJBRiA9IDxUIGV4dGVuZHMgYW55W10+KGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCkgPT4ge1xuICBsZXQgaGFuZGxlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGxldCBjYWxsYmFjazogKCguLi5hcmdzOiBUKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgY2FsbGJhY2sgPSBmbjtcbiAgICBpZiAoaGFuZGxlID09PSBudWxsKSB7XG4gICAgICBoYW5kbGUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgaGFuZGxlID0gbnVsbDtcbiAgICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgaWYgKGhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlKTtcbiAgICAgIGhhbmRsZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBjb25zdCBfY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGNhbGxiYWNrID0gbnVsbDtcbiAgICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgX2NhbGxiYWNrKC4uLl9sYXN0QXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjYWxsYmFjayA9IG51bGw7XG4gICAgaWYgKGhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlKTtcbiAgICAgIGhhbmRsZSA9IG51bGw7XG4gICAgfVxuICB9O1xuICByZXR1cm4gcmV0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9lcy9jaHVuay5qc1xuZXhwb3J0IGNvbnN0IGNodW5rID0gPFQgZXh0ZW5kcyBhbnk+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBzaXplOiBudW1iZXIsXG4pOiBUW11bXSA9PiB7XG4gIGlmICghYXJyYXkubGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCByZXNJbmRleCA9IDA7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSk7XG4gIHdoaWxlIChpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGFycmF5LnNsaWNlKGluZGV4LCAoaW5kZXggKz0gc2l6ZSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0Tm9kZSA9IChub2RlOiBFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3Rpb24gPSAoKSA9PiB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBNYXRoLmFicyh4IC0geSk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY3RpdmVUb29sID0gKFxuICBhcHBTdGF0ZTogUGljazxBcHBTdGF0ZSwgXCJhY3RpdmVUb29sXCI+LFxuICBkYXRhOiAoXG4gICAgfCB7IHR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdIHwgXCJlcmFzZXJcIiB9XG4gICAgfCB7IHR5cGU6IFwiY3VzdG9tXCI7IGN1c3RvbVR5cGU6IHN0cmluZyB9XG4gICkgJiB7IGxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyPzogTGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIgfSxcbik6IEFwcFN0YXRlW1wiYWN0aXZlVG9vbFwiXSA9PiB7XG4gIGlmIChkYXRhLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXBwU3RhdGUuYWN0aXZlVG9vbCxcbiAgICAgIHR5cGU6IFwiY3VzdG9tXCIsXG4gICAgICBjdXN0b21UeXBlOiBkYXRhLmN1c3RvbVR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uYXBwU3RhdGUuYWN0aXZlVG9vbCxcbiAgICBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcjpcbiAgICAgIGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGFwcFN0YXRlLmFjdGl2ZVRvb2wubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXJcbiAgICAgICAgOiBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyLFxuICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICBjdXN0b21UeXBlOiBudWxsLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0Q3Vyc29yID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gXCJcIjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCwgY3Vyc29yOiBzdHJpbmcpID0+IHtcbiAgaWYgKGNhbnZhcykge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XG4gIH1cbn07XG5cbmxldCBlcmFzZXJDYW52YXNDYWNoZTogYW55O1xubGV0IHByZXZpZXdEYXRhVVJMOiBzdHJpbmc7XG5leHBvcnQgY29uc3Qgc2V0RXJhc2VyQ3Vyc29yID0gKFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgdGhlbWU6IEFwcFN0YXRlW1widGhlbWVcIl0sXG4pID0+IHtcbiAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSAyMDtcblxuICBjb25zdCBkcmF3Q2FudmFzID0gKCkgPT4ge1xuICAgIGNvbnN0IGlzRGFya1RoZW1lID0gdGhlbWUgPT09IFRIRU1FLkRBUks7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLnRoZW1lID0gdGhlbWU7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUuaGVpZ2h0ID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUud2lkdGggPSBjdXJzb3JJbWFnZVNpemVQeDtcbiAgICBjb25zdCBjb250ZXh0ID0gZXJhc2VyQ2FudmFzQ2FjaGUuZ2V0Q29udGV4dChcIjJkXCIpITtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhcbiAgICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoIC8gMixcbiAgICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCAvIDIsXG4gICAgICA1LFxuICAgICAgMCxcbiAgICAgIDIgKiBNYXRoLlBJLFxuICAgICk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLmJsYWNrIDogb2Mud2hpdGU7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGlzRGFya1RoZW1lID8gb2Mud2hpdGUgOiBvYy5ibGFjaztcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgIHByZXZpZXdEYXRhVVJMID0gZXJhc2VyQ2FudmFzQ2FjaGUudG9EYXRhVVJMKE1JTUVfVFlQRVMuc3ZnKSBhcyBEYXRhVVJMO1xuICB9O1xuICBpZiAoIWVyYXNlckNhbnZhc0NhY2hlIHx8IGVyYXNlckNhbnZhc0NhY2hlLnRoZW1lICE9PSB0aGVtZSkge1xuICAgIGRyYXdDYW52YXMoKTtcbiAgfVxuXG4gIHNldEN1cnNvcihcbiAgICBjYW52YXMsXG4gICAgYHVybCgke3ByZXZpZXdEYXRhVVJMfSkgJHtjdXJzb3JJbWFnZVNpemVQeCAvIDJ9ICR7XG4gICAgICBjdXJzb3JJbWFnZVNpemVQeCAvIDJcbiAgICB9LCBhdXRvYCxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3JGb3JTaGFwZSA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbikgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgcmVzZXRDdXJzb3IoY2FudmFzKTtcbiAgfSBlbHNlIGlmIChhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiZXJhc2VyXCIpIHtcbiAgICBzZXRFcmFzZXJDdXJzb3IoY2FudmFzLCBhcHBTdGF0ZS50aGVtZSk7XG4gICAgLy8gZG8gbm90aGluZyBpZiBpbWFnZSB0b29sIGlzIHNlbGVjdGVkIHdoaWNoIHN1Z2dlc3RzIHRoZXJlJ3NcbiAgICAvLyBhIGltYWdlLXByZXZpZXcgc2V0IGFzIHRoZSBjdXJzb3JcbiAgICAvLyBJZ25vcmUgY3VzdG9tIHR5cGUgYXMgd2VsbCBhbmQgbGV0IGhvc3QgZGVjaWRlXG4gIH0gZWxzZSBpZiAoIVtcImltYWdlXCIsIFwiY3VzdG9tXCJdLmluY2x1ZGVzKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuQ1JPU1NIQUlSO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gKCkgPT5cbiAgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcblxuZXhwb3J0IGNvbnN0IGFsbG93RnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZXhpdEZ1bGxTY3JlZW4gPSAoKSA9PiBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSAoc2hvcnRjdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHNob3J0Y3V0ID0gc2hvcnRjdXRcbiAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiQWx0XCIpXG4gICAgLnJlcGxhY2UoL1xcYlNoaWZ0XFxiL2ksIFwiU2hpZnRcIilcbiAgICAucmVwbGFjZSgvXFxiKEVudGVyfFJldHVybilcXGIvaSwgXCJFbnRlclwiKVxuICAgIC5yZXBsYWNlKC9cXGJEZWxcXGIvaSwgXCJEZWxldGVcIik7XG5cbiAgaWYgKGlzRGFyd2luKSB7XG4gICAgcmV0dXJuIHNob3J0Y3V0XG4gICAgICAucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ21kXCIpXG4gICAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiT3B0aW9uXCIpO1xuICB9XG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvaSwgXCJDdHJsXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyA9IChcbiAgeyBjbGllbnRYLCBjbGllbnRZIH06IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSxcbiAge1xuICAgIHpvb20sXG4gICAgb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRUb3AsXG4gICAgc2Nyb2xsWCxcbiAgICBzY3JvbGxZLFxuICB9OiB7XG4gICAgem9vbTogWm9vbTtcbiAgICBvZmZzZXRMZWZ0OiBudW1iZXI7XG4gICAgb2Zmc2V0VG9wOiBudW1iZXI7XG4gICAgc2Nyb2xsWDogbnVtYmVyO1xuICAgIHNjcm9sbFk6IG51bWJlcjtcbiAgfSxcbikgPT4ge1xuICBjb25zdCBpbnZTY2FsZSA9IDEgLyB6b29tLnZhbHVlO1xuICBjb25zdCB4ID0gKGNsaWVudFggLSBvZmZzZXRMZWZ0KSAqIGludlNjYWxlIC0gc2Nyb2xsWDtcbiAgY29uc3QgeSA9IChjbGllbnRZIC0gb2Zmc2V0VG9wKSAqIGludlNjYWxlIC0gc2Nyb2xsWTtcblxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzID0gKFxuICB7IHNjZW5lWCwgc2NlbmVZIH06IHsgc2NlbmVYOiBudW1iZXI7IHNjZW5lWTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgeCA9IChzY2VuZVggKyBzY3JvbGxYKSAqIHpvb20udmFsdWUgKyBvZmZzZXRMZWZ0O1xuICBjb25zdCB5ID0gKHNjZW5lWSArIHNjcm9sbFkpICogem9vbS52YWx1ZSArIG9mZnNldFRvcDtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbENTU1ZhcmlhYmxlID0gKG5hbWU6IHN0cmluZykgPT5cbiAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tJHtuYW1lfWApO1xuXG5jb25zdCBSU19MVFJfQ0hBUlMgPVxuICBcIkEtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJCOFxcdTAzMDAtXFx1MDU5MFxcdTA4MDAtXFx1MUZGRlwiICtcbiAgXCJcXHUyQzAwLVxcdUZCMUNcXHVGREZFLVxcdUZFNkZcXHVGRUZELVxcdUZGRkZcIjtcbmNvbnN0IFJTX1JUTF9DSEFSUyA9IFwiXFx1MDU5MS1cXHUwN0ZGXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXCI7XG5jb25zdCBSRV9SVExfQ0hFQ0sgPSBuZXcgUmVnRXhwKGBeW14ke1JTX0xUUl9DSEFSU31dKlske1JTX1JUTF9DSEFSU31dYCk7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGZpcnN0IGRpcmVjdGlvbmFsIGNoYXJhY3RlciBpcyBSVEwuIE1lYW5pbmcgd2hldGhlciBpdCBzdGFydHNcbiAqICB3aXRoIFJUTCBjaGFyYWN0ZXJzLCBvciBpbmRldGVybWluYXRlIChudW1iZXJzIGV0Yy4pIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnlcbiAqICBSVEwuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzE3MjIjZGlzY3Vzc2lvbl9yNDM2MzQwMTcxXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JUTCA9ICh0ZXh0OiBzdHJpbmcpID0+IFJFX1JUTF9DSEVDSy50ZXN0KHRleHQpO1xuXG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gKFxuICB4eVR1cGxlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLFxuKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLyoqIHVzZSBhcyBhIHJlamVjdGlvbkhhbmRsZXIgdG8gbXV0ZSBmaWxlc3lzdGVtIEFib3J0IGVycm9ycyAqL1xuZXhwb3J0IGNvbnN0IG11dGVGU0Fib3J0RXJyb3IgPSAoZXJyb3I/OiBFcnJvcikgPT4ge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgZXJyb3I7XG59O1xuXG5leHBvcnQgY29uc3QgZmluZEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gMCxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuICB3aGlsZSAoKytpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRMYXN0SW5kZXggPSA8VD4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIGNiOiAoZWxlbWVudDogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IHJlYWRvbmx5IFRbXSkgPT4gYm9vbGVhbixcbiAgZnJvbUluZGV4OiBudW1iZXIgPSBhcnJheS5sZW5ndGggLSAxLFxuKSA9PiB7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoICsgZnJvbUluZGV4O1xuICB9XG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICB3aGlsZSAoLS1pbmRleCA+IC0xKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUcmFuc3BhcmVudCA9IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIChcbiAgICBpc1JHQlRyYW5zcGFyZW50IHx8XG4gICAgaXNSUkdHQkJUcmFuc3BhcmVudCB8fFxuICAgIGNvbG9yID09PSBjb2xvcnMuZWxlbWVudEJhY2tncm91bmRbMF1cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlc29sdmFibGVQcm9taXNlPFQ+ID0gUHJvbWlzZTxUPiAmIHtcbiAgcmVzb2x2ZTogW1RdIGV4dGVuZHMgW3VuZGVmaW5lZF0gPyAodmFsdWU/OiBUKSA9PiB2b2lkIDogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuZXhwb3J0IGNvbnN0IHJlc29sdmFibGVQcm9taXNlID0gPFQ+KCkgPT4ge1xuICBsZXQgcmVzb2x2ZSE6IGFueTtcbiAgbGV0IHJlamVjdCE6IGFueTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgKHByb21pc2UgYXMgYW55KS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgKHByb21pc2UgYXMgYW55KS5yZWplY3QgPSByZWplY3Q7XG4gIHJldHVybiBwcm9taXNlIGFzIFJlc29sdmFibGVQcm9taXNlPFQ+O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZnVuYyBoYW5kbGVyIHRha2luZyBhdCBtb3N0IHNpbmdsZSBwYXJhbWV0ZXIgKGV2ZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlcyA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+XG4gICgoZXZlbnQpID0+IHtcbiAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhmdW5jIGFzIFRGdW5jdGlvbiwgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb247XG5cbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlc1Rocm90dGxlZCA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+IHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUY8UGFyYW1ldGVyczxURnVuY3Rpb24+PigoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb24pO1xufTtcblxuLy9odHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTQ2MjM4Mi84NDE4XG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IChudW06IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzaSA9IFtcbiAgICB7IHZhbHVlOiAxLCBzeW1ib2w6IFwiYlwiIH0sXG4gICAgeyB2YWx1ZTogMWUzLCBzeW1ib2w6IFwia1wiIH0sXG4gICAgeyB2YWx1ZTogMWU2LCBzeW1ib2w6IFwiTVwiIH0sXG4gICAgeyB2YWx1ZTogMWU5LCBzeW1ib2w6IFwiR1wiIH0sXG4gIF07XG4gIGNvbnN0IHJ4ID0gL1xcLjArJHwoXFwuWzAtOV0qWzEtOV0pMCskLztcbiAgbGV0IGluZGV4O1xuICBmb3IgKGluZGV4ID0gc2kubGVuZ3RoIC0gMTsgaW5kZXggPiAwOyBpbmRleC0tKSB7XG4gICAgaWYgKG51bSA+PSBzaVtpbmRleF0udmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgIChudW0gLyBzaVtpbmRleF0udmFsdWUpLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpICsgc2lbaW5kZXhdLnN5bWJvbFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZlcnNpb24gPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MTWV0YUVsZW1lbnQ+KCdtZXRhW25hbWU9XCJ2ZXJzaW9uXCJdJyk/LmNvbnRlbnQgfHxcbiAgICBERUZBVUxUX1ZFUlNJT05cbiAgKTtcbn07XG5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcbmV4cG9ydCBjb25zdCBzdXBwb3J0c0Vtb2ppID0gKCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBpZiAoIWN0eCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjtcbiAgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cbiAgY3R4LmZpbGxUZXh0KFwi8J+YgFwiLCAwLCAwKTtcbiAgcmV0dXJuIGN0eC5nZXRJbWFnZURhdGEob2Zmc2V0LCBvZmZzZXQsIDEsIDEpLmRhdGFbMF0gIT09IDA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuKTogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuICAgIGNvbnN0IHsgb3ZlcmZsb3dZIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgIGNvbnN0IGhhc1Njcm9sbGFibGVDb250ZW50ID0gcGFyZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKFxuICAgICAgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgJiZcbiAgICAgIChvdmVyZmxvd1kgPT09IFwiYXV0b1wiIHx8XG4gICAgICAgIG92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwib3ZlcmxheVwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IChlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LnRhYkluZGV4ID4gLTEpIHtcbiAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHByZXZlbnRVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vIE5PVEU6IG1vZGVybiBicm93c2VycyBubyBsb25nZXIgYWxsb3cgc2hvd2luZyBhIGN1c3RvbSBtZXNzYWdlIGhlcmVcbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ5dGVzVG9IZXhTdHJpbmcgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgLm1hcCgoYnl0ZSkgPT4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpKVxuICAgIC5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVwZGF0ZWRUaW1lc3RhbXAgPSAoKSA9PiAoaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKSk7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYGlkYCBhdHRyaWJ1dGUsXG4gKiBvciBhcnJheSBvZiBpZHMgKHN0cmluZ3MpLCBpbnRvIGEgTWFwLCBrZXlkIGJ5IGBpZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZz4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4pID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBNYXA8c3RyaW5nLCBUPiwgZWxlbWVudCkgPT4ge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Rlc3RFbnYgPSAoKSA9PlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uTk9ERV9FTlYgPT09IFwidGVzdFwiO1xuXG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IHdyYXBFdmVudCA9IDxUIGV4dGVuZHMgRXZlbnQ+KG5hbWU6IEVWRU5ULCBuYXRpdmVFdmVudDogVCkgPT4ge1xuICByZXR1cm4gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgIH0sXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlT2JqZWN0ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqOiBULFxuICB1cGRhdGVzOiBQYXJ0aWFsPFQ+LFxuKTogVCA9PiB7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgIGNvbnN0IHZhbHVlID0gKHVwZGF0ZXMgYXMgYW55KVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG9iaiBhcyBhbnkpW2tleV0gPT09IHZhbHVlICYmXG4gICAgICAgIC8vIGlmIG9iamVjdCwgYWx3YXlzIHVwZGF0ZSBiZWNhdXNlIGl0cyBhdHRycyBjb3VsZCBoYXZlIGNoYW5nZWRcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vYmosXG4gICAgLi4udXBkYXRlcyxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWw6IGFueSkgPT4ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8ICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc1Byb21pc2VMaWtlID0gKFxuICB2YWx1ZTogYW55LFxuKTogdmFsdWUgaXMgUHJvbWlzZTxSZXNvbHV0aW9uVHlwZTx0eXBlb2YgdmFsdWU+PiA9PiB7XG4gIHJldHVybiAoXG4gICAgISF2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwidGhlblwiIGluIHZhbHVlICYmXG4gICAgXCJjYXRjaFwiIGluIHZhbHVlICYmXG4gICAgXCJmaW5hbGx5XCIgaW4gdmFsdWVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICBcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiLFxuICApO1xuXG4gIHJldHVybiBmb2N1c2FibGVFbGVtZW50c1xuICAgID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnRhYkluZGV4ID4gLTEgJiYgIShlbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmRpc2FibGVkLFxuICAgICAgKVxuICAgIDogW107XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../utils.ts\n");
3138
3138
 
3139
3139
  /***/ }),
3140
3140
 
@@ -3277,7 +3277,7 @@ module.exports = JSON.parse('{"white":"#ffffff","black":"#000000","gray":["#f8f9
3277
3277
  /***/ ((module) => {
3278
3278
 
3279
3279
  "use strict";
3280
- module.exports = JSON.parse('{"labels":{"paste":"Paste","pasteCharts":"Paste charts","selectAll":"Select all","multiSelect":"Add element to selection","moveCanvas":"Move canvas","cut":"Cut","copy":"Copy","copyAsPng":"Copy to clipboard as PNG","copyAsSvg":"Copy to clipboard as SVG","copyText":"Copy to clipboard as text","bringForward":"Bring forward","sendToBack":"Send to back","bringToFront":"Bring to front","sendBackward":"Send backward","delete":"Delete","copyStyles":"Copy styles","pasteStyles":"Paste styles","stroke":"Stroke","background":"Background","fill":"Fill","strokeWidth":"Stroke width","strokeStyle":"Stroke style","strokeStyle_solid":"Solid","strokeStyle_dashed":"Dashed","strokeStyle_dotted":"Dotted","sloppiness":"Sloppiness","opacity":"Opacity","textAlign":"Text align","edges":"Edges","sharp":"Sharp","round":"Round","arrowheads":"Arrowheads","arrowhead_none":"None","arrowhead_arrow":"Arrow","arrowhead_bar":"Bar","arrowhead_dot":"Dot","arrowhead_triangle":"Triangle","fontSize":"Font size","fontFamily":"Font family","onlySelected":"Only selected","withBackground":"Background","exportEmbedScene":"Embed scene","exportEmbedScene_details":"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.","addWatermark":"Add \\"Made with Excalidraw\\"","handDrawn":"Hand-drawn","normal":"Normal","code":"Code","small":"Small","medium":"Medium","large":"Large","veryLarge":"Very large","solid":"Solid","hachure":"Hachure","crossHatch":"Cross-hatch","thin":"Thin","bold":"Bold","left":"Left","center":"Center","right":"Right","extraBold":"Extra bold","architect":"Architect","artist":"Artist","cartoonist":"Cartoonist","fileTitle":"File name","colorPicker":"Color picker","canvasColors":"Used on canvas","canvasBackground":"Canvas background","drawingCanvas":"Drawing canvas","layers":"Layers","actions":"Actions","language":"Language","liveCollaboration":"Sharing","duplicateSelection":"Duplicate","untitled":"Untitled","name":"Name","yourName":"Your name","madeWithExcalidraw":"Made with Excalidraw","group":"Group selection","ungroup":"Ungroup selection","collaborators":"Collaborators","showGrid":"Show grid","addToLibrary":"Add to library","removeFromLibrary":"Remove from library","libraryLoadingMessage":"Loading library…","libraries":"Browse libraries","loadingScene":"Loading scene…","align":"Align","alignTop":"Align top","alignBottom":"Align bottom","alignLeft":"Align left","alignRight":"Align right","centerVertically":"Center vertically","centerHorizontally":"Center horizontally","distributeHorizontally":"Distribute horizontally","distributeVertically":"Distribute vertically","flipHorizontal":"Flip horizontal","flipVertical":"Flip vertical","viewMode":"View mode","toggleExportColorScheme":"Toggle export color scheme","share":"Share","showStroke":"Show stroke color picker","showBackground":"Show background color picker","toggleTheme":"Toggle theme","personalLib":"Personal Library","excalidrawLib":"Excalidraw Library","decreaseFontSize":"Decrease font size","increaseFontSize":"Increase font size","unbindText":"Unbind text","bindText":"Bind text to the container","link":{"edit":"Edit link","create":"Create link","label":"Link"},"elementLock":{"lock":"Lock","unlock":"Unlock","lockAll":"Lock all","unlockAll":"Unlock all"},"statusPublished":"Published","sidebarLock":"Keep sidebar open"},"library":{"hint_emptyLibrary":"Select an item on canvas to add it here, or install a library from the public repository, below.","hint_emptyPrivateLibrary":"Select an item on canvas to add it here."},"buttons":{"clearReset":"Reset the canvas","exportJSON":"Export to file","exportImage":"Save as image","export":"Export","exportToPng":"Export to PNG","exportToSvg":"Export to SVG","copyToClipboard":"Copy to clipboard","copyPngToClipboard":"Copy PNG to clipboard","scale":"Scale","save":"Save (to active file)","saveAs":"Save as","load":"Load","getShareableLink":"Get shareable link","close":"Close","selectLanguage":"Select language","scrollBackToContent":"Scroll back to content","zoomIn":"Zoom in","zoomOut":"Zoom out","resetZoom":"Reset zoom","menu":"Menu","done":"Done","edit":"Edit","undo":"Undo","redo":"Redo","resetLibrary":"Reset library","roomDialog":"Sharing","createNewRoom":"Create new room","fullScreen":"Full screen","darkMode":"Dark mode","lightMode":"Light mode","zenMode":"Zen mode","exitZenMode":"Exit zen mode","cancel":"Cancel","clear":"Clear","remove":"Remove","publishLibrary":"Publish","submit":"Submit","confirm":"Confirm"},"alerts":{"clearReset":"This will clear the whole canvas. Are you sure?","couldNotCreateShareableLink":"Couldn\'t create shareable link.","couldNotCreateShareableLinkTooBig":"Couldn\'t create shareable link: the scene is too big","couldNotLoadInvalidFile":"Couldn\'t load invalid file","importBackendFailed":"Importing from backend failed.","cannotExportEmptyCanvas":"Cannot export empty canvas.","couldNotCopyToClipboard":"Couldn\'t copy to clipboard.","decryptFailed":"Couldn\'t decrypt data.","uploadedSecurly":"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can\'t read the content.","loadSceneOverridePrompt":"Loading external drawing will replace your existing content. Do you wish to continue?","collabStopOverridePrompt":"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)","errorAddingToLibrary":"Couldn\'t add item to the library","errorRemovingFromLibrary":"Couldn\'t remove item from the library","confirmAddLibrary":"This will add {{numShapes}} shape(s) to your library. Are you sure?","imageDoesNotContainScene":"This image does not seem to contain any scene data. Have you enabled scene embedding during export?","cannotRestoreFromImage":"Scene couldn\'t be restored from this image file","invalidSceneUrl":"Couldn\'t import scene from the supplied URL. It\'s either malformed, or doesn\'t contain valid Excalidraw JSON data.","resetLibrary":"This will clear your library. Are you sure?","removeItemsFromsLibrary":"Delete {{count}} item(s) from library?","invalidEncryptionKey":"Encryption key must be of 22 characters. Live collaboration is disabled."},"errors":{"unsupportedFileType":"Unsupported file type.","imageInsertError":"Couldn\'t insert image. Try again later...","fileTooBig":"File is too big. Maximum allowed size is {{maxSize}}.","svgImageInsertError":"Couldn\'t insert SVG image. The SVG markup looks invalid.","invalidSVGString":"Invalid SVG.","cannotResolveCollabServer":"Couldn\'t connect to the collab server. Please reload the page and try again.","importLibraryError":"Couldn\'t load library"},"toolBar":{"selection":"Selection","image":"Insert image","rectangle":"Rectangle","diamond":"Diamond","ellipse":"Ellipse","arrow":"Arrow","line":"Line","freedraw":"Draw","text":"Text","library":"Library","lock":"Keep selected tool active after drawing","penMode":"Prevent pinch-zoom and accept freedraw input only from pen","link":"Add/ Update link for a selected shape","eraser":"Eraser"},"headings":{"canvasActions":"Canvas actions","selectedShapeActions":"Selected shape actions","shapes":"Shapes"},"hints":{"canvasPanning":"To move canvas, hold mouse wheel or spacebar while dragging","linearElement":"Click to start multiple points, drag for single line","freeDraw":"Click and drag, release when you\'re finished","text":"Tip: you can also add text by double-clicking anywhere with the selection tool","text_selected":"Double-click or press ENTER to edit text","text_editing":"Press Escape or CtrlOrCmd+ENTER to finish editing","linearElementMulti":"Click on last point or press Escape or Enter to finish","lockAngle":"You can constrain angle by holding SHIFT","resize":"You can constrain proportions by holding SHIFT while resizing,\\nhold ALT to resize from the center","resizeImage":"You can resize freely by holding SHIFT,\\nhold ALT to resize from the center","rotate":"You can constrain angles by holding SHIFT while rotating","lineEditor_info":"Double-click or press Enter to edit points","lineEditor_pointSelected":"Press Delete to remove point(s),\\nCtrlOrCmd+D to duplicate, or drag to move","lineEditor_nothingSelected":"Select a point to edit (hold SHIFT to select multiple),\\nor hold Alt and click to add new points","placeImage":"Click to place the image, or click and drag to set its size manually","publishLibrary":"Publish your own library","bindTextToElement":"Press enter to add text","deepBoxSelect":"Hold CtrlOrCmd to deep select, and to prevent dragging","eraserRevert":"Hold Alt to revert the elements marked for deletion"},"canvasError":{"cannotShowPreview":"Cannot show preview","canvasTooBig":"The canvas may be too big.","canvasTooBigTip":"Tip: try moving the farthest elements a bit closer together."},"errorSplash":{"headingMain_pre":"Encountered an error. Try ","headingMain_button":"reloading the page.","clearCanvasMessage":"If reloading doesn\'t work, try ","clearCanvasMessage_button":"clearing the canvas.","clearCanvasCaveat":" This will result in loss of work ","trackedToSentry_pre":"The error with identifier ","trackedToSentry_post":" was tracked on our system.","openIssueMessage_pre":"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our ","openIssueMessage_button":"bug tracker.","openIssueMessage_post":" Please include information below by copying and pasting into the GitHub issue.","sceneContent":"Scene content:"},"roomDialog":{"desc_intro":"You can invite people to your current scene to collaborate with you.","desc_privacy":"Don\'t worry, the session uses end-to-end encryption, so whatever you draw will stay private. Not even our server will be able to see what you come up with.","button_startSession":"Start session","button_stopSession":"Stop session","desc_inProgressIntro":"Live-collaboration session is now in progress.","desc_shareLink":"Share this link with anyone you want to collaborate with:","desc_exitSession":"Stopping the session will disconnect you from the room, but you\'ll be able to continue working with the scene, locally. Note that this won\'t affect other people, and they\'ll still be able to collaborate on their version.","shareTitle":"Join a live collaboration session on Excalidraw"},"errorDialog":{"title":"Error"},"exportDialog":{"disk_title":"Save to disk","disk_details":"Export the scene data to a file from which you can import later.","disk_button":"Save to file","link_title":"Shareable link","link_details":"Export as a read-only link.","link_button":"Export to Link","excalidrawplus_description":"Save the scene to your Excalidraw+ workspace.","excalidrawplus_button":"Export","excalidrawplus_exportError":"Couldn\'t export to Excalidraw+ at this moment..."},"helpDialog":{"blog":"Read our blog","click":"click","deepSelect":"Deep select","deepBoxSelect":"Deep select within box, and prevent dragging","curvedArrow":"Curved arrow","curvedLine":"Curved line","documentation":"Documentation","doubleClick":"double-click","drag":"drag","editor":"Editor","editSelectedShape":"Edit selected shape (text/arrow/line)","github":"Found an issue? Submit","howto":"Follow our guides","or":"or","preventBinding":"Prevent arrow binding","tools":"Tools","shortcuts":"Keyboard shortcuts","textFinish":"Finish editing (text editor)","textNewLine":"Add new line (text editor)","title":"Help","view":"View","zoomToFit":"Zoom to fit all elements","zoomToSelection":"Zoom to selection","toggleElementLock":"Lock/unlock selection"},"clearCanvasDialog":{"title":"Clear canvas"},"publishDialog":{"title":"Publish library","itemName":"Item name","authorName":"Author name","githubUsername":"GitHub username","twitterUsername":"Twitter username","libraryName":"Library name","libraryDesc":"Library description","website":"Website","placeholder":{"authorName":"Your name or username","libraryName":"Name of your library","libraryDesc":"Description of your library to help people understand its usage","githubHandle":"GitHub handle (optional), so you can edit the library once submitted for review","twitterHandle":"Twitter username (optional), so we know who to credit when promoting over Twitter","website":"Link to your personal website or elsewhere (optional)"},"errors":{"required":"Required","website":"Enter a valid URL"},"noteDescription":{"pre":"Submit your library to be included in the ","link":"public library repository","post":"for other people to use in their drawings."},"noteGuidelines":{"pre":"The library needs to be manually approved first. Please read the ","link":"guidelines","post":" before submitting. You will need a GitHub account to communicate and make changes if requested, but it is not strictly required."},"noteLicense":{"pre":"By submitting, you agree the library will be published under the ","link":"MIT License, ","post":"which in short means anyone can use them without restrictions."},"noteItems":"Each library item must have its own name so it\'s filterable. The following library items will be included:","atleastOneLibItem":"Please select at least one library item to get started","republishWarning":"Note: some of the selected items are marked as already published/submitted. You should only resubmit items when updating an existing library or submission."},"publishSuccessDialog":{"title":"Library submitted","content":"Thank you {{authorName}}. Your library has been submitted for review. You can track the status","link":"here"},"confirmDialog":{"resetLibrary":"Reset library","removeItemsFromLib":"Remove selected items from library"},"encrypted":{"tooltip":"Your drawings are end-to-end encrypted so Excalidraw\'s servers will never see them.","link":"Blog post on end-to-end encryption in Excalidraw"},"stats":{"angle":"Angle","element":"Element","elements":"Elements","height":"Height","scene":"Scene","selected":"Selected","storage":"Storage","title":"Stats for nerds","total":"Total","version":"Version","versionCopy":"Click to copy","versionNotAvailable":"Version not available","width":"Width"},"toast":{"addedToLibrary":"Added to library","copyStyles":"Copied styles.","copyToClipboard":"Copied to clipboard.","copyToClipboardAsPng":"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})","fileSaved":"File saved.","fileSavedToFilename":"Saved to {filename}","canvas":"canvas","selection":"selection"},"colors":{"495057":"Gray 7","ffffff":"White","f8f9fa":"Gray 0","f1f3f5":"Gray 1","fff5f5":"Red 0","fff0f6":"Pink 0","f8f0fc":"Grape 0","f3f0ff":"Violet 0","edf2ff":"Indigo 0","e7f5ff":"Blue 0","e3fafc":"Cyan 0","e6fcf5":"Teal 0","ebfbee":"Green 0","f4fce3":"Lime 0","fff9db":"Yellow 0","fff4e6":"Orange 0","transparent":"Transparent","ced4da":"Gray 4","868e96":"Gray 6","fa5252":"Red 6","e64980":"Pink 6","be4bdb":"Grape 6","7950f2":"Violet 6","4c6ef5":"Indigo 6","228be6":"Blue 6","15aabf":"Cyan 6","12b886":"Teal 6","40c057":"Green 6","82c91e":"Lime 6","fab005":"Yellow 6","fd7e14":"Orange 6","000000":"Black","343a40":"Gray 8","c92a2a":"Red 9","a61e4d":"Pink 9","862e9c":"Grape 9","5f3dc4":"Violet 9","364fc7":"Indigo 9","1864ab":"Blue 9","0b7285":"Cyan 9","087f5b":"Teal 9","2b8a3e":"Green 9","5c940d":"Lime 9","e67700":"Yellow 9","d9480f":"Orange 9"}}');
3280
+ module.exports = JSON.parse('{"labels":{"paste":"Paste","pasteCharts":"Paste charts","selectAll":"Select all","multiSelect":"Add element to selection","moveCanvas":"Move canvas","cut":"Cut","copy":"Copy","copyAsPng":"Copy to clipboard as PNG","copyAsSvg":"Copy to clipboard as SVG","copyText":"Copy to clipboard as text","bringForward":"Bring forward","sendToBack":"Send to back","bringToFront":"Bring to front","sendBackward":"Send backward","delete":"Delete","copyStyles":"Copy styles","pasteStyles":"Paste styles","stroke":"Stroke","background":"Background","fill":"Fill","strokeWidth":"Stroke width","strokeStyle":"Stroke style","strokeStyle_solid":"Solid","strokeStyle_dashed":"Dashed","strokeStyle_dotted":"Dotted","sloppiness":"Sloppiness","opacity":"Opacity","textAlign":"Text align","edges":"Edges","sharp":"Sharp","round":"Round","arrowheads":"Arrowheads","arrowhead_none":"None","arrowhead_arrow":"Arrow","arrowhead_bar":"Bar","arrowhead_dot":"Dot","arrowhead_triangle":"Triangle","fontSize":"Font size","fontFamily":"Font family","onlySelected":"Only selected","withBackground":"Background","exportEmbedScene":"Embed scene","exportEmbedScene_details":"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.","addWatermark":"Add \\"Made with Excalidraw\\"","handDrawn":"Hand-drawn","normal":"Normal","code":"Code","small":"Small","medium":"Medium","large":"Large","veryLarge":"Very large","solid":"Solid","hachure":"Hachure","crossHatch":"Cross-hatch","thin":"Thin","bold":"Bold","left":"Left","center":"Center","right":"Right","extraBold":"Extra bold","architect":"Architect","artist":"Artist","cartoonist":"Cartoonist","fileTitle":"File name","colorPicker":"Color picker","canvasColors":"Used on canvas","canvasBackground":"Canvas background","drawingCanvas":"Drawing canvas","layers":"Layers","actions":"Actions","language":"Language","liveCollaboration":"Sharing","duplicateSelection":"Duplicate","untitled":"Untitled","name":"Name","yourName":"Your name","madeWithExcalidraw":"Made with Excalidraw","group":"Group selection","ungroup":"Ungroup selection","collaborators":"Collaborators","showGrid":"Show grid","addToLibrary":"Add to library","removeFromLibrary":"Remove from library","libraryLoadingMessage":"Loading library…","libraries":"Browse libraries","loadingScene":"Loading scene…","align":"Align","alignTop":"Align top","alignBottom":"Align bottom","alignLeft":"Align left","alignRight":"Align right","centerVertically":"Center vertically","centerHorizontally":"Center horizontally","distributeHorizontally":"Distribute horizontally","distributeVertically":"Distribute vertically","flipHorizontal":"Flip horizontal","flipVertical":"Flip vertical","viewMode":"View mode","toggleExportColorScheme":"Toggle export color scheme","share":"Share","showStroke":"Show stroke color picker","showBackground":"Show background color picker","toggleTheme":"Toggle theme","personalLib":"Personal Library","excalidrawLib":"Excalidraw Library","decreaseFontSize":"Decrease font size","increaseFontSize":"Increase font size","unbindText":"Unbind text","bindText":"Bind text to the container","link":{"edit":"Edit link","create":"Create link","label":"Link"},"elementLock":{"lock":"Lock","unlock":"Unlock","lockAll":"Lock all","unlockAll":"Unlock all"},"statusPublished":"Published","sidebarLock":"Keep sidebar open"},"library":{"noItems":"No items added yet...","hint_emptyLibrary":"Select an item on canvas to add it here, or install a library from the public repository, below.","hint_emptyPrivateLibrary":"Select an item on canvas to add it here."},"buttons":{"clearReset":"Reset the canvas","exportJSON":"Export to file","exportImage":"Save as image","export":"Export","exportToPng":"Export to PNG","exportToSvg":"Export to SVG","copyToClipboard":"Copy to clipboard","copyPngToClipboard":"Copy PNG to clipboard","scale":"Scale","save":"Save (to active file)","saveAs":"Save as","load":"Load","getShareableLink":"Get shareable link","close":"Close","selectLanguage":"Select language","scrollBackToContent":"Scroll back to content","zoomIn":"Zoom in","zoomOut":"Zoom out","resetZoom":"Reset zoom","menu":"Menu","done":"Done","edit":"Edit","undo":"Undo","redo":"Redo","resetLibrary":"Reset library","roomDialog":"Sharing","createNewRoom":"Create new room","fullScreen":"Full screen","darkMode":"Dark mode","lightMode":"Light mode","zenMode":"Zen mode","exitZenMode":"Exit zen mode","cancel":"Cancel","clear":"Clear","remove":"Remove","publishLibrary":"Publish","submit":"Submit","confirm":"Confirm"},"alerts":{"clearReset":"This will clear the whole canvas. Are you sure?","couldNotCreateShareableLink":"Couldn\'t create shareable link.","couldNotCreateShareableLinkTooBig":"Couldn\'t create shareable link: the scene is too big","couldNotLoadInvalidFile":"Couldn\'t load invalid file","importBackendFailed":"Importing from backend failed.","cannotExportEmptyCanvas":"Cannot export empty canvas.","couldNotCopyToClipboard":"Couldn\'t copy to clipboard.","decryptFailed":"Couldn\'t decrypt data.","uploadedSecurly":"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can\'t read the content.","loadSceneOverridePrompt":"Loading external drawing will replace your existing content. Do you wish to continue?","collabStopOverridePrompt":"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)","errorAddingToLibrary":"Couldn\'t add item to the library","errorRemovingFromLibrary":"Couldn\'t remove item from the library","confirmAddLibrary":"This will add {{numShapes}} shape(s) to your library. Are you sure?","imageDoesNotContainScene":"This image does not seem to contain any scene data. Have you enabled scene embedding during export?","cannotRestoreFromImage":"Scene couldn\'t be restored from this image file","invalidSceneUrl":"Couldn\'t import scene from the supplied URL. It\'s either malformed, or doesn\'t contain valid Excalidraw JSON data.","resetLibrary":"This will clear your library. Are you sure?","removeItemsFromsLibrary":"Delete {{count}} item(s) from library?","invalidEncryptionKey":"Encryption key must be of 22 characters. Live collaboration is disabled."},"errors":{"unsupportedFileType":"Unsupported file type.","imageInsertError":"Couldn\'t insert image. Try again later...","fileTooBig":"File is too big. Maximum allowed size is {{maxSize}}.","svgImageInsertError":"Couldn\'t insert SVG image. The SVG markup looks invalid.","invalidSVGString":"Invalid SVG.","cannotResolveCollabServer":"Couldn\'t connect to the collab server. Please reload the page and try again.","importLibraryError":"Couldn\'t load library"},"toolBar":{"selection":"Selection","image":"Insert image","rectangle":"Rectangle","diamond":"Diamond","ellipse":"Ellipse","arrow":"Arrow","line":"Line","freedraw":"Draw","text":"Text","library":"Library","lock":"Keep selected tool active after drawing","penMode":"Prevent pinch-zoom and accept freedraw input only from pen","link":"Add/ Update link for a selected shape","eraser":"Eraser"},"headings":{"canvasActions":"Canvas actions","selectedShapeActions":"Selected shape actions","shapes":"Shapes"},"hints":{"canvasPanning":"To move canvas, hold mouse wheel or spacebar while dragging","linearElement":"Click to start multiple points, drag for single line","freeDraw":"Click and drag, release when you\'re finished","text":"Tip: you can also add text by double-clicking anywhere with the selection tool","text_selected":"Double-click or press ENTER to edit text","text_editing":"Press Escape or CtrlOrCmd+ENTER to finish editing","linearElementMulti":"Click on last point or press Escape or Enter to finish","lockAngle":"You can constrain angle by holding SHIFT","resize":"You can constrain proportions by holding SHIFT while resizing,\\nhold ALT to resize from the center","resizeImage":"You can resize freely by holding SHIFT,\\nhold ALT to resize from the center","rotate":"You can constrain angles by holding SHIFT while rotating","lineEditor_info":"Double-click or press Enter to edit points","lineEditor_pointSelected":"Press Delete to remove point(s),\\nCtrlOrCmd+D to duplicate, or drag to move","lineEditor_nothingSelected":"Select a point to edit (hold SHIFT to select multiple),\\nor hold Alt and click to add new points","placeImage":"Click to place the image, or click and drag to set its size manually","publishLibrary":"Publish your own library","bindTextToElement":"Press enter to add text","deepBoxSelect":"Hold CtrlOrCmd to deep select, and to prevent dragging","eraserRevert":"Hold Alt to revert the elements marked for deletion"},"canvasError":{"cannotShowPreview":"Cannot show preview","canvasTooBig":"The canvas may be too big.","canvasTooBigTip":"Tip: try moving the farthest elements a bit closer together."},"errorSplash":{"headingMain_pre":"Encountered an error. Try ","headingMain_button":"reloading the page.","clearCanvasMessage":"If reloading doesn\'t work, try ","clearCanvasMessage_button":"clearing the canvas.","clearCanvasCaveat":" This will result in loss of work ","trackedToSentry_pre":"The error with identifier ","trackedToSentry_post":" was tracked on our system.","openIssueMessage_pre":"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our ","openIssueMessage_button":"bug tracker.","openIssueMessage_post":" Please include information below by copying and pasting into the GitHub issue.","sceneContent":"Scene content:"},"roomDialog":{"desc_intro":"You can invite people to your current scene to collaborate with you.","desc_privacy":"Don\'t worry, the session uses end-to-end encryption, so whatever you draw will stay private. Not even our server will be able to see what you come up with.","button_startSession":"Start session","button_stopSession":"Stop session","desc_inProgressIntro":"Live-collaboration session is now in progress.","desc_shareLink":"Share this link with anyone you want to collaborate with:","desc_exitSession":"Stopping the session will disconnect you from the room, but you\'ll be able to continue working with the scene, locally. Note that this won\'t affect other people, and they\'ll still be able to collaborate on their version.","shareTitle":"Join a live collaboration session on Excalidraw"},"errorDialog":{"title":"Error"},"exportDialog":{"disk_title":"Save to disk","disk_details":"Export the scene data to a file from which you can import later.","disk_button":"Save to file","link_title":"Shareable link","link_details":"Export as a read-only link.","link_button":"Export to Link","excalidrawplus_description":"Save the scene to your Excalidraw+ workspace.","excalidrawplus_button":"Export","excalidrawplus_exportError":"Couldn\'t export to Excalidraw+ at this moment..."},"helpDialog":{"blog":"Read our blog","click":"click","deepSelect":"Deep select","deepBoxSelect":"Deep select within box, and prevent dragging","curvedArrow":"Curved arrow","curvedLine":"Curved line","documentation":"Documentation","doubleClick":"double-click","drag":"drag","editor":"Editor","editSelectedShape":"Edit selected shape (text/arrow/line)","github":"Found an issue? Submit","howto":"Follow our guides","or":"or","preventBinding":"Prevent arrow binding","tools":"Tools","shortcuts":"Keyboard shortcuts","textFinish":"Finish editing (text editor)","textNewLine":"Add new line (text editor)","title":"Help","view":"View","zoomToFit":"Zoom to fit all elements","zoomToSelection":"Zoom to selection","toggleElementLock":"Lock/unlock selection"},"clearCanvasDialog":{"title":"Clear canvas"},"publishDialog":{"title":"Publish library","itemName":"Item name","authorName":"Author name","githubUsername":"GitHub username","twitterUsername":"Twitter username","libraryName":"Library name","libraryDesc":"Library description","website":"Website","placeholder":{"authorName":"Your name or username","libraryName":"Name of your library","libraryDesc":"Description of your library to help people understand its usage","githubHandle":"GitHub handle (optional), so you can edit the library once submitted for review","twitterHandle":"Twitter username (optional), so we know who to credit when promoting over Twitter","website":"Link to your personal website or elsewhere (optional)"},"errors":{"required":"Required","website":"Enter a valid URL"},"noteDescription":{"pre":"Submit your library to be included in the ","link":"public library repository","post":"for other people to use in their drawings."},"noteGuidelines":{"pre":"The library needs to be manually approved first. Please read the ","link":"guidelines","post":" before submitting. You will need a GitHub account to communicate and make changes if requested, but it is not strictly required."},"noteLicense":{"pre":"By submitting, you agree the library will be published under the ","link":"MIT License, ","post":"which in short means anyone can use them without restrictions."},"noteItems":"Each library item must have its own name so it\'s filterable. The following library items will be included:","atleastOneLibItem":"Please select at least one library item to get started","republishWarning":"Note: some of the selected items are marked as already published/submitted. You should only resubmit items when updating an existing library or submission."},"publishSuccessDialog":{"title":"Library submitted","content":"Thank you {{authorName}}. Your library has been submitted for review. You can track the status","link":"here"},"confirmDialog":{"resetLibrary":"Reset library","removeItemsFromLib":"Remove selected items from library"},"encrypted":{"tooltip":"Your drawings are end-to-end encrypted so Excalidraw\'s servers will never see them.","link":"Blog post on end-to-end encryption in Excalidraw"},"stats":{"angle":"Angle","element":"Element","elements":"Elements","height":"Height","scene":"Scene","selected":"Selected","storage":"Storage","title":"Stats for nerds","total":"Total","version":"Version","versionCopy":"Click to copy","versionNotAvailable":"Version not available","width":"Width"},"toast":{"addedToLibrary":"Added to library","copyStyles":"Copied styles.","copyToClipboard":"Copied to clipboard.","copyToClipboardAsPng":"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})","fileSaved":"File saved.","fileSavedToFilename":"Saved to {filename}","canvas":"canvas","selection":"selection"},"colors":{"495057":"Gray 7","ffffff":"White","f8f9fa":"Gray 0","f1f3f5":"Gray 1","fff5f5":"Red 0","fff0f6":"Pink 0","f8f0fc":"Grape 0","f3f0ff":"Violet 0","edf2ff":"Indigo 0","e7f5ff":"Blue 0","e3fafc":"Cyan 0","e6fcf5":"Teal 0","ebfbee":"Green 0","f4fce3":"Lime 0","fff9db":"Yellow 0","fff4e6":"Orange 0","transparent":"Transparent","ced4da":"Gray 4","868e96":"Gray 6","fa5252":"Red 6","e64980":"Pink 6","be4bdb":"Grape 6","7950f2":"Violet 6","4c6ef5":"Indigo 6","228be6":"Blue 6","15aabf":"Cyan 6","12b886":"Teal 6","40c057":"Green 6","82c91e":"Lime 6","fab005":"Yellow 6","fd7e14":"Orange 6","000000":"Black","343a40":"Gray 8","c92a2a":"Red 9","a61e4d":"Pink 9","862e9c":"Grape 9","5f3dc4":"Violet 9","364fc7":"Indigo 9","1864ab":"Blue 9","0b7285":"Cyan 9","087f5b":"Teal 9","2b8a3e":"Green 9","5c940d":"Lime 9","e67700":"Yellow 9","d9480f":"Orange 9"}}');
3281
3281
 
3282
3282
  /***/ }),
3283
3283